diff -Nru emacs23-23.2+1/debian/changelog emacs23-23.2+1/debian/changelog --- emacs23-23.2+1/debian/changelog 2010-11-04 06:19:26.000000000 -0400 +++ emacs23-23.2+1/debian/changelog 2010-11-04 15:56:13.000000000 -0400 @@ -1,3 +1,10 @@ +emacs23 (23.2+1-4ubuntu2) natty; urgency=low + + * debian/patches/fix-menus.diff: Fix http://debbugs.gnu.org/6499 + (Emacs gets stuck waiting for menu input). (LP: #569914) + + -- Anders Kaseorg Thu, 04 Nov 2010 15:56:10 -0400 + emacs23 (23.2+1-4ubuntu1) natty; urgency=low [ Michael W. Olson (GNU address) ] diff -Nru emacs23-23.2+1/debian/patches/fix-menus.diff emacs23-23.2+1/debian/patches/fix-menus.diff --- emacs23-23.2+1/debian/patches/fix-menus.diff 1969-12-31 19:00:00.000000000 -0500 +++ emacs23-23.2+1/debian/patches/fix-menus.diff 2010-11-04 15:53:37.000000000 -0400 @@ -0,0 +1,175 @@ +From: Jan D +Subject: [PATCH] Fix menus as per bug 6499 and 6608. +Bug: http://debbugs.gnu.org/6499 +Origin: upstream, http://repo.or.cz/w/emacs.git/commitdiff/779d00723cf772d240f3c5c2facd214a776a424e, http://repo.or.cz/w/emacs.git/commitdiff/34ec65ff9f71734511755226586e674b39d49768, http://repo.or.cz/w/emacs.git/commitdiff/d1f48a4dc26d6bb94ed553a3dacbdfda9821b45e +Last-Update: 2010-10-14 +Applied-Upstream: 23.3 + +* gtkutil.c (xg_event_is_for_menubar): New function (Bug#6499). + +* gtkutil.h (xg_event_is_for_menubar): Declare. + +* xfns.c (x_menubar_window_to_frame): Take XEvent as second parameter +instead of Window. Call xg_event_is_for_menubar when +USE_GTK (Bug#6499). + +* xterm.c (handle_one_xevent): Pass event to x_menubar_window_to_frame. + +* xterm.h (x_menubar_window_to_frame): Second parameter is XEvent*. + +* gtkutil.c (xg_event_is_for_menubar): Also check that event window +is related to the menu bar (Bug#6499). +--- + src/gtkutil.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ + src/gtkutil.h | 2 ++ + src/xfns.c | 21 ++++++--------------- + src/xterm.c | 2 +- + src/xterm.h | 3 ++- + 5 files changed, 60 insertions(+), 17 deletions(-) + +diff --git a/src/gtkutil.c b/src/gtkutil.c +index 2764382..1a90aab 100644 +--- a/src/gtkutil.c ++++ b/src/gtkutil.c +@@ -2990,6 +2990,55 @@ free_frame_menubar (f) + } + } + ++int ++xg_event_is_for_menubar (FRAME_PTR f, XEvent *event) ++{ ++ struct x_output *x = f->output_data.x; ++ GList *iter; ++ GdkRectangle rec; ++ GList *list; ++ GdkDisplay *gdpy; ++ GdkWindow *gw; ++ GdkEvent gevent; ++ GtkWidget *gwdesc; ++ ++ if (! x->menubar_widget) return 0; ++ ++ if (! (event->xbutton.x >= 0 ++ && event->xbutton.x < FRAME_PIXEL_WIDTH (f) ++ && event->xbutton.y >= 0 ++ && event->xbutton.y < f->output_data.x->menubar_height ++ && event->xbutton.same_screen)) ++ return 0; ++ ++ gdpy = gdk_x11_lookup_xdisplay (FRAME_X_DISPLAY (f)); ++ gw = gdk_xid_table_lookup_for_display (gdpy, event->xbutton.window); ++ if (! gw) return 0; ++ gevent.any.window = gw; ++ gwdesc = gtk_get_event_widget (&gevent); ++ if (! gwdesc) return 0; ++ if (! GTK_IS_MENU_BAR (gwdesc) ++ && ! GTK_IS_MENU_ITEM (gwdesc) ++ && ! gtk_widget_is_ancestor (x->menubar_widget, gwdesc)) ++ return 0; ++ ++ list = gtk_container_get_children (GTK_CONTAINER (x->menubar_widget)); ++ if (! list) return 0; ++ rec.x = event->xbutton.x; ++ rec.y = event->xbutton.y; ++ rec.width = 1; ++ rec.height = 1; ++ ++ for (iter = list ; iter; iter = g_list_next (iter)) ++ { ++ GtkWidget *w = GTK_WIDGET (iter->data); ++ if (GTK_WIDGET_MAPPED (w) && gtk_widget_intersect (w, &rec, NULL)) ++ break; ++ } ++ g_list_free (list); ++ return iter == 0 ? 0 : 1; ++} ++ + + + /*********************************************************************** +diff --git a/src/gtkutil.h b/src/gtkutil.h +index 602228f..7c1e09a 100644 +--- a/src/gtkutil.h ++++ b/src/gtkutil.h +@@ -154,6 +154,8 @@ extern void xg_modify_menubar_widgets P_ ((GtkWidget *menubar, + + extern int xg_update_frame_menubar P_ ((FRAME_PTR f)); + ++extern int xg_event_is_for_menubar P_ ((FRAME_PTR f, XEvent *event)); ++ + extern int xg_have_tear_offs P_ ((void)); + + extern int xg_get_scroll_id_for_window P_ ((Display *dpy, Window wid)); +diff --git a/src/xfns.c b/src/xfns.c +index 6d04170..be21046 100644 +--- a/src/xfns.c ++++ b/src/xfns.c +@@ -402,10 +402,11 @@ x_any_window_to_frame (dpyinfo, wdesc) + /* Likewise, but consider only the menu bar widget. */ + + struct frame * +-x_menubar_window_to_frame (dpyinfo, wdesc) ++x_menubar_window_to_frame (dpyinfo, event) + struct x_display_info *dpyinfo; +- int wdesc; ++ XEvent *event; + { ++ Window wdesc = event->xany.window; + Lisp_Object tail, frame; + struct frame *f; + struct x_output *x; +@@ -421,21 +422,11 @@ x_menubar_window_to_frame (dpyinfo, wdesc) + if (!FRAME_X_P (f) || FRAME_X_DISPLAY_INFO (f) != dpyinfo) + continue; + x = f->output_data.x; +- /* Match if the window is this frame's menubar. */ + #ifdef USE_GTK +- if (x->menubar_widget) +- { +- GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc); +- +- /* 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_is_ancestor (x->menubar_widget, gwdesc) +- || gtk_widget_is_ancestor (gwdesc, x->menubar_widget))) +- return f; +- } ++ if (x->menubar_widget && xg_event_is_for_menubar (f, event)) ++ return f; + #else ++ /* Match if the window is this frame's menubar. */ + if (x->menubar_widget + && lw_window_is_in_menubar (wdesc, x->menubar_widget)) + return f; +diff --git a/src/xterm.c b/src/xterm.c +index 6994068..fb56f53 100644 +--- a/src/xterm.c ++++ b/src/xterm.c +@@ -6966,7 +6966,7 @@ handle_one_xevent (dpyinfo, eventp, finish, hold_quit) + f->mouse_moved = 0; + + #if defined (USE_X_TOOLKIT) || defined (USE_GTK) +- f = x_menubar_window_to_frame (dpyinfo, event.xbutton.window); ++ f = x_menubar_window_to_frame (dpyinfo, &event); + /* For a down-event in the menu bar, + don't pass it to Xt right now. + Instead, save it away +diff --git a/src/xterm.h b/src/xterm.h +index a766f86..c8601b8 100644 +--- a/src/xterm.h ++++ b/src/xterm.h +@@ -383,7 +383,8 @@ extern void check_x P_ ((void)); + extern struct frame *x_window_to_frame P_ ((struct x_display_info *, int)); + + extern struct frame *x_any_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_menubar_window_to_frame P_ ((struct x_display_info *, ++ XEvent *)); + extern struct frame *x_top_window_to_frame P_ ((struct x_display_info *, int)); + + #if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK) +-- +1.7.3.1 + diff -Nru emacs23-23.2+1/debian/patches/series emacs23-23.2+1/debian/patches/series --- emacs23-23.2+1/debian/patches/series 2010-11-04 06:17:41.000000000 -0400 +++ emacs23-23.2+1/debian/patches/series 2010-11-04 15:55:55.000000000 -0400 @@ -12,3 +12,4 @@ fix-gnu-kfreebsd-startup.diff fix-decimal-point-in-font-size.diff fix-ftbfs-xft-fontconfig.diff +fix-menus.diff