X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Ffocus.c;h=3b4dd14537c6b641194ba73376b7355bc5066729;hb=2aa5cd3574b2bbdc103cb7626aa1ff77ea2c0046;hp=0140226ed5509c42b430f6834ea4b1e64e3e4a6b;hpb=04ab35aa140fe418d8d5c256011c3b59dea51adf;p=chaz%2Fopenbox diff --git a/openbox/focus.c b/openbox/focus.c index 0140226e..3b4dd145 100644 --- a/openbox/focus.c +++ b/openbox/focus.c @@ -49,7 +49,6 @@ struct { } focus_indicator; RrAppearance *a_focus_indicator; -RrColor *color_black; RrColor *color_white; static ObIconPopup *focus_cycle_popup; @@ -61,7 +60,7 @@ static void focus_cycle_destructor(ObClient *client, gpointer data) focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE); } -static Window createWindow(Window parent, unsigned long mask, +static Window createWindow(Window parent, gulong mask, XSetWindowAttributes *attrib) { return XCreateWindow(ob_display, parent, 0, 0, 1, 1, 0, @@ -87,33 +86,38 @@ void focus_startup(gboolean reconfig) focus_indicator.right.obwin.type = Window_Internal; focus_indicator.bottom.obwin.type = Window_Internal; + attr.save_under = True; attr.override_redirect = True; attr.background_pixel = BlackPixel(ob_display, ob_screen); focus_indicator.top.win = createWindow(RootWindow(ob_display, ob_screen), - CWOverrideRedirect | CWBackPixel, &attr); + CWOverrideRedirect | CWBackPixel | CWSaveUnder, + &attr); focus_indicator.left.win = createWindow(RootWindow(ob_display, ob_screen), - CWOverrideRedirect | CWBackPixel, &attr); + CWOverrideRedirect | CWBackPixel | CWSaveUnder, + &attr); focus_indicator.right.win = createWindow(RootWindow(ob_display, ob_screen), - CWOverrideRedirect | CWBackPixel, &attr); + CWOverrideRedirect | CWBackPixel | CWSaveUnder, + &attr); focus_indicator.bottom.win = createWindow(RootWindow(ob_display, ob_screen), - CWOverrideRedirect | CWBackPixel, &attr); + CWOverrideRedirect | CWBackPixel | CWSaveUnder, + &attr); stacking_add(INTERNAL_AS_WINDOW(&focus_indicator.top)); stacking_add(INTERNAL_AS_WINDOW(&focus_indicator.left)); stacking_add(INTERNAL_AS_WINDOW(&focus_indicator.right)); stacking_add(INTERNAL_AS_WINDOW(&focus_indicator.bottom)); - color_black = RrColorNew(ob_rr_inst, 0, 0, 0); color_white = RrColorNew(ob_rr_inst, 0xff, 0xff, 0xff); a_focus_indicator = RrAppearanceNew(ob_rr_inst, 4); a_focus_indicator->surface.grad = RR_SURFACE_SOLID; a_focus_indicator->surface.relief = RR_RELIEF_FLAT; - a_focus_indicator->surface.primary = color_black; + a_focus_indicator->surface.primary = RrColorNew(ob_rr_inst, + 0, 0, 0); a_focus_indicator->texture[0].type = RR_TEXTURE_LINE_ART; a_focus_indicator->texture[0].data.lineart.color = color_white; a_focus_indicator->texture[1].type = RR_TEXTURE_LINE_ART; @@ -141,7 +145,6 @@ void focus_shutdown(gboolean reconfig) /* reset focus to root */ XSetInputFocus(ob_display, PointerRoot, RevertToNone, event_lasttime); - RrColorFree(color_black); RrColorFree(color_white); RrAppearanceFree(a_focus_indicator); @@ -207,7 +210,8 @@ void focus_set_client(ObClient *client) /* finds the first transient that isn't 'skip' and ensure's that client_normal is true for it */ -static ObClient *find_transient_recursive(ObClient *c, ObClient *top, ObClient *skip) +static ObClient *find_transient_recursive(ObClient *c, ObClient *top, + ObClient *skip) { GSList *it; ObClient *ret; @@ -329,7 +333,7 @@ static void popup_cycle(ObClient *c, gboolean show) } else { Rect *a; ObClient *p = c; - char *title; + gchar *title; a = screen_physical_area_monitor(0); icon_popup_position(focus_cycle_popup, CenterGravity, @@ -362,16 +366,171 @@ static void popup_cycle(ObClient *c, gboolean show) } } +void focus_cycle_draw_indicator() +{ + if (!focus_cycle_target) { + XUnmapWindow(ob_display, focus_indicator.top.win); + XUnmapWindow(ob_display, focus_indicator.left.win); + XUnmapWindow(ob_display, focus_indicator.right.win); + XUnmapWindow(ob_display, focus_indicator.bottom.win); + } else { + /* + if (focus_cycle_target) + frame_adjust_focus(focus_cycle_target->frame, FALSE); + frame_adjust_focus(focus_cycle_target->frame, TRUE); + */ + gint x, y, w, h; + gint wt, wl, wr, wb; + + wt = wl = wr = wb = MAX(3, + ob_rr_theme->handle_height + + ob_rr_theme->bwidth * 2); + + x = focus_cycle_target->frame->area.x; + y = focus_cycle_target->frame->area.y; + w = focus_cycle_target->frame->area.width; + h = wt; + + XMoveResizeWindow(ob_display, focus_indicator.top.win, + x, y, w, h); + a_focus_indicator->texture[0].data.lineart.x1 = 0; + a_focus_indicator->texture[0].data.lineart.y1 = h-1; + a_focus_indicator->texture[0].data.lineart.x2 = 0; + a_focus_indicator->texture[0].data.lineart.y2 = 0; + a_focus_indicator->texture[1].data.lineart.x1 = 0; + a_focus_indicator->texture[1].data.lineart.y1 = 0; + a_focus_indicator->texture[1].data.lineart.x2 = w-1; + a_focus_indicator->texture[1].data.lineart.y2 = 0; + a_focus_indicator->texture[2].data.lineart.x1 = w-1; + a_focus_indicator->texture[2].data.lineart.y1 = 0; + a_focus_indicator->texture[2].data.lineart.x2 = w-1; + a_focus_indicator->texture[2].data.lineart.y2 = h-1; + a_focus_indicator->texture[3].data.lineart.x1 = (wl-1); + a_focus_indicator->texture[3].data.lineart.y1 = h-1; + a_focus_indicator->texture[3].data.lineart.x2 = w - wr; + a_focus_indicator->texture[3].data.lineart.y2 = h-1; + RrPaint(a_focus_indicator, focus_indicator.top.win, + w, h); + + x = focus_cycle_target->frame->area.x; + y = focus_cycle_target->frame->area.y; + w = wl; + h = focus_cycle_target->frame->area.height; + + XMoveResizeWindow(ob_display, focus_indicator.left.win, + x, y, w, h); + a_focus_indicator->texture[0].data.lineart.x1 = w-1; + a_focus_indicator->texture[0].data.lineart.y1 = 0; + a_focus_indicator->texture[0].data.lineart.x2 = 0; + a_focus_indicator->texture[0].data.lineart.y2 = 0; + a_focus_indicator->texture[1].data.lineart.x1 = 0; + a_focus_indicator->texture[1].data.lineart.y1 = 0; + a_focus_indicator->texture[1].data.lineart.x2 = 0; + a_focus_indicator->texture[1].data.lineart.y2 = h-1; + a_focus_indicator->texture[2].data.lineart.x1 = 0; + a_focus_indicator->texture[2].data.lineart.y1 = h-1; + a_focus_indicator->texture[2].data.lineart.x2 = w-1; + a_focus_indicator->texture[2].data.lineart.y2 = h-1; + a_focus_indicator->texture[3].data.lineart.x1 = w-1; + a_focus_indicator->texture[3].data.lineart.y1 = wt-1; + a_focus_indicator->texture[3].data.lineart.x2 = w-1; + a_focus_indicator->texture[3].data.lineart.y2 = h - wb; + RrPaint(a_focus_indicator, focus_indicator.left.win, + w, h); + + x = focus_cycle_target->frame->area.x + + focus_cycle_target->frame->area.width - wr; + y = focus_cycle_target->frame->area.y; + w = wr; + h = focus_cycle_target->frame->area.height ; + + XMoveResizeWindow(ob_display, focus_indicator.right.win, + x, y, w, h); + a_focus_indicator->texture[0].data.lineart.x1 = 0; + a_focus_indicator->texture[0].data.lineart.y1 = 0; + a_focus_indicator->texture[0].data.lineart.x2 = w-1; + a_focus_indicator->texture[0].data.lineart.y2 = 0; + a_focus_indicator->texture[1].data.lineart.x1 = w-1; + a_focus_indicator->texture[1].data.lineart.y1 = 0; + a_focus_indicator->texture[1].data.lineart.x2 = w-1; + a_focus_indicator->texture[1].data.lineart.y2 = h-1; + a_focus_indicator->texture[2].data.lineart.x1 = w-1; + a_focus_indicator->texture[2].data.lineart.y1 = h-1; + a_focus_indicator->texture[2].data.lineart.x2 = 0; + a_focus_indicator->texture[2].data.lineart.y2 = h-1; + a_focus_indicator->texture[3].data.lineart.x1 = 0; + a_focus_indicator->texture[3].data.lineart.y1 = wt-1; + a_focus_indicator->texture[3].data.lineart.x2 = 0; + a_focus_indicator->texture[3].data.lineart.y2 = h - wb; + RrPaint(a_focus_indicator, focus_indicator.right.win, + w, h); + + x = focus_cycle_target->frame->area.x; + y = focus_cycle_target->frame->area.y + + focus_cycle_target->frame->area.height - wb; + w = focus_cycle_target->frame->area.width; + h = wb; + + XMoveResizeWindow(ob_display, focus_indicator.bottom.win, + x, y, w, h); + a_focus_indicator->texture[0].data.lineart.x1 = 0; + a_focus_indicator->texture[0].data.lineart.y1 = 0; + a_focus_indicator->texture[0].data.lineart.x2 = 0; + a_focus_indicator->texture[0].data.lineart.y2 = h-1; + a_focus_indicator->texture[1].data.lineart.x1 = 0; + a_focus_indicator->texture[1].data.lineart.y1 = h-1; + a_focus_indicator->texture[1].data.lineart.x2 = w-1; + a_focus_indicator->texture[1].data.lineart.y2 = h-1; + a_focus_indicator->texture[2].data.lineart.x1 = w-1; + a_focus_indicator->texture[2].data.lineart.y1 = h-1; + a_focus_indicator->texture[2].data.lineart.x2 = w-1; + a_focus_indicator->texture[2].data.lineart.y2 = 0; + a_focus_indicator->texture[3].data.lineart.x1 = wl-1; + a_focus_indicator->texture[3].data.lineart.y1 = 0; + a_focus_indicator->texture[3].data.lineart.x2 = w - wr; + a_focus_indicator->texture[3].data.lineart.y2 = 0; + RrPaint(a_focus_indicator, focus_indicator.bottom.win, + w, h); + + XMapWindow(ob_display, focus_indicator.top.win); + XMapWindow(ob_display, focus_indicator.left.win); + XMapWindow(ob_display, focus_indicator.right.win); + XMapWindow(ob_display, focus_indicator.bottom.win); + } +} + static gboolean valid_focus_target(ObClient *ft) { /* we don't use client_can_focus here, because that doesn't let you focus an iconic window, but we want to be able to, so we just check if the focus flags on the window allow it, and its on the current desktop */ - return (!ft->transients && client_normal(ft) && - ((ft->can_focus || ft->focus_notify) && - !ft->skip_taskbar && - (ft->desktop == screen_desktop || ft->desktop == DESKTOP_ALL))); + if ((ft->type == OB_CLIENT_TYPE_NORMAL || + ft->type == OB_CLIENT_TYPE_DIALOG || + (!client_has_group_siblings(ft) && + (ft->type == OB_CLIENT_TYPE_TOOLBAR || + ft->type == OB_CLIENT_TYPE_MENU || + ft->type == OB_CLIENT_TYPE_UTILITY))) && + ((ft->can_focus || ft->focus_notify) && + !ft->skip_taskbar && + (ft->desktop == screen_desktop || ft->desktop == DESKTOP_ALL)) && + ft == client_focus_target(ft)) + return TRUE; +/* + { + GSList *it; + + for (it = ft->transients; it; it = g_slist_next(it)) { + ObClient *c = it->data; + + if (c->frame->visible) + return FALSE; + } + return TRUE; + } +*/ + + return FALSE; } void focus_cycle(gboolean forward, gboolean linear, @@ -384,17 +543,10 @@ void focus_cycle(gboolean forward, gboolean linear, ObClient *ft = NULL; if (cancel) { - /* - if (focus_cycle_target) - frame_adjust_focus(focus_cycle_target->frame, FALSE); - if (focus_client) - frame_adjust_focus(focus_client->frame, TRUE); - */ focus_cycle_target = NULL; goto done_cycle; - } else if (done && dialog) { + } else if (done) goto done_cycle; - } if (!focus_order[screen_desktop]) goto done_cycle; @@ -421,132 +573,10 @@ void focus_cycle(gboolean forward, gboolean linear, ft = it->data; if (valid_focus_target(ft)) { if (ft != focus_cycle_target) { /* prevents flicker */ - /* - if (focus_cycle_target) - frame_adjust_focus(focus_cycle_target->frame, FALSE); - */ focus_cycle_target = ft; - /* - frame_adjust_focus(focus_cycle_target->frame, TRUE); - */ - { - int x, y, w, h; - int wt, wl, wr, wb; - - wt = wl = wr = wb = MAX(5, ob_rr_theme->handle_height); - - x = focus_cycle_target->frame->area.x; - y = focus_cycle_target->frame->area.y; - w = focus_cycle_target->frame->area.width; - h = wt; - - XMoveResizeWindow(ob_display, focus_indicator.top.win, - x, y, w, h); - a_focus_indicator->texture[0].data.lineart.x1 = 0; - a_focus_indicator->texture[0].data.lineart.y1 = h-1; - a_focus_indicator->texture[0].data.lineart.x2 = 0; - a_focus_indicator->texture[0].data.lineart.y2 = 0; - a_focus_indicator->texture[1].data.lineart.x1 = 0; - a_focus_indicator->texture[1].data.lineart.y1 = 0; - a_focus_indicator->texture[1].data.lineart.x2 = w-1; - a_focus_indicator->texture[1].data.lineart.y2 = 0; - a_focus_indicator->texture[2].data.lineart.x1 = w-1; - a_focus_indicator->texture[2].data.lineart.y1 = 0; - a_focus_indicator->texture[2].data.lineart.x2 = w-1; - a_focus_indicator->texture[2].data.lineart.y2 = h-1; - a_focus_indicator->texture[3].data.lineart.x1 = (wl-1); - a_focus_indicator->texture[3].data.lineart.y1 = h-1; - a_focus_indicator->texture[3].data.lineart.x2 = w - wr; - a_focus_indicator->texture[3].data.lineart.y2 = h-1; - RrPaint(a_focus_indicator, focus_indicator.top.win, - w, h); - - x = focus_cycle_target->frame->area.x; - y = focus_cycle_target->frame->area.y; - w = wl; - h = focus_cycle_target->frame->area.height; - - XMoveResizeWindow(ob_display, focus_indicator.left.win, - x, y, w, h); - a_focus_indicator->texture[0].data.lineart.x1 = w-1; - a_focus_indicator->texture[0].data.lineart.y1 = 0; - a_focus_indicator->texture[0].data.lineart.x2 = 0; - a_focus_indicator->texture[0].data.lineart.y2 = 0; - a_focus_indicator->texture[1].data.lineart.x1 = 0; - a_focus_indicator->texture[1].data.lineart.y1 = 0; - a_focus_indicator->texture[1].data.lineart.x2 = 0; - a_focus_indicator->texture[1].data.lineart.y2 = h-1; - a_focus_indicator->texture[2].data.lineart.x1 = 0; - a_focus_indicator->texture[2].data.lineart.y1 = h-1; - a_focus_indicator->texture[2].data.lineart.x2 = w-1; - a_focus_indicator->texture[2].data.lineart.y2 = h-1; - a_focus_indicator->texture[3].data.lineart.x1 = w-1; - a_focus_indicator->texture[3].data.lineart.y1 = wt-1; - a_focus_indicator->texture[3].data.lineart.x2 = w-1; - a_focus_indicator->texture[3].data.lineart.y2 = h - wb; - RrPaint(a_focus_indicator, focus_indicator.left.win, - w, h); - - x = focus_cycle_target->frame->area.x + - focus_cycle_target->frame->area.width - wr; - y = focus_cycle_target->frame->area.y; - w = wr; - h = focus_cycle_target->frame->area.height ; - - XMoveResizeWindow(ob_display, focus_indicator.right.win, - x, y, w, h); - a_focus_indicator->texture[0].data.lineart.x1 = 0; - a_focus_indicator->texture[0].data.lineart.y1 = 0; - a_focus_indicator->texture[0].data.lineart.x2 = w-1; - a_focus_indicator->texture[0].data.lineart.y2 = 0; - a_focus_indicator->texture[1].data.lineart.x1 = w-1; - a_focus_indicator->texture[1].data.lineart.y1 = 0; - a_focus_indicator->texture[1].data.lineart.x2 = w-1; - a_focus_indicator->texture[1].data.lineart.y2 = h-1; - a_focus_indicator->texture[2].data.lineart.x1 = w-1; - a_focus_indicator->texture[2].data.lineart.y1 = h-1; - a_focus_indicator->texture[2].data.lineart.x2 = 0; - a_focus_indicator->texture[2].data.lineart.y2 = h-1; - a_focus_indicator->texture[3].data.lineart.x1 = 0; - a_focus_indicator->texture[3].data.lineart.y1 = wt-1; - a_focus_indicator->texture[3].data.lineart.x2 = 0; - a_focus_indicator->texture[3].data.lineart.y2 = h - wb; - RrPaint(a_focus_indicator, focus_indicator.right.win, - w, h); - - x = focus_cycle_target->frame->area.x; - y = focus_cycle_target->frame->area.y + - focus_cycle_target->frame->area.height - wb; - w = focus_cycle_target->frame->area.width; - h = wb; - - XMoveResizeWindow(ob_display, focus_indicator.bottom.win, - x, y, w, h); - a_focus_indicator->texture[0].data.lineart.x1 = 0; - a_focus_indicator->texture[0].data.lineart.y1 = 0; - a_focus_indicator->texture[0].data.lineart.x2 = 0; - a_focus_indicator->texture[0].data.lineart.y2 = h-1; - a_focus_indicator->texture[1].data.lineart.x1 = 0; - a_focus_indicator->texture[1].data.lineart.y1 = h-1; - a_focus_indicator->texture[1].data.lineart.x2 = w-1; - a_focus_indicator->texture[1].data.lineart.y2 = h-1; - a_focus_indicator->texture[2].data.lineart.x1 = w-1; - a_focus_indicator->texture[2].data.lineart.y1 = h-1; - a_focus_indicator->texture[2].data.lineart.x2 = w-1; - a_focus_indicator->texture[2].data.lineart.y2 = 0; - a_focus_indicator->texture[3].data.lineart.x1 = wl-1; - a_focus_indicator->texture[3].data.lineart.y1 = 0; - a_focus_indicator->texture[3].data.lineart.x2 = w - wr; - a_focus_indicator->texture[3].data.lineart.y2 = 0; - RrPaint(a_focus_indicator, focus_indicator.bottom.win, - w, h); - } + focus_cycle_draw_indicator(); } popup_cycle(ft, dialog); - XMapWindow(ob_display, focus_indicator.top.win); - XMapWindow(ob_display, focus_indicator.left.win); - XMapWindow(ob_display, focus_indicator.right.win); - XMapWindow(ob_display, focus_indicator.bottom.win); return; } } while (it != start); @@ -555,17 +585,13 @@ done_cycle: if (done && focus_cycle_target) client_activate(focus_cycle_target, FALSE); - XUnmapWindow(ob_display, focus_indicator.top.win); - XUnmapWindow(ob_display, focus_indicator.left.win); - XUnmapWindow(ob_display, focus_indicator.right.win); - XUnmapWindow(ob_display, focus_indicator.bottom.win); - t = NULL; first = NULL; focus_cycle_target = NULL; g_list_free(order); order = NULL; + focus_cycle_draw_indicator(); popup_cycle(ft, FALSE); return; @@ -578,15 +604,10 @@ void focus_directional_cycle(ObDirection dir, ObClient *ft = NULL; if (cancel) { - if (focus_cycle_target) - frame_adjust_focus(focus_cycle_target->frame, FALSE); - if (focus_client) - frame_adjust_focus(focus_client->frame, TRUE); focus_cycle_target = NULL; goto done_cycle; - } else if (done && dialog) { + } else if (done) goto done_cycle; - } if (!focus_order[screen_desktop]) goto done_cycle; @@ -606,10 +627,8 @@ void focus_directional_cycle(ObDirection dir, if (ft) { if (ft != focus_cycle_target) {/* prevents flicker */ - if (focus_cycle_target) - frame_adjust_focus(focus_cycle_target->frame, FALSE); focus_cycle_target = ft; - frame_adjust_focus(focus_cycle_target->frame, TRUE); + focus_cycle_draw_indicator(); } } if (focus_cycle_target) { @@ -626,6 +645,7 @@ done_cycle: first = NULL; focus_cycle_target = NULL; + focus_cycle_draw_indicator(); popup_cycle(ft, FALSE); return; @@ -646,11 +666,12 @@ void focus_order_add_new(ObClient *c) else focus_order[i] = g_list_insert(focus_order[i], c, 1); } - } else - if (focus_order[d] && ((ObClient*)focus_order[d]->data)->iconic) + } else { + if (focus_order[d] && ((ObClient*)focus_order[d]->data)->iconic) focus_order[d] = g_list_insert(focus_order[d], c, 0); else focus_order[d] = g_list_insert(focus_order[d], c, 1); + } } }