X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=dca615df8003451e07720631c1ad2c4550e284ef;hb=1ef0d8eb53fcae52afbae74310fbef0cac729951;hp=1b3c1c23e66e86f054ddda8d7f8c0d4cc269ffec;hpb=c0333e9452330c6b7b44aa81bbccc7460fd50e14;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index 1b3c1c23..dca615df 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -31,6 +31,7 @@ #include "frame.h" #include "grab.h" #include "menu.h" +#include "prompt.h" #include "menuframe.h" #include "keyboard.h" #include "modkeys.h" @@ -88,6 +89,7 @@ static void event_process(const XEvent *e, gpointer data); static void event_handle_root(XEvent *e); static gboolean event_handle_menu_keyboard(XEvent *e); static gboolean event_handle_menu(XEvent *e); +static gboolean event_handle_prompt(ObPrompt *p, XEvent *e); static void event_handle_dock(ObDock *s, XEvent *e); static void event_handle_dockapp(ObDockApp *app, XEvent *e); static void event_handle_client(ObClient *c, XEvent *e); @@ -459,6 +461,7 @@ static void event_process(const XEvent *ec, gpointer data) ObWindow *obwin = NULL; XEvent ee, *e; ObEventData *ed = data; + ObPrompt *prompt = NULL; /* make a copy we can mangle */ ee = *ec; @@ -475,6 +478,8 @@ static void event_process(const XEvent *ec, gpointer data) break; case Window_Client: client = WINDOW_AS_CLIENT(obwin); + /* events on clients can be events on prompt windows too */ + prompt = client->prompt; break; case Window_Menu: /* not to be used for events */ @@ -483,6 +488,9 @@ static void event_process(const XEvent *ec, gpointer data) case Window_Internal: /* we don't do anything with events directly on these windows */ break; + case Window_Prompt: + prompt = WINDOW_AS_PROMPT(obwin); + break; } } @@ -639,7 +647,7 @@ static void event_process(const XEvent *ec, gpointer data) else if (window == RootWindow(ob_display, ob_screen)) event_handle_root(e); else if (e->type == MapRequest) - client_manage(window); + client_manage(window, NULL); else if (e->type == MappingNotify) { /* keyboard layout changes for modifier mapping changes. reload the modifier map, and rebind all the key bindings as appropriate */ @@ -699,7 +707,9 @@ static void event_process(const XEvent *ec, gpointer data) } #endif - if (e->type == ButtonPress || e->type == ButtonRelease) { + if (prompt && event_handle_prompt(prompt, e)) + ; + else if (e->type == ButtonPress || e->type == ButtonRelease) { /* If the button press was on some non-root window, or was physically on the root window, then process it */ if (window != RootWindow(ob_display, ob_screen) || @@ -833,6 +843,7 @@ static void event_handle_client(ObClient *client, XEvent *e) ObFrameContext con; static gint px = -1, py = -1; static guint pb = 0; + static ObFrameContext pcon = OB_FRAME_CONTEXT_NONE; switch (e->type) { case ButtonPress: @@ -841,11 +852,15 @@ static void event_handle_client(ObClient *client, XEvent *e) pb = e->xbutton.button; px = e->xbutton.x; py = e->xbutton.y; + + pcon = frame_context(client, e->xbutton.window, px, py); + pcon = mouse_button_frame_context(pcon, e->xbutton.button, + e->xbutton.state); } case ButtonRelease: /* Wheel buttons don't draw because they are an instant click, so it is a waste of resources to go drawing it. - if the user is doing an intereactive thing, or has a menu open then + if the user is doing an interactive thing, or has a menu open then the mouse is grabbed (possibly) and if we get these events we don't want to deal with them */ @@ -857,8 +872,11 @@ static void event_handle_client(ObClient *client, XEvent *e) con = mouse_button_frame_context(con, e->xbutton.button, e->xbutton.state); - if (e->type == ButtonRelease && e->xbutton.button == pb) - pb = 0, px = py = -1; + /* button presses on CLIENT_CONTEXTs are not accompanied by a + release because they are Replayed to the client */ + if ((e->type == ButtonRelease || CLIENT_CONTEXT(con, client)) && + e->xbutton.button == pb) + pb = 0, px = py = -1, pcon = OB_FRAME_CONTEXT_NONE; switch (con) { case OB_FRAME_CONTEXT_MAXIMIZE: @@ -912,31 +930,31 @@ static void event_handle_client(ObClient *client, XEvent *e) } break; case OB_FRAME_CONTEXT_MAXIMIZE: - if (!client->frame->max_hover) { + if (!client->frame->max_hover && !pb) { client->frame->max_hover = TRUE; frame_adjust_state(client->frame); } break; case OB_FRAME_CONTEXT_ALLDESKTOPS: - if (!client->frame->desk_hover) { + if (!client->frame->desk_hover && !pb) { client->frame->desk_hover = TRUE; frame_adjust_state(client->frame); } break; case OB_FRAME_CONTEXT_SHADE: - if (!client->frame->shade_hover) { + if (!client->frame->shade_hover && !pb) { client->frame->shade_hover = TRUE; frame_adjust_state(client->frame); } break; case OB_FRAME_CONTEXT_ICONIFY: - if (!client->frame->iconify_hover) { + if (!client->frame->iconify_hover && !pb) { client->frame->iconify_hover = TRUE; frame_adjust_state(client->frame); } break; case OB_FRAME_CONTEXT_CLOSE: - if (!client->frame->close_hover) { + if (!client->frame->close_hover && !pb) { client->frame->close_hover = TRUE; frame_adjust_state(client->frame); } @@ -953,36 +971,48 @@ static void event_handle_client(ObClient *client, XEvent *e) case OB_FRAME_CONTEXT_TLCORNER: case OB_FRAME_CONTEXT_TRCORNER: /* we've left the button area inside the titlebar */ - if (client->frame->max_hover || client->frame->desk_hover || - client->frame->shade_hover || client->frame->iconify_hover || - client->frame->close_hover) - { - client->frame->max_hover = FALSE; - client->frame->desk_hover = FALSE; - client->frame->shade_hover = FALSE; - client->frame->iconify_hover = FALSE; - client->frame->close_hover = FALSE; - frame_adjust_state(client->frame); + client->frame->max_hover = FALSE; + client->frame->desk_hover = FALSE; + client->frame->shade_hover = FALSE; + client->frame->iconify_hover = FALSE; + client->frame->close_hover = FALSE; + if (e->xcrossing.mode == NotifyGrab) { + client->frame->max_press = FALSE; + client->frame->desk_press = FALSE; + client->frame->shade_press = FALSE; + client->frame->iconify_press = FALSE; + client->frame->close_press = FALSE; } + frame_adjust_state(client->frame); break; case OB_FRAME_CONTEXT_MAXIMIZE: client->frame->max_hover = FALSE; + if (e->xcrossing.mode == NotifyGrab) + client->frame->max_press = FALSE; frame_adjust_state(client->frame); break; case OB_FRAME_CONTEXT_ALLDESKTOPS: client->frame->desk_hover = FALSE; + if (e->xcrossing.mode == NotifyGrab) + client->frame->desk_press = FALSE; frame_adjust_state(client->frame); break; case OB_FRAME_CONTEXT_SHADE: client->frame->shade_hover = FALSE; + if (e->xcrossing.mode == NotifyGrab) + client->frame->shade_press = FALSE; frame_adjust_state(client->frame); break; case OB_FRAME_CONTEXT_ICONIFY: client->frame->iconify_hover = FALSE; + if (e->xcrossing.mode == NotifyGrab) + client->frame->iconify_press = FALSE; frame_adjust_state(client->frame); break; case OB_FRAME_CONTEXT_CLOSE: client->frame->close_hover = FALSE; + if (e->xcrossing.mode == NotifyGrab) + client->frame->close_press = FALSE; frame_adjust_state(client->frame); break; case OB_FRAME_CONTEXT_FRAME: @@ -1021,22 +1051,32 @@ static void event_handle_client(ObClient *client, XEvent *e) switch (con) { case OB_FRAME_CONTEXT_MAXIMIZE: client->frame->max_hover = TRUE; + if (e->xcrossing.mode == NotifyUngrab) + client->frame->max_press = (con == pcon); frame_adjust_state(client->frame); break; case OB_FRAME_CONTEXT_ALLDESKTOPS: client->frame->desk_hover = TRUE; + if (e->xcrossing.mode == NotifyUngrab) + client->frame->desk_press = (con == pcon); frame_adjust_state(client->frame); break; case OB_FRAME_CONTEXT_SHADE: client->frame->shade_hover = TRUE; + if (e->xcrossing.mode == NotifyUngrab) + client->frame->shade_press = (con == pcon); frame_adjust_state(client->frame); break; case OB_FRAME_CONTEXT_ICONIFY: client->frame->iconify_hover = TRUE; + if (e->xcrossing.mode == NotifyUngrab) + client->frame->iconify_press = (con == pcon); frame_adjust_state(client->frame); break; case OB_FRAME_CONTEXT_CLOSE: client->frame->close_hover = TRUE; + if (e->xcrossing.mode == NotifyUngrab) + client->frame->close_press = (con == pcon); frame_adjust_state(client->frame); break; case OB_FRAME_CONTEXT_FRAME: @@ -1667,6 +1707,21 @@ static ObMenuFrame* find_active_or_last_menu(void) return ret; } +static gboolean event_handle_prompt(ObPrompt *p, XEvent *e) +{ + switch (e->type) { + case ButtonPress: + case ButtonRelease: + case MotionNotify: + return prompt_mouse_event(p, e); + break; + case KeyPress: + return prompt_key_event(p, e); + break; + } + return FALSE; +} + static gboolean event_handle_menu_keyboard(XEvent *ev) { guint keycode, state;