diff options
Diffstat (limited to 'lwlib')
| -rw-r--r-- | lwlib/ChangeLog | 16 | ||||
| -rw-r--r-- | lwlib/lwlib-Xlw.c | 27 | ||||
| -rw-r--r-- | lwlib/xlwmenu.c | 31 | ||||
| -rw-r--r-- | lwlib/xlwmenu.h | 2 | ||||
| -rw-r--r-- | lwlib/xlwmenuP.h | 2 |
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 @@ | |||
| 1 | 2007-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 | |||
| 1 | 2006-10-30 Chong Yidong <cyd@stupidchicken.com> | 17 | 2006-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 | ||
| 86 | static void | 86 | static void |
| 87 | enter_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 | |||
| 95 | static void | ||
| 96 | leave_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 | |||
| 105 | static void | ||
| 87 | pre_hook (w, client_data, call_data) | 106 | pre_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 | ||
| 1458 | static Boolean | 1471 | static 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; |