* Emacs should properly render dynamically generated menus. Patch: fix-dynamic-menus.diff Originally-reported-by: Baylis Shanks Date: Sat, 10 Oct 2009 22:15:05 UTC Added-by: Rob Browning Status: incorporated upstream Bug: 550541 This Debian patch is taken from this upstream commit: commit 3715ffe3e3b2c64d113bf26d94aab559f8559e83 Author: Jan Djärv Date: Wed Sep 2 17:03:20 2009 +0000 Index: b/src/ChangeLog =================================================================== --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,19 @@ +2009-09-02 Jan Djärv + + * 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-07-29 Chong Yidong * Version 23.1 released. Index: b/src/xfns.c =================================================================== --- a/src/xfns.c +++ b/src/xfns.c @@ -374,10 +374,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) @@ -398,54 +395,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 * @@ -473,15 +422,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 Index: b/src/xterm.c =================================================================== --- a/src/xterm.c +++ b/src/xterm.c @@ -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 @@ -3915,7 +3908,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; @@ -3932,8 +3932,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 Index: b/src/xterm.h =================================================================== --- a/src/xterm.h +++ b/src/xterm.h @@ -374,7 +374,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