From 0bebc5a792342d090f02ddd56df8d40b0da48219 Mon Sep 17 00:00:00 2001 From: id Date: Thu, 22 Apr 1999 15:21:29 +0000 Subject: [PATCH] menu jump back delay --- src/event.c | 3 ++- src/menu.c | 35 +++++++++++++++++++++++++++++++++++ src/menu.h | 2 ++ src/screen.h | 1 + src/wconfig.h.in | 1 + 5 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/event.c b/src/event.c index 0138c92d..1a2adbe8 100644 --- a/src/event.c +++ b/src/event.c @@ -1744,7 +1744,8 @@ handleMotionNotify(XEvent *event) WScreen *scr = wScreenForRootWindow(event->xmotion.root); if (wPreferences.scrollable_menus) { - if (event->xmotion.x_root <= 1 || + if (scr->flags.jump_back_pending || + event->xmotion.x_root <= 1 || event->xmotion.x_root >= (scr->scr_width - 2) || event->xmotion.y_root <= 1 || event->xmotion.y_root >= (scr->scr_height - 2)) { diff --git a/src/menu.c b/src/menu.c index 896e1edc..f822ae7e 100644 --- a/src/menu.c +++ b/src/menu.c @@ -1740,6 +1740,23 @@ isPointNearBoder(WMenu *menu, int x, int y) return flag; } + +typedef struct _delay { + WWindow *wwin; + WMenu *menu; + int ox,oy; +} _delay; + + +static void +_leaving(_delay *dl) +{ + wMenuMove(dl->menu, dl->ox, dl->oy, True); + dl->menu->jump_back=NULL; + dl->menu->menu->screen_ptr->flags.jump_back_pending = 0; + free(dl); +} + void wMenuScroll(WMenu *menu, XEvent *event) @@ -1756,6 +1773,10 @@ wMenuScroll(WMenu *menu, XEvent *event) #ifdef DEBUG puts("Entering menu Scroll"); #endif + + if (omenu->jump_back) + WMDeleteTimerWithClientData(omenu->jump_back); + if ((/*omenu->flags.buttoned &&*/ !wPreferences.wrap_menus) || omenu->flags.app_menu) { @@ -1842,6 +1863,20 @@ wMenuScroll(WMenu *menu, XEvent *event) if (jump_back) wMenuMove(omenu, old_frame_x, old_frame_y, True); + if (jump_back) { + _delay *delayer; + if (!omenu->jump_back) { + delayer=wmalloc(sizeof(_delay)); + delayer->menu=omenu; + delayer->ox=old_frame_x; + delayer->oy=old_frame_y; + omenu->jump_back=delayer; + scr->flags.jump_back_pending = 1; + } + else delayer = omenu->jump_back; + WMAddTimerHandler(MENU_JUMP_BACK_DELAY,(WMCallback*)_leaving, delayer); + } + #ifdef DEBUG puts("Leaving menu Scroll"); diff --git a/src/menu.h b/src/menu.h index 415ea78a..81e103dd 100644 --- a/src/menu.h +++ b/src/menu.h @@ -78,6 +78,8 @@ typedef struct WMenu { WMHandlerID timer; /* timer for the autoscroll */ + void *jump_back; /* jump back data */ + /* to be called when some entry is edited */ void (*on_edit)(struct WMenu *menu, struct WMenuEntry *entry); /* to be called when destroyed */ diff --git a/src/screen.h b/src/screen.h index e9befa3b..42f2d746 100644 --- a/src/screen.h +++ b/src/screen.h @@ -315,6 +315,7 @@ typedef struct _WScreen { /* some client has issued a WM_COLORMAP_NOTIFY */ unsigned int colormap_stuff_blocked:1; unsigned int doing_alt_tab:1; + unsigned int jump_back_pending:1; #ifdef KWM_HINTS unsigned int kwm_syncing_name:1; unsigned int kwm_syncing_count:1; diff --git a/src/wconfig.h.in b/src/wconfig.h.in index 74c53a76..08d960c3 100644 --- a/src/wconfig.h.in +++ b/src/wconfig.h.in @@ -400,6 +400,7 @@ #define MENU_SCROLL_STEPS_U 1 #define MENU_SCROLL_DELAY_U 8 +#define MENU_JUMP_BACK_DELAY 0 /* shade animation */ #define SHADE_STEPS_UF 5 -- 2.11.4.GIT