aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/xmenu.c43
1 files changed, 42 insertions, 1 deletions
diff --git a/src/xmenu.c b/src/xmenu.c
index 498eb501fe2..027b4f7f68c 100644
--- a/src/xmenu.c
+++ b/src/xmenu.c
@@ -859,9 +859,10 @@ xmenu_show (f, val, x, y, menubarp, vw)
859 int menubarp; 859 int menubarp;
860 widget_value *vw; 860 widget_value *vw;
861{ 861{
862 int menu_id, id = (int)f; 862 int menu_id, item_length;
863 Lisp_Object selection; 863 Lisp_Object selection;
864 Widget menu; 864 Widget menu;
865 XlwMenuWidget menuw = (XlwMenuWidget) f->display.x->menubar_widget;
865 866
866 /* 867 /*
867 * Define and allocate a foreign event queue to hold events 868 * Define and allocate a foreign event queue to hold events
@@ -915,6 +916,14 @@ xmenu_show (f, val, x, y, menubarp, vw)
915 pop_up_menu (mw, &dummy); 916 pop_up_menu (mw, &dummy);
916 } 917 }
917 918
919 if (menubarp)
920 {
921 item_length = (x + string_width (menuw, vw->name)
922 + (2 * (menuw->menu.horizontal_spacing
923 + menuw->menu.shadow_thickness))
924 - 4);
925 }
926
918 /* Enters XEvent loop */ 927 /* Enters XEvent loop */
919 while (1) 928 while (1)
920 { 929 {
@@ -929,6 +938,38 @@ xmenu_show (f, val, x, y, menubarp, vw)
929 else 938 else
930 if (event.type == Expose) 939 if (event.type == Expose)
931 process_expose_from_menu (event); 940 process_expose_from_menu (event);
941 else
942 if (event.type == MotionNotify
943 && menubarp
944 && ((event.xmotion.y_root
945 >= (f->display.x->widget->core.y
946 + f->display.x->widget->core.border_width))
947 && (event.xmotion.y_root
948 < (f->display.x->widget->core.y
949 + f->display.x->widget->core.border_width
950 + f->display.x->menubar_widget->core.height)))
951 && (event.xmotion.x_root >= item_length
952 || event.xmotion.x_root < (x - 4)))
953 {
954 BLOCK_INPUT;
955 XtUngrabPointer ((Widget)
956 ((XlwMenuWidget)
957 ((CompositeWidget)menu)->composite.children[0]),
958 event.xbutton.time);
959 lw_destroy_all_widgets (menu_id);
960 UNBLOCK_INPUT;
961
962 event.type = ButtonPress;
963 event.xbutton.time = CurrentTime;
964 event.xbutton.button = Button1;
965 event.xbutton.window = XtWindow (f->display.x->menubar_widget);
966 event.xbutton.x = (event.xbutton.x_root
967 - (f->display.x->widget->core.x
968 + f->display.x->widget->core.border_width));
969 XPutBackEvent (XDISPLAY &event);
970 break;
971 }
972
932 XtDispatchEvent (&event); 973 XtDispatchEvent (&event);
933 feq_tmp = (XMEventQue *) malloc (sizeof (XMEventQue)); 974 feq_tmp = (XMEventQue *) malloc (sizeof (XMEventQue));
934 975