]> Dogcows Code - chaz/openbox/blobdiff - openbox/focus_cycle_popup.c
make popup dialogs appear on the active monitor with xinerama
[chaz/openbox] / openbox / focus_cycle_popup.c
index 7d132b6ab55298f822104d59da82d131955f12e3..071ffc164bd19582c0abef156b89a53bfe2a2590 100644 (file)
@@ -35,6 +35,7 @@
 #define ICON_HILITE_WIDTH 2
 #define ICON_HILITE_MARGIN 1
 #define OUTSIDE_BORDER 3
+#define TEXT_BORDER 2
 
 typedef struct _ObFocusCyclePopup       ObFocusCyclePopup;
 typedef struct _ObFocusCyclePopupTarget ObFocusCyclePopupTarget;
@@ -112,9 +113,9 @@ void focus_cycle_popup_startup(gboolean reconfig)
     popup.a_bg->texture[0].type = RR_TEXTURE_RGBA;
 
     attrib.override_redirect = True;
-    attrib.border_pixel=RrColorPixel(ob_rr_theme->frame_focused_border_color);
+    attrib.border_pixel=RrColorPixel(ob_rr_theme->osd_border_color);
     popup.bg = create_window(RootWindow(ob_display, ob_screen),
-                             ob_rr_theme->fbwidth,
+                             ob_rr_theme->obwidth,
                              CWOverrideRedirect | CWBorderPixel, &attrib);
 
     popup.text = create_window(popup.bg, 0, 0, NULL);
@@ -210,31 +211,26 @@ static void popup_setup(ObFocusCyclePopup *p, gboolean create_targets,
 static gchar *popup_get_name(ObClient *c)
 {
     ObClient *p;
-    gchar *title = NULL;
+    gchar *title;
     const gchar *desk = NULL;
     gchar *ret;
 
-    /* find our highest direct parent, including non-normal windows */
-    for (p = c; p->transient_for && p->transient_for != OB_TRAN_GROUP;
-         p = p->transient_for);
+    /* find our highest direct parent */
+    p = client_search_top_direct_parent(c);
 
     if (c->desktop != DESKTOP_ALL && c->desktop != screen_desktop)
         desk = screen_desktop_names[c->desktop];
 
-    /* use the transient's parent's title/icon if we don't have one */
-    if (p != c && !strcmp("", (c->iconic ? c->icon_title : c->title)))
-        title = g_strdup(p->iconic ? p->icon_title : p->title);
+    title = c->iconic ? c->icon_title : c->title;
 
-    if (title == NULL)
-        title = g_strdup(c->iconic ? c->icon_title : c->title);
+    /* use the transient's parent's title/icon if we don't have one */
+    if (p != c && title[0] == '\0')
+        title = p->iconic ? p->icon_title : p->title;
 
     if (desk)
         ret = g_strdup_printf("%s [%s]", title, desk);
-    else {
-        ret = title;
-        title = NULL;
-    }
-    g_free(title);
+    else
+        ret = g_strdup(title);
 
     return ret;
 }
@@ -244,7 +240,7 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c)
     gint ml, mt, mr, mb;
     gint l, t, r, b;
     gint x, y, w, h;
-    Rect *screen_area;
+    Rect *screen_area = NULL;
     gint icons_per_row;
     gint icon_rows;
     gint textx, texty, textw, texth;
@@ -256,8 +252,7 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c)
     const ObFocusCyclePopupTarget *newtarget;
     gint newtargetx, newtargety;
 
-    /* XXX find the middle monitor? */
-    screen_area = screen_physical_area_monitor(0);
+    screen_area = screen_physical_area_monitor_active();
 
     /* get the outside margins */
     RrMargins(p->a_bg, &ml, &mt, &mr, &mb);
@@ -287,10 +282,10 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c)
 
     /* get the text dimensions */
     textw = w - l - r;
-    texth = RrMinHeight(p->a_text);
+    texth = RrMinHeight(p->a_text) + TEXT_BORDER * 2;
 
     /* find the height of the dialog */
-    h = t + b + (icon_rows * ICON_SIZE) + (OUTSIDE_BORDER*2 + texth);
+    h = t + b + (icon_rows * ICON_SIZE) + (OUTSIDE_BORDER + texth);
 
     /* get the position of the text */
     textx = l;
@@ -298,9 +293,9 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c)
 
     /* find the position for the popup (include the outer borders) */
     x = screen_area->x + (screen_area->width -
-                          (w + ob_rr_theme->fbwidth * 2)) / 2;
+                          (w + ob_rr_theme->obwidth * 2)) / 2;
     y = screen_area->y + (screen_area->height -
-                          (h + ob_rr_theme->fbwidth * 2)) / 2;
+                          (h + ob_rr_theme->obwidth * 2)) / 2;
 
     /* get the dimensions of the target hilite texture */
     rgbax = ml;
@@ -406,7 +401,6 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c)
             const gint row = i / icons_per_row; /* starting from 0 */
             const gint col = i % icons_per_row; /* starting from 0 */
             gint innerx, innery;
-            RrPixel32 *icon_data;
 
             /* find the dimensions of the icon inside it */
             innerx = icons_center_x + l + (col * ICON_SIZE);
@@ -422,20 +416,14 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c)
             icon = client_icon(target->client, innerw, innerh);
             p->a_icon->texture[0].data.rgba.width = icon->width;
             p->a_icon->texture[0].data.rgba.height = icon->height;
-            if (target->client->iconic)
-                /* 7/16 alpha */
-                p->a_icon->texture[0].data.rgba.alpha = (0xff>>1 - 0xff>>4);
-            else
-                p->a_icon->texture[0].data.rgba.alpha = 0xff;
+            p->a_icon->texture[0].data.rgba.alpha =
+                target->client->iconic ? OB_ICONIC_ALPHA : 0xff;
             p->a_icon->texture[0].data.rgba.data = icon->data;
 
             /* draw the icon */
             p->a_icon->surface.parentx = innerx;
             p->a_icon->surface.parenty = innery;
             RrPaint(p->a_icon, target->win, innerw, innerh);
-
-            if (target->client->iconic)
-                g_free(icon_data);
         }
     }
 
@@ -472,13 +460,16 @@ void focus_cycle_popup_show(ObClient *c, gboolean iconic_windows,
 
 void focus_cycle_popup_hide()
 {
+    gulong ignore_start;
+
+    ignore_start = event_start_ignore_all_enters();
+
     XUnmapWindow(ob_display, popup.bg);
     XFlush(ob_display);
 
-    popup.mapped = FALSE;
+    event_end_ignore_all_enters(ignore_start);
 
-    /* kill enter events cause by this unmapping */
-    event_ignore_all_queued_enters();
+    popup.mapped = FALSE;
 
     while(popup.targets) {
         ObFocusCyclePopupTarget *t = popup.targets->data;
This page took 0.024415 seconds and 4 git commands to generate.