X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=11eacbd8ace0ebd5c8e78c3bf99ffcfe274ae5ef;hb=276b2be581c6cb138b439537761ff2ca42201805;hp=adc393d0395d63c8bc1f31fdc15393ca7e16a494;hpb=373a4584d603a4dc14c64d5f27653c83a1fe686b;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index adc393d0..11eacbd8 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -41,7 +41,7 @@ static void event_handle_root(XEvent *e); static void event_handle_dock(Dock *s, XEvent *e); static void event_handle_dockapp(DockApp *app, XEvent *e); static void event_handle_client(Client *c, XEvent *e); -static void event_handle_menu(Menu *menu, Client *c, XEvent *e); +static void event_handle_menu(Client *c, XEvent *e); static void fd_event_handle(); #ifdef USE_SM static void ice_watch(IceConn conn, IcePointer data, Bool opening, @@ -501,10 +501,7 @@ static void event_process(XEvent *e) return; /* deal with it in the kernel */ - if (menu) { - event_handle_menu(menu, client, e); - return; - } else if (client) + if (client) event_handle_client(client, e); else if (dockapp) event_handle_dockapp(dockapp, e); @@ -535,6 +532,15 @@ static void event_process(XEvent *e) xerror_set_ignore(FALSE); } + if (menu_visible) + if (e->type == MotionNotify || e->type == ButtonRelease || + e->type == ButtonPress || + e->type == KeyPress || e->type == KeyRelease) { + event_handle_menu(client, e); + + return; /* no dispatch! */ + } + if (moveresize_in_progress) if (e->type == MotionNotify || e->type == ButtonRelease || e->type == ButtonPress || @@ -589,9 +595,7 @@ static void event_handle_root(XEvent *e) #ifdef XRANDR XRRUpdateConfiguration(e); #endif - if (e->xconfigure.width != screen_physical_size.width || - e->xconfigure.height != screen_physical_size.height) - screen_resize(e->xconfigure.width, e->xconfigure.height); + screen_resize(); break; default: ; @@ -667,7 +671,7 @@ static void event_handle_client(Client *client, XEvent *e) break; case EnterNotify: if (client_normal(client)) { - if (ob_state == State_Starting) { + if (ob_state == OB_STATE_STARTING) { /* move it to the top of the focus order */ guint desktop = client->desktop; if (desktop == DESKTOP_ALL) desktop = screen_desktop; @@ -718,7 +722,7 @@ static void event_handle_client(Client *client, XEvent *e) if (e->xconfigurerequest.value_mask & (CWWidth | CWHeight | CWX | CWY)) { int x, y, w, h; - Corner corner; + ObCorner corner; x = (e->xconfigurerequest.value_mask & CWX) ? e->xconfigurerequest.x : client->area.x; @@ -732,17 +736,17 @@ static void event_handle_client(Client *client, XEvent *e) switch (client->gravity) { case NorthEastGravity: case EastGravity: - corner = Corner_TopRight; + corner = OB_CORNER_TOPRIGHT; break; case SouthWestGravity: case SouthGravity: - corner = Corner_BottomLeft; + corner = OB_CORNER_BOTTOMLEFT; break; case SouthEastGravity: - corner = Corner_BottomRight; + corner = OB_CORNER_BOTTOMRIGHT; break; default: /* NorthWest, Static, etc */ - corner = Corner_TopLeft; + corner = OB_CORNER_TOPLEFT; } client_configure(client, corner, x, y, w, h, FALSE, TRUE); @@ -916,7 +920,8 @@ static void event_handle_client(Client *client, XEvent *e) else h = client->area.y; client->gravity = tmpg; - client_configure(client, Corner_TopLeft, x, y, w, h, TRUE, TRUE); + client_configure(client, OB_CORNER_TOPLEFT, + x, y, w, h, FALSE, TRUE); client->gravity = oldg; } break; @@ -977,88 +982,153 @@ static void event_handle_client(Client *client, XEvent *e) } } -static void event_handle_menu(Menu *menu, Client *client, XEvent *e) +static void event_handle_menu(Client *client, XEvent *e) { + static MenuEntry *over = NULL; MenuEntry *entry; + Menu *top; + GSList *it; + + top = g_slist_nth_data(menu_visible, 0); g_message("EVENT %d", e->type); switch (e->type) { + case KeyPress: + if (over) { + if (over->parent->mouseover) + over->parent->mouseover(over, FALSE); + else + menu_control_mouseover(over, FALSE); + menu_entry_render(over); + over = NULL; + } +/* + if (top->hide) + top->hide(top); + else +*/ + menu_hide(top); + break; case ButtonPress: + if (e->xbutton.button > 3) break; + g_message("BUTTON PRESS"); - if (e->xbutton.button == 3) - menu_hide(menu); - else if (e->xbutton.button == 1) { - entry = menu_find_entry(menu, e->xbutton.window); - if (!entry) - stacking_raise(MENU_AS_WINDOW(menu)); - } break; case ButtonRelease: + if (e->xbutton.button > 3) break; + g_message("BUTTON RELEASED"); - if (!menu->shown) break; - -/* grab_pointer_window(FALSE, None, menu->frame);*/ - - if (e->xbutton.button == 1) { - entry = menu_find_entry(menu, e->xbutton.window); - if (entry) { - int junk; - Window wjunk; - guint ujunk, b, w, h; - XGetGeometry(ob_display, e->xbutton.window, - &wjunk, &junk, &junk, &w, &h, &b, &ujunk); - if (e->xbutton.x >= (signed)-b && - e->xbutton.y >= (signed)-b && - e->xbutton.x < (signed)(w+b) && - e->xbutton.y < (signed)(h+b)) { - menu_entry_fire(entry); + + for (it = menu_visible; it; it = g_slist_next(it)) { + Menu *m = it->data; + if (e->xbutton.x_root >= m->location.x - ob_rr_theme->bwidth && + e->xbutton.y_root >= m->location.y - ob_rr_theme->bwidth && + e->xbutton.x_root < m->location.x + m->size.width + + ob_rr_theme->bwidth && + e->xbutton.y_root < m->location.y + m->size.height + + ob_rr_theme->bwidth) { + if ((entry = menu_find_entry_by_pos(it->data, + e->xbutton.x_root - + m->location.x, + e->xbutton.y_root - + m->location.y))) { + if (over) { + if (over->parent->mouseover) + over->parent->mouseover(over, FALSE); + else + menu_control_mouseover(over, FALSE); + menu_entry_render(over); + over = NULL; + /* this hides the menu */ + menu_entry_fire(entry); + } } + break; + } + } + if (!it) { + if (over) { + if (over->parent->mouseover) + over->parent->mouseover(over, FALSE); + else + menu_control_mouseover(over, FALSE); + menu_entry_render(over); + over = NULL; } +/* + if (top->hide) + top->hide(top); + else +*/ + menu_hide(top); } break; - case EnterNotify: - case LeaveNotify: - g_message("enter/leave"); - entry = menu_find_entry(menu, e->xcrossing.window); - if (entry) { - if (menu->mouseover) - menu->mouseover(entry, e->type == EnterNotify); + case MotionNotify: + g_message("motion"); + for (it = menu_visible; it; it = g_slist_next(it)) { + Menu *m = it->data; + if ((entry = menu_find_entry_by_pos(it->data, + e->xmotion.x_root - + m->location.x, + e->xmotion.y_root - + m->location.y))) { + if (over && entry != over) { + if (over->parent->mouseover) + over->parent->mouseover(over, FALSE); + else + menu_control_mouseover(over, FALSE); + menu_entry_render(over); + } + + over = entry; + if (over->parent->mouseover) + over->parent->mouseover(over, TRUE); + else + menu_control_mouseover(over, TRUE); + menu_entry_render(over); + break; + } + } + if (!it && over) { + if (over->parent->mouseover) + over->parent->mouseover(over, FALSE); else - menu_control_mouseover(entry, e->type == EnterNotify); - - menu_entry_render(entry); + menu_control_mouseover(over, FALSE); + menu_entry_render(over); + over = NULL; } break; } } void event_add_fd_handler(event_fd_handler *h) { - g_datalist_id_set_data(&fd_handler_list, h->fd, h); - FD_SET(h->fd, &allset); - max_fd = MAX(max_fd, h->fd); + g_datalist_id_set_data(&fd_handler_list, h->fd, h); + FD_SET(h->fd, &allset); + max_fd = MAX(max_fd, h->fd); } static void find_max_fd_foreach(GQuark n, gpointer data, gpointer max) { - *((unsigned int *)max) = MAX(*((unsigned int *)max), n); + *((unsigned int *)max) = MAX(*((unsigned int *)max), n); } static void find_max_fd() { - int tmpmax = -1; - g_datalist_foreach(&fd_handler_list, find_max_fd_foreach, (gpointer)&tmpmax); - max_fd = MAX(x_fd, tmpmax); + int tmpmax = -1; + g_datalist_foreach(&fd_handler_list, find_max_fd_foreach, + (gpointer)&tmpmax); + max_fd = MAX(x_fd, tmpmax); #ifdef USE_SM - max_fd = MAX(ice_fd, tmpmax); + max_fd = MAX(ice_fd, tmpmax); #endif } void event_remove_fd(int n) { - FD_CLR(n, &allset); - g_datalist_id_remove_data(&fd_handler_list, (GQuark)n); - find_max_fd(); + FD_CLR(n, &allset); + g_datalist_id_remove_data(&fd_handler_list, (GQuark)n); + find_max_fd(); } static void fd_event_handle_foreach(GQuark n, gpointer data, gpointer user_data)