all repos — openbox @ bc13099405a7aecc0eb8b6688b2b3a384f4dfcac

openbox fork - make it a bit more like ryudo

show a small arrow on the top/bottom of the alttab list box when there are more windows that are not visible in that direction
Dana Jansens danakj@orodu.net
commit

bc13099405a7aecc0eb8b6688b2b3a384f4dfcac

parent

92bbd733fa1a8fbc5eebf207932bf26be0251894

3 files changed, 91 insertions(+), 2 deletions(-)

jump to
M openbox/focus_cycle_popup.copenbox/focus_cycle_popup.c

@@ -68,6 +68,9 @@

/* This is used when the popup is in icon mode */ Window icon_mode_text; + Window list_mode_up; + Window list_mode_down; + GList *targets; gint n_targets;

@@ -82,6 +85,7 @@ RrAppearance *a_bg;

RrAppearance *a_text; RrAppearance *a_hilite_text; RrAppearance *a_icon; + RrAppearance *a_arrow; gboolean mapped; ObFocusCyclePopupMode mode;

@@ -122,6 +126,7 @@ popup.a_bg = RrAppearanceCopy(ob_rr_theme->osd_hilite_bg);

popup.a_hilite_text = RrAppearanceCopy(ob_rr_theme->osd_hilite_label); popup.a_text = RrAppearanceCopy(ob_rr_theme->a_unfocused_label); popup.a_icon = RrAppearanceCopy(ob_rr_theme->a_clear); + popup.a_arrow = RrAppearanceCopy(ob_rr_theme->a_clear_tex); popup.a_hilite_text->surface.parent = popup.a_bg; popup.a_text->surface.parent = popup.a_bg;

@@ -136,6 +141,10 @@ RrAppearanceAddTextures(popup.a_icon, 2);

popup.a_icon->texture[0].type = RR_TEXTURE_RGBA; + popup.a_arrow->texture[0].type = RR_TEXTURE_MASK; + popup.a_arrow->texture[0].data.mask.color = + ob_rr_theme->osd_color; + attrib.override_redirect = True; attrib.border_pixel=RrColorPixel(ob_rr_theme->osd_border_color); popup.bg = create_window(obt_root(ob_screen), ob_rr_theme->obwidth,

@@ -144,6 +153,10 @@

/* create the text window used for the icon-mode popup */ popup.icon_mode_text = create_window(popup.bg, 0, 0, NULL); + /* create the windows for the up and down arrows */ + popup.list_mode_up = create_window(popup.bg, 0, 0, NULL); + popup.list_mode_down = create_window(popup.bg, 0, 0, NULL); + popup.targets = NULL; popup.n_targets = 0; popup.last_target = NULL;

@@ -210,9 +223,12 @@

g_free(popup.a_icon->texture[1].data.rgba.data); popup.a_icon->texture[1].data.rgba.data = NULL; + XDestroyWindow(obt_display, popup.list_mode_up); + XDestroyWindow(obt_display, popup.list_mode_down); XDestroyWindow(obt_display, popup.icon_mode_text); XDestroyWindow(obt_display, popup.bg); + RrAppearanceFree(popup.a_arrow); RrAppearanceFree(popup.a_icon); RrAppearanceFree(popup.a_hilite_text); RrAppearanceFree(popup.a_text);

@@ -320,6 +336,8 @@ gint icons_center_x;

/* vars for list mode */ gint list_mode_icon_column_w = HILITE_SIZE + OUTSIDE_BORDER; + gint up_arrow_x, down_arrow_x; + gint up_arrow_y, down_arrow_y; g_assert(p->mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS || p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST);

@@ -383,6 +401,10 @@ 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 + 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)

@@ -418,9 +440,27 @@ XMoveResizeWindow(obt_display, p->icon_mode_text,

icon_mode_textx, icon_mode_texty, textw, texth); XMapWindow(obt_display, popup.icon_mode_text); } - else + else { XUnmapWindow(obt_display, popup.icon_mode_text); + up_arrow_x = (w - ob_rr_theme->up_arrow_mask->width) / 2; + up_arrow_y = t; + + down_arrow_x = (w - ob_rr_theme->down_arrow_mask->width) / 2; + down_arrow_y = h - b - ob_rr_theme->down_arrow_mask->height; + + /* position the arrows */ + XMoveResizeWindow(obt_display, p->list_mode_up, + up_arrow_x, up_arrow_y, + ob_rr_theme->up_arrow_mask->width, + ob_rr_theme->up_arrow_mask->height); + XMoveResizeWindow(obt_display, p->list_mode_down, + down_arrow_x, down_arrow_y, + 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; }

@@ -463,6 +503,39 @@ /* draw the background */

if (!p->mapped) RrPaint(p->a_bg, p->bg, w, h); + /* draw the scroll arrows */ + if (!p->mapped && p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) { + p->a_arrow->texture[0].data.mask.mask = + ob_rr_theme->up_arrow_mask; + p->a_arrow->surface.parent = p->a_bg; + p->a_arrow->surface.parentx = up_arrow_x; + p->a_arrow->surface.parenty = up_arrow_y; + RrPaint(p->a_arrow, p->list_mode_up, + ob_rr_theme->up_arrow_mask->width, + ob_rr_theme->up_arrow_mask->height); + + p->a_arrow->texture[0].data.mask.mask = + ob_rr_theme->down_arrow_mask; + p->a_arrow->surface.parent = p->a_bg; + p->a_arrow->surface.parentx = down_arrow_x; + p->a_arrow->surface.parenty = down_arrow_y; + RrPaint(p->a_arrow, p->list_mode_down, + ob_rr_theme->down_arrow_mask->width, + 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;

@@ -482,7 +555,8 @@ RrAppearance *text;

/* find the coordinates for the icon */ iconx = icons_center_x + l + (col * HILITE_SIZE); - icony = t + (row * MAX(texth, HILITE_SIZE)) + icony = t + ob_rr_theme->up_arrow_mask->height + OUTSIDE_BORDER + + (row * MAX(texth, HILITE_SIZE)) + MAX(texth - HILITE_SIZE, 0) / 2; /* find the dimensions of the text box */
M render/theme.crender/theme.c

@@ -538,6 +538,16 @@ guchar data[] = { 0x01, 0x03, 0x07, 0x0f, 0x07, 0x03, 0x01 };

theme->menu_bullet_mask = RrPixmapMaskNew(inst, 4, 7, (gchar*)data); } + /* up and down arrows */ + { + guchar data[] = { 0xfe, 0x00, 0x7c, 0x00, 0x38, 0x00, 0x10, 0x00 }; + theme->down_arrow_mask = RrPixmapMaskNew(inst, 9, 4, (gchar*)data); + } + { + guchar data[] = { 0x10, 0x00, 0x38, 0x00, 0x7c, 0x00, 0xfe, 0x00 }; + theme->up_arrow_mask = RrPixmapMaskNew(inst, 9, 4, (gchar*)data); + } + /* setup the default window icon */ theme->def_win_icon = read_c_image(OB_DEFAULT_ICON_WIDTH, OB_DEFAULT_ICON_HEIGHT,

@@ -1450,6 +1460,8 @@ RrPixmapMaskFree(theme->close_disabled_mask);

RrPixmapMaskFree(theme->close_hover_mask); RrPixmapMaskFree(theme->close_pressed_mask); RrPixmapMaskFree(theme->menu_bullet_mask); + RrPixmapMaskFree(theme->down_arrow_mask); + RrPixmapMaskFree(theme->up_arrow_mask); RrFontClose(theme->win_font_focused); RrFontClose(theme->win_font_unfocused);
M render/theme.hrender/theme.h

@@ -144,6 +144,9 @@ #if 0

RrPixmapMask *menu_toggle_mask; /* menu boolean */ #endif + RrPixmapMask *down_arrow_mask; + RrPixmapMask *up_arrow_mask; + /* global appearances */ RrAppearance *a_disabled_focused_max; RrAppearance *a_disabled_unfocused_max;