all repos — openbox @ ea272a93efe26bb6c0b0d9278cee4a67cc9c872e

openbox fork - make it a bit more like ryudo

show the old single-window popup for directional focus.
fix multirow icons for the new popup.
Dana Jansens danakj@orodu.net
commit

ea272a93efe26bb6c0b0d9278cee4a67cc9c872e

parent

2ed4552f8ba79d4f2ca78e61b1c74af8478be988

3 files changed, 75 insertions(+), 16 deletions(-)

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

@@ -375,8 +375,9 @@ }

} if (focus_cycle_target && dialog) { /* same arguments as focus_target_valid */ - focus_cycle_popup_show(focus_cycle_target, FALSE, FALSE, dock_windows, - desktop_windows); + focus_cycle_popup_single_show(focus_cycle_target, + FALSE, FALSE, dock_windows, + desktop_windows); return; }

@@ -388,7 +389,7 @@ first = NULL;

focus_cycle_target = NULL; focus_cycle_draw_indicator(NULL); - focus_cycle_popup_hide(); + focus_cycle_popup_single_hide(); return; }
M openbox/focus_cycle_popup.copenbox/focus_cycle_popup.c

@@ -68,10 +68,14 @@

gboolean mapped; }; +/*! This popup shows all possible windows */ static ObFocusCyclePopup popup; +/*! This popup shows a single window */ +static ObIconPopup *single_popup; static gchar *popup_get_name (ObClient *c); static void popup_setup (ObFocusCyclePopup *p, + gboolean create_targets, gboolean iconic_windows, gboolean all_desktops, gboolean dock_windows,

@@ -91,6 +95,8 @@ void focus_cycle_popup_startup(gboolean reconfig)

{ XSetWindowAttributes attrib; + single_popup = icon_popup_new(TRUE); + popup.obwin.type = Window_Internal; popup.a_bg = RrAppearanceCopy(ob_rr_theme->osd_hilite_bg); popup.a_text = RrAppearanceCopy(ob_rr_theme->osd_hilite_label);

@@ -125,6 +131,8 @@ }

void focus_cycle_popup_shutdown(gboolean reconfig) { + icon_popup_free(single_popup); + stacking_remove(INTERNAL_AS_WINDOW(&popup)); while(popup.targets) {

@@ -146,7 +154,7 @@ RrAppearanceFree(popup.a_text);

RrAppearanceFree(popup.a_bg); } -static void popup_setup(ObFocusCyclePopup *p, +static void popup_setup(ObFocusCyclePopup *p, gboolean create_targets, gboolean iconic_windows, gboolean all_desktops, gboolean dock_windows, gboolean desktop_windows) {

@@ -171,20 +179,26 @@ all_desktops,

dock_windows, desktop_windows)) { - ObFocusCyclePopupTarget *t = g_new(ObFocusCyclePopupTarget, 1); + gchar *text = popup_get_name(ft); - t->client = ft; - t->text = popup_get_name(ft); - t->win = create_window(p->bg, 0, 0, NULL); + /* measure */ + p->a_text->texture[0].data.text.string = text; + maxwidth = MAX(maxwidth, RrMinWidth(p->a_text)); + + if (!create_targets) + g_free(text); + else { + ObFocusCyclePopupTarget *t = g_new(ObFocusCyclePopupTarget, 1); - XMapWindow(ob_display, t->win); + t->client = ft; + t->text = text; + t->win = create_window(p->bg, 0, 0, NULL); - /* measure */ - p->a_text->texture[0].data.text.string = t->text; - maxwidth = MAX(maxwidth, RrMinWidth(p->a_text)); + XMapWindow(ob_display, t->win); - p->targets = g_list_prepend(p->targets, t); - ++n; + p->targets = g_list_prepend(p->targets, t); + ++n; + } } }

@@ -297,7 +311,7 @@ /* 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; + icons_center_x = 0; if (!p->mapped) { /* position the background but don't draw it*/

@@ -431,7 +445,7 @@ g_assert(c != NULL);

/* do this stuff only when the dialog is first showing */ if (!popup.mapped) - popup_setup(&popup, iconic_windows, all_desktops, + popup_setup(&popup, TRUE, iconic_windows, all_desktops, dock_windows, desktop_windows); g_assert(popup.targets != NULL);

@@ -467,3 +481,40 @@ g_free(popup.hilite_rgba);

popup.hilite_rgba = NULL; } +void focus_cycle_popup_single_show(struct _ObClient *c, + gboolean iconic_windows, + gboolean all_desktops, + gboolean dock_windows, + gboolean desktop_windows) +{ + gchar *text; + + g_assert(c != NULL); + + /* do this stuff only when the dialog is first showing */ + if (!popup.mapped) { + Rect *a; + + popup_setup(&popup, FALSE, iconic_windows, all_desktops, + dock_windows, desktop_windows); + g_assert(popup.targets == NULL); + + /* position the popup */ + a = screen_physical_area_monitor(0); + icon_popup_position(single_popup, CenterGravity, + a->x + a->width / 2, a->y + a->height / 2); + icon_popup_height(single_popup, POPUP_HEIGHT); + icon_popup_min_width(single_popup, POPUP_WIDTH); + icon_popup_max_width(single_popup, MAX(a->width/3, POPUP_WIDTH)); + icon_popup_text_width(single_popup, popup.maxtextw); + } + + text = popup_get_name(c); + icon_popup_show(single_popup, text, client_icon(c, ICON_SIZE, ICON_SIZE)); + g_free(text); +} + +void focus_cycle_popup_single_hide() +{ + icon_popup_hide(single_popup); +}
M openbox/focus_cycle_popup.hopenbox/focus_cycle_popup.h

@@ -32,4 +32,11 @@ gboolean all_desktops, gboolean dock_windows,

gboolean desktop_windows); void focus_cycle_popup_hide(); +void focus_cycle_popup_single_show(struct _ObClient *c, + gboolean iconic_windows, + gboolean all_desktops, + gboolean dock_windows, + gboolean desktop_windows); +void focus_cycle_popup_single_hide(); + #endif