X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=4f9f61dc6022bb093b7e85d08dbefdf5a352e2a6;hb=d8d2fd7148c46eb4acba9d647adaddfa906c0652;hp=7252c379d5b1d9205444abcbc1d026d8babbba90;hpb=d51702affa3e3895f9fca218de39690f8958b500;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index 7252c379..4f9f61dc 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -600,6 +600,7 @@ static void event_handle_client(ObClient *client, XEvent *e) XEvent ce; Atom msgtype; int i=0; + ObFrameContext con; switch (e->type) { case ButtonPress: @@ -658,6 +659,19 @@ static void event_handle_client(ObClient *client, XEvent *e) frame_adjust_focus(client->frame, FALSE); break; case EnterNotify: + switch (con) { + case OB_FRAME_CONTEXT_MAXIMIZE: + case OB_FRAME_CONTEXT_ALLDESKTOPS: + case OB_FRAME_CONTEXT_SHADE: + case OB_FRAME_CONTEXT_ICONIFY: + case OB_FRAME_CONTEXT_CLOSE: + g_message("hi"); + frame_adjust_state(client->frame); + break; + default: + break; + } + con = frame_context(client, e->xcrossing.subwindow); if (client_normal(client)) { if (ob_state() == OB_STATE_STARTING) { /* move it to the top of the focus order */ @@ -711,7 +725,8 @@ static void event_handle_client(ObClient *client, XEvent *e) CWX | CWY)) { int x, y, w, h; ObCorner corner; - + Rect *a; + x = (e->xconfigurerequest.value_mask & CWX) ? e->xconfigurerequest.x : client->area.x; y = (e->xconfigurerequest.value_mask & CWY) ? @@ -720,6 +735,16 @@ static void event_handle_client(ObClient *client, XEvent *e) e->xconfigurerequest.width : client->area.width; h = (e->xconfigurerequest.value_mask & CWHeight) ? e->xconfigurerequest.height : client->area.height; + + /* dont let windows move above/left into the strut unless they are + bigger than the available area */ + a = screen_area(client->desktop); + if (e->xconfigurerequest.value_mask & CWX && + w <= a->width && x < a->x) + x = a->x; + if (e->xconfigurerequest.value_mask & CWY && + h <= a->height && y < a->y) + y = a->y; switch (client->gravity) { case NorthEastGravity: @@ -885,6 +910,7 @@ static void event_handle_client(ObClient *client, XEvent *e) } else if (msgtype == prop_atoms.net_moveresize_window) { int oldg = client->gravity; int tmpg, x, y, w, h; + Rect *a; if (e->xclient.data.l[0] & 0xff) tmpg = e->xclient.data.l[0] & 0xff; @@ -908,8 +934,26 @@ static void event_handle_client(ObClient *client, XEvent *e) else h = client->area.y; client->gravity = tmpg; + + /* get the frame position */ + frame_client_gravity(client->frame, &x, &y); + + /* dont let windows move above/left into the strut unless they are + bigger than the available area */ + a = screen_area(client->desktop); + if (e->xconfigurerequest.value_mask & CWX && + w <= a->width && x < a->x) + x = a->x; + if (e->xconfigurerequest.value_mask & CWY && + h <= a->height && y < a->y) + y = a->y; + + /* go back to the client position */ + frame_frame_gravity(client->frame, &x, &y); + client_configure(client, OB_CORNER_TOPLEFT, x, y, w, h, FALSE, TRUE); + client->gravity = oldg; } break; @@ -972,7 +1016,6 @@ static void event_handle_client(ObClient *client, XEvent *e) static void event_handle_menu(ObClient *client, XEvent *e) { - static ObMenuEntry *over = NULL; ObMenuEntry *entry; ObMenu *top; GList *it = NULL; @@ -982,27 +1025,11 @@ static void event_handle_menu(ObClient *client, XEvent *e) ob_debug("EVENT %d\n", e->type); switch (e->type) { case KeyPress: - if (e->xkey.keycode == ob_keycode(OB_KEY_DOWN)) - over = menu_control_keyboard_nav(over, OB_KEY_DOWN); - else if (e->xkey.keycode == ob_keycode(OB_KEY_UP)) - over = menu_control_keyboard_nav(over, OB_KEY_UP); - else if (e->xkey.keycode == ob_keycode(OB_KEY_RIGHT)) /* fuck */ - over = menu_control_keyboard_nav(over, OB_KEY_RIGHT); - else if (e->xkey.keycode == ob_keycode(OB_KEY_LEFT)) /* users */ - over = menu_control_keyboard_nav(over, OB_KEY_LEFT); - else { - if (over) { - over->parent->mouseover(over, FALSE); - over = NULL; - } - - menu_hide(top); - } + menu_control_keyboard_nav(e->xkey.keycode); break; case ButtonPress: - if (e->xbutton.button > 3) break; - ob_debug("BUTTON PRESS\n"); + break; case ButtonRelease: ob_debug("BUTTON RELEASED\n"); @@ -1020,31 +1047,18 @@ static void event_handle_menu(ObClient *client, XEvent *e) m->location.x, e->xbutton.y_root - m->location.y))) { - if (over) { - over->parent->mouseover(over, FALSE); - /* this hides the menu */ - - over->parent->selected(entry, e->xbutton.button, - e->xbutton.x_root, - e->xbutton.y_root); - over = NULL; - } + m->selected(entry, e->xbutton.button, + e->xbutton.x_root, + e->xbutton.y_root); + break; } break; } } - if (!it) { - if (over) { - over->parent->mouseover(over, FALSE); - over = NULL; - } -/* - if (top->hide) - top->hide(top); - else -*/ - menu_hide(top); - } + + /* will call the menu_hide() for each submenu as well */ + if (!it) + menu_hide(menu_visible->data); break; case MotionNotify: @@ -1056,19 +1070,14 @@ static void event_handle_menu(ObClient *client, XEvent *e) m->location.x, e->xmotion.y_root - m->location.y))) { - if (over && entry != over) { - over->parent->mouseover(over, FALSE); - } + if (m->over && m->over->data != entry) + m->mouseover(m->over->data, FALSE); - over = entry; - over->parent->mouseover(over, TRUE); + m->mouseover(entry, TRUE); break; } } - if (!it && over) { - over->parent->mouseover(over, FALSE); - over = NULL; - } + break; } }