Advertisement
Guest User

91_gtkstatusicon_backport.patch

a guest
Mar 24th, 2010
560
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 13.24 KB | None | 0 0
  1. Description: backport GtkStatusIcon support to get proper icon transparency
  2. Origin: backport, http://developer.pidgin.im/viewmtn/revision/info/4e796a513d5ffdab72249b7e88425b41d820a05f
  3. Bug: http://developer.pidgin.im/ticket/2629
  4. Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/light-themes/+bug/532789
  5.  
  6. diff -Naur pidgin-2.6.6.ori/pidgin/gtkdocklet-gtk.c pidgin-2.6.6/pidgin/gtkdocklet-gtk.c
  7. --- pidgin-2.6.6.ori/pidgin/gtkdocklet-gtk.c    1969-12-31 19:00:00.000000000 -0500
  8. +++ pidgin-2.6.6/pidgin/gtkdocklet-gtk.c    2010-03-05 23:09:45.000000000 -0500
  9. @@ -0,0 +1,155 @@
  10. +/*
  11. + * System tray icon (aka docklet) plugin for Purple
  12. + *
  13. + * Copyright (C) 2007 Anders Hasselqvist
  14. + *
  15. + * This program is free software; you can redistribute it and/or
  16. + * modify it under the terms of the GNU General Public License as
  17. + * published by the Free Software Foundation; either version 2 of the
  18. + * License, or (at your option) any later version.
  19. + *
  20. + * This program is distributed in the hope that it will be useful, but
  21. + * WITHOUT ANY WARRANTY; without even the implied warranty of
  22. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  23. + * General Public License for more details.
  24. + *
  25. + * You should have received a copy of the GNU General Public License
  26. + * along with this program; if not, write to the Free Software
  27. + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  28. + * 02111-1307, USA.
  29. + */
  30. +
  31. +#include "internal.h"
  32. +#include "pidgin.h"
  33. +#include "debug.h"
  34. +#include "prefs.h"
  35. +#include "pidginstock.h"
  36. +#include "gtkdocklet.h"
  37. +
  38. +/* globals */
  39. +GtkStatusIcon *docklet = NULL;
  40. +
  41. +static void
  42. +docklet_gtk_status_activated_cb(GtkStatusIcon *status_icon, gpointer user_data)
  43. +{
  44. +   pidgin_docklet_clicked(1);
  45. +}
  46. +
  47. +static void
  48. +docklet_gtk_status_clicked_cb(GtkStatusIcon *status_icon, guint button, guint activate_time, gpointer user_data)
  49. +{
  50. +   pidgin_docklet_clicked(button);
  51. +}
  52. +
  53. +static void
  54. +docklet_gtk_status_update_icon(PurpleStatusPrimitive status, gboolean connecting, gboolean pending)
  55. +{
  56. +   const gchar *icon_name = NULL;
  57. +
  58. +   switch (status) {
  59. +       case PURPLE_STATUS_OFFLINE:
  60. +           icon_name = PIDGIN_STOCK_TRAY_OFFLINE;
  61. +           break;
  62. +       case PURPLE_STATUS_AWAY:
  63. +           icon_name = PIDGIN_STOCK_TRAY_AWAY;
  64. +           break;
  65. +       case PURPLE_STATUS_UNAVAILABLE:
  66. +           icon_name = PIDGIN_STOCK_TRAY_BUSY;
  67. +           break;
  68. +       case PURPLE_STATUS_EXTENDED_AWAY:
  69. +           icon_name = PIDGIN_STOCK_TRAY_XA;
  70. +           break;
  71. +       case PURPLE_STATUS_INVISIBLE:
  72. +           icon_name = PIDGIN_STOCK_TRAY_INVISIBLE;
  73. +           break;
  74. +       default:
  75. +           icon_name = PIDGIN_STOCK_TRAY_AVAILABLE;
  76. +           break;
  77. +   }
  78. +
  79. +   if (pending)
  80. +       icon_name = PIDGIN_STOCK_TRAY_PENDING;
  81. +   if (connecting)
  82. +       icon_name = PIDGIN_STOCK_TRAY_CONNECT;
  83. +
  84. +   if (icon_name) {
  85. +       gtk_status_icon_set_from_icon_name(docklet, icon_name);
  86. +   }
  87. +}
  88. +
  89. +static void
  90. +docklet_gtk_status_set_tooltip(gchar *tooltip)
  91. +{
  92. +   if (tooltip) {
  93. +       gtk_status_icon_set_tooltip(docklet, tooltip);
  94. +   } else {
  95. +       gtk_status_icon_set_tooltip(docklet, NULL);
  96. +   }
  97. +}
  98. +
  99. +static void
  100. +docklet_gtk_status_position_menu(GtkMenu *menu,
  101. +                                 int *x, int *y, gboolean *push_in,
  102. +                                 gpointer user_data)
  103. +{
  104. +   gtk_status_icon_position_menu(menu, x, y, push_in, docklet);
  105. +}
  106. +
  107. +static void
  108. +docklet_gtk_status_destroy(void)
  109. +{
  110. +   g_return_if_fail(docklet != NULL);
  111. +
  112. +   pidgin_docklet_remove();
  113. +  
  114. +   g_object_unref(G_OBJECT(docklet));
  115. +   docklet = NULL;
  116. +
  117. +   purple_debug_info("docklet", "GTK+ destroyed\n");
  118. +}
  119. +
  120. +static void
  121. +docklet_gtk_status_create(gboolean recreate)
  122. +{
  123. +   if (docklet) {
  124. +       /* if this is being called when a tray icon exists, it's because
  125. +          something messed up. try destroying it before we proceed,
  126. +          although docklet_refcount may be all hosed. hopefully won't happen. */
  127. +       purple_debug_warning("docklet", "trying to create icon but it already exists?\n");
  128. +       docklet_gtk_status_destroy();
  129. +   }
  130. +
  131. +   docklet = gtk_status_icon_new();
  132. +   g_return_if_fail(docklet != NULL);
  133. +
  134. +   g_signal_connect(G_OBJECT(docklet), "activate", G_CALLBACK(docklet_gtk_status_activated_cb), NULL);
  135. +   g_signal_connect(G_OBJECT(docklet), "popup-menu", G_CALLBACK(docklet_gtk_status_clicked_cb), NULL);
  136. +
  137. +   pidgin_docklet_embedded();
  138. +   gtk_status_icon_set_visible(docklet, TRUE);
  139. +   purple_debug_info("docklet", "GTK+ created\n");
  140. +}
  141. +
  142. +static void
  143. +docklet_gtk_status_create_ui_op(void)
  144. +{
  145. +   docklet_gtk_status_create(FALSE);
  146. +}
  147. +
  148. +static struct docklet_ui_ops ui_ops =
  149. +{
  150. +   docklet_gtk_status_create_ui_op,
  151. +   docklet_gtk_status_destroy,
  152. +   docklet_gtk_status_update_icon,
  153. +   NULL,
  154. +   docklet_gtk_status_set_tooltip,
  155. +   docklet_gtk_status_position_menu
  156. +};
  157. +
  158. +void
  159. +docklet_ui_init(void)
  160. +{
  161. +   pidgin_docklet_set_ui_ops(&ui_ops);
  162. +   gtk_icon_theme_append_search_path(gtk_icon_theme_get_default(),
  163. +       DATADIR G_DIR_SEPARATOR_S "pixmaps" G_DIR_SEPARATOR_S "pidgin" G_DIR_SEPARATOR_S "tray");
  164. +}
  165. diff -Naur pidgin-2.6.6.ori/pidgin/gtkdocklet.h pidgin-2.6.6/pidgin/gtkdocklet.h
  166. --- pidgin-2.6.6.ori/pidgin/gtkdocklet.h    2010-02-16 04:34:06.000000000 -0500
  167. +++ pidgin-2.6.6/pidgin/gtkdocklet.h    2010-03-05 23:09:58.000000000 -0500
  168. @@ -49,7 +49,7 @@
  169.  void pidgin_docklet_uninit(void);
  170.  void*pidgin_docklet_get_handle(void);
  171.  
  172. -/* function in gtkdocklet-{x11,win32}.c */
  173. +/* function in gtkdocklet-{gtk,x11,win32}.c */
  174.  void docklet_ui_init(void);
  175.  
  176.  #endif /* _GTKDOCKLET_H_ */
  177. diff -Naur pidgin-2.6.6.ori/pidgin/gtkdocklet-x11.c pidgin-2.6.6/pidgin/gtkdocklet-x11.c
  178. --- pidgin-2.6.6.ori/pidgin/gtkdocklet-x11.c    2010-02-16 04:34:06.000000000 -0500
  179. +++ pidgin-2.6.6/pidgin/gtkdocklet-x11.c    2010-03-05 23:09:58.000000000 -0500
  180. @@ -34,6 +34,8 @@
  181.  #include "gtkdocklet.h"
  182.  #include <gdk/gdkkeysyms.h>
  183.  
  184. +#if !GTK_CHECK_VERSION(2,10,0)
  185. +
  186.  #define SHORT_EMBED_TIMEOUT 5000
  187.  #define LONG_EMBED_TIMEOUT 15000
  188.  
  189. @@ -358,3 +360,6 @@
  190.     purple_prefs_add_none(PIDGIN_PREFS_ROOT "/docklet/x11");
  191.     purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/docklet/x11/embedded", FALSE);
  192.  }
  193. +
  194. +#endif  /* !GTK_CHECK_VERSION(2,10,0) */
  195. +
  196. diff -Naur pidgin-2.6.6.ori/pidgin/Makefile.am pidgin-2.6.6/pidgin/Makefile.am
  197. --- pidgin-2.6.6.ori/pidgin/Makefile.am 2010-02-16 04:34:06.000000000 -0500
  198. +++ pidgin-2.6.6/pidgin/Makefile.am 2010-03-05 23:09:58.000000000 -0500
  199. @@ -92,6 +92,7 @@
  200.     gtkdialogs.c \
  201.     gtkdnd-hints.c \
  202.     gtkdocklet.c \
  203. +   gtkdocklet-gtk.c \
  204.     gtkdocklet-x11.c \
  205.     gtkeventloop.c \
  206.     gtkexpander.c \
  207. diff -Naur pidgin-2.6.6.ori/pidgin/Makefile.in pidgin-2.6.6/pidgin/Makefile.in
  208. --- pidgin-2.6.6.ori/pidgin/Makefile.in 2010-02-16 04:34:30.000000000 -0500
  209. +++ pidgin-2.6.6/pidgin/Makefile.in 2010-03-05 23:09:58.000000000 -0500
  210. @@ -62,15 +62,16 @@
  211.     gtkcellrendererexpander.c gtkcellrendererprogress.c \
  212.     gtkcellview.c gtkcellviewmenuitem.c gtkcertmgr.c gtkconn.c \
  213.     gtkconv.c gtkdebug.c gtkdialogs.c gtkdnd-hints.c gtkdocklet.c \
  214. -   gtkdocklet-x11.c gtkeventloop.c gtkexpander.c gtkft.c \
  215. -   gtkicon-theme.c gtkicon-theme-loader.c gtkidle.c gtkimhtml.c \
  216. -   gtkimhtmltoolbar.c gtklog.c gtkmain.c gtkmedia.c gtkmenutray.c \
  217. -   gtknotify.c gtkplugin.c gtkpluginpref.c gtkpounce.c gtkprefs.c \
  218. -   gtkprivacy.c gtkrequest.c gtkroomlist.c gtksavedstatuses.c \
  219. -   gtkscrollbook.c gtksession.c gtksmiley.c gtksound.c \
  220. -   gtksourceiter.c gtksourceundomanager.c gtksourceview-marshal.c \
  221. -   gtkstatus-icon-theme.c gtkstatusbox.c gtkthemes.c gtkutils.c \
  222. -   gtkwhiteboard.c minidialog.c pidgintooltip.c
  223. +   gtkdocklet-gtk.c gtkdocklet-x11.c gtkeventloop.c gtkexpander.c \
  224. +   gtkft.c gtkicon-theme.c gtkicon-theme-loader.c gtkidle.c \
  225. +   gtkimhtml.c gtkimhtmltoolbar.c gtklog.c gtkmain.c gtkmedia.c \
  226. +   gtkmenutray.c gtknotify.c gtkplugin.c gtkpluginpref.c \
  227. +   gtkpounce.c gtkprefs.c gtkprivacy.c gtkrequest.c gtkroomlist.c \
  228. +   gtksavedstatuses.c gtkscrollbook.c gtksession.c gtksmiley.c \
  229. +   gtksound.c gtksourceiter.c gtksourceundomanager.c \
  230. +   gtksourceview-marshal.c gtkstatus-icon-theme.c gtkstatusbox.c \
  231. +   gtkthemes.c gtkutils.c gtkwhiteboard.c minidialog.c \
  232. +   pidgintooltip.c
  233.  @ENABLE_GTK_TRUE@am_pidgin_OBJECTS = eggtrayicon.$(OBJEXT) \
  234.  @ENABLE_GTK_TRUE@  pidgincombobox.$(OBJEXT) \
  235.  @ENABLE_GTK_TRUE@  pidginstock.$(OBJEXT) gtkaccount.$(OBJEXT) \
  236. @@ -84,7 +85,8 @@
  237.  @ENABLE_GTK_TRUE@  gtkcertmgr.$(OBJEXT) gtkconn.$(OBJEXT) \
  238.  @ENABLE_GTK_TRUE@  gtkconv.$(OBJEXT) gtkdebug.$(OBJEXT) \
  239.  @ENABLE_GTK_TRUE@  gtkdialogs.$(OBJEXT) gtkdnd-hints.$(OBJEXT) \
  240. -@ENABLE_GTK_TRUE@  gtkdocklet.$(OBJEXT) gtkdocklet-x11.$(OBJEXT) \
  241. +@ENABLE_GTK_TRUE@  gtkdocklet.$(OBJEXT) gtkdocklet-gtk.$(OBJEXT) \
  242. +@ENABLE_GTK_TRUE@  gtkdocklet-x11.$(OBJEXT) \
  243.  @ENABLE_GTK_TRUE@  gtkeventloop.$(OBJEXT) gtkexpander.$(OBJEXT) \
  244.  @ENABLE_GTK_TRUE@  gtkft.$(OBJEXT) gtkicon-theme.$(OBJEXT) \
  245.  @ENABLE_GTK_TRUE@  gtkicon-theme-loader.$(OBJEXT) \
  246. @@ -587,6 +589,7 @@
  247.  @ENABLE_GTK_TRUE@  gtkdialogs.c \
  248.  @ENABLE_GTK_TRUE@  gtkdnd-hints.c \
  249.  @ENABLE_GTK_TRUE@  gtkdocklet.c \
  250. +@ENABLE_GTK_TRUE@  gtkdocklet-gtk.c \
  251.  @ENABLE_GTK_TRUE@  gtkdocklet-x11.c \
  252.  @ENABLE_GTK_TRUE@  gtkeventloop.c \
  253.  @ENABLE_GTK_TRUE@  gtkexpander.c \
  254. @@ -816,6 +819,7 @@
  255.  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtkdebug.Po@am__quote@
  256.  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtkdialogs.Po@am__quote@
  257.  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtkdnd-hints.Po@am__quote@
  258. +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtkdocklet-gtk.Po@am__quote@
  259.  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtkdocklet-x11.Po@am__quote@
  260.  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtkdocklet.Po@am__quote@
  261.  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtkeventloop.Po@am__quote@
  262. diff -Naur pidgin-2.6.6.ori/pidgin/pidginstock.c pidgin-2.6.6/pidgin/pidginstock.c
  263. --- pidgin-2.6.6.ori/pidgin/pidginstock.c   2010-02-16 04:34:06.000000000 -0500
  264. +++ pidgin-2.6.6/pidgin/pidginstock.c   2010-03-05 23:09:50.000000000 -0500
  265. @@ -218,17 +218,22 @@
  266.     { PIDGIN_STOCK_STATUS_LOGOUT,    "status",  "log-out.png",       TRUE, TRUE, TRUE,  TRUE,  TRUE,  FALSE, TRUE,  NULL },
  267.     { PIDGIN_STOCK_STATUS_OFFLINE,   "status",  "offline.png",       TRUE, TRUE, TRUE,  TRUE,  TRUE,  FALSE, FALSE, PIDGIN_STOCK_STATUS_OFFLINE_I  },
  268.     { PIDGIN_STOCK_STATUS_PERSON,    "status",  "person.png",        TRUE, TRUE, TRUE,  TRUE,  TRUE,  FALSE, FALSE, NULL },
  269. -   { PIDGIN_STOCK_STATUS_MESSAGE,   "toolbar", "message-new.png",   TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  270. +   { PIDGIN_STOCK_STATUS_MESSAGE,   "toolbar", "message-new.png",   TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }
  271. +};
  272.  
  273. -   { PIDGIN_STOCK_TRAY_AVAILABLE, "tray", "tray-online.png",        FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
  274. -   { PIDGIN_STOCK_TRAY_INVISIBLE, "tray", "tray-invisible.png",     FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
  275. -   { PIDGIN_STOCK_TRAY_AWAY,      "tray", "tray-away.png",          FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
  276. -   { PIDGIN_STOCK_TRAY_BUSY,      "tray", "tray-busy.png",          FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
  277. -   { PIDGIN_STOCK_TRAY_XA,        "tray", "tray-extended-away.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
  278. -   { PIDGIN_STOCK_TRAY_OFFLINE,   "tray", "tray-offline.png",       FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
  279. -   { PIDGIN_STOCK_TRAY_CONNECT,   "tray", "tray-connecting.png",    FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
  280. -   { PIDGIN_STOCK_TRAY_PENDING,   "tray", "tray-new-im.png",        FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
  281. -   { PIDGIN_STOCK_TRAY_EMAIL,     "tray", "tray-message.png",       FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }
  282. +const SizedStockIcon sized_tray_icons [] = {
  283. +#define SIZED_TRAY_ICON(name) \
  284. +   { name, "tray/hicolor", "status/" name ".png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }
  285. +   SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_AVAILABLE ),
  286. +   SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_INVISIBLE ),
  287. +   SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_AWAY ),
  288. +   SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_BUSY ),
  289. +   SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_XA ),
  290. +   SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_OFFLINE ),
  291. +   SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_CONNECT ),
  292. +   SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_PENDING ),
  293. +   SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_EMAIL )
  294. +#undef SIZED_TRAY_ICON
  295.  };
  296.  
  297.  /*****************************************************************************
  298. @@ -480,6 +485,33 @@
  299.         }
  300.     }
  301.  
  302. +   for (i = 0; i < G_N_ELEMENTS(sized_tray_icons); i++)
  303. +   {
  304. +       normal = gtk_icon_set_new();
  305. +       if (sized_tray_icons[i].translucent_name)
  306. +           translucent = gtk_icon_set_new();
  307. +
  308. +#define ADD_SIZED_ICON(name, size) \
  309. +       if (sized_tray_icons[i].name) { \
  310. +           add_sized_icon(normal, name, PIDGIN_ICON_THEME(theme), size, sized_tray_icons[i], FALSE); \
  311. +           if (sized_tray_icons[i].translucent_name) \
  312. +               add_sized_icon(translucent, name, PIDGIN_ICON_THEME(theme), size, sized_tray_icons[i], TRUE); \
  313. +       }
  314. +       ADD_SIZED_ICON(extra_small, "16x16");
  315. +       ADD_SIZED_ICON(small, "22x22");
  316. +       ADD_SIZED_ICON(medium, "32x32");
  317. +       ADD_SIZED_ICON(large, "48x48");
  318. +#undef ADD_SIZED_ICON
  319. +
  320. +       gtk_icon_factory_add(icon_factory, sized_tray_icons[i].name, normal);
  321. +       gtk_icon_set_unref(normal);
  322. +
  323. +       if (sized_tray_icons[i].translucent_name) {
  324. +           gtk_icon_factory_add(icon_factory, sized_tray_icons[i].translucent_name, translucent);
  325. +           gtk_icon_set_unref(translucent);
  326. +       }
  327. +   }
  328. +
  329.     gtk_widget_destroy(win);
  330.     g_object_unref(G_OBJECT(icon_factory));
  331.     reload_settings();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement