aboutsummaryrefslogtreecommitdiffstats
path: root/src/pgtkterm.c
diff options
context:
space:
mode:
authorYuuki Harano2019-08-01 01:26:55 +0900
committerJeff Walsh2020-11-22 14:46:56 +1100
commitbc35a1e1d5dbee82391d08c4fca361c7fc77d558 (patch)
tree37d8cb8f338ca89c45be7f9642e968acfb2826d4 /src/pgtkterm.c
parent24d82638bc674d0c258ed95649fe98b22113d42f (diff)
downloademacs-bc35a1e1d5dbee82391d08c4fca361c7fc77d558.tar.gz
emacs-bc35a1e1d5dbee82391d08c4fca361c7fc77d558.zip
Make multipdisplay work by limiting selection while enabed
* src/pgtkterm.c (pgtk_mouse_position): * src/pgtkselect.c (pgtk_selection_usable): new function (Fpgtk_own_selection_internal, Fpgtk_disown_selection_internal) (Fpgtk_selection_exists_p, Fpgtk_selection_owner_p) (Fpgtk_get_selection_internal): check usable selection multi-display で落ちる理由を一つ潰した。 まだまだありそう。 multi-display 時は selection を使えないようにした。
Diffstat (limited to 'src/pgtkterm.c')
-rw-r--r--src/pgtkterm.c35
1 files changed, 19 insertions, 16 deletions
diff --git a/src/pgtkterm.c b/src/pgtkterm.c
index 50ee31e45c3..92f1409ede7 100644
--- a/src/pgtkterm.c
+++ b/src/pgtkterm.c
@@ -2975,6 +2975,8 @@ pgtk_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window,
2975 int win_x, win_y; 2975 int win_x, win_y;
2976 GdkSeat *seat; 2976 GdkSeat *seat;
2977 GdkDevice *device; 2977 GdkDevice *device;
2978 GdkModifierType mask;
2979 GdkWindow *win;
2978 2980
2979 block_input (); 2981 block_input ();
2980 2982
@@ -2988,32 +2990,33 @@ pgtk_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window,
2988 2990
2989 dpyinfo->last_mouse_scroll_bar = NULL; 2991 dpyinfo->last_mouse_scroll_bar = NULL;
2990 2992
2991 seat = gdk_display_get_default_seat(dpyinfo->gdpy);
2992 device = gdk_seat_get_pointer(seat);
2993
2994 if (gui_mouse_grabbed (dpyinfo)) { 2993 if (gui_mouse_grabbed (dpyinfo)) {
2995 GdkWindow *win; 2994 /* 1.1. use last_mouse_frame as frame where the pointer is on. */
2996 GdkModifierType mask;
2997 /* get x, y relative to edit window of f1. */
2998 f1 = dpyinfo->last_mouse_frame; 2995 f1 = dpyinfo->last_mouse_frame;
2999 win = gtk_widget_get_window(FRAME_GTK_WIDGET(f1));
3000 win = gdk_window_get_device_position(win, device, &win_x, &win_y, &mask);
3001 } else { 2996 } else {
3002 GdkWindow *win; 2997 f1 = *fp;
3003 GdkModifierType mask; 2998 /* 1.2. get frame where the pointer is on. */
3004 /* 1. get frame where the pointer is on. */
3005 win = gtk_widget_get_window(FRAME_GTK_WIDGET(*fp)); 2999 win = gtk_widget_get_window(FRAME_GTK_WIDGET(*fp));
3000 seat = gdk_display_get_default_seat(dpyinfo->gdpy);
3001 device = gdk_seat_get_pointer(seat);
3006 win = gdk_window_get_device_position(win, device, &win_x, &win_y, &mask); 3002 win = gdk_window_get_device_position(win, device, &win_x, &win_y, &mask);
3007 if (win != NULL) 3003 if (win != NULL)
3008 f1 = pgtk_any_window_to_frame(win); 3004 f1 = pgtk_any_window_to_frame(win);
3009 else 3005 else {
3006 // crossing display server?
3010 f1 = SELECTED_FRAME(); 3007 f1 = SELECTED_FRAME();
3011 3008 }
3012 /* 2. get x, y relative to edit window of the frame. */
3013 win = gtk_widget_get_window(FRAME_GTK_WIDGET(f1));
3014 win = gdk_window_get_device_position(win, device, &win_x, &win_y, &mask);
3015 } 3009 }
3016 3010
3011 /* 2. get the display and the device. */
3012 win = gtk_widget_get_window(FRAME_GTK_WIDGET(f1));
3013 GdkDisplay *gdpy = gdk_window_get_display (win);
3014 seat = gdk_display_get_default_seat(gdpy);
3015 device = gdk_seat_get_pointer(seat);
3016
3017 /* 3. get x, y relative to edit window of the frame. */
3018 win = gdk_window_get_device_position(win, device, &win_x, &win_y, &mask);
3019
3017 if (f1 != NULL) { 3020 if (f1 != NULL) {
3018 dpyinfo = FRAME_DISPLAY_INFO (f1); 3021 dpyinfo = FRAME_DISPLAY_INFO (f1);
3019 remember_mouse_glyph (f1, win_x, win_y, &dpyinfo->last_mouse_glyph); 3022 remember_mouse_glyph (f1, win_x, win_y, &dpyinfo->last_mouse_glyph);