Fri, 20 Aug 2004 03:44:46 +0000
[gaim-migrate @ 10656]
"ixes sending declines when we would decline a request
to an MSN file xfer.
Fixes accidentally having 2 xfers of the same file in
the transfer dialog when sending through MSN and SILC.
Fixes crash when cancelling MSN file transfers.
Should fix crash when removing old MSN transfers from
the xfer window in MSN.
Fixes MSN crash when the remote side sends a decline
after we've canceled locally." --Dave West
committer: Luke Schierer <lschiere@pidgin.im>
| 6209 | 1 | /* |
| 2 | * System tray icon (aka docklet) plugin for Gaim | |
| 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 | |
| 21 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA | |
| 22 | * 02111-1307, USA. | |
| 23 | */ | |
| 24 | ||
| 25 | #include "internal.h" | |
|
6371
e92b66ee5518
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6209
diff
changeset
|
26 | #include "gtkinternal.h" |
| 6209 | 27 | #include "debug.h" |
| 28 | #include "stock.h" | |
| 29 | ||
| 30 | #include "gaim.h" | |
|
9709
2e73f176cc80
[gaim-migrate @ 10570]
Mark Doliner <markdoliner@pidgin.im>
parents:
9229
diff
changeset
|
31 | #include "gtkdialogs.h" |
| 6209 | 32 | |
| 33 | #include "eggtrayicon.h" | |
| 34 | #include "docklet.h" | |
| 35 | ||
| 36 | /* globals */ | |
| 37 | static EggTrayIcon *docklet = NULL; | |
| 38 | static GtkWidget *image = NULL; | |
|
6894
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
39 | static GdkPixbuf *blank_icon = NULL; |
| 6209 | 40 | |
| 41 | /* protos */ | |
| 42 | static void docklet_x11_create(); | |
| 43 | ||
| 44 | static gboolean | |
| 45 | docklet_x11_create_cb() | |
| 46 | { | |
| 47 | docklet_x11_create(); | |
| 48 | ||
| 49 | return FALSE; /* for when we're called by the glib idle handler */ | |
| 50 | } | |
| 51 | ||
| 52 | static void | |
| 53 | docklet_x11_embedded_cb(GtkWidget *widget, void *data) | |
| 54 | { | |
| 55 | gaim_debug(GAIM_DEBUG_INFO, "tray icon", "embedded\n"); | |
| 56 | ||
| 57 | docklet_embedded(); | |
| 58 | } | |
| 59 | ||
| 60 | static void | |
| 61 | docklet_x11_destroyed_cb(GtkWidget *widget, void *data) | |
| 62 | { | |
| 63 | gaim_debug(GAIM_DEBUG_INFO, "tray icon", "destroyed\n"); | |
| 64 | ||
| 65 | docklet_remove(TRUE); | |
| 66 | ||
| 67 | g_object_unref(G_OBJECT(docklet)); | |
| 68 | docklet = NULL; | |
| 69 | ||
| 70 | g_idle_add(docklet_x11_create_cb, &handle); | |
| 71 | } | |
| 72 | ||
| 73 | static void | |
| 74 | docklet_x11_clicked_cb(GtkWidget *button, GdkEventButton *event, void *data) | |
| 75 | { | |
| 76 | if (event->type != GDK_BUTTON_PRESS) | |
| 77 | return; | |
| 78 | ||
| 79 | docklet_clicked(event->button); | |
| 80 | } | |
| 81 | ||
| 82 | static void | |
| 83 | docklet_x11_update_icon(enum docklet_status icon) | |
| 84 | { | |
| 85 | const gchar *icon_name = NULL; | |
| 86 | ||
| 87 | switch (icon) { | |
| 88 | case offline: | |
| 89 | icon_name = GAIM_STOCK_ICON_OFFLINE; | |
| 90 | break; | |
| 91 | case offline_connecting: | |
| 92 | case online_connecting: | |
| 93 | icon_name = GAIM_STOCK_ICON_CONNECT; | |
| 94 | break; | |
| 95 | case online: | |
| 96 | icon_name = GAIM_STOCK_ICON_ONLINE; | |
| 97 | break; | |
| 98 | case online_pending: | |
| 99 | icon_name = GAIM_STOCK_ICON_ONLINE_MSG; | |
| 100 | break; | |
| 101 | case away: | |
| 102 | icon_name = GAIM_STOCK_ICON_AWAY; | |
| 103 | break; | |
| 104 | case away_pending: | |
| 105 | icon_name = GAIM_STOCK_ICON_AWAY_MSG; | |
| 106 | break; | |
| 107 | } | |
| 108 | ||
| 109 | gtk_image_set_from_stock(GTK_IMAGE(image), icon_name, GTK_ICON_SIZE_LARGE_TOOLBAR); | |
| 110 | } | |
| 111 | ||
| 112 | static void | |
|
6894
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
113 | docklet_x11_blank_icon() |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
114 | { |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
115 | if (!blank_icon) { |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
116 | gint width, height; |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
117 | |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
118 | gtk_icon_size_lookup(GTK_ICON_SIZE_LARGE_TOOLBAR, &width, &height); |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
119 | 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
|
120 | gdk_pixbuf_fill(blank_icon, 0); |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
121 | } |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
122 | |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
123 | gtk_image_set_from_pixbuf(GTK_IMAGE(image), blank_icon); |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
124 | } |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
125 | |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
126 | static void |
| 6209 | 127 | docklet_x11_destroy() |
| 128 | { | |
| 129 | docklet_remove(GTK_WIDGET_VISIBLE(docklet)); | |
| 130 | ||
| 131 | g_signal_handlers_disconnect_by_func(G_OBJECT(docklet), G_CALLBACK(docklet_x11_destroyed_cb), NULL); | |
| 132 | gtk_widget_destroy(GTK_WIDGET(docklet)); | |
| 133 | ||
| 134 | g_object_unref(G_OBJECT(docklet)); | |
| 135 | docklet = NULL; | |
| 136 | ||
|
6894
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
137 | if (blank_icon) |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
138 | g_object_unref(G_OBJECT(blank_icon)); |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
139 | blank_icon = NULL; |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
140 | |
| 6209 | 141 | gaim_debug(GAIM_DEBUG_INFO, "tray icon", "destroyed\n"); |
| 142 | } | |
| 143 | ||
| 144 | static void | |
| 145 | docklet_x11_create() | |
| 146 | { | |
| 147 | GtkWidget *box; | |
| 148 | ||
| 149 | if (docklet) { | |
| 150 | /* if this is being called when a tray icon exists, it's because | |
| 151 | something messed up. try destroying it before we proceed, | |
| 152 | although docklet_refcount may be all hosed. hopefully won't happen. */ | |
| 153 | gaim_debug(GAIM_DEBUG_WARNING, "tray icon", "trying to create icon but it already exists?\n"); | |
| 154 | docklet_x11_destroy(); | |
| 155 | } | |
| 156 | ||
| 157 | docklet = egg_tray_icon_new("Gaim"); | |
| 158 | box = gtk_event_box_new(); | |
| 159 | image = gtk_image_new(); | |
| 160 | ||
| 161 | g_signal_connect(G_OBJECT(docklet), "embedded", G_CALLBACK(docklet_x11_embedded_cb), NULL); | |
| 162 | g_signal_connect(G_OBJECT(docklet), "destroy", G_CALLBACK(docklet_x11_destroyed_cb), NULL); | |
| 163 | g_signal_connect(G_OBJECT(box), "button-press-event", G_CALLBACK(docklet_x11_clicked_cb), NULL); | |
| 164 | ||
| 165 | gtk_container_add(GTK_CONTAINER(box), image); | |
| 166 | gtk_container_add(GTK_CONTAINER(docklet), box); | |
| 9229 | 167 | |
| 168 | if(!gtk_check_version(2,4,0)) | |
| 169 | g_object_set(G_OBJECT(box), "visible-window", FALSE, NULL); | |
| 170 | ||
| 6209 | 171 | gtk_widget_show_all(GTK_WIDGET(docklet)); |
| 172 | ||
| 173 | /* ref the docklet before we bandy it about the place */ | |
| 174 | g_object_ref(G_OBJECT(docklet)); | |
| 175 | ||
| 176 | gaim_debug(GAIM_DEBUG_INFO, "tray icon", "created\n"); | |
| 177 | } | |
| 178 | ||
| 179 | static struct docklet_ui_ops ui_ops = | |
| 180 | { | |
| 181 | docklet_x11_create, | |
| 182 | docklet_x11_destroy, | |
|
6894
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
183 | docklet_x11_update_icon, |
|
8c6e286b079d
[gaim-migrate @ 7441]
Herman Bloggs <herman@bluedigits.com>
parents:
6371
diff
changeset
|
184 | docklet_x11_blank_icon |
| 6209 | 185 | }; |
| 186 | ||
| 187 | void | |
| 188 | docklet_ui_init() | |
| 189 | { | |
| 190 | docklet_set_ui_ops(&ui_ops); | |
| 191 | } |