- gint x, y, w, h;
- gint wt, wl, wr, wb;
-
- wt = wl = wr = wb = FOCUS_INDICATOR_WIDTH;
-
- 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,
- gboolean all_desktops,
- gboolean dock_windows)
-{
- gboolean ok = FALSE;
-
- /* it's on this desktop unless you want all desktops.
-
- do this check first because it will usually filter out the most
- windows */
- ok = (all_desktops || ft->desktop == screen_desktop ||
- ft->desktop == DESKTOP_ALL);
-
- /* the window can receive focus somehow */
- ok = ok && (ft->can_focus || ft->focus_notify);
-
- /* it's the right type of window */
- if (dock_windows)
- ok = ok && ft->type == OB_CLIENT_TYPE_DOCK;
- else
- ok = ok && (ft->type == OB_CLIENT_TYPE_NORMAL ||
- ft->type == OB_CLIENT_TYPE_DIALOG ||
- ((ft->type == OB_CLIENT_TYPE_TOOLBAR ||
- ft->type == OB_CLIENT_TYPE_MENU ||
- ft->type == OB_CLIENT_TYPE_UTILITY) &&
- /* let alt-tab go to these windows when a window in its
- group already has focus ... */
- ((focus_client && ft->group == focus_client->group) ||
- /* ... or if there are no application windows in its
- group */
- !client_has_application_group_siblings(ft))));
-
- /* it's not set to skip the taskbar (unless it is a type that would be
- expected to set this hint */
- ok = ok && (!(ft->type == OB_CLIENT_TYPE_DOCK ||
- ft->type == OB_CLIENT_TYPE_TOOLBAR ||
- ft->type == OB_CLIENT_TYPE_MENU ||
- ft->type == OB_CLIENT_TYPE_UTILITY) ||
- !ft->skip_taskbar);
-
- /* it's not going to just send fous off somewhere else (modal window) */
- ok = ok && ft == client_focus_target(ft);
-
- return ok;
-}
-
-void focus_cycle(gboolean forward, gboolean all_desktops,
- gboolean dock_windows,
- gboolean linear, gboolean interactive,
- gboolean dialog, gboolean done, gboolean cancel)
-{
- static ObClient *first = NULL;
- static ObClient *t = NULL;
- static GList *order = NULL;
- GList *it, *start, *list;
- ObClient *ft = NULL;
-
- if (interactive) {
- if (cancel) {
- focus_cycle_target = NULL;
- goto done_cycle;
- } else if (done)
- goto done_cycle;
-
- if (!focus_order)
- goto done_cycle;
-
- if (!first) first = focus_client;
-
- if (linear) list = client_list;
- else list = focus_order;
- } else {
- if (!focus_order)
- goto done_cycle;
- list = client_list;
- }
- if (!focus_cycle_target) focus_cycle_target = focus_client;
-
- start = it = g_list_find(list, focus_cycle_target);
- if (!start) /* switched desktops or something? */
- start = it = forward ? g_list_last(list) : g_list_first(list);
- if (!start) goto done_cycle;
-
- do {
- if (forward) {
- it = it->next;
- if (it == NULL) it = g_list_first(list);
- } else {
- it = it->prev;
- if (it == NULL) it = g_list_last(list);
- }
- ft = it->data;
- if (valid_focus_target(ft, all_desktops, dock_windows)) {
- if (interactive) {
- if (ft != focus_cycle_target) { /* prevents flicker */
- focus_cycle_target = ft;
- focus_cycle_draw_indicator();
- }
- /* same arguments as valid_focus_target */
- popup_cycle(ft, dialog, all_desktops, dock_windows);
- return;
- } else if (ft != focus_cycle_target) {
- focus_cycle_target = ft;
- done = TRUE;
- break;
- }