X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Ffocus_cycle_popup.c;h=c69c1d2798c4bec09280c00cd46698c5e2f7b8ce;hb=25d54d2ddab10e233a3300e2ebba13fa5f3f401f;hp=9f3fa3e86493ddee346e206d3b572400938a0959;hpb=76464a604ee2999b00b806be25722f7fcac1cd9c;p=chaz%2Fopenbox diff --git a/openbox/focus_cycle_popup.c b/openbox/focus_cycle_popup.c index 9f3fa3e8..c69c1d27 100644 --- a/openbox/focus_cycle_popup.c +++ b/openbox/focus_cycle_popup.c @@ -78,6 +78,7 @@ struct _ObFocusCyclePopup RrAppearance *a_icon; gboolean mapped; + ObFocusCyclePopupMode mode; }; /*! This popup shows all possible windows */ @@ -93,8 +94,7 @@ static void popup_setup (ObFocusCyclePopup *p, gboolean dock_windows, gboolean desktop_windows); static void popup_render (ObFocusCyclePopup *p, - const ObClient *c, - ObFocusCyclePopupMode mode); + const ObClient *c); static Window create_window(Window parent, guint bwidth, gulong mask, XSetWindowAttributes *attr) @@ -137,7 +137,6 @@ void focus_cycle_popup_startup(gboolean reconfig) /* create the text window used for the icon-mode popup */ popup.icon_mode_text = create_window(popup.bg, 0, 0, NULL); - XMapWindow(obt_display, popup.icon_mode_text); popup.targets = NULL; popup.n_targets = 0; @@ -256,7 +255,6 @@ static void popup_setup(ObFocusCyclePopup *p, gboolean create_targets, t->textwin = create_window(p->bg, 0, 0, NULL); XMapWindow(obt_display, t->iconwin); - XMapWindow(obt_display, t->textwin); p->targets = g_list_prepend(p->targets, t); ++n; @@ -295,8 +293,7 @@ static gchar *popup_get_name(ObClient *c) return ret; } -static void popup_render(ObFocusCyclePopup *p, const ObClient *c, - ObFocusCyclePopupMode mode) +static void popup_render(ObFocusCyclePopup *p, const ObClient *c) { gint ml, mt, mr, mb; gint l, t, r, b; @@ -318,8 +315,8 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c, /* vars for list mode */ gint list_mode_icon_column_w = HILITE_SIZE + OUTSIDE_BORDER; - g_assert(mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS || - mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST); + g_assert(p->mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS || + p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST); screen_area = screen_physical_area_active(); @@ -334,17 +331,24 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c, /* get the width from the text and keep it within limits */ w = l + r + p->maxtextw; - if (mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) + if (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) /* when in list mode, there are icons down the side */ w += list_mode_icon_column_w; w = MIN(w, MAX(screen_area->width/3, POPUP_WIDTH)); /* max width */ w = MAX(w, POPUP_WIDTH); /* min width */ - if (mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS) { + /* get the text height */ + texth = RrMinHeight(p->a_hilite_text); + if (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) + texth = MAX(MAX(texth, RrMinHeight(p->a_text)), ICON_SIZE); + else + texth += TEXT_BORDER * 2; + + if (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS) { /* 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; + icons_per_row = (w + HILITE_SIZE - 1) / HILITE_SIZE; + w = icons_per_row * HILITE_SIZE + l + r; /* how many rows do we need? */ icon_rows = (p->n_targets-1) / icons_per_row + 1; @@ -353,30 +357,33 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c, else { /* in list mode, there is one column of icons.. */ icons_per_row = 1; - icon_rows = p->n_targets; + /* maximum is 80% of the screen height */ + icon_rows = MIN(p->n_targets, + (4*screen_area->height/5) /* 80% of the screen */ + / + MAX(HILITE_SIZE, texth)); /* height of each row */ } - /* get the text dimensions */ + /* get the text width */ textw = w - l - r; - if (mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) + if (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) /* leave space on the side for the icons */ textw -= list_mode_icon_column_w; - texth = RrMinHeight(p->a_text) + TEXT_BORDER * 2; /* find the height of the dialog */ #warning limit the height and scroll entries somehow h = t + b + (icon_rows * MAX(HILITE_SIZE, texth)); - if (mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS) + 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; /* center the icons if there is less than one row */ if (icon_rows == 1) - icons_center_x = (w - p->n_targets * ICON_SIZE) / 2; + icons_center_x = (w - p->n_targets * HILITE_SIZE) / 2; else icons_center_x = 0; - if (mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS) { + if (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS) { /* get the position of the text */ icon_mode_textx = l; icon_mode_texty = h - texth - b; @@ -398,10 +405,14 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c, /* position the background but don't draw it */ XMoveResizeWindow(obt_display, p->bg, x, y, w, h); - if (mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS) + if (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS) { /* position the text */ XMoveResizeWindow(obt_display, p->icon_mode_text, icon_mode_textx, icon_mode_texty, textw, texth); + XMapWindow(obt_display, popup.icon_mode_text); + } + else + XUnmapWindow(obt_display, popup.icon_mode_text); } /* find the focused target */ @@ -445,19 +456,20 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c, /* find the dimensions of the text box */ list_mode_textx = iconx + HILITE_SIZE + TEXT_BORDER; list_mode_texty = icony + HILITE_OFFSET; -// textw = w -// /* left edge */ - innerx - HILITE_SIZE - TEXT_BORDER -// /* right edge */ - OUTSIDE_BORDER - TEXT_BORDER; /* position the icon */ XMoveResizeWindow(obt_display, target->iconwin, iconx, icony, HILITE_SIZE, HILITE_SIZE); /* position the text */ - if (mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) + if (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) { XMoveResizeWindow(obt_display, target->textwin, list_mode_textx, list_mode_texty, textw, texth); + XMapWindow(obt_display, target->textwin); + } + else + XUnmapWindow(obt_display, target->textwin); /* get the icon from the client */ icon = client_icon(target->client, ICON_SIZE, ICON_SIZE); @@ -481,18 +493,19 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c, RrPaint(p->a_icon, target->iconwin, HILITE_SIZE, HILITE_SIZE); /* draw the text */ - if (mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST || target == newtarget) + if (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST || + target == newtarget) { text = (target == newtarget) ? p->a_hilite_text : p->a_text; text->texture[0].data.text.string = target->text; text->surface.parentx = - mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS ? + p->mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS ? icon_mode_textx : list_mode_textx; text->surface.parenty = - mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS ? + p->mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS ? icon_mode_texty : list_mode_texty; RrPaint(text, - (mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS ? + (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS ? p->icon_mode_text : target->textwin), textw, texth); } @@ -517,12 +530,15 @@ void focus_cycle_popup_show(ObClient *c, gboolean iconic_windows, } /* do this stuff only when the dialog is first showing */ - if (!popup.mapped) - popup_setup(&popup, TRUE, iconic_windows, all_desktops, + if (!popup.mapped) { + popup_setup(&popup, TRUE, iconic_windows, all_desktops, dock_windows, desktop_windows); + /* this is fixed once the dialog is shown */ + popup.mode = mode; + } g_assert(popup.targets != NULL); - popup_render(&popup, c, mode); + popup_render(&popup, c); if (!popup.mapped) { /* show the dialog */