Mon, 09 Jun 2008 19:31:43 +0000
Do not disable default smileys with dupliate shortcuts if custom smileys
are not supported by the prpl. Also, show the text of the disabled smiley
in the tooltip.
And use _prepend and _reverse, instead of _append for GLists, since some
people apparently have hundreds of custom smileys.
Closes #6057.
committer: Sadrul Habib Chowdhury <sadrul@pidgin.im>
| 6209 | 1 | /* |
| 15884 | 2 | * System tray icon (aka docklet) plugin for Purple |
| 6209 | 3 | * |
| 4 | * Copyright (C) 2002-3 Robert McQueen <robot101@debian.org> | |
| 5 | * Copyright (C) 2003 Herman Bloggs <hermanator12002@yahoo.com> | |
| 6 | * Inspired by a similar plugin by: | |
| 7 | * John (J5) Palmieri <johnp@martianrock.com> | |
| 8 | * | |
| 9 | * This program is free software; you can redistribute it and/or | |
| 10 | * modify it under the terms of the GNU General Public License as | |
| 11 | * published by the Free Software Foundation; either version 2 of the | |
| 12 | * License, or (at your option) any later version. | |
| 13 | * | |
| 14 | * This program is distributed in the hope that it will be useful, but | |
| 15 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 17 | * General Public License for more details. | |
| 18 | * | |
| 19 | * You should have received a copy of the GNU General Public License | |
| 20 | * along with this program; if not, write to the Free Software | |
|
19859
71d37b57eff2
The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
17756
diff
changeset
|
21 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
|
71d37b57eff2
The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
17756
diff
changeset
|
22 | * 02111-1301, USA. |
| 6209 | 23 | */ |
| 24 | ||
| 25 | #include "internal.h" | |
| 15577 | 26 | #include "pidgin.h" |
| 6209 | 27 | #include "debug.h" |
| 16621 | 28 | #include "prefs.h" |
|
15883
969b74a3e27a
According to etags, pidgin/ should be completely clean of references to 'gaim' as a client
Sean Egan <seanegan@pidgin.im>
parents:
15836
diff
changeset
|
29 | #include "pidginstock.h" |
| 6209 | 30 | |
|
9709
2e73f176cc80
[gaim-migrate @ 10570]
Mark Doliner <markdoliner@pidgin.im>
parents:
9229
diff
changeset
|
31 | #include "gtkdialogs.h" |
| 6209 | 32 | |
| 33 | #include "eggtrayicon.h" | |
| 14743 | 34 | #include "gtkdocklet.h" |
| 6209 | 35 | |
| 16621 | 36 | #define SHORT_EMBED_TIMEOUT 5000 |
| 37 | #define LONG_EMBED_TIMEOUT 15000 | |
| 10491 | 38 | |
| 6209 | 39 | /* globals */ |
| 40 | static EggTrayIcon *docklet = NULL; | |
| 41 | static GtkWidget *image = NULL; | |
|
12471
5d7c12d525ed
[gaim-migrate @ 14781]
Casey Harkins <charkins@pidgin.im>
parents:
12397
diff
changeset
|
42 | static GtkTooltips *tooltips = NULL; |
|
6894
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
43 | static GdkPixbuf *blank_icon = NULL; |
| 10491 | 44 | static int embed_timeout = 0; |
| 15836 | 45 | static int docklet_height = 0; |
| 6209 | 46 | |
| 47 | /* protos */ | |
| 16621 | 48 | static void docklet_x11_create(gboolean); |
| 6209 | 49 | |
| 50 | static gboolean | |
|
22108
cb9819851163
Squash some compiler warnings, some from my -Wstrict-prototypes fixing.
Richard Laager <rlaager@pidgin.im>
parents:
22104
diff
changeset
|
51 | docklet_x11_recreate_cb(gpointer data) |
| 6209 | 52 | { |
| 16621 | 53 | docklet_x11_create(TRUE); |
| 6209 | 54 | |
| 55 | return FALSE; /* for when we're called by the glib idle handler */ | |
| 56 | } | |
| 57 | ||
| 58 | static void | |
| 59 | docklet_x11_embedded_cb(GtkWidget *widget, void *data) | |
| 60 | { | |
| 15884 | 61 | purple_debug(PURPLE_DEBUG_INFO, "docklet", "embedded\n"); |
| 10491 | 62 | |
| 63 | g_source_remove(embed_timeout); | |
| 64 | embed_timeout = 0; | |
|
15562
8c8249fe5e3c
gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents:
15499
diff
changeset
|
65 | pidgin_docklet_embedded(); |
| 16621 | 66 | purple_prefs_set_bool(PIDGIN_PREFS_ROOT "/docklet/x11/embedded", FALSE); |
| 6209 | 67 | } |
| 68 | ||
| 69 | static void | |
| 70 | docklet_x11_destroyed_cb(GtkWidget *widget, void *data) | |
| 71 | { | |
| 15884 | 72 | purple_debug(PURPLE_DEBUG_INFO, "docklet", "destroyed\n"); |
| 6209 | 73 | |
|
15562
8c8249fe5e3c
gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents:
15499
diff
changeset
|
74 | pidgin_docklet_remove(); |
| 6209 | 75 | |
| 76 | g_object_unref(G_OBJECT(docklet)); | |
| 77 | docklet = NULL; | |
| 78 | ||
|
16628
8fc264ea344f
Charkins renamed the callback function, but missed the g_idle_add
Kevin Stange <kstange@pidgin.im>
parents:
16621
diff
changeset
|
79 | g_idle_add(docklet_x11_recreate_cb, NULL); |
| 6209 | 80 | } |
| 81 | ||
|
22032
8136dd5eeda3
Make some more event handlers return appropriate gboolean values. This turns
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20962
diff
changeset
|
82 | static gboolean |
| 6209 | 83 | docklet_x11_clicked_cb(GtkWidget *button, GdkEventButton *event, void *data) |
| 84 | { | |
| 15109 | 85 | if (event->type != GDK_BUTTON_RELEASE) |
|
22032
8136dd5eeda3
Make some more event handlers return appropriate gboolean values. This turns
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20962
diff
changeset
|
86 | return FALSE; |
| 6209 | 87 | |
|
15562
8c8249fe5e3c
gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents:
15499
diff
changeset
|
88 | pidgin_docklet_clicked(event->button); |
|
22032
8136dd5eeda3
Make some more event handlers return appropriate gboolean values. This turns
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
20962
diff
changeset
|
89 | return TRUE; |
| 6209 | 90 | } |
| 91 | ||
| 92 | static void | |
|
16996
749cb2af2e40
Now that the docklet icon is based on the status from status selector, it
Casey Harkins <charkins@pidgin.im>
parents:
16808
diff
changeset
|
93 | docklet_x11_update_icon(PurpleStatusPrimitive status, gboolean connecting, gboolean pending) |
| 6209 | 94 | { |
| 95 | const gchar *icon_name = NULL; | |
| 96 | ||
|
10504
eae130eefbfe
[gaim-migrate @ 11796]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10491
diff
changeset
|
97 | g_return_if_fail(image != NULL); |
|
eae130eefbfe
[gaim-migrate @ 11796]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10491
diff
changeset
|
98 | |
|
16996
749cb2af2e40
Now that the docklet icon is based on the status from status selector, it
Casey Harkins <charkins@pidgin.im>
parents:
16808
diff
changeset
|
99 | switch (status) { |
|
749cb2af2e40
Now that the docklet icon is based on the status from status selector, it
Casey Harkins <charkins@pidgin.im>
parents:
16808
diff
changeset
|
100 | case PURPLE_STATUS_OFFLINE: |
| 15731 | 101 | icon_name = PIDGIN_STOCK_TRAY_OFFLINE; |
| 6209 | 102 | break; |
|
16996
749cb2af2e40
Now that the docklet icon is based on the status from status selector, it
Casey Harkins <charkins@pidgin.im>
parents:
16808
diff
changeset
|
103 | case PURPLE_STATUS_AWAY: |
|
749cb2af2e40
Now that the docklet icon is based on the status from status selector, it
Casey Harkins <charkins@pidgin.im>
parents:
16808
diff
changeset
|
104 | icon_name = PIDGIN_STOCK_TRAY_AWAY; |
|
749cb2af2e40
Now that the docklet icon is based on the status from status selector, it
Casey Harkins <charkins@pidgin.im>
parents:
16808
diff
changeset
|
105 | break; |
|
749cb2af2e40
Now that the docklet icon is based on the status from status selector, it
Casey Harkins <charkins@pidgin.im>
parents:
16808
diff
changeset
|
106 | case PURPLE_STATUS_UNAVAILABLE: |
|
749cb2af2e40
Now that the docklet icon is based on the status from status selector, it
Casey Harkins <charkins@pidgin.im>
parents:
16808
diff
changeset
|
107 | icon_name = PIDGIN_STOCK_TRAY_BUSY; |
| 6209 | 108 | break; |
|
16996
749cb2af2e40
Now that the docklet icon is based on the status from status selector, it
Casey Harkins <charkins@pidgin.im>
parents:
16808
diff
changeset
|
109 | case PURPLE_STATUS_EXTENDED_AWAY: |
|
749cb2af2e40
Now that the docklet icon is based on the status from status selector, it
Casey Harkins <charkins@pidgin.im>
parents:
16808
diff
changeset
|
110 | icon_name = PIDGIN_STOCK_TRAY_XA; |
|
749cb2af2e40
Now that the docklet icon is based on the status from status selector, it
Casey Harkins <charkins@pidgin.im>
parents:
16808
diff
changeset
|
111 | break; |
|
749cb2af2e40
Now that the docklet icon is based on the status from status selector, it
Casey Harkins <charkins@pidgin.im>
parents:
16808
diff
changeset
|
112 | case PURPLE_STATUS_INVISIBLE: |
|
749cb2af2e40
Now that the docklet icon is based on the status from status selector, it
Casey Harkins <charkins@pidgin.im>
parents:
16808
diff
changeset
|
113 | icon_name = PIDGIN_STOCK_TRAY_INVISIBLE; |
|
749cb2af2e40
Now that the docklet icon is based on the status from status selector, it
Casey Harkins <charkins@pidgin.im>
parents:
16808
diff
changeset
|
114 | break; |
|
749cb2af2e40
Now that the docklet icon is based on the status from status selector, it
Casey Harkins <charkins@pidgin.im>
parents:
16808
diff
changeset
|
115 | default: |
| 15731 | 116 | icon_name = PIDGIN_STOCK_TRAY_AVAILABLE; |
| 6209 | 117 | break; |
| 118 | } | |
| 119 | ||
|
16996
749cb2af2e40
Now that the docklet icon is based on the status from status selector, it
Casey Harkins <charkins@pidgin.im>
parents:
16808
diff
changeset
|
120 | if (pending) |
|
749cb2af2e40
Now that the docklet icon is based on the status from status selector, it
Casey Harkins <charkins@pidgin.im>
parents:
16808
diff
changeset
|
121 | icon_name = PIDGIN_STOCK_TRAY_PENDING; |
|
749cb2af2e40
Now that the docklet icon is based on the status from status selector, it
Casey Harkins <charkins@pidgin.im>
parents:
16808
diff
changeset
|
122 | if (connecting) |
|
749cb2af2e40
Now that the docklet icon is based on the status from status selector, it
Casey Harkins <charkins@pidgin.im>
parents:
16808
diff
changeset
|
123 | icon_name = PIDGIN_STOCK_TRAY_CONNECT; |
|
749cb2af2e40
Now that the docklet icon is based on the status from status selector, it
Casey Harkins <charkins@pidgin.im>
parents:
16808
diff
changeset
|
124 | |
|
15834
ba09306a7b0a
16px tray icons. These are used if the tray is shorter than 22px, and in Windows where all tray icons are 16x16. I still need to attach to a resizing signal to make them automatically update when the tray resizes.
Sean Egan <seanegan@pidgin.im>
parents:
15774
diff
changeset
|
125 | if(icon_name) { |
|
ba09306a7b0a
16px tray icons. These are used if the tray is shorter than 22px, and in Windows where all tray icons are 16x16. I still need to attach to a resizing signal to make them automatically update when the tray resizes.
Sean Egan <seanegan@pidgin.im>
parents:
15774
diff
changeset
|
126 | int icon_size; |
| 15836 | 127 | if (docklet_height < 22) |
|
15834
ba09306a7b0a
16px tray icons. These are used if the tray is shorter than 22px, and in Windows where all tray icons are 16x16. I still need to attach to a resizing signal to make them automatically update when the tray resizes.
Sean Egan <seanegan@pidgin.im>
parents:
15774
diff
changeset
|
128 | icon_size = gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL); |
|
17704
d795d29d11e0
Icon updates from Hylke, including tray icons in 2 more sizes
Sean Egan <seanegan@pidgin.im>
parents:
17645
diff
changeset
|
129 | else if (docklet_height < 32) |
|
d795d29d11e0
Icon updates from Hylke, including tray icons in 2 more sizes
Sean Egan <seanegan@pidgin.im>
parents:
17645
diff
changeset
|
130 | icon_size = gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_SMALL); |
|
d795d29d11e0
Icon updates from Hylke, including tray icons in 2 more sizes
Sean Egan <seanegan@pidgin.im>
parents:
17645
diff
changeset
|
131 | else if (docklet_height < 48) |
|
d795d29d11e0
Icon updates from Hylke, including tray icons in 2 more sizes
Sean Egan <seanegan@pidgin.im>
parents:
17645
diff
changeset
|
132 | icon_size = gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_MEDIUM); |
|
15834
ba09306a7b0a
16px tray icons. These are used if the tray is shorter than 22px, and in Windows where all tray icons are 16x16. I still need to attach to a resizing signal to make them automatically update when the tray resizes.
Sean Egan <seanegan@pidgin.im>
parents:
15774
diff
changeset
|
133 | else |
|
17704
d795d29d11e0
Icon updates from Hylke, including tray icons in 2 more sizes
Sean Egan <seanegan@pidgin.im>
parents:
17645
diff
changeset
|
134 | icon_size = gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_LARGE); |
| 15836 | 135 | |
|
15834
ba09306a7b0a
16px tray icons. These are used if the tray is shorter than 22px, and in Windows where all tray icons are 16x16. I still need to attach to a resizing signal to make them automatically update when the tray resizes.
Sean Egan <seanegan@pidgin.im>
parents:
15774
diff
changeset
|
136 | gtk_image_set_from_stock(GTK_IMAGE(image), icon_name, icon_size); |
| 10765 | 137 | } |
| 15836 | 138 | } |
| 139 | ||
| 140 | static void | |
| 141 | docklet_x11_resize_icon(GtkWidget *widget) | |
| 142 | { | |
|
17756
0eb3eae720fb
Instead of sizing the docklet icon to the height available, size it to the minimum of the height or width. Fixes #1721 in which the icon may get cut off in vertically aligned panels
Sean Egan <seanegan@pidgin.im>
parents:
17704
diff
changeset
|
143 | if (docklet_height == MIN(widget->allocation.height, widget->allocation.width)) |
| 15836 | 144 | return; |
|
17756
0eb3eae720fb
Instead of sizing the docklet icon to the height available, size it to the minimum of the height or width. Fixes #1721 in which the icon may get cut off in vertically aligned panels
Sean Egan <seanegan@pidgin.im>
parents:
17704
diff
changeset
|
145 | docklet_height = MIN(widget->allocation.height, widget->allocation.width); |
|
16996
749cb2af2e40
Now that the docklet icon is based on the status from status selector, it
Casey Harkins <charkins@pidgin.im>
parents:
16808
diff
changeset
|
146 | pidgin_docklet_update_icon(); |
| 6209 | 147 | } |
| 148 | ||
| 149 | static void | |
|
22104
56970903b8e9
Probe for -Wstrict-prototypes to get some more warnings. I then cleaned up
Richard Laager <rlaager@pidgin.im>
parents:
22032
diff
changeset
|
150 | docklet_x11_blank_icon(void) |
|
6894
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
151 | { |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
152 | if (!blank_icon) { |
|
16422
2a36f5d04f5b
Make sure the blinking docklet has the same size. Fixes #174.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
15884
diff
changeset
|
153 | GtkIconSize size = GTK_ICON_SIZE_LARGE_TOOLBAR; |
|
6894
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
154 | gint width, height; |
|
16422
2a36f5d04f5b
Make sure the blinking docklet has the same size. Fixes #174.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
15884
diff
changeset
|
155 | g_object_get(G_OBJECT(image), "icon-size", &size, NULL); |
|
2a36f5d04f5b
Make sure the blinking docklet has the same size. Fixes #174.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
15884
diff
changeset
|
156 | gtk_icon_size_lookup(size, &width, &height); |
|
6894
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
157 | blank_icon = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, width, height); |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
158 | gdk_pixbuf_fill(blank_icon, 0); |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
159 | } |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
160 | |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
161 | gtk_image_set_from_pixbuf(GTK_IMAGE(image), blank_icon); |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
162 | } |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
163 | |
|
12471
5d7c12d525ed
[gaim-migrate @ 14781]
Casey Harkins <charkins@pidgin.im>
parents:
12397
diff
changeset
|
164 | static void |
|
5d7c12d525ed
[gaim-migrate @ 14781]
Casey Harkins <charkins@pidgin.im>
parents:
12397
diff
changeset
|
165 | docklet_x11_set_tooltip(gchar *tooltip) |
|
5d7c12d525ed
[gaim-migrate @ 14781]
Casey Harkins <charkins@pidgin.im>
parents:
12397
diff
changeset
|
166 | { |
|
5d7c12d525ed
[gaim-migrate @ 14781]
Casey Harkins <charkins@pidgin.im>
parents:
12397
diff
changeset
|
167 | if (!tooltips) |
|
5d7c12d525ed
[gaim-migrate @ 14781]
Casey Harkins <charkins@pidgin.im>
parents:
12397
diff
changeset
|
168 | tooltips = gtk_tooltips_new(); |
|
5d7c12d525ed
[gaim-migrate @ 14781]
Casey Harkins <charkins@pidgin.im>
parents:
12397
diff
changeset
|
169 | |
|
5d7c12d525ed
[gaim-migrate @ 14781]
Casey Harkins <charkins@pidgin.im>
parents:
12397
diff
changeset
|
170 | /* image->parent is a GtkEventBox */ |
|
5d7c12d525ed
[gaim-migrate @ 14781]
Casey Harkins <charkins@pidgin.im>
parents:
12397
diff
changeset
|
171 | if (tooltip) { |
|
5d7c12d525ed
[gaim-migrate @ 14781]
Casey Harkins <charkins@pidgin.im>
parents:
12397
diff
changeset
|
172 | gtk_tooltips_enable(tooltips); |
|
5d7c12d525ed
[gaim-migrate @ 14781]
Casey Harkins <charkins@pidgin.im>
parents:
12397
diff
changeset
|
173 | gtk_tooltips_set_tip(tooltips, image->parent, tooltip, NULL); |
|
5d7c12d525ed
[gaim-migrate @ 14781]
Casey Harkins <charkins@pidgin.im>
parents:
12397
diff
changeset
|
174 | } else { |
|
5d7c12d525ed
[gaim-migrate @ 14781]
Casey Harkins <charkins@pidgin.im>
parents:
12397
diff
changeset
|
175 | gtk_tooltips_set_tip(tooltips, image->parent, "", NULL); |
|
5d7c12d525ed
[gaim-migrate @ 14781]
Casey Harkins <charkins@pidgin.im>
parents:
12397
diff
changeset
|
176 | gtk_tooltips_disable(tooltips); |
|
5d7c12d525ed
[gaim-migrate @ 14781]
Casey Harkins <charkins@pidgin.im>
parents:
12397
diff
changeset
|
177 | } |
|
5d7c12d525ed
[gaim-migrate @ 14781]
Casey Harkins <charkins@pidgin.im>
parents:
12397
diff
changeset
|
178 | } |
|
5d7c12d525ed
[gaim-migrate @ 14781]
Casey Harkins <charkins@pidgin.im>
parents:
12397
diff
changeset
|
179 | |
|
10505
4c063ce8ed62
[gaim-migrate @ 11799]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10504
diff
changeset
|
180 | #if GTK_CHECK_VERSION(2,2,0) |
|
6894
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
181 | static void |
|
10268
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
182 | docklet_x11_position_menu(GtkMenu *menu, int *x, int *y, gboolean *push_in, |
|
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
183 | gpointer user_data) |
|
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
184 | { |
|
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
185 | GtkWidget *widget = GTK_WIDGET(docklet); |
|
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
186 | GtkRequisition req; |
|
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
187 | gint menu_xpos, menu_ypos; |
|
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
188 | |
|
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
189 | gtk_widget_size_request(GTK_WIDGET(menu), &req); |
|
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
190 | gdk_window_get_origin(widget->window, &menu_xpos, &menu_ypos); |
|
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
191 | |
|
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
192 | menu_xpos += widget->allocation.x; |
|
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
193 | menu_ypos += widget->allocation.y; |
|
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
194 | |
|
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
195 | if (menu_ypos > gdk_screen_get_height(gtk_widget_get_screen(widget)) / 2) |
|
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
196 | menu_ypos -= req.height; |
|
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
197 | else |
|
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
198 | menu_ypos += widget->allocation.height; |
|
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
199 | |
|
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
200 | *x = menu_xpos; |
|
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
201 | *y = menu_ypos; |
|
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
202 | |
|
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
203 | *push_in = TRUE; |
|
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
204 | } |
|
10505
4c063ce8ed62
[gaim-migrate @ 11799]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10504
diff
changeset
|
205 | #endif |
|
10268
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
206 | |
|
10504
eae130eefbfe
[gaim-migrate @ 11796]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10491
diff
changeset
|
207 | static void |
|
22104
56970903b8e9
Probe for -Wstrict-prototypes to get some more warnings. I then cleaned up
Richard Laager <rlaager@pidgin.im>
parents:
22032
diff
changeset
|
208 | docklet_x11_destroy(void) |
| 6209 | 209 | { |
|
10504
eae130eefbfe
[gaim-migrate @ 11796]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10491
diff
changeset
|
210 | g_return_if_fail(docklet != NULL); |
|
eae130eefbfe
[gaim-migrate @ 11796]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10491
diff
changeset
|
211 | |
| 14935 | 212 | if (embed_timeout) |
| 213 | g_source_remove(embed_timeout); | |
| 214 | ||
|
15562
8c8249fe5e3c
gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents:
15499
diff
changeset
|
215 | pidgin_docklet_remove(); |
| 14935 | 216 | |
| 6209 | 217 | g_signal_handlers_disconnect_by_func(G_OBJECT(docklet), G_CALLBACK(docklet_x11_destroyed_cb), NULL); |
| 218 | gtk_widget_destroy(GTK_WIDGET(docklet)); | |
| 219 | ||
| 220 | g_object_unref(G_OBJECT(docklet)); | |
| 221 | docklet = NULL; | |
| 222 | ||
|
6894
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
223 | if (blank_icon) |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
224 | g_object_unref(G_OBJECT(blank_icon)); |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
225 | blank_icon = NULL; |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
226 | |
|
10504
eae130eefbfe
[gaim-migrate @ 11796]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10491
diff
changeset
|
227 | image = NULL; |
|
eae130eefbfe
[gaim-migrate @ 11796]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10491
diff
changeset
|
228 | |
| 15884 | 229 | purple_debug(PURPLE_DEBUG_INFO, "docklet", "destroyed\n"); |
|
10504
eae130eefbfe
[gaim-migrate @ 11796]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10491
diff
changeset
|
230 | } |
|
eae130eefbfe
[gaim-migrate @ 11796]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10491
diff
changeset
|
231 | |
|
eae130eefbfe
[gaim-migrate @ 11796]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10491
diff
changeset
|
232 | static gboolean |
|
22108
cb9819851163
Squash some compiler warnings, some from my -Wstrict-prototypes fixing.
Richard Laager <rlaager@pidgin.im>
parents:
22104
diff
changeset
|
233 | docklet_x11_embed_timeout_cb(gpointer data) |
|
10504
eae130eefbfe
[gaim-migrate @ 11796]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10491
diff
changeset
|
234 | { |
|
12498
93591c1f68f1
[gaim-migrate @ 14810]
Casey Harkins <charkins@pidgin.im>
parents:
12471
diff
changeset
|
235 | /* The docklet was not embedded within the timeout. |
|
93591c1f68f1
[gaim-migrate @ 14810]
Casey Harkins <charkins@pidgin.im>
parents:
12471
diff
changeset
|
236 | * Remove it as a visibility manager, but leave the plugin |
|
93591c1f68f1
[gaim-migrate @ 14810]
Casey Harkins <charkins@pidgin.im>
parents:
12471
diff
changeset
|
237 | * loaded so that it can embed automatically if/when a notification |
|
93591c1f68f1
[gaim-migrate @ 14810]
Casey Harkins <charkins@pidgin.im>
parents:
12471
diff
changeset
|
238 | * area becomes available. |
|
93591c1f68f1
[gaim-migrate @ 14810]
Casey Harkins <charkins@pidgin.im>
parents:
12471
diff
changeset
|
239 | */ |
| 15884 | 240 | purple_debug_info("docklet", "failed to embed within timeout\n"); |
|
15562
8c8249fe5e3c
gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents:
15499
diff
changeset
|
241 | pidgin_docklet_remove(); |
| 14743 | 242 | |
| 10491 | 243 | return FALSE; |
| 6209 | 244 | } |
| 245 | ||
| 246 | static void | |
| 16621 | 247 | docklet_x11_create(gboolean recreate) |
| 6209 | 248 | { |
| 249 | GtkWidget *box; | |
| 250 | ||
| 251 | if (docklet) { | |
| 252 | /* if this is being called when a tray icon exists, it's because | |
| 253 | something messed up. try destroying it before we proceed, | |
| 254 | although docklet_refcount may be all hosed. hopefully won't happen. */ | |
| 15884 | 255 | purple_debug(PURPLE_DEBUG_WARNING, "docklet", "trying to create icon but it already exists?\n"); |
| 6209 | 256 | docklet_x11_destroy(); |
| 257 | } | |
| 258 | ||
|
15499
9550c30eb265
A few non-gettextized strings
Sean Egan <seanegan@pidgin.im>
parents:
15435
diff
changeset
|
259 | docklet = egg_tray_icon_new(PIDGIN_NAME); |
| 6209 | 260 | box = gtk_event_box_new(); |
| 261 | image = gtk_image_new(); | |
| 262 | ||
| 263 | g_signal_connect(G_OBJECT(docklet), "embedded", G_CALLBACK(docklet_x11_embedded_cb), NULL); | |
| 264 | g_signal_connect(G_OBJECT(docklet), "destroy", G_CALLBACK(docklet_x11_destroyed_cb), NULL); | |
| 15836 | 265 | g_signal_connect(G_OBJECT(docklet), "size-allocate", G_CALLBACK(docklet_x11_resize_icon), NULL); |
| 15109 | 266 | g_signal_connect(G_OBJECT(box), "button-release-event", G_CALLBACK(docklet_x11_clicked_cb), NULL); |
| 6209 | 267 | gtk_container_add(GTK_CONTAINER(box), image); |
| 268 | gtk_container_add(GTK_CONTAINER(docklet), box); | |
| 9229 | 269 | |
|
12471
5d7c12d525ed
[gaim-migrate @ 14781]
Casey Harkins <charkins@pidgin.im>
parents:
12397
diff
changeset
|
270 | if (!gtk_check_version(2,4,0)) |
| 9229 | 271 | g_object_set(G_OBJECT(box), "visible-window", FALSE, NULL); |
| 272 | ||
| 6209 | 273 | gtk_widget_show_all(GTK_WIDGET(docklet)); |
| 274 | ||
| 275 | /* ref the docklet before we bandy it about the place */ | |
| 276 | g_object_ref(G_OBJECT(docklet)); | |
|
12498
93591c1f68f1
[gaim-migrate @ 14810]
Casey Harkins <charkins@pidgin.im>
parents:
12471
diff
changeset
|
277 | |
|
93591c1f68f1
[gaim-migrate @ 14810]
Casey Harkins <charkins@pidgin.im>
parents:
12471
diff
changeset
|
278 | /* This is a hack to avoid a race condition between the docklet getting |
|
93591c1f68f1
[gaim-migrate @ 14810]
Casey Harkins <charkins@pidgin.im>
parents:
12471
diff
changeset
|
279 | * embedded in the notification area and the gtkblist restoring its |
|
93591c1f68f1
[gaim-migrate @ 14810]
Casey Harkins <charkins@pidgin.im>
parents:
12471
diff
changeset
|
280 | * previous visibility state. If the docklet does not get embedded within |
|
93591c1f68f1
[gaim-migrate @ 14810]
Casey Harkins <charkins@pidgin.im>
parents:
12471
diff
changeset
|
281 | * the timeout, it will be removed as a visibility manager until it does |
|
93591c1f68f1
[gaim-migrate @ 14810]
Casey Harkins <charkins@pidgin.im>
parents:
12471
diff
changeset
|
282 | * get embedded. Ideally, we would only call docklet_embedded() when the |
| 16621 | 283 | * icon was actually embedded. This only happens when the docklet is first |
| 284 | * created, not when being recreated. | |
| 285 | * | |
| 286 | * The x11 docklet tracks whether it successfully embedded in a pref and | |
| 287 | * allows for a longer timeout period if it successfully embedded the last | |
| 288 | * time it was run. This should hopefully solve problems with the buddy | |
|
17645
32a0fe7965b7
Get rid of 'Gaim' in a few more places
Mark Doliner <markdoliner@pidgin.im>
parents:
16996
diff
changeset
|
289 | * list not properly starting hidden when Pidgin is started on login. |
|
12498
93591c1f68f1
[gaim-migrate @ 14810]
Casey Harkins <charkins@pidgin.im>
parents:
12471
diff
changeset
|
290 | */ |
| 16621 | 291 | if(!recreate) { |
| 292 | pidgin_docklet_embedded(); | |
| 293 | if(purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/docklet/x11/embedded")) { | |
| 294 | embed_timeout = g_timeout_add(LONG_EMBED_TIMEOUT, docklet_x11_embed_timeout_cb, NULL); | |
| 295 | } else { | |
| 296 | embed_timeout = g_timeout_add(SHORT_EMBED_TIMEOUT, docklet_x11_embed_timeout_cb, NULL); | |
| 297 | } | |
| 298 | } | |
| 6209 | 299 | |
| 15884 | 300 | purple_debug(PURPLE_DEBUG_INFO, "docklet", "created\n"); |
| 6209 | 301 | } |
| 302 | ||
| 16621 | 303 | static void |
|
22104
56970903b8e9
Probe for -Wstrict-prototypes to get some more warnings. I then cleaned up
Richard Laager <rlaager@pidgin.im>
parents:
22032
diff
changeset
|
304 | docklet_x11_create_ui_op(void) |
| 16621 | 305 | { |
| 306 | docklet_x11_create(FALSE); | |
| 307 | } | |
| 308 | ||
| 6209 | 309 | static struct docklet_ui_ops ui_ops = |
| 310 | { | |
| 16621 | 311 | docklet_x11_create_ui_op, |
| 6209 | 312 | docklet_x11_destroy, |
|
6894
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
313 | docklet_x11_update_icon, |
|
10268
862ed5d3f227
[gaim-migrate @ 11414]
Christian Hammond <chipx86@chipx86.com>
parents:
9791
diff
changeset
|
314 | docklet_x11_blank_icon, |
|
12471
5d7c12d525ed
[gaim-migrate @ 14781]
Casey Harkins <charkins@pidgin.im>
parents:
12397
diff
changeset
|
315 | docklet_x11_set_tooltip, |
|
10505
4c063ce8ed62
[gaim-migrate @ 11799]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10504
diff
changeset
|
316 | #if GTK_CHECK_VERSION(2,2,0) |
|
20962
bca687215ee8
disapproval of revision 'f69b1356bb5514053201a1c11ce435bd7b0d83a7'
Casey Harkins <charkins@pidgin.im>
parents:
20961
diff
changeset
|
317 | docklet_x11_position_menu |
|
10505
4c063ce8ed62
[gaim-migrate @ 11799]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10504
diff
changeset
|
318 | #else |
|
20962
bca687215ee8
disapproval of revision 'f69b1356bb5514053201a1c11ce435bd7b0d83a7'
Casey Harkins <charkins@pidgin.im>
parents:
20961
diff
changeset
|
319 | NULL |
|
10505
4c063ce8ed62
[gaim-migrate @ 11799]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10504
diff
changeset
|
320 | #endif |
| 6209 | 321 | }; |
| 322 | ||
| 323 | void | |
| 324 | docklet_ui_init() | |
| 325 | { | |
|
15562
8c8249fe5e3c
gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents:
15499
diff
changeset
|
326 | pidgin_docklet_set_ui_ops(&ui_ops); |
| 16621 | 327 | purple_prefs_add_none(PIDGIN_PREFS_ROOT "/docklet/x11"); |
| 328 | purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/docklet/x11/embedded", FALSE); | |
| 6209 | 329 | } |