]> Dogcows Code - chaz/openbox/blobdiff - openbox/focus_cycle_popup.c
put stuff in the right place in alttab list mode when there is only 1 window in it
[chaz/openbox] / openbox / focus_cycle_popup.c
index 77a6d2153ebb898e49ac0cb1ee88ec1130ba4b6a..ceab3ca1b3cb6d20116816b5fd12838bcc77ec18 100644 (file)
@@ -337,6 +337,7 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c)
     gint list_mode_icon_column_w = HILITE_SIZE + OUTSIDE_BORDER;
     gint up_arrow_x, down_arrow_x;
     gint up_arrow_y, down_arrow_y;
+    gboolean showing_arrows = FALSE;
 
     g_assert(p->mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS ||
              p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST);
@@ -393,18 +394,68 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c)
         /* leave space on the side for the icons */
         textw -= list_mode_icon_column_w;
 
+    if (!p->mapped)
+        /* reset the scrolling when the dialog is first shown */
+        p->scroll = 0;
+
     /* find the height of the dialog */
     h = t + b + (icon_rows * MAX(HILITE_SIZE, texth));
     if (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS)
         /* in icon mode the text sits below the icons, so make some space */
         h += OUTSIDE_BORDER + texth;
-    else
+
+    /* find the focused target */
+    newtarget = NULL;
+    for (i = 0, it = p->targets; it; ++i, it = g_list_next(it)) {
+        const ObFocusCyclePopupTarget *target = it->data;
+        if (target->client == c) {
+            /* save the target */
+            newtarget = target;
+            break;
+        }
+    }
+    selected_pos = i;
+    g_assert(newtarget != NULL);
+
+    /* scroll the list if needed */
+    last_scroll = p->scroll;
+    if (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) {
+        const gint top = p->scroll + SCROLL_MARGIN;
+        const gint bottom = p->scroll + icon_rows - SCROLL_MARGIN;
+        const gint min_scroll = 0;
+        const gint max_scroll = p->n_targets - icon_rows;
+
+        if (top - selected_pos >= 0) {
+            p->scroll -= top - selected_pos + 1;
+            p->scroll = MAX(p->scroll, min_scroll);
+        } else if (selected_pos - bottom >= 0) {
+            p->scroll += selected_pos - bottom + 1;
+            p->scroll = MIN(p->scroll, max_scroll);
+        }
+    }
+
+    /* show the scroll arrows when appropriate */
+    if (p->scroll && p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) {
+        XMapWindow(obt_display, p->list_mode_up);
+        showing_arrows = TRUE;
+    } else
+        XUnmapWindow(obt_display, p->list_mode_up);
+
+    if (p->scroll < p->n_targets - icon_rows &&
+        p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST)
+    {
+        XMapWindow(obt_display, p->list_mode_down);
+        showing_arrows = TRUE;
+    } else
+        XUnmapWindow(obt_display, p->list_mode_down);
+
+    /* make space for the arrows */
+    if (showing_arrows)
         h += ob_rr_theme->up_arrow_mask->height + OUTSIDE_BORDER
             + ob_rr_theme->down_arrow_mask->height + OUTSIDE_BORDER;
 
-
     /* center the icons if there is less than one row */
-    if (icon_rows == 1)
+    if (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS && icon_rows == 1)
         icons_center_x = (w - p->n_targets * HILITE_SIZE) / 2;
     else
         icons_center_x = 0;
@@ -455,43 +506,8 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c)
                               ob_rr_theme->down_arrow_mask->width,
                               ob_rr_theme->down_arrow_mask->height);
         }
-
-
-        /* reset the scrolling when the dialog is first shown */
-        p->scroll = 0;
-    }
-
-    /* find the focused target */
-    newtarget = NULL;
-    for (i = 0, it = p->targets; it; ++i, it = g_list_next(it)) {
-        const ObFocusCyclePopupTarget *target = it->data;
-        if (target->client == c) {
-            /* save the target */
-            newtarget = target;
-            break;
-        }
-    }
-    selected_pos = i;
-
-    /* scroll the list if needed */
-    last_scroll = p->scroll;
-    if (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) {
-        const gint top = p->scroll + SCROLL_MARGIN;
-        const gint bottom = p->scroll + icon_rows - SCROLL_MARGIN;
-        const gint min_scroll = 0;
-        const gint max_scroll = p->n_targets - icon_rows;
-
-        if (top - selected_pos >= 0) {
-            p->scroll -= top - selected_pos + 1;
-            p->scroll = MAX(p->scroll, min_scroll);
-        } else if (selected_pos - bottom >= 0) {
-            p->scroll += selected_pos - bottom + 1;
-            p->scroll = MIN(p->scroll, max_scroll);
-        }
     }
 
-    g_assert(newtarget != NULL);
-
     /* * * draw everything * * */
 
     /* draw the background */
@@ -519,18 +535,6 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c)
                 ob_rr_theme->down_arrow_mask->height);
     }
 
-    /* show the scroll arrows when appropriate */
-    if (p->scroll && p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST)
-        XMapWindow(obt_display, p->list_mode_up);
-    else
-        XUnmapWindow(obt_display, p->list_mode_up);
-
-    if (p->scroll < p->n_targets - icon_rows &&
-        p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST)
-        XMapWindow(obt_display, p->list_mode_down);
-    else
-        XUnmapWindow(obt_display, p->list_mode_down);
-
     /* draw the icons and text */
     for (i = 0, it = p->targets; it; ++i, it = g_list_next(it)) {
         const ObFocusCyclePopupTarget *target = it->data;
@@ -550,7 +554,9 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c)
 
             /* find the coordinates for the icon */
             iconx = icons_center_x + l + (col * HILITE_SIZE);
-            icony = t + ob_rr_theme->up_arrow_mask->height + OUTSIDE_BORDER
+            icony = t + (showing_arrows ? ob_rr_theme->up_arrow_mask->height
+                                          + OUTSIDE_BORDER
+                         : 0)
                 + (row * MAX(texth, HILITE_SIZE))
                 + MAX(texth - HILITE_SIZE, 0) / 2;
 
This page took 0.025179 seconds and 4 git commands to generate.