X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=e1ab8fef63f75fca06b565ae4c092952e687809c;hb=742106511fbaca5ebef385a9c60c427e8dd7a6dd;hp=fba86cfb3a58bcd27b4c1f99a0f17d690e56579b;hpb=eb1fb5580e6a4c3620dfefdfd5704f9927f82ab1;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index fba86cfb..e1ab8fef 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: @@ -657,24 +658,77 @@ static void event_handle_client(ObClient *client, XEvent *e) client_iconify(client, TRUE, TRUE); frame_adjust_focus(client->frame, FALSE); break; + case LeaveNotify: + con = frame_context(client, e->xcrossing.window); + switch (con) { + case OB_FRAME_CONTEXT_MAXIMIZE: + client->frame->max_hover = FALSE; + frame_adjust_state(client->frame); + break; + case OB_FRAME_CONTEXT_ALLDESKTOPS: + client->frame->desk_hover = FALSE; + frame_adjust_state(client->frame); + break; + case OB_FRAME_CONTEXT_SHADE: + client->frame->shade_hover = FALSE; + frame_adjust_state(client->frame); + break; + case OB_FRAME_CONTEXT_ICONIFY: + client->frame->iconify_hover = FALSE; + frame_adjust_state(client->frame); + break; + case OB_FRAME_CONTEXT_CLOSE: + client->frame->close_hover = FALSE; + frame_adjust_state(client->frame); + break; + default: + break; + } + break; case EnterNotify: - 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 */ - guint desktop = client->desktop; - if (desktop == DESKTOP_ALL) desktop = screen_desktop; - focus_order[desktop] = g_list_remove(focus_order[desktop], - client); - focus_order[desktop] = g_list_prepend(focus_order[desktop], - client); - } else if (config_focus_follow) { + con = frame_context(client, e->xcrossing.window); + switch (con) { + case OB_FRAME_CONTEXT_MAXIMIZE: + client->frame->max_hover = TRUE; + frame_adjust_state(client->frame); + break; + case OB_FRAME_CONTEXT_ALLDESKTOPS: + client->frame->desk_hover = TRUE; + frame_adjust_state(client->frame); + break; + case OB_FRAME_CONTEXT_SHADE: + client->frame->shade_hover = TRUE; + frame_adjust_state(client->frame); + break; + case OB_FRAME_CONTEXT_ICONIFY: + client->frame->iconify_hover = TRUE; + frame_adjust_state(client->frame); + break; + case OB_FRAME_CONTEXT_CLOSE: + client->frame->close_hover = TRUE; + frame_adjust_state(client->frame); + break; + case OB_FRAME_CONTEXT_FRAME: + if (client_normal(client)) { + 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; + focus_order[desktop] = g_list_remove(focus_order[desktop], + client); + focus_order[desktop] = g_list_prepend(focus_order[desktop], + client); + } else if (config_focus_follow) { #ifdef DEBUG_FOCUS - ob_debug("EnterNotify on %lx, focusing window\n", - client->window); + ob_debug("EnterNotify on %lx, focusing window\n", + client->window); #endif - client_focus(client); + client_focus(client); + } } + break; + default: + break; } break; case ConfigureRequest: @@ -712,7 +766,6 @@ 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; @@ -723,15 +776,15 @@ static void event_handle_client(ObClient *client, XEvent *e) 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; + { + int newx = x; + int newy = y; + client_find_onscreen(client, &newx, &newy, w, h, TRUE); + if (e->xconfigurerequest.value_mask & CWX) + x = newx; + if (e->xconfigurerequest.value_mask & CWY) + y = newy; + } switch (client->gravity) { case NorthEastGravity: @@ -897,7 +950,6 @@ 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; @@ -922,22 +974,16 @@ static void event_handle_client(ObClient *client, XEvent *e) 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; + { + int newx = x; + int newy = y; + client_find_onscreen(client, &newx, &newy, w, h, TRUE); + if (e->xclient.data.l[0] & 1 << 8) + x = newx; + if (e->xclient.data.l[0] & 1 << 9) + y = newy; + } - /* 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);