X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Ffocus_cycle_popup.c;h=cc2b3b362beb2edf1c12c98f14b21367b8c6e147;hb=965ed8907a5dd81d5ffbc93b67a672fa78833854;hp=4d1dfaa35a87533dd9ab3b6bf66c2efcb1d9f684;hpb=3167fc223ea82851ae954b348a5ff1c0ce6b6d79;p=chaz%2Fopenbox diff --git a/openbox/focus_cycle_popup.c b/openbox/focus_cycle_popup.c index 4d1dfaa3..cc2b3b36 100644 --- a/openbox/focus_cycle_popup.c +++ b/openbox/focus_cycle_popup.c @@ -23,6 +23,7 @@ #include "screen.h" #include "focus.h" #include "openbox.h" +#include "config.h" #include "window.h" #include "event.h" #include "render/render.h" @@ -30,16 +31,16 @@ #include #include +/* Size of the icons, which can appear inside or outside of a hilite box */ +#define ICON_SIZE (gint)config_theme_window_list_icon_size /* Size of the hilite box around a window's icon */ -#define HILITE_SIZE 40 +#define HILITE_SIZE (ICON_SIZE + 2*HILITE_OFFSET) /* Width of the outer ring around the hilite box */ #define HILITE_WIDTH 2 /* Space between the outer ring around the hilite box and the icon inside it */ #define HILITE_MARGIN 1 /* Total distance from the edge of the hilite box to the icon inside it */ #define HILITE_OFFSET (HILITE_WIDTH + HILITE_MARGIN) -/* Size of the icons, which can appear inside or outside of a hilite box */ -#define ICON_SIZE (HILITE_SIZE - 2*HILITE_OFFSET) /* Margin area around the outside of the dialog */ #define OUTSIDE_BORDER 3 /* Margin area around the text */ @@ -54,6 +55,7 @@ typedef struct _ObFocusCyclePopupTarget ObFocusCyclePopupTarget; struct _ObFocusCyclePopupTarget { ObClient *client; + RrImage *icon; gchar *text; Window iconwin; /* This is used when the popup is in list mode */ @@ -139,8 +141,10 @@ void focus_cycle_popup_startup(gboolean reconfig) may or may not be used */ RrAppearanceAddTextures(popup.a_icon, 2); - popup.a_icon->texture[0].type = RR_TEXTURE_RGBA; + RrAppearanceClearTextures(popup.a_icon); + popup.a_icon->texture[0].type = RR_TEXTURE_IMAGE; + RrAppearanceClearTextures(popup.a_arrow); popup.a_arrow->texture[0].type = RR_TEXTURE_MASK; popup.a_arrow->texture[0].data.mask.color = ob_rr_theme->osd_color; @@ -212,9 +216,11 @@ void focus_cycle_popup_shutdown(gboolean reconfig) while(popup.targets) { ObFocusCyclePopupTarget *t = popup.targets->data; + RrImageUnref(t->icon); g_free(t->text); XDestroyWindow(obt_display, t->iconwin); XDestroyWindow(obt_display, t->textwin); + g_free(t); popup.targets = g_list_delete_link(popup.targets, popup.targets); } @@ -257,7 +263,8 @@ static void popup_setup(ObFocusCyclePopup *p, gboolean create_targets, iconic_windows, all_desktops, dock_windows, - desktop_windows)) + desktop_windows, + FALSE)) { gchar *text = popup_get_name(ft); @@ -272,6 +279,8 @@ static void popup_setup(ObFocusCyclePopup *p, gboolean create_targets, t->client = ft; t->text = text; + t->icon = client_icon(t->client); + RrImageRef(t->icon); /* own the icon so it won't go away */ t->iconwin = create_window(p->bg, 0, 0, NULL); t->textwin = create_window(p->bg, 0, 0, NULL); @@ -318,10 +327,10 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c) gint l, t, r, b; gint x, y, w, h; Rect *screen_area = NULL; - gint rgbax, rgbay, rgbaw, rgbah; gint i; GList *it; const ObFocusCyclePopupTarget *newtarget; + ObFocusCyclePopupMode mode = p->mode; gint icons_per_row; gint icon_rows; gint textw, texth; @@ -339,10 +348,10 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c) gint up_arrow_y, down_arrow_y; gboolean showing_arrows = FALSE; - g_assert(p->mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS || - p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST); + g_assert(mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS || + mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST); - screen_area = screen_physical_area_active(); + screen_area = screen_physical_area_primary(FALSE); /* get the outside margins */ RrMargins(p->a_bg, &ml, &mt, &mr, &mb); @@ -355,7 +364,7 @@ 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 (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) + if (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 */ @@ -363,12 +372,12 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c) /* get the text height */ texth = RrMinHeight(p->a_hilite_text); - if (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) + if (mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) texth = MAX(MAX(texth, RrMinHeight(p->a_text)), HILITE_SIZE); else texth += TEXT_BORDER * 2; - if (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS) { + if (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 + HILITE_SIZE - 1) / HILITE_SIZE; @@ -390,7 +399,7 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c) /* get the text width */ textw = w - l - r; - if (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) + if (mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) /* leave space on the side for the icons */ textw -= list_mode_icon_column_w; @@ -400,7 +409,7 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c) /* find the height of the dialog */ h = t + b + (icon_rows * MAX(HILITE_SIZE, texth)); - if (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS) + if (mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS) /* in icon mode the text sits below the icons, so make some space */ h += OUTSIDE_BORDER + texth; @@ -419,7 +428,7 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c) /* scroll the list if needed */ last_scroll = p->scroll; - if (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) { + if (mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) { const gint top = p->scroll + SCROLL_MARGIN; const gint bottom = p->scroll + icon_rows - SCROLL_MARGIN; const gint min_scroll = 0; @@ -435,14 +444,14 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c) } /* show the scroll arrows when appropriate */ - if (p->scroll && p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) { + if (p->scroll && mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) { XMapWindow(obt_display, p->list_mode_up); showing_arrows = TRUE; } else XUnmapWindow(obt_display, p->list_mode_up); if (p->scroll < p->n_targets - icon_rows && - p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) + mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) { XMapWindow(obt_display, p->list_mode_down); showing_arrows = TRUE; @@ -455,12 +464,12 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c) + ob_rr_theme->down_arrow_mask->height + OUTSIDE_BORDER; /* center the icons if there is less than one row */ - if (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS && icon_rows == 1) + if (mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS && icon_rows == 1) icons_center_x = (w - p->n_targets * HILITE_SIZE) / 2; else icons_center_x = 0; - if (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS) { + if (mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS) { /* get the position of the text */ icon_mode_textx = l; icon_mode_texty = h - texth - b; @@ -472,17 +481,11 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c) y = screen_area->y + (screen_area->height - (h + ob_rr_theme->obwidth * 2)) / 2; - /* get the dimensions of the target hilite texture */ - rgbax = ml; - rgbay = mt; - rgbaw = w - ml - mr; - rgbah = h - mt - mb; - if (!p->mapped) { /* position the background but don't draw it */ XMoveResizeWindow(obt_display, p->bg, x, y, w, h); - if (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS) { + if (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); @@ -515,7 +518,7 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c) RrPaint(p->a_bg, p->bg, w, h); /* draw the scroll arrows */ - if (!p->mapped && p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) { + if (!p->mapped && 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; @@ -547,7 +550,6 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c) /* row and column start from 0 */ const gint row = i / icons_per_row - p->scroll; const gint col = i % icons_per_row; - const ObClientIcon *icon; gint iconx, icony; gint list_mode_textx, list_mode_texty; RrAppearance *text; @@ -569,7 +571,7 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c) iconx, icony, HILITE_SIZE, HILITE_SIZE); /* position the text */ - if (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) + if (mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) XMoveResizeWindow(obt_display, target->textwin, list_mode_textx, list_mode_texty, textw, texth); @@ -577,29 +579,26 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c) /* show/hide the right windows */ if (row >= 0 && row < icon_rows) { XMapWindow(obt_display, target->iconwin); - if (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) + if (mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) XMapWindow(obt_display, target->textwin); else XUnmapWindow(obt_display, target->textwin); } else { XUnmapWindow(obt_display, target->textwin); - if (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) + if (mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST) XUnmapWindow(obt_display, target->iconwin); else XMapWindow(obt_display, target->iconwin); } /* get the icon from the client */ - icon = client_icon(target->client, ICON_SIZE, ICON_SIZE); - p->a_icon->texture[0].data.rgba.width = icon->width; - p->a_icon->texture[0].data.rgba.height = icon->height; - p->a_icon->texture[0].data.rgba.twidth = ICON_SIZE; - p->a_icon->texture[0].data.rgba.theight = ICON_SIZE; - p->a_icon->texture[0].data.rgba.tx = HILITE_OFFSET; - p->a_icon->texture[0].data.rgba.ty = HILITE_OFFSET; - p->a_icon->texture[0].data.rgba.alpha = + p->a_icon->texture[0].data.image.twidth = ICON_SIZE; + p->a_icon->texture[0].data.image.theight = ICON_SIZE; + p->a_icon->texture[0].data.image.tx = HILITE_OFFSET; + p->a_icon->texture[0].data.image.ty = HILITE_OFFSET; + p->a_icon->texture[0].data.image.alpha = target->client->iconic ? OB_ICONIC_ALPHA : 0xff; - p->a_icon->texture[0].data.rgba.data = icon->data; + p->a_icon->texture[0].data.image.image = target->icon; /* Draw the hilite? */ p->a_icon->texture[1].type = (target == newtarget) ? @@ -611,19 +610,19 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c) RrPaint(p->a_icon, target->iconwin, HILITE_SIZE, HILITE_SIZE); /* draw the text */ - if (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST || + if (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 = - p->mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS ? + mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS ? icon_mode_textx : list_mode_textx; text->surface.parenty = - p->mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS ? + mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS ? icon_mode_texty : list_mode_texty; RrPaint(text, - (p->mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS ? + (mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS ? p->icon_mode_text : target->textwin), textw, texth); } @@ -685,6 +684,7 @@ void focus_cycle_popup_hide(void) while(popup.targets) { ObFocusCyclePopupTarget *t = popup.targets->data; + RrImageUnref(t->icon); g_free(t->text); XDestroyWindow(obt_display, t->iconwin); XDestroyWindow(obt_display, t->textwin); @@ -715,7 +715,7 @@ void focus_cycle_popup_single_show(struct _ObClient *c, g_assert(popup.targets == NULL); /* position the popup */ - a = screen_physical_area_active(); + a = screen_physical_area_primary(FALSE); icon_popup_position(single_popup, CenterGravity, a->x + a->width / 2, a->y + a->height / 2); icon_popup_height(single_popup, POPUP_HEIGHT); @@ -726,8 +726,7 @@ void focus_cycle_popup_single_show(struct _ObClient *c, } text = popup_get_name(c); - icon_popup_show(single_popup, text, client_icon(c, HILITE_SIZE, - HILITE_SIZE)); + icon_popup_show(single_popup, text, client_icon(c)); g_free(text); screen_hide_desktop_popup(); } @@ -736,3 +735,17 @@ void focus_cycle_popup_single_hide(void) { icon_popup_hide(single_popup); } + +gboolean focus_cycle_popup_is_showing(ObClient *client) +{ + if (popup.mapped) { + GList *it; + + for (it = popup.targets; it; it = g_list_next(it)) { + ObFocusCyclePopupTarget *t = it->data; + if (t->client == client) + return TRUE; + } + } + return FALSE; +}