all repos — openbox @ 23cbab843592f35fba74034539f3213ae5d1b7c9

openbox fork - make it a bit more like ryudo

Beginnings of alt-tab dialog that lists all titles to the right of icons
Mikael Magnusson mikachu@comhem.se
commit

23cbab843592f35fba74034539f3213ae5d1b7c9

parent

f740f47e772d4fd465c32d3c61a4953df3d2171f

1 files changed, 29 insertions(+), 61 deletions(-)

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

@@ -43,15 +43,14 @@ struct _ObFocusCyclePopupTarget

{ ObClient *client; gchar *text; - Window win; + Window iconwin; + Window textwin; }; struct _ObFocusCyclePopup { ObWindow obwin; Window bg; - - Window text; GList *targets; gint n_targets;

@@ -116,15 +115,11 @@ attrib.border_pixel=RrColorPixel(ob_rr_theme->osd_border_color);

popup.bg = create_window(obt_root(ob_screen), ob_rr_theme->obwidth, CWOverrideRedirect | CWBorderPixel, &attrib); - popup.text = create_window(popup.bg, 0, 0, NULL); - popup.targets = NULL; popup.n_targets = 0; popup.last_target = NULL; popup.hilite_rgba = NULL; - - XMapWindow(obt_display, popup.text); stacking_add(INTERNAL_AS_WINDOW(&popup)); window_add(&popup.bg, INTERNAL_AS_WINDOW(&popup));

@@ -141,7 +136,8 @@ while(popup.targets) {

ObFocusCyclePopupTarget *t = popup.targets->data; g_free(t->text); - XDestroyWindow(obt_display, t->win); + XDestroyWindow(obt_display, t->iconwin); + XDestroyWindow(obt_display, t->textwin); popup.targets = g_list_delete_link(popup.targets, popup.targets); }

@@ -149,7 +145,6 @@

g_free(popup.hilite_rgba); popup.hilite_rgba = NULL; - XDestroyWindow(obt_display, popup.text); XDestroyWindow(obt_display, popup.bg); RrAppearanceFree(popup.a_icon);

@@ -195,9 +190,11 @@ ObFocusCyclePopupTarget *t = g_new(ObFocusCyclePopupTarget, 1);

t->client = ft; t->text = text; - t->win = create_window(p->bg, 0, 0, NULL); + t->iconwin = create_window(p->bg, 0, 0, NULL); + t->textwin = create_window(p->bg, 0, 0, NULL); - XMapWindow(obt_display, t->win); + XMapWindow(obt_display, t->iconwin); + XMapWindow(obt_display, t->textwin); p->targets = g_list_prepend(p->targets, t); ++n;

@@ -242,11 +239,7 @@ gint ml, mt, mr, mb;

gint l, t, r, b; gint x, y, w, h; Rect *screen_area = NULL; - gint icons_per_row; - gint icon_rows; - gint textx, texty, textw, texth; gint rgbax, rgbay, rgbaw, rgbah; - gint icons_center_x; gint innerw, innerh; gint i; GList *it;

@@ -273,24 +266,8 @@ w = l + r + p->maxtextw;

w = MIN(w, MAX(screen_area->width/3, POPUP_WIDTH)); /* max width */ w = MAX(w, POPUP_WIDTH); /* min width */ - /* how many icons will fit in that row? make the width fit that */ - w -= l + r; - icons_per_row = (w + ICON_SIZE - 1) / ICON_SIZE; - w = icons_per_row * ICON_SIZE + l + r; - - /* how many rows do we need? */ - icon_rows = (p->n_targets-1) / icons_per_row + 1; - - /* get the text dimensions */ - textw = w - l - r; - texth = RrMinHeight(p->a_text) + TEXT_BORDER * 2; - /* find the height of the dialog */ - h = t + b + (icon_rows * ICON_SIZE) + (OUTSIDE_BORDER + texth); - - /* get the position of the text */ - textx = l; - texty = h - texth - b; + h = t + b + (p->n_targets * ICON_SIZE) + OUTSIDE_BORDER; /* find the position for the popup (include the outer borders) */ x = screen_area->x + (screen_area->width -

@@ -304,12 +281,6 @@ rgbay = mt;

rgbaw = w - ml - mr; rgbah = h - mt - mb; - /* center the icons if there is less than one row */ - if (icon_rows == 1) - icons_center_x = (w - p->n_targets * ICON_SIZE) / 2; - else - icons_center_x = 0; - if (!p->mapped) { /* position the background but don't draw it*/ XMoveResizeWindow(obt_display, p->bg, x, y, w, h);

@@ -320,24 +291,17 @@ p->a_bg->texture[0].data.rgba.height = rgbah;

p->a_bg->texture[0].data.rgba.alpha = 0xff; p->hilite_rgba = g_new(RrPixel32, rgbaw * rgbah); p->a_bg->texture[0].data.rgba.data = p->hilite_rgba; - - /* position the text, but don't draw it */ - XMoveResizeWindow(obt_display, p->text, textx, texty, textw, texth); - p->a_text->surface.parentx = textx; - p->a_text->surface.parenty = texty; } /* find the focused target */ for (i = 0, it = p->targets; it; ++i, it = g_list_next(it)) { const ObFocusCyclePopupTarget *target = it->data; - const gint row = i / icons_per_row; /* starting from 0 */ - const gint col = i % icons_per_row; /* starting from 0 */ if (target->client == c) { /* save the target */ newtarget = target; - newtargetx = icons_center_x + l + (col * ICON_SIZE); - newtargety = t + (row * ICON_SIZE); + newtargetx = l; + newtargety = t + i * ICON_SIZE; if (!p->mapped) break; /* if we're not dimensioning, then we're done */

@@ -391,7 +355,7 @@

/* draw the background */ RrPaint(p->a_bg, p->bg, w, h); - /* draw the icons */ + /* draw the icons and text */ for (i = 0, it = p->targets; it; ++i, it = g_list_next(it)) { const ObFocusCyclePopupTarget *target = it->data;

@@ -399,20 +363,23 @@ /* have to redraw the targetted icon and last targetted icon,

they can pick up the hilite changes in the backgroud */ if (!p->mapped || newtarget == target || p->last_target == target) { const ObClientIcon *icon; - const gint row = i / icons_per_row; /* starting from 0 */ - const gint col = i % icons_per_row; /* starting from 0 */ gint innerx, innery; /* find the dimensions of the icon inside it */ - innerx = icons_center_x + l + (col * ICON_SIZE); + innerx = l; innerx += ICON_HILITE_WIDTH + ICON_HILITE_MARGIN; - innery = t + (row * ICON_SIZE); + innery = t + i * ICON_SIZE; innery += ICON_HILITE_WIDTH + ICON_HILITE_MARGIN; /* move the icon */ - XMoveResizeWindow(obt_display, target->win, + XMoveResizeWindow(obt_display, target->iconwin, innerx, innery, innerw, innerh); + /* move the text */ + XMoveResizeWindow(obt_display, target->textwin, + innerx + ICON_SIZE, innery, + w - innerx - ICON_SIZE - OUTSIDE_BORDER, innerh); + /* get the icon from the client */ icon = client_icon(target->client, innerw, innerh); p->a_icon->texture[0].data.rgba.width = icon->width;

@@ -424,15 +391,15 @@

/* draw the icon */ p->a_icon->surface.parentx = innerx; p->a_icon->surface.parenty = innery; - RrPaint(p->a_icon, target->win, innerw, innerh); + RrPaint(p->a_icon, target->iconwin, innerw, innerh); + + /* draw the text */ + p->a_text->texture[0].data.text.string = target->text; + p->a_text->surface.parentx = innerx + ICON_SIZE; + p->a_text->surface.parenty = innery; + RrPaint(p->a_text, target->textwin, w - innerx - ICON_SIZE - OUTSIDE_BORDER, innerh); } } - - /* draw the text */ - p->a_text->texture[0].data.text.string = newtarget->text; - p->a_text->surface.parentx = textx; - p->a_text->surface.parenty = texty; - RrPaint(p->a_text, p->text, textw, texth); p->last_target = newtarget;

@@ -479,7 +446,8 @@ while(popup.targets) {

ObFocusCyclePopupTarget *t = popup.targets->data; g_free(t->text); - XDestroyWindow(obt_display, t->win); + XDestroyWindow(obt_display, t->iconwin); + XDestroyWindow(obt_display, t->textwin); g_free(t); popup.targets = g_list_delete_link(popup.targets, popup.targets);