diff options
| author | Yuuki Harano | 2019-08-01 01:26:55 +0900 |
|---|---|---|
| committer | Jeff Walsh | 2020-11-22 14:46:56 +1100 |
| commit | bc35a1e1d5dbee82391d08c4fca361c7fc77d558 (patch) | |
| tree | 37d8cb8f338ca89c45be7f9642e968acfb2826d4 /src/pgtkterm.c | |
| parent | 24d82638bc674d0c258ed95649fe98b22113d42f (diff) | |
| download | emacs-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.c | 35 |
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); |