diff --git a/control.c b/control.c index ecd3503..727658e 100644 --- a/control.c +++ b/control.c @@ -384,6 +384,14 @@ redraw: control_expose(window, labels, &(SuwaButton){0}); } +void reset_mouse_hover(SuwaWindow *window, CtrlLabels *labels) { + if (!lasthover) return; + lasthover->hovered = 0; + lasthover = NULL; + window->event = (XEvent){.type = Expose}; + control_expose(window, labels, &(SuwaButton){0}); +} + void handle_mouse_hover(SuwaWindow *window, CtrlLabels *labels, int mx, int my) { SuwaButton *btn = find_button_at(window, mx, my); if (!btn) return; diff --git a/control.h b/control.h index bf4c904..26d7e44 100644 --- a/control.h +++ b/control.h @@ -47,4 +47,5 @@ void control_expose(SuwaWindow *window, CtrlLabels *labels, SuwaButton *button); void handle_button_press(SuwaWindow *window, CtrlLabels *labels, int mx, int my); void handle_button_release(SuwaWindow *window, CtrlLabels *labels, int mx, int my); void handle_key_press(SuwaWindow *window, CtrlLabels *labels); +void reset_mouse_hover(SuwaWindow *window, CtrlLabels *labels); void handle_mouse_hover(SuwaWindow *window, CtrlLabels *labels, int mx, int my); diff --git a/include/suwaui.h b/include/suwaui.h index b694580..0e3f8bd 100644 --- a/include/suwaui.h +++ b/include/suwaui.h @@ -334,6 +334,8 @@ __attribute__((unused)) static SuwaWindow suwaui_create_window(int x, int y, int | KeyPressMask | PointerMotionMask | Button1MotionMask + | EnterWindowMask + | LeaveWindowMask // | StructureNotifyMask ); diff --git a/main.c b/main.c index 41bda4a..9e57b0c 100644 --- a/main.c +++ b/main.c @@ -113,7 +113,10 @@ int main() { case MotionNotify: Time now = window.event.xmotion.time; if (now - lasthovertime < 40) break; - lasthovertime = now; + if (now - lasthovertime > 80) { + reset_mouse_hover(&window, &lbl); + lasthovertime = now; + } Window root, child; int root_x, root_y, win_x, win_y; @@ -121,9 +124,14 @@ int main() { XQueryPointer(window.display, window.xwindow, &root, &child, &root_x, &root_y, &win_x, &win_y, &mask); - if (window.event.xmotion.state == 0) break; + if (window.event.xmotion.state == 0) { + break; + } handle_mouse_hover(&window, &lbl, win_x, win_y); break; + case LeaveNotify: + reset_mouse_hover(&window, &lbl); + break; case ClientMessage: // WM_DELETE_WINDOW break;