]> Dogcows Code - chaz/openbox/blobdiff - openbox/focus.c
dont leave the focus indicator hanging around when dialogs are disabled
[chaz/openbox] / openbox / focus.c
index 0140226ed5509c42b430f6834ea4b1e64e3e4a6b..de346ead98ddefe1a64a9c7ba9e805a9372d97bf 100644 (file)
@@ -113,7 +113,8 @@ void focus_startup(gboolean reconfig)
         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;
@@ -362,13 +363,152 @@ 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);
+        */
+        int x, y, w, h;
+        int 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) &&
+    return ((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->transients &&
             ((ft->can_focus || ft->focus_notify) &&
              !ft->skip_taskbar &&
              (ft->desktop == screen_desktop || ft->desktop == DESKTOP_ALL)));
@@ -384,17 +524,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 +554,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 +566,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 +585,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 +608,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 +626,7 @@ done_cycle:
     first = NULL;
     focus_cycle_target = NULL;
 
+    focus_cycle_draw_indicator();
     popup_cycle(ft, FALSE);
 
     return;
This page took 0.028188 seconds and 4 git commands to generate.