diff options
| author | Jan Djärv | 2007-01-01 15:20:11 +0000 |
|---|---|---|
| committer | Jan Djärv | 2007-01-01 15:20:11 +0000 |
| commit | 1ecd508641172d55c3dbb5dbbd287316b858d7c5 (patch) | |
| tree | 545e9dde62f83203bf69bd907bf2042471f46a94 | |
| parent | 36bce9a9b28620e630bdf011e9bcaf3bd265eca7 (diff) | |
| download | emacs-1ecd508641172d55c3dbb5dbbd287316b858d7c5.tar.gz emacs-1ecd508641172d55c3dbb5dbbd287316b858d7c5.zip | |
(xlwMenuResources): Add XtNleaveCallback, XtNenterCallback.
(display_menu, map_event_to_widget_value): Generate enter and
leave callbacks.
(pop_up_menu): Initialize mw->menu.inside_entry.
| -rw-r--r-- | lwlib/xlwmenu.c | 31 |
1 files changed, 28 insertions, 3 deletions
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))) |