show the old single-window popup for directional focus.
fix multirow icons for the new popup.
This commit is contained in:
parent
2ed4552f8b
commit
ea272a93ef
3 changed files with 75 additions and 16 deletions
|
@ -375,8 +375,9 @@ void focus_directional_cycle(ObDirection dir, gboolean dock_windows,
|
||||||
}
|
}
|
||||||
if (focus_cycle_target && dialog) {
|
if (focus_cycle_target && dialog) {
|
||||||
/* same arguments as focus_target_valid */
|
/* same arguments as focus_target_valid */
|
||||||
focus_cycle_popup_show(focus_cycle_target, FALSE, FALSE, dock_windows,
|
focus_cycle_popup_single_show(focus_cycle_target,
|
||||||
desktop_windows);
|
FALSE, FALSE, dock_windows,
|
||||||
|
desktop_windows);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -388,7 +389,7 @@ done_cycle:
|
||||||
focus_cycle_target = NULL;
|
focus_cycle_target = NULL;
|
||||||
|
|
||||||
focus_cycle_draw_indicator(NULL);
|
focus_cycle_draw_indicator(NULL);
|
||||||
focus_cycle_popup_hide();
|
focus_cycle_popup_single_hide();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,10 +68,14 @@ struct _ObFocusCyclePopup
|
||||||
gboolean mapped;
|
gboolean mapped;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*! This popup shows all possible windows */
|
||||||
static ObFocusCyclePopup popup;
|
static ObFocusCyclePopup popup;
|
||||||
|
/*! This popup shows a single window */
|
||||||
|
static ObIconPopup *single_popup;
|
||||||
|
|
||||||
static gchar *popup_get_name (ObClient *c);
|
static gchar *popup_get_name (ObClient *c);
|
||||||
static void popup_setup (ObFocusCyclePopup *p,
|
static void popup_setup (ObFocusCyclePopup *p,
|
||||||
|
gboolean create_targets,
|
||||||
gboolean iconic_windows,
|
gboolean iconic_windows,
|
||||||
gboolean all_desktops,
|
gboolean all_desktops,
|
||||||
gboolean dock_windows,
|
gboolean dock_windows,
|
||||||
|
@ -91,6 +95,8 @@ void focus_cycle_popup_startup(gboolean reconfig)
|
||||||
{
|
{
|
||||||
XSetWindowAttributes attrib;
|
XSetWindowAttributes attrib;
|
||||||
|
|
||||||
|
single_popup = icon_popup_new(TRUE);
|
||||||
|
|
||||||
popup.obwin.type = Window_Internal;
|
popup.obwin.type = Window_Internal;
|
||||||
popup.a_bg = RrAppearanceCopy(ob_rr_theme->osd_hilite_bg);
|
popup.a_bg = RrAppearanceCopy(ob_rr_theme->osd_hilite_bg);
|
||||||
popup.a_text = RrAppearanceCopy(ob_rr_theme->osd_hilite_label);
|
popup.a_text = RrAppearanceCopy(ob_rr_theme->osd_hilite_label);
|
||||||
|
@ -125,6 +131,8 @@ void focus_cycle_popup_startup(gboolean reconfig)
|
||||||
|
|
||||||
void focus_cycle_popup_shutdown(gboolean reconfig)
|
void focus_cycle_popup_shutdown(gboolean reconfig)
|
||||||
{
|
{
|
||||||
|
icon_popup_free(single_popup);
|
||||||
|
|
||||||
stacking_remove(INTERNAL_AS_WINDOW(&popup));
|
stacking_remove(INTERNAL_AS_WINDOW(&popup));
|
||||||
|
|
||||||
while(popup.targets) {
|
while(popup.targets) {
|
||||||
|
@ -146,7 +154,7 @@ void focus_cycle_popup_shutdown(gboolean reconfig)
|
||||||
RrAppearanceFree(popup.a_bg);
|
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 iconic_windows, gboolean all_desktops,
|
||||||
gboolean dock_windows, gboolean desktop_windows)
|
gboolean dock_windows, gboolean desktop_windows)
|
||||||
{
|
{
|
||||||
|
@ -171,20 +179,26 @@ static void popup_setup(ObFocusCyclePopup *p,
|
||||||
dock_windows,
|
dock_windows,
|
||||||
desktop_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);
|
|
||||||
|
|
||||||
XMapWindow(ob_display, t->win);
|
|
||||||
|
|
||||||
/* measure */
|
/* measure */
|
||||||
p->a_text->texture[0].data.text.string = t->text;
|
p->a_text->texture[0].data.text.string = text;
|
||||||
maxwidth = MAX(maxwidth, RrMinWidth(p->a_text));
|
maxwidth = MAX(maxwidth, RrMinWidth(p->a_text));
|
||||||
|
|
||||||
p->targets = g_list_prepend(p->targets, t);
|
if (!create_targets)
|
||||||
++n;
|
g_free(text);
|
||||||
|
else {
|
||||||
|
ObFocusCyclePopupTarget *t = g_new(ObFocusCyclePopupTarget, 1);
|
||||||
|
|
||||||
|
t->client = ft;
|
||||||
|
t->text = text;
|
||||||
|
t->win = create_window(p->bg, 0, 0, NULL);
|
||||||
|
|
||||||
|
XMapWindow(ob_display, t->win);
|
||||||
|
|
||||||
|
p->targets = g_list_prepend(p->targets, t);
|
||||||
|
++n;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -297,7 +311,7 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c)
|
||||||
if (icon_rows == 1)
|
if (icon_rows == 1)
|
||||||
icons_center_x = (w - p->n_targets * ICON_SIZE) / 2;
|
icons_center_x = (w - p->n_targets * ICON_SIZE) / 2;
|
||||||
else
|
else
|
||||||
icons_center_x;
|
icons_center_x = 0;
|
||||||
|
|
||||||
if (!p->mapped) {
|
if (!p->mapped) {
|
||||||
/* position the background but don't draw it*/
|
/* position the background but don't draw it*/
|
||||||
|
@ -431,7 +445,7 @@ void focus_cycle_popup_show(ObClient *c, gboolean iconic_windows,
|
||||||
|
|
||||||
/* do this stuff only when the dialog is first showing */
|
/* do this stuff only when the dialog is first showing */
|
||||||
if (!popup.mapped)
|
if (!popup.mapped)
|
||||||
popup_setup(&popup, iconic_windows, all_desktops,
|
popup_setup(&popup, TRUE, iconic_windows, all_desktops,
|
||||||
dock_windows, desktop_windows);
|
dock_windows, desktop_windows);
|
||||||
g_assert(popup.targets != NULL);
|
g_assert(popup.targets != NULL);
|
||||||
|
|
||||||
|
@ -467,3 +481,40 @@ void focus_cycle_popup_hide()
|
||||||
popup.hilite_rgba = NULL;
|
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);
|
||||||
|
}
|
||||||
|
|
|
@ -32,4 +32,11 @@ void focus_cycle_popup_show(struct _ObClient *c, gboolean iconic_windows,
|
||||||
gboolean desktop_windows);
|
gboolean desktop_windows);
|
||||||
void focus_cycle_popup_hide();
|
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
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue