Mercurial > emacs
changeset 104815:b3c991e42448
* xterm.h: Rename x_non_menubar_window_to_frame to
x_menubar_window_to_frame
* xterm.c: Remove declarations also in xterm.h
(XTmouse_position): Do not return valid positions
for clicks in the menubar and the toolbar for Gtk+.
* xfns.c (x_any_window_to_frame): Assume less about Gtk+ internals,
if the widget for the event has the same top level as a frame,
return the frame.
(x_menubar_window_to_frame): Detect menu bar even with Gtk+
internal windows, bug #4122.
(x_non_menubar_window_to_frame): Remove.
author | Jan Djärv <jan.h.d@swipnet.se> |
---|---|
date | Wed, 02 Sep 2009 17:03:20 +0000 |
parents | 927de3d0c010 |
children | 4129eea9d003 |
files | src/ChangeLog src/xfns.c src/xterm.c src/xterm.h |
diffstat | 4 files changed, 38 insertions(+), 68 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ChangeLog Wed Sep 02 13:08:50 2009 +0000 +++ b/src/ChangeLog Wed Sep 02 17:03:20 2009 +0000 @@ -1,3 +1,19 @@ +2009-09-02 Jan Djärv <jan.h.d@swipnet.se> + + * xterm.h: Rename x_non_menubar_window_to_frame to + x_menubar_window_to_frame + + * xterm.c: Remove declarations also in xterm.h + (XTmouse_position): Do not return valid positions + for clicks in the menubar and the toolbar for Gtk+. + + * xfns.c (x_any_window_to_frame): Assume less about Gtk+ internals, + if the widget for the event has the same top level as a frame, + return the frame. + (x_menubar_window_to_frame): Detect menu bar even with Gtk+ + internal windows, bug #4122. + (x_non_menubar_window_to_frame): Remove. + 2009-09-02 Glenn Morris <rgm@gnu.org> * buffer.c (default-major-mode): Move most of the doc from here...
--- a/src/xfns.c Wed Sep 02 13:08:50 2009 +0000 +++ b/src/xfns.c Wed Sep 02 17:03:20 2009 +0000 @@ -377,10 +377,7 @@ #ifdef USE_GTK GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc); if (gwdesc != 0 - && (gwdesc == x->widget - || gwdesc == x->edit_widget - || gwdesc == x->vbox_widget - || gwdesc == x->menubar_widget)) + && gtk_widget_get_toplevel (gwdesc) == x->widget) found = f; #else if (wdesc == XtWindow (x->widget) @@ -401,54 +398,6 @@ return found; } -/* Likewise, but exclude the menu bar widget. */ - -struct frame * -x_non_menubar_window_to_frame (dpyinfo, wdesc) - struct x_display_info *dpyinfo; - int wdesc; -{ - Lisp_Object tail, frame; - struct frame *f; - struct x_output *x; - - if (wdesc == None) return 0; - - for (tail = Vframe_list; CONSP (tail); tail = XCDR (tail)) - { - frame = XCAR (tail); - if (!FRAMEP (frame)) - continue; - f = XFRAME (frame); - if (!FRAME_X_P (f) || FRAME_X_DISPLAY_INFO (f) != dpyinfo) - continue; - x = f->output_data.x; - /* This frame matches if the window is any of its widgets. */ - if (x->hourglass_window == wdesc) - return f; - else if (x->widget) - { -#ifdef USE_GTK - GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc); - if (gwdesc != 0 - && (gwdesc == x->widget - || gwdesc == x->edit_widget - || gwdesc == x->vbox_widget)) - return f; -#else - if (wdesc == XtWindow (x->widget) - || wdesc == XtWindow (x->column_widget) - || wdesc == XtWindow (x->edit_widget)) - return f; -#endif - } - else if (FRAME_X_WINDOW (f) == wdesc) - /* A tooltip frame. */ - return f; - } - return 0; -} - /* Likewise, but consider only the menu bar widget. */ struct frame * @@ -476,15 +425,14 @@ if (x->menubar_widget) { GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc); - int found = 0; - - BLOCK_INPUT; + + /* This gives false positives, but the rectangle check in xterm.c + where this is called takes care of that. */ if (gwdesc != 0 && (gwdesc == x->menubar_widget - || gtk_widget_get_parent (gwdesc) == x->menubar_widget)) - found = 1; - UNBLOCK_INPUT; - if (found) return f; + || gtk_widget_is_ancestor (x->menubar_widget, gwdesc) + || gtk_widget_is_ancestor (gwdesc, x->menubar_widget))) + return f; } #else if (x->menubar_widget
--- a/src/xterm.c Wed Sep 02 13:08:50 2009 +0000 +++ b/src/xterm.c Wed Sep 02 17:03:20 2009 +0000 @@ -109,8 +109,6 @@ #if defined (USE_X_TOOLKIT) || defined (USE_GTK) extern void free_frame_menubar P_ ((struct frame *)); -extern struct frame *x_menubar_window_to_frame P_ ((struct x_display_info *, - int)); #endif #ifdef USE_X_TOOLKIT @@ -143,11 +141,6 @@ #endif /* USE_X_TOOLKIT */ -#if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK) -#define x_any_window_to_frame x_window_to_frame -#define x_top_window_to_frame x_window_to_frame -#endif - #ifdef USE_X_TOOLKIT #include "widget.h" #ifndef XtNinitialState @@ -3908,7 +3901,14 @@ if (child == None || child == win) break; - +#ifdef USE_GTK + /* We don't wan't to know the innermost window. We + want the edit window. For non-Gtk+ the innermost + window is the edit window. For Gtk+ it might not + be. It might be the tool bar for example. */ + if (x_window_to_frame (FRAME_X_DISPLAY_INFO (*fp), win)) + break; +#endif win = child; parent_x = win_x; parent_y = win_y; @@ -3925,8 +3925,14 @@ parent_{x,y} are invalid, but that's okay, because we'll never use them in that case.) */ +#ifdef USE_GTK + /* We don't wan't to know the innermost window. We + want the edit window. */ + f1 = x_window_to_frame (FRAME_X_DISPLAY_INFO (*fp), win); +#else /* Is win one of our frames? */ f1 = x_any_window_to_frame (FRAME_X_DISPLAY_INFO (*fp), win); +#endif #ifdef USE_X_TOOLKIT /* If we end up with the menu bar window, say it's not
--- a/src/xterm.h Wed Sep 02 13:08:50 2009 +0000 +++ b/src/xterm.h Wed Sep 02 17:03:20 2009 +0000 @@ -378,7 +378,7 @@ #if defined (USE_X_TOOLKIT) || defined (USE_GTK) extern struct frame *x_any_window_to_frame P_ ((struct x_display_info *, int)); -extern struct frame *x_non_menubar_window_to_frame P_ ((struct x_display_info *, int)); +extern struct frame *x_menubar_window_to_frame P_ ((struct x_display_info *, int)); extern struct frame *x_top_window_to_frame P_ ((struct x_display_info *, int)); #endif