+ 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;