aboutsummaryrefslogtreecommitdiffstats
path: root/lwlib
diff options
context:
space:
mode:
Diffstat (limited to 'lwlib')
-rw-r--r--lwlib/ChangeLog16
-rw-r--r--lwlib/lwlib-Xlw.c27
-rw-r--r--lwlib/xlwmenu.c31
-rw-r--r--lwlib/xlwmenu.h2
-rw-r--r--lwlib/xlwmenuP.h2
5 files changed, 71 insertions, 7 deletions
diff --git a/lwlib/ChangeLog b/lwlib/ChangeLog
index 904d8eadf05..d3e8c2eb4c3 100644
--- a/lwlib/ChangeLog
+++ b/lwlib/ChangeLog
@@ -1,3 +1,19 @@
12007-01-01 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
2
3 * xlwmenu.c (xlwMenuResources): Add XtNleaveCallback, XtNenterCallback.
4 (display_menu, map_event_to_widget_value): Generate enter and
5 leave callbacks.
6 (pop_up_menu): Initialize mw->menu.inside_entry.
7
8 * xlwmenu.h (XtNleaveCallback, XtNenterCallback): New strings.
9
10 * xlwmenuP.h (_XlwMenu_part): Add enter/leave callbacks and
11 inside_entry.
12
13 * lwlib-Xlw.c (enter_hook, leave_hook): New functions
14 (xlw_create_menubar, xlw_create_popup_menu): Connect XtNenter/leave
15 to enter/leave_hook.
16
12006-10-30 Chong Yidong <cyd@stupidchicken.com> 172006-10-30 Chong Yidong <cyd@stupidchicken.com>
2 18
3 * Makefile.in (lwlib-utils.o): Use CPPFLAGS. 19 * Makefile.in (lwlib-utils.o): Use CPPFLAGS.
diff --git a/lwlib/lwlib-Xlw.c b/lwlib/lwlib-Xlw.c
index 4799b1dbd9d..dd366e4cca1 100644
--- a/lwlib/lwlib-Xlw.c
+++ b/lwlib/lwlib-Xlw.c
@@ -84,6 +84,25 @@ highlight_hook (w, client_data, call_data)
84} 84}
85 85
86static void 86static void
87enter_hook (w, client_data, call_data)
88 Widget w;
89 XtPointer client_data;
90 XtPointer call_data;
91{
92 highlight_hook (w, client_data, call_data);
93}
94
95static void
96leave_hook (w, client_data, call_data)
97 Widget w;
98 XtPointer client_data;
99 XtPointer call_data;
100{
101 highlight_hook (w, client_data, NULL);
102}
103
104
105static void
87pre_hook (w, client_data, call_data) 106pre_hook (w, client_data, call_data)
88 Widget w; 107 Widget w;
89 XtPointer client_data; 108 XtPointer client_data;
@@ -152,8 +171,8 @@ xlw_create_menubar (instance)
152 171
153 XtAddCallback (widget, XtNopen, pre_hook, (XtPointer)instance); 172 XtAddCallback (widget, XtNopen, pre_hook, (XtPointer)instance);
154 XtAddCallback (widget, XtNselect, pick_hook, (XtPointer)instance); 173 XtAddCallback (widget, XtNselect, pick_hook, (XtPointer)instance);
155 XtAddCallback (widget, XtNhighlightCallback, highlight_hook, 174 XtAddCallback (widget, XtNleaveCallback, leave_hook, (XtPointer)instance);
156 (XtPointer)instance); 175 XtAddCallback (widget, XtNenterCallback, enter_hook, (XtPointer)instance);
157 return widget; 176 return widget;
158} 177}
159 178
@@ -179,8 +198,8 @@ xlw_create_popup_menu (instance)
179 popup_shell, al, ac); 198 popup_shell, al, ac);
180 199
181 XtAddCallback (widget, XtNselect, pick_hook, (XtPointer)instance); 200 XtAddCallback (widget, XtNselect, pick_hook, (XtPointer)instance);
182 XtAddCallback (widget, XtNhighlightCallback, highlight_hook, 201 XtAddCallback (widget, XtNleaveCallback, leave_hook, (XtPointer)instance);
183 (XtPointer)instance); 202 XtAddCallback (widget, XtNenterCallback, enter_hook, (XtPointer)instance);
184 203
185 return popup_shell; 204 return popup_shell;
186} 205}
diff --git a/lwlib/xlwmenu.c b/lwlib/xlwmenu.c
index 77cc50e9d7a..fc73746dc86 100644
--- a/lwlib/xlwmenu.c
+++ b/lwlib/xlwmenu.c
@@ -161,6 +161,10 @@ xlwMenuResources[] =
161 offset(menu.select), XtRCallback, (XtPointer)NULL}, 161 offset(menu.select), XtRCallback, (XtPointer)NULL},
162 {XtNhighlightCallback, XtCCallback, XtRCallback, sizeof(XtPointer), 162 {XtNhighlightCallback, XtCCallback, XtRCallback, sizeof(XtPointer),
163 offset(menu.highlight), XtRCallback, (XtPointer)NULL}, 163 offset(menu.highlight), XtRCallback, (XtPointer)NULL},
164 {XtNenterCallback, XtCCallback, XtRCallback, sizeof(XtPointer),
165 offset(menu.enter), XtRCallback, (XtPointer)NULL},
166 {XtNleaveCallback, XtCCallback, XtRCallback, sizeof(XtPointer),
167 offset(menu.leave), XtRCallback, (XtPointer)NULL},
164 {XtNmenu, XtCMenu, XtRPointer, sizeof(XtPointer), 168 {XtNmenu, XtCMenu, XtRPointer, sizeof(XtPointer),
165 offset(menu.contents), XtRImmediate, (XtPointer)NULL}, 169 offset(menu.contents), XtRImmediate, (XtPointer)NULL},
166 {XtNcursor, XtCCursor, XtRCursor, sizeof(Cursor), 170 {XtNcursor, XtCCursor, XtRCursor, sizeof(Cursor),
@@ -1186,8 +1190,17 @@ display_menu (mw, level, just_compute_p, highlighted_pos, hit, hit_return,
1186 { 1190 {
1187 if (val->enabled) 1191 if (val->enabled)
1188 *hit_return = val; 1192 *hit_return = val;
1189 else 1193 else
1190 no_return = 1; 1194 no_return = 1;
1195 if (mw->menu.inside_entry != val)
1196 {
1197 if (mw->menu.inside_entry)
1198 XtCallCallbackList ((Widget)mw, mw->menu.leave,
1199 (XtPointer) mw->menu.inside_entry);
1200 mw->menu.inside_entry = val;
1201 XtCallCallbackList ((Widget)mw, mw->menu.enter,
1202 (XtPointer) mw->menu.inside_entry);
1203 }
1191 } 1204 }
1192 1205
1193 if (horizontal_p) 1206 if (horizontal_p)
@@ -1452,7 +1465,7 @@ motion_event_is_in_menu (mw, ev, level, relative_pos)
1452 relative_pos->x = ev->x_root - x; 1465 relative_pos->x = ev->x_root - x;
1453 relative_pos->y = ev->y_root - y; 1466 relative_pos->y = ev->y_root - y;
1454 return (x - shadow < ev->x_root && ev->x_root < x + ws->width 1467 return (x - shadow < ev->x_root && ev->x_root < x + ws->width
1455 && y - shadow < ev->y_root && ev->y_root < y + ws->height); 1468 && y - shadow < ev->y_root && ev->y_root < y + ws->height);
1456} 1469}
1457 1470
1458static Boolean 1471static Boolean
@@ -1465,6 +1478,7 @@ map_event_to_widget_value (mw, ev, val, level)
1465 int i; 1478 int i;
1466 XPoint relative_pos; 1479 XPoint relative_pos;
1467 window_state* ws; 1480 window_state* ws;
1481 int inside = 0;
1468 1482
1469 *val = NULL; 1483 *val = NULL;
1470 1484
@@ -1474,6 +1488,7 @@ map_event_to_widget_value (mw, ev, val, level)
1474 ws = &mw->menu.windows [i]; 1488 ws = &mw->menu.windows [i];
1475 if (ws && motion_event_is_in_menu (mw, ev, i, &relative_pos)) 1489 if (ws && motion_event_is_in_menu (mw, ev, i, &relative_pos))
1476 { 1490 {
1491 inside = 1;
1477 display_menu (mw, i, True, NULL, &relative_pos, val, NULL, NULL); 1492 display_menu (mw, i, True, NULL, &relative_pos, val, NULL, NULL);
1478 1493
1479 if (*val) 1494 if (*val)
@@ -1483,6 +1498,15 @@ map_event_to_widget_value (mw, ev, val, level)
1483 } 1498 }
1484 } 1499 }
1485 } 1500 }
1501
1502 if (!inside)
1503 {
1504 if (mw->menu.inside_entry != NULL)
1505 XtCallCallbackList ((Widget)mw, mw->menu.leave,
1506 (XtPointer) mw->menu.inside_entry);
1507 mw->menu.inside_entry = NULL;
1508 }
1509
1486 return False; 1510 return False;
1487} 1511}
1488 1512
@@ -2416,6 +2440,7 @@ pop_up_menu (mw, event)
2416 2440
2417 next_release_must_exit = 0; 2441 next_release_must_exit = 0;
2418 2442
2443 mw->menu.inside_entry = NULL;
2419 XtCallCallbackList ((Widget)mw, mw->menu.open, NULL); 2444 XtCallCallbackList ((Widget)mw, mw->menu.open, NULL);
2420 2445
2421 if (XtIsShell (XtParent ((Widget)mw))) 2446 if (XtIsShell (XtParent ((Widget)mw)))
diff --git a/lwlib/xlwmenu.h b/lwlib/xlwmenu.h
index fa5dc887330..9b7a6b099db 100644
--- a/lwlib/xlwmenu.h
+++ b/lwlib/xlwmenu.h
@@ -44,6 +44,8 @@ Boston, MA 02110-1301, USA. */
44#define XtNopen "open" 44#define XtNopen "open"
45#define XtNselect "select" 45#define XtNselect "select"
46#define XtNhighlightCallback "highlightCallback" 46#define XtNhighlightCallback "highlightCallback"
47#define XtNenterCallback "enterCallback"
48#define XtNleaveCallback "leaveCallback"
47#define XtNmenuBorderWidth "menuBorderWidth" 49#define XtNmenuBorderWidth "menuBorderWidth"
48#define XtNhorizontal "horizontal" 50#define XtNhorizontal "horizontal"
49#define XtCHorizontal "Horizontal" 51#define XtCHorizontal "Horizontal"
diff --git a/lwlib/xlwmenuP.h b/lwlib/xlwmenuP.h
index ce170d7bfe4..b90bc3da827 100644
--- a/lwlib/xlwmenuP.h
+++ b/lwlib/xlwmenuP.h
@@ -64,6 +64,7 @@ typedef struct _XlwMenu_part
64 Cursor cursor_shape; 64 Cursor cursor_shape;
65 XtCallbackList open; 65 XtCallbackList open;
66 XtCallbackList select, highlight; 66 XtCallbackList select, highlight;
67 XtCallbackList enter, leave;
67 widget_value* contents; 68 widget_value* contents;
68 int horizontal; 69 int horizontal;
69 70
@@ -76,6 +77,7 @@ typedef struct _XlwMenu_part
76 int old_depth; 77 int old_depth;
77 widget_value** old_stack; 78 widget_value** old_stack;
78 int old_stack_length; 79 int old_stack_length;
80 widget_value* inside_entry;
79 81
80 /* New state after the user moved */ 82 /* New state after the user moved */
81 int new_depth; 83 int new_depth;