X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Ffocus_cycle_popup.c;h=df3558dff5110e59e91f3cb562cd8ed8be614af3;hb=4c7cc1cfa64bf5722f059eae0528d510c2ae636f;hp=8ce2c161058afe8890987af5af001c04d4450df0;hpb=c12d09bde85e40fdfbb36225a1b596b5f27c2335;p=chaz%2Fopenbox diff --git a/openbox/focus_cycle_popup.c b/openbox/focus_cycle_popup.c index 8ce2c161..df3558df 100644 --- a/openbox/focus_cycle_popup.c +++ b/openbox/focus_cycle_popup.c @@ -42,6 +42,7 @@ typedef struct _ObFocusCyclePopupTarget ObFocusCyclePopupTarget; struct _ObFocusCyclePopupTarget { ObClient *client; + RrImage *icon; gchar *text; Window win; }; @@ -106,7 +107,8 @@ void focus_cycle_popup_startup(gboolean reconfig) popup.a_text->surface.parent = popup.a_bg; popup.a_icon->surface.parent = popup.a_bg; - popup.a_icon->texture[0].type = RR_TEXTURE_RGBA; + RrAppearanceClearTextures(popup.a_icon); + popup.a_icon->texture[0].type = RR_TEXTURE_IMAGE; RrAppearanceAddTextures(popup.a_bg, 1); popup.a_bg->texture[0].type = RR_TEXTURE_RGBA; @@ -128,24 +130,29 @@ void focus_cycle_popup_startup(gboolean reconfig) XMapWindow(ob_display, popup.text); stacking_add(INTERNAL_AS_WINDOW(&popup)); + g_hash_table_insert(window_map, &popup.bg, &popup); } void focus_cycle_popup_shutdown(gboolean reconfig) { icon_popup_free(single_popup); + g_hash_table_remove(window_map, &popup.bg); stacking_remove(INTERNAL_AS_WINDOW(&popup)); while(popup.targets) { ObFocusCyclePopupTarget *t = popup.targets->data; + RrImageUnref(t->icon); g_free(t->text); XDestroyWindow(ob_display, t->win); + g_free(t); popup.targets = g_list_delete_link(popup.targets, popup.targets); } g_free(popup.hilite_rgba); + popup.hilite_rgba = NULL; XDestroyWindow(ob_display, popup.text); XDestroyWindow(ob_display, popup.bg); @@ -193,6 +200,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->win = create_window(p->bg, 0, 0, NULL); XMapWindow(ob_display, t->win); @@ -396,7 +405,6 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c) /* 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; @@ -412,12 +420,9 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c) innerx, innery, innerw, innerh); /* get the icon from the client */ - icon = client_icon(target->client, innerw, innerh); - 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.alpha = + 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 icon */ p->a_icon->surface.parentx = innerx; @@ -460,7 +465,7 @@ void focus_cycle_popup_show(ObClient *c, gboolean iconic_windows, } } -void focus_cycle_popup_hide() +void focus_cycle_popup_hide(void) { gulong ignore_start; @@ -476,8 +481,10 @@ void focus_cycle_popup_hide() while(popup.targets) { ObFocusCyclePopupTarget *t = popup.targets->data; + RrImageUnref(t->icon); g_free(t->text); XDestroyWindow(ob_display, t->win); + g_free(t); popup.targets = g_list_delete_link(popup.targets, popup.targets); } @@ -518,12 +525,12 @@ void focus_cycle_popup_single_show(struct _ObClient *c, } text = popup_get_name(c); - icon_popup_show(single_popup, text, client_icon(c, ICON_SIZE, ICON_SIZE)); + icon_popup_show(single_popup, text, client_icon(c)); g_free(text); screen_hide_desktop_popup(); } -void focus_cycle_popup_single_hide() +void focus_cycle_popup_single_hide(void) { icon_popup_hide(single_popup); }