[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
feature/pgtk 68b99a3 021/100: Implement invisible-pointer to create blin
From: |
Yuuki Harano |
Subject: |
feature/pgtk 68b99a3 021/100: Implement invisible-pointer to create blinking effect |
Date: |
Tue, 24 Nov 2020 08:02:28 -0500 (EST) |
branch: feature/pgtk
commit 68b99a3e6615a7f3eb21dbd72b0b796960831a5e
Author: Yuuki Harano <masm+github@masm11.me>
Commit: Jeff Walsh <fejfighter@gmail.com>
Implement invisible-pointer to create blinking effect
* src/pgtkterm.h (struct pgtk_display_info): add cursor and callback
* src/pgtkterm.c (x_setup_pointer_blanking)
(XTtoggle_invisible_pointer, x_toggle_visible_pointer): new functions
(pgtk_create_terminal, pgtk_term_init): use gdkcursor
* src/pgtkgui.h: define Emacs_cursor as a GdkCursor
invisible pointer 実装。
---
src/pgtkgui.h | 2 +-
src/pgtkterm.c | 39 +++++++++++++++++++++++++++++++++------
src/pgtkterm.h | 7 +++++++
3 files changed, 41 insertions(+), 7 deletions(-)
diff --git a/src/pgtkgui.h b/src/pgtkgui.h
index e7e614e..be9fb25 100644
--- a/src/pgtkgui.h
+++ b/src/pgtkgui.h
@@ -43,7 +43,7 @@ typedef unichar XChar2b;
(*(chp) & 0x00ff)
-typedef void *Emacs_Cursor;
+typedef struct _GdkCursor *Emacs_Cursor;
typedef void * Color;
typedef int Window;
diff --git a/src/pgtkterm.c b/src/pgtkterm.c
index 6d0dc96..2e98ded 100644
--- a/src/pgtkterm.c
+++ b/src/pgtkterm.c
@@ -4527,6 +4527,36 @@ XTframe_rehighlight (struct frame *frame)
pgtk_frame_rehighlight (FRAME_DISPLAY_INFO (frame));
}
+
+/* Toggle mouse pointer visibility on frame F by using invisible cursor. */
+
+static void
+x_toggle_visible_pointer (struct frame *f, bool invisible)
+{
+ Emacs_Cursor cursor;
+ if (invisible)
+ cursor = FRAME_DISPLAY_INFO (f)->invisible_cursor;
+ else
+ cursor = f->output_data.pgtk->current_cursor;
+ gdk_window_set_cursor(gtk_widget_get_window(FRAME_GTK_WIDGET(f)), cursor);
+ f->pointer_invisible = invisible;
+}
+
+static void
+x_setup_pointer_blanking (struct pgtk_display_info *dpyinfo)
+{
+ dpyinfo->toggle_visible_pointer = x_toggle_visible_pointer;
+ dpyinfo->invisible_cursor = gdk_cursor_new_for_display(dpyinfo->gdpy,
GDK_BLANK_CURSOR);
+}
+
+static void
+XTtoggle_invisible_pointer (struct frame *f, bool invisible)
+{
+ block_input ();
+ FRAME_DISPLAY_INFO (f)->toggle_visible_pointer (f, invisible);
+ unblock_input ();
+}
+
/* The focus has changed. Update the frames as necessary to reflect
the new situation. Note that we can't change the selected frame
here, because the Lisp code we are interrupting might become confused.
@@ -4570,6 +4600,7 @@ pgtk_create_terminal (struct pgtk_display_info *dpyinfo)
terminal->clear_frame_hook = pgtk_clear_frame;
terminal->ring_bell_hook = pgtk_ring_bell;
+ terminal->toggle_invisible_pointer_hook = XTtoggle_invisible_pointer;
terminal->update_begin_hook = pgtk_update_begin;
terminal->update_end_hook = pgtk_update_end;
terminal->read_socket_hook = pgtk_read_socket;
@@ -6136,13 +6167,11 @@ pgtk_term_init (Lisp_Object display_name, char
*resource_name)
/* We must create a GTK cursor, it is required for GTK widgets. */
dpyinfo->xg_cursor = xg_create_default_cursor (dpyinfo->gdpy);
-#if 0
dpyinfo->vertical_scroll_bar_cursor
- = XCreateFontCursor (dpyinfo->display, XC_sb_v_double_arrow);
+ = gdk_cursor_new_for_display(dpyinfo->gdpy, GDK_SB_V_DOUBLE_ARROW);
dpyinfo->horizontal_scroll_bar_cursor
- = XCreateFontCursor (dpyinfo->display, XC_sb_h_double_arrow);
-#endif
+ = gdk_cursor_new_for_display(dpyinfo->gdpy, GDK_SB_H_DOUBLE_ARROW);
reset_mouse_highlight (&dpyinfo->mouse_highlight);
@@ -6153,9 +6182,7 @@ pgtk_term_init (Lisp_Object display_name, char
*resource_name)
dpyinfo->resy = dpi;
}
-#if 0
x_setup_pointer_blanking (dpyinfo);
-#endif
xsettings_initialize (dpyinfo);
diff --git a/src/pgtkterm.h b/src/pgtkterm.h
index c48b1b3..3222bb2 100644
--- a/src/pgtkterm.h
+++ b/src/pgtkterm.h
@@ -209,6 +209,13 @@ struct pgtk_display_info
/* The scroll bar in which the last motion event occurred. */
void *last_mouse_scroll_bar;
+ /* The invisible cursor used for pointer blanking.
+ Unused if this display supports Xfixes extension. */
+ Emacs_Cursor invisible_cursor;
+
+ /* Function used to toggle pointer visibility on this display. */
+ void (*toggle_visible_pointer) (struct frame *, bool);
+
/* The GDK cursor for scroll bars and popup menus. */
GdkCursor *xg_cursor;
- branch feature/pgtk created (now d6ef9af), Yuuki Harano, 2020/11/24
- feature/pgtk 1b621c8 004/100: Don't mark name_list_element as it's not required, Yuuki Harano, 2020/11/24
- feature/pgtk 526f727 036/100: Let gtk handle scaling., Yuuki Harano, 2020/11/24
- feature/pgtk 68b99a3 021/100: Implement invisible-pointer to create blinking effect,
Yuuki Harano <=
- feature/pgtk 53cb431 007/100: replace listn with list., Yuuki Harano, 2020/11/24
- feature/pgtk 592badc 014/100: Early toolbar improvements, Yuuki Harano, 2020/11/24
- feature/pgtk 9d9c828 025/100: TIMERFD support for PGTK, prevent calling when timerfd<0, Yuuki Harano, 2020/11/24
- feature/pgtk fbba846 017/100: Addframe highlighting support, Yuuki Harano, 2020/11/24
- feature/pgtk 0056ca2 064/100: * src/pgtkterm.h: Change coding style, Yuuki Harano, 2020/11/24
- feature/pgtk f761a09 065/100: * src/pgtkim.c: Change coding style, Yuuki Harano, 2020/11/24
- feature/pgtk 27a92f7 072/100: Add font chooser functionality, Yuuki Harano, 2020/11/24
- feature/pgtk 9752896 042/100: Bring pgtk more inline with X11-cairo builds, Yuuki Harano, 2020/11/24
- feature/pgtk 164800d 013/100: Add Preferred geometry settings, Yuuki Harano, 2020/11/24
- feature/pgtk 383ced7 071/100: Fix migrating Child frames, Yuuki Harano, 2020/11/24