[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/src/xmenu.c
From: |
Jan Djärv |
Subject: |
[Emacs-diffs] Changes to emacs/src/xmenu.c |
Date: |
Sat, 13 Nov 2004 15:32:46 -0500 |
Index: emacs/src/xmenu.c
diff -c emacs/src/xmenu.c:1.267 emacs/src/xmenu.c:1.268
*** emacs/src/xmenu.c:1.267 Fri Nov 12 13:46:39 2004
--- emacs/src/xmenu.c Sat Nov 13 20:18:21 2004
***************
*** 288,294 ****
static Lisp_Object
unuse_menu_items (dummy)
! int dummy;
{
return menu_items_inuse = Qnil;
}
--- 288,294 ----
static Lisp_Object
unuse_menu_items (dummy)
! Lisp_Object dummy;
{
return menu_items_inuse = Qnil;
}
***************
*** 1173,1186 ****
#ifdef USE_X_TOOLKIT
- static Lisp_Object
- pop_down_menu (dummy)
- int dummy;
- {
- popup_activated_flag = 0;
- return Qnil;
- }
-
/* Loop in Xt until the menu pulldown or dialog popup has been
popped down (deactivated). This is used for x-popup-menu
and x-popup-dialog; it is not used for the menu bar.
--- 1173,1178 ----
***************
*** 1200,1208 ****
{
XEvent event;
- int specpdl_count = SPECPDL_INDEX ();
- record_unwind_protect (pop_down_menu, Qnil);
-
while (popup_activated_flag)
{
if (initial_event)
--- 1192,1197 ----
***************
*** 1252,1259 ****
x_dispatch_event (&event, event.xany.display);
}
-
- unbind_to (specpdl_count, Qnil);
}
#endif /* USE_X_TOOLKIT */
--- 1241,1246 ----
***************
*** 1261,1290 ****
#ifdef USE_GTK
/* Loop util popup_activated_flag is set to zero in a callback.
Used for popup menus and dialogs. */
- static GtkWidget *current_menu;
-
- static Lisp_Object
- pop_down_menu (dummy)
- int dummy;
- {
- if (current_menu)
- {
- gtk_widget_unmap (current_menu);
- current_menu = 0;
- popup_activated_flag = 0;
- }
- return Qnil;
- }
static void
popup_widget_loop (do_timers, widget)
int do_timers;
GtkWidget *widget;
{
- int specpdl_count = SPECPDL_INDEX ();
- current_menu = widget;
- record_unwind_protect (pop_down_menu, Qnil);
-
++popup_activated_flag;
/* Process events in the Gtk event loop until done. */
--- 1248,1259 ----
***************
*** 1293,1300 ****
if (do_timers) x_menu_wait_for_event (0);
gtk_main_iteration ();
}
-
- unbind_to (specpdl_count, Qnil);
}
#endif
--- 1262,1267 ----
***************
*** 2443,2448 ****
--- 2410,2432 ----
if (cb_data) menu_item_selection = (Lisp_Object *) cb_data->call_data;
}
+ static GtkWidget *current_menu;
+
+ static Lisp_Object
+ pop_down_menu (dummy)
+ Lisp_Object dummy;
+ {
+ popup_activated_flag = 0;
+ if (current_menu)
+ {
+ BLOCK_INPUT;
+ gtk_widget_destroy (current_menu);
+ UNBLOCK_INPUT;
+ current_menu = 0;
+ }
+ return Qnil;
+ }
+
/* Pop up the menu for frame F defined by FIRST_WV at X/Y and loop until the
menu pops down.
menu_item_selection will be set to the selection. */
***************
*** 2458,2463 ****
--- 2442,2448 ----
GtkWidget *menu;
GtkMenuPositionFunc pos_func = 0; /* Pop up at pointer. */
struct next_popup_x_y popup_x_y;
+ int specpdl_count = SPECPDL_INDEX ();
xg_crazy_callback_abort = 1;
menu = xg_create_widget ("popup", first_wv->name, f, first_wv,
***************
*** 2488,2500 ****
gtk_widget_show_all (menu);
gtk_menu_popup (GTK_MENU (menu), 0, 0, pos_func, &popup_x_y, i, 0);
/* Set this to one. popup_widget_loop increases it by one, so it becomes
two. show_help_echo uses this to detect popup menus. */
popup_activated_flag = 1;
/* Process events that apply to the menu. */
! popup_widget_loop (1, 0);
! gtk_widget_destroy (menu);
/* Must reset this manually because the button release event is not passed
to Emacs event loop. */
--- 2473,2488 ----
gtk_widget_show_all (menu);
gtk_menu_popup (GTK_MENU (menu), 0, 0, pos_func, &popup_x_y, i, 0);
+ current_menu = menu;
+ record_unwind_protect (pop_down_menu, Qnil);
+
/* Set this to one. popup_widget_loop increases it by one, so it becomes
two. show_help_echo uses this to detect popup menus. */
popup_activated_flag = 1;
/* Process events that apply to the menu. */
! popup_widget_loop (1, menu);
! unbind_to (specpdl_count, Qnil);
/* Must reset this manually because the button release event is not passed
to Emacs event loop. */
***************
*** 2522,2527 ****
--- 2510,2533 ----
menu_item_selection = (Lisp_Object *) client_data;
}
+ /* ARG is the LWLIB ID of the dialog box, represented
+ as a Lisp object as (HIGHPART . LOWPART). */
+
+ static Lisp_Object
+ pop_down_menu (arg)
+ Lisp_Object arg;
+ {
+ LWLIB_ID id = (XINT (XCAR (arg)) << 4 * sizeof (LWLIB_ID)
+ | XINT (XCDR (arg)));
+
+ BLOCK_INPUT;
+ lw_destroy_all_widgets (id);
+ UNBLOCK_INPUT;
+ popup_activated_flag = 0;
+
+ return Qnil;
+ }
+
/* Pop up the menu for frame F defined by FIRST_WV at X/Y and loop until the
menu pops down.
menu_item_selection will be set to the selection. */
***************
*** 2578,2592 ****
/* Display the menu. */
lw_popup_menu (menu, (XEvent *) &dummy);
popup_activated_flag = 1;
! /* Process events that apply to the menu. */
! popup_get_selection ((XEvent *) 0, FRAME_X_DISPLAY_INFO (f), menu_id, 1, 0);
! /* fp turned off the following statement and wrote a comment
! that it is unnecessary--that the menu has already disappeared.
! Nowadays the menu disappears ok, all right, but
! we need to delete the widgets or multiple ones will pile up. */
! lw_destroy_all_widgets (menu_id);
}
#endif /* not USE_GTK */
--- 2584,2602 ----
/* Display the menu. */
lw_popup_menu (menu, (XEvent *) &dummy);
popup_activated_flag = 1;
+
+ {
+ int fact = 4 * sizeof (LWLIB_ID);
+ int specpdl_count = SPECPDL_INDEX ();
+ record_unwind_protect (pop_down_menu,
+ Fcons (make_number (menu_id >> (fact)),
+ make_number (menu_id & ~(-1 << (fact)))));
! /* Process events that apply to the menu. */
! popup_get_selection ((XEvent *) 0, FRAME_X_DISPLAY_INFO (f), menu_id, 1,
0);
! unbind_to (specpdl_count, Qnil);
! }
}
#endif /* not USE_GTK */
***************
*** 2897,2909 ****
if (menu)
{
/* Display the menu. */
gtk_widget_show_all (menu);
/* Process events that apply to the menu. */
popup_widget_loop (1, menu);
! gtk_widget_destroy (menu);
}
}
--- 2907,2923 ----
if (menu)
{
+ int specpdl_count = SPECPDL_INDEX ();
+ current_menu = menu;
+ record_unwind_protect (pop_down_menu, Qnil);
+
/* Display the menu. */
gtk_widget_show_all (menu);
/* Process events that apply to the menu. */
popup_widget_loop (1, menu);
! unbind_to (specpdl_count, Qnil);
}
}
***************
*** 2926,2948 ****
}
- /* ARG is the LWLIB ID of the dialog box, represented
- as a Lisp object as (HIGHPART . LOWPART). */
-
- Lisp_Object
- xdialog_show_unwind (arg)
- Lisp_Object arg;
- {
- LWLIB_ID id = (XINT (XCAR (arg)) << 4 * sizeof (LWLIB_ID)
- | XINT (XCDR (arg)));
- BLOCK_INPUT;
- lw_destroy_all_widgets (id);
- UNBLOCK_INPUT;
- popup_activated_flag = 0;
- return Qnil;
- }
-
-
/* Pop up the dialog for frame F defined by FIRST_WV and loop until the
dialog pops down.
menu_item_selection will be set to the selection. */
--- 2940,2945 ----
***************
*** 2970,2976 ****
int fact = 4 * sizeof (LWLIB_ID);
/* xdialog_show_unwind is responsible for popping the dialog box down. */
! record_unwind_protect (xdialog_show_unwind,
Fcons (make_number (dialog_id >> (fact)),
make_number (dialog_id & ~(-1 << (fact)))));
--- 2967,2973 ----
int fact = 4 * sizeof (LWLIB_ID);
/* xdialog_show_unwind is responsible for popping the dialog box down. */
! record_unwind_protect (pop_down_menu,
Fcons (make_number (dialog_id >> (fact)),
make_number (dialog_id & ~(-1 << (fact)))));
***************
*** 3203,3208 ****
--- 3200,3242 ----
Qnil, menu_object, make_number (item), 1);
}
+ static XMenu *current_menu;
+
+ static Lisp_Object
+ pop_down_menu (frame)
+ Lisp_Object frame;
+ {
+ struct frame *f = XFRAME (frame);
+
+ BLOCK_INPUT;
+ if (current_menu)
+ {
+ #ifndef MSDOS
+ XUngrabPointer (FRAME_X_DISPLAY (f), CurrentTime);
+ XUngrabKeyboard (FRAME_X_DISPLAY (f), CurrentTime);
+ #endif
+ XMenuDestroy (FRAME_X_DISPLAY (f), current_menu);
+ current_menu = 0;
+ }
+
+ #ifdef HAVE_X_WINDOWS
+ /* Assume the mouse has moved out of the X window.
+ If it has actually moved in, we will get an EnterNotify. */
+ x_mouse_leave (FRAME_X_DISPLAY_INFO (f));
+
+ /* State that no mouse buttons are now held.
+ (The oldXMenu code doesn't track this info for us.)
+ That is not necessarily true, but the fiction leads to reasonable
+ results, and it is a pain to ask which are actually held now. */
+ FRAME_X_DISPLAY_INFO (f)->grabbed = 0;
+
+ #endif /* HAVE_X_WINDOWS */
+
+ UNBLOCK_INPUT;
+
+ return Qnil;
+ }
+
static Lisp_Object
xmenu_show (f, x, y, for_click, keymaps, title, error)
***************
*** 3216,3222 ****
Window root;
XMenu *menu;
int pane, selidx, lpane, status;
! Lisp_Object entry, pane_prefix;
char *datap;
int ulx, uly, width, height;
int dispwidth, dispheight;
--- 3250,3256 ----
Window root;
XMenu *menu;
int pane, selidx, lpane, status;
! Lisp_Object entry, pane_prefix, frame;
char *datap;
int ulx, uly, width, height;
int dispwidth, dispheight;
***************
*** 3224,3229 ****
--- 3258,3264 ----
int maxwidth;
int dummy_int;
unsigned int dummy_uint;
+ int specpdl_count = SPECPDL_INDEX ();
*error = 0;
if (menu_items_n_panes == 0)
***************
*** 3416,3435 ****
#ifndef MSDOS
XMenuActivateSetWaitFunction (x_menu_wait_for_event, FRAME_X_DISPLAY (f));
#endif
/* Help display under X won't work because XMenuActivate contains
a loop that doesn't give Emacs a chance to process it. */
menu_help_frame = f;
status = XMenuActivate (FRAME_X_DISPLAY (f), menu, &pane, &selidx,
! x, y, ButtonReleaseMask, &datap,
! menu_help_callback);
!
!
! #ifdef HAVE_X_WINDOWS
! /* Assume the mouse has moved out of the X window.
! If it has actually moved in, we will get an EnterNotify. */
! x_mouse_leave (FRAME_X_DISPLAY_INFO (f));
! #endif
switch (status)
{
--- 3451,3467 ----
#ifndef MSDOS
XMenuActivateSetWaitFunction (x_menu_wait_for_event, FRAME_X_DISPLAY (f));
#endif
+
+ XSETFRAME (frame, f);
+ record_unwind_protect (pop_down_menu, frame);
/* Help display under X won't work because XMenuActivate contains
a loop that doesn't give Emacs a chance to process it. */
menu_help_frame = f;
+ current_menu = menu;
status = XMenuActivate (FRAME_X_DISPLAY (f), menu, &pane, &selidx,
! x, y, ButtonReleaseMask, &datap,
! menu_help_callback);
switch (status)
{
***************
*** 3480,3494 ****
entry = Qnil;
break;
}
- XMenuDestroy (FRAME_X_DISPLAY (f), menu);
! #ifdef HAVE_X_WINDOWS
! /* State that no mouse buttons are now held.
! (The oldXMenu code doesn't track this info for us.)
! That is not necessarily true, but the fiction leads to reasonable
! results, and it is a pain to ask which are actually held now. */
! FRAME_X_DISPLAY_INFO (f)->grabbed = 0;
! #endif
return entry;
}
--- 3512,3519 ----
entry = Qnil;
break;
}
! unbind_to (specpdl_count, Qnil);
return entry;
}
- [Emacs-diffs] Changes to emacs/src/xmenu.c, Richard M . Stallman, 2004/11/04
- [Emacs-diffs] Changes to emacs/src/xmenu.c, Jan Djärv, 2004/11/06
- [Emacs-diffs] Changes to emacs/src/xmenu.c, Jan Djärv, 2004/11/12
- [Emacs-diffs] Changes to emacs/src/xmenu.c, Jan Djärv, 2004/11/12
- [Emacs-diffs] Changes to emacs/src/xmenu.c, Jan Djärv, 2004/11/12
- [Emacs-diffs] Changes to emacs/src/xmenu.c, Kim F . Storm, 2004/11/12
- [Emacs-diffs] Changes to emacs/src/xmenu.c,
Jan Djärv <=
- [Emacs-diffs] Changes to emacs/src/xmenu.c, Jan Djärv, 2004/11/13
- [Emacs-diffs] Changes to emacs/src/xmenu.c, Jan Djärv, 2004/11/14
- [Emacs-diffs] Changes to emacs/src/xmenu.c, Jan Djärv, 2004/11/14
- [Emacs-diffs] Changes to emacs/src/xmenu.c, Jan Djärv, 2004/11/16