Statistics
| Revision:

root / src / trayicon.c @ 1250

History | View | Annotate | Download (10.1 kB)

1 510 hiro
/*
2 510 hiro
 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 896 hiro
 * Copyright (C) 1999-2006 Hiroyuki Yamamoto
4 510 hiro
 *
5 510 hiro
 * This program is free software; you can redistribute it and/or modify
6 510 hiro
 * it under the terms of the GNU General Public License as published by
7 510 hiro
 * the Free Software Foundation; either version 2 of the License, or
8 510 hiro
 * (at your option) any later version.
9 510 hiro
 *
10 510 hiro
 * This program is distributed in the hope that it will be useful,
11 510 hiro
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 510 hiro
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 510 hiro
 * GNU General Public License for more details.
14 510 hiro
 *
15 510 hiro
 * You should have received a copy of the GNU General Public License
16 510 hiro
 * along with this program; if not, write to the Free Software
17 510 hiro
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 510 hiro
 */
19 510 hiro
20 510 hiro
#ifdef HAVE_CONFIG_H
21 510 hiro
#  include "config.h"
22 510 hiro
#endif
23 510 hiro
24 510 hiro
#include <glib.h>
25 510 hiro
#include <glib/gi18n.h>
26 510 hiro
#include <gtk/gtkwindow.h>
27 510 hiro
#include <gtk/gtkeventbox.h>
28 510 hiro
#include <gtk/gtktooltips.h>
29 510 hiro
#include <gtk/gtkimage.h>
30 896 hiro
#include <gtk/gtkmenu.h>
31 896 hiro
#include <gtk/gtkmenuitem.h>
32 1189 hiro
#include <gtk/gtkversion.h>
33 510 hiro
34 510 hiro
#include "eggtrayicon.h"
35 510 hiro
#include "trayicon.h"
36 510 hiro
#include "mainwindow.h"
37 510 hiro
#include "utils.h"
38 962 hiro
#include "gtkutils.h"
39 510 hiro
#include "eggtrayicon.h"
40 510 hiro
#include "stock_pixmap.h"
41 896 hiro
#include "menu.h"
42 896 hiro
#include "main.h"
43 896 hiro
#include "inc.h"
44 896 hiro
#include "compose.h"
45 1195 hiro
#include "gtkutils.h"
46 510 hiro
47 1189 hiro
#if GTK_CHECK_VERSION(2, 10, 0) || defined(GDK_WINDOWING_X11)
48 510 hiro
49 1189 hiro
#if GTK_CHECK_VERSION(2, 10, 0)
50 1189 hiro
51 1189 hiro
#include <gtk/gtkstatusicon.h>
52 1189 hiro
53 1189 hiro
static TrayIcon trayicon;
54 1189 hiro
static GtkWidget *trayicon_menu;
55 1189 hiro
static gboolean default_tooltip = FALSE;
56 1189 hiro
57 1189 hiro
static void trayicon_activated                (GtkStatusIcon        *status_icon,
58 1189 hiro
                                         gpointer         data);
59 1189 hiro
static void trayicon_popup_menu_cb        (GtkStatusIcon        *status_icon,
60 1189 hiro
                                         guint                 button,
61 1189 hiro
                                         guint                 activate_time,
62 1189 hiro
                                         gpointer         data);
63 1189 hiro
64 1189 hiro
#else
65 1189 hiro
66 1189 hiro
static TrayIcon trayicon;
67 510 hiro
static GtkWidget *trayicon_img;
68 510 hiro
static GtkWidget *eventbox;
69 510 hiro
static GtkTooltips *trayicon_tip;
70 896 hiro
static GtkWidget *trayicon_menu;
71 962 hiro
static gboolean default_tooltip = FALSE;
72 510 hiro
73 510 hiro
static void trayicon_button_pressed        (GtkWidget        *widget,
74 510 hiro
                                         GdkEventButton        *event,
75 510 hiro
                                         gpointer         data);
76 653 hiro
static void trayicon_destroy_cb                (GtkWidget        *widget,
77 653 hiro
                                         gpointer         data);
78 510 hiro
79 1189 hiro
#endif
80 1189 hiro
81 1189 hiro
static void trayicon_present                (GtkWidget        *widget,
82 1189 hiro
                                         gpointer         data);
83 896 hiro
static void trayicon_inc                (GtkWidget        *widget,
84 896 hiro
                                         gpointer         data);
85 896 hiro
static void trayicon_inc_all                (GtkWidget        *widget,
86 896 hiro
                                         gpointer         data);
87 896 hiro
static void trayicon_send                (GtkWidget        *widget,
88 896 hiro
                                         gpointer         data);
89 896 hiro
static void trayicon_compose                (GtkWidget        *widget,
90 896 hiro
                                         gpointer         data);
91 896 hiro
static void trayicon_app_exit                (GtkWidget        *widget,
92 896 hiro
                                         gpointer         data);
93 896 hiro
94 1189 hiro
TrayIcon *trayicon_create(MainWindow *mainwin)
95 510 hiro
{
96 896 hiro
        GtkWidget *menuitem;
97 896 hiro
98 1189 hiro
#if GTK_CHECK_VERSION(2, 10, 0)
99 1189 hiro
        GdkPixbuf *pixbuf;
100 1189 hiro
101 1197 hiro
#ifdef G_OS_WIN32
102 1197 hiro
        stock_pixbuf_gdk(NULL, STOCK_PIXMAP_SYLPHEED_SMALL, &pixbuf);
103 1197 hiro
#else
104 1189 hiro
        stock_pixbuf_gdk(NULL, STOCK_PIXMAP_SYLPHEED, &pixbuf);
105 1197 hiro
#endif
106 1189 hiro
        trayicon.status_icon = gtk_status_icon_new_from_pixbuf(pixbuf);
107 1189 hiro
108 1189 hiro
        g_signal_connect(G_OBJECT(trayicon.status_icon), "activate",
109 1189 hiro
                         G_CALLBACK(trayicon_activated), mainwin);
110 1189 hiro
        g_signal_connect(G_OBJECT(trayicon.status_icon), "popup-menu",
111 1189 hiro
                         G_CALLBACK(trayicon_popup_menu_cb), mainwin);
112 1189 hiro
#else
113 1189 hiro
        trayicon.widget = GTK_WIDGET(egg_tray_icon_new("Sylpheed"));
114 1189 hiro
        g_signal_connect(G_OBJECT(trayicon.widget), "destroy",
115 653 hiro
                         G_CALLBACK(trayicon_destroy_cb), mainwin);
116 510 hiro
117 510 hiro
        eventbox = gtk_event_box_new();
118 896 hiro
        gtk_widget_show(eventbox);
119 1189 hiro
        gtk_container_add(GTK_CONTAINER(trayicon.widget), eventbox);
120 510 hiro
        g_signal_connect(G_OBJECT(eventbox), "button_press_event",
121 510 hiro
                         G_CALLBACK(trayicon_button_pressed), mainwin);
122 510 hiro
        trayicon_img = stock_pixbuf_widget_scale(NULL, STOCK_PIXMAP_SYLPHEED,
123 532 hiro
                                                 24, 24);
124 896 hiro
        gtk_widget_show(trayicon_img);
125 510 hiro
        gtk_container_add(GTK_CONTAINER(eventbox), trayicon_img);
126 510 hiro
127 1189 hiro
        trayicon_tip = gtk_tooltips_new();
128 1189 hiro
#endif
129 962 hiro
        default_tooltip = FALSE;
130 962 hiro
        trayicon_set_tooltip(NULL);
131 510 hiro
132 896 hiro
        if (!trayicon_menu) {
133 896 hiro
                trayicon_menu = gtk_menu_new();
134 896 hiro
                gtk_widget_show(trayicon_menu);
135 909 hiro
                MENUITEM_ADD_WITH_MNEMONIC(trayicon_menu, menuitem,
136 1189 hiro
                                           _("_Display Sylpheed"), 0);
137 1189 hiro
                g_signal_connect(G_OBJECT(menuitem), "activate",
138 1189 hiro
                                 G_CALLBACK(trayicon_present), mainwin);
139 1189 hiro
                MENUITEM_ADD(trayicon_menu, menuitem, NULL, 0);
140 1189 hiro
                MENUITEM_ADD_WITH_MNEMONIC(trayicon_menu, menuitem,
141 909 hiro
                                           _("Get from _current account"), 0);
142 896 hiro
                g_signal_connect(G_OBJECT(menuitem), "activate",
143 896 hiro
                                 G_CALLBACK(trayicon_inc), mainwin);
144 909 hiro
                MENUITEM_ADD_WITH_MNEMONIC(trayicon_menu, menuitem,
145 909 hiro
                                           _("Get from _all accounts"), 0);
146 896 hiro
                g_signal_connect(G_OBJECT(menuitem), "activate",
147 896 hiro
                                 G_CALLBACK(trayicon_inc_all), mainwin);
148 909 hiro
                MENUITEM_ADD_WITH_MNEMONIC(trayicon_menu, menuitem,
149 909 hiro
                                           _("_Send queued messages"), 0);
150 896 hiro
                g_signal_connect(G_OBJECT(menuitem), "activate",
151 896 hiro
                                 G_CALLBACK(trayicon_send), mainwin);
152 510 hiro
153 896 hiro
                MENUITEM_ADD(trayicon_menu, menuitem, NULL, 0);
154 909 hiro
                MENUITEM_ADD_WITH_MNEMONIC(trayicon_menu, menuitem,
155 909 hiro
                                           _("Compose _new message"), 0);
156 896 hiro
                g_signal_connect(G_OBJECT(menuitem), "activate",
157 896 hiro
                                 G_CALLBACK(trayicon_compose), mainwin);
158 896 hiro
159 896 hiro
                MENUITEM_ADD(trayicon_menu, menuitem, NULL, 0);
160 909 hiro
                MENUITEM_ADD_WITH_MNEMONIC(trayicon_menu, menuitem,
161 909 hiro
                                           _("E_xit"), 0);
162 896 hiro
                g_signal_connect(G_OBJECT(menuitem), "activate",
163 896 hiro
                                 G_CALLBACK(trayicon_app_exit), mainwin);
164 896 hiro
        }
165 896 hiro
166 1189 hiro
        return &trayicon;
167 510 hiro
}
168 510 hiro
169 1189 hiro
#if GTK_CHECK_VERSION(2, 10, 0)
170 1189 hiro
171 1191 hiro
void trayicon_show(TrayIcon *tray_icon)
172 1191 hiro
{
173 1198 hiro
        gtk_status_icon_set_visible(tray_icon->status_icon, TRUE);
174 1191 hiro
};
175 1191 hiro
176 1198 hiro
void trayicon_hide(TrayIcon *tray_icon)
177 1198 hiro
{
178 1198 hiro
        gtk_status_icon_set_visible(tray_icon->status_icon, FALSE);
179 1198 hiro
}
180 1198 hiro
181 1191 hiro
void trayicon_destroy(TrayIcon *tray_icon)
182 1191 hiro
{
183 1191 hiro
        g_object_unref(tray_icon->status_icon);
184 1191 hiro
        tray_icon->status_icon = NULL;
185 1191 hiro
}
186 1191 hiro
187 510 hiro
void trayicon_set_tooltip(const gchar *text)
188 510 hiro
{
189 962 hiro
        if (text) {
190 962 hiro
                default_tooltip = FALSE;
191 1189 hiro
                gtk_status_icon_set_tooltip(trayicon.status_icon, text);
192 962 hiro
        } else if (!default_tooltip) {
193 962 hiro
                default_tooltip = TRUE;
194 1189 hiro
                gtk_status_icon_set_tooltip(trayicon.status_icon,
195 1189 hiro
                                            _("Sylpheed"));
196 1189 hiro
        }
197 1189 hiro
}
198 1189 hiro
199 1191 hiro
static guint notify_tag = 0;
200 1191 hiro
201 1191 hiro
gboolean notify_timeout_cb(gpointer data)
202 1191 hiro
{
203 1191 hiro
        gtk_status_icon_set_blinking(trayicon.status_icon, FALSE);
204 1191 hiro
        notify_tag = 0;
205 1191 hiro
        return FALSE;
206 1191 hiro
}
207 1191 hiro
208 1191 hiro
void trayicon_set_notify(gboolean enabled)
209 1191 hiro
{
210 1191 hiro
        if (enabled && notify_tag == 0) {
211 1191 hiro
                gtk_status_icon_set_blinking(trayicon.status_icon, enabled);
212 1191 hiro
                notify_tag = g_timeout_add(5000, notify_timeout_cb, NULL);
213 1250 hiro
        } else if (!enabled && notify_tag > 0) {
214 1191 hiro
                g_source_remove(notify_tag);
215 1250 hiro
                notify_timeout_cb(NULL);
216 1250 hiro
        }
217 1191 hiro
}
218 1191 hiro
219 1189 hiro
void trayicon_set_stock_icon(StockPixmap icon)
220 1189 hiro
{
221 1189 hiro
        GdkPixbuf *pixbuf;
222 1189 hiro
        GdkPixbuf *scaled_pixbuf;
223 1189 hiro
224 1189 hiro
        stock_pixbuf_gdk(NULL, icon, &pixbuf);
225 1189 hiro
        scaled_pixbuf = gdk_pixbuf_scale_simple(pixbuf, 24, 24,
226 1189 hiro
                                                GDK_INTERP_HYPER);
227 1189 hiro
        gtk_status_icon_set_from_pixbuf(trayicon.status_icon, scaled_pixbuf);
228 1189 hiro
        g_object_unref(scaled_pixbuf);
229 1189 hiro
}
230 1189 hiro
231 1189 hiro
static void trayicon_activated(GtkStatusIcon *status_icon, gpointer data)
232 1189 hiro
{
233 1189 hiro
        MainWindow *mainwin = (MainWindow *)data;
234 1189 hiro
235 1216 hiro
        main_window_popup(mainwin);
236 1189 hiro
}
237 1189 hiro
238 1189 hiro
static void trayicon_popup_menu_cb(GtkStatusIcon *status_icon, guint button,
239 1189 hiro
                                   guint activate_time, gpointer data)
240 1189 hiro
{
241 1189 hiro
        gtk_menu_popup(GTK_MENU(trayicon_menu), NULL, NULL, NULL, NULL,
242 1189 hiro
                       button, activate_time);
243 1189 hiro
}
244 1189 hiro
245 1189 hiro
#else
246 1189 hiro
247 1191 hiro
void trayicon_show(TrayIcon *tray_icon)
248 1191 hiro
{
249 1191 hiro
        gtk_widget_show(tray_icon->widget);
250 1191 hiro
};
251 1191 hiro
252 1198 hiro
void trayicon_hide(TrayIcon *tray_icon)
253 1198 hiro
{
254 1198 hiro
        gtk_widget_destroy(tray_icon->widget);
255 1198 hiro
        tray_icon->widget = NULL;
256 1198 hiro
}
257 1198 hiro
258 1191 hiro
void trayicon_destroy(TrayIcon *tray_icon)
259 1191 hiro
{
260 1199 hiro
        g_signal_handlers_disconnect_by_func(G_OBJECT(tray_icon->widget),
261 1198 hiro
                                             G_CALLBACK(trayicon_destroy_cb),
262 1199 hiro
                                             main_window_get());
263 1191 hiro
        gtk_widget_destroy(tray_icon->widget);
264 1191 hiro
        tray_icon->widget = NULL;
265 1191 hiro
}
266 1191 hiro
267 1189 hiro
void trayicon_set_tooltip(const gchar *text)
268 1189 hiro
{
269 1189 hiro
        if (text) {
270 1189 hiro
                default_tooltip = FALSE;
271 1189 hiro
                gtk_tooltips_set_tip(trayicon_tip, trayicon.widget, text,
272 962 hiro
                                     NULL);
273 1189 hiro
        } else if (!default_tooltip) {
274 1189 hiro
                default_tooltip = TRUE;
275 1189 hiro
                gtk_tooltips_set_tip(trayicon_tip, trayicon.widget,
276 1189 hiro
                                     _("Sylpheed"), NULL);
277 962 hiro
        }
278 510 hiro
}
279 510 hiro
280 1191 hiro
void trayicon_set_notify(gboolean enabled)
281 1191 hiro
{
282 1191 hiro
}
283 1191 hiro
284 510 hiro
void trayicon_set_stock_icon(StockPixmap icon)
285 510 hiro
{
286 510 hiro
        GdkPixbuf *pixbuf;
287 510 hiro
        GdkPixbuf *scaled_pixbuf;
288 510 hiro
289 510 hiro
        stock_pixbuf_gdk(NULL, icon, &pixbuf);
290 510 hiro
        scaled_pixbuf = gdk_pixbuf_scale_simple(pixbuf, 24, 24,
291 510 hiro
                                                GDK_INTERP_HYPER);
292 510 hiro
        gtk_image_set_from_pixbuf(GTK_IMAGE(trayicon_img), scaled_pixbuf);
293 510 hiro
        g_object_unref(scaled_pixbuf);
294 510 hiro
}
295 510 hiro
296 510 hiro
static void trayicon_button_pressed(GtkWidget *widget, GdkEventButton *event,
297 510 hiro
                                    gpointer data)
298 510 hiro
{
299 510 hiro
        MainWindow *mainwin = (MainWindow *)data;
300 510 hiro
301 896 hiro
        if (!event)
302 896 hiro
                return;
303 896 hiro
304 1195 hiro
        if (event->button == 1)
305 1216 hiro
                main_window_popup(mainwin);
306 1195 hiro
        else if (event->button == 3) {
307 896 hiro
                gtk_menu_popup(GTK_MENU(trayicon_menu), NULL, NULL, NULL, NULL,
308 896 hiro
                               event->button, event->time);
309 896 hiro
        }
310 510 hiro
}
311 532 hiro
312 653 hiro
static gboolean trayicon_restore(gpointer data)
313 653 hiro
{
314 896 hiro
        MainWindow *mainwin = (MainWindow *)data;
315 896 hiro
316 896 hiro
        mainwin->tray_icon = trayicon_create(mainwin);
317 653 hiro
        return FALSE;
318 653 hiro
}
319 653 hiro
320 653 hiro
static void trayicon_destroy_cb(GtkWidget *widget, gpointer data)
321 653 hiro
{
322 653 hiro
        g_idle_add(trayicon_restore, data);
323 653 hiro
}
324 653 hiro
325 1189 hiro
#endif
326 1189 hiro
327 1189 hiro
static void trayicon_present(GtkWidget *widget, gpointer data)
328 1189 hiro
{
329 1189 hiro
        MainWindow *mainwin = (MainWindow *)data;
330 1189 hiro
331 1216 hiro
        main_window_popup(mainwin);
332 1189 hiro
}
333 1189 hiro
334 896 hiro
static void trayicon_inc(GtkWidget *widget, gpointer data)
335 896 hiro
{
336 962 hiro
        if (!inc_is_active() && !gtkut_window_modal_exist())
337 896 hiro
                inc_mail((MainWindow *)data);
338 896 hiro
}
339 896 hiro
340 896 hiro
static void trayicon_inc_all(GtkWidget *widget, gpointer data)
341 896 hiro
{
342 962 hiro
        if (!inc_is_active() && !gtkut_window_modal_exist())
343 896 hiro
                inc_all_account_mail((MainWindow *)data, FALSE);
344 896 hiro
}
345 896 hiro
346 896 hiro
static void trayicon_send(GtkWidget *widget, gpointer data)
347 896 hiro
{
348 962 hiro
        if (!gtkut_window_modal_exist())
349 962 hiro
                main_window_send_queue((MainWindow *)data);
350 896 hiro
}
351 896 hiro
352 896 hiro
static void trayicon_compose(GtkWidget *widget, gpointer data)
353 896 hiro
{
354 962 hiro
        if (!gtkut_window_modal_exist())
355 962 hiro
                compose_new(NULL, NULL, NULL, NULL);
356 896 hiro
}
357 896 hiro
358 896 hiro
static void trayicon_app_exit(GtkWidget *widget, gpointer data)
359 896 hiro
{
360 896 hiro
        MainWindow *mainwin = (MainWindow *)data;
361 896 hiro
362 962 hiro
        if (mainwin->lock_count == 0 && !gtkut_window_modal_exist())
363 896 hiro
                app_will_exit(FALSE);
364 896 hiro
}
365 896 hiro
366 1189 hiro
#else /* GTK_CHECK_VERSION(2, 10, 0) || defined(GDK_WINDOWING_X11) */
367 532 hiro
368 1190 Hiro
TrayIcon *trayicon_create(MainWindow *mainwin)
369 532 hiro
{
370 532 hiro
        return NULL;
371 532 hiro
}
372 532 hiro
373 1191 hiro
void trayicon_show(TrayIcon *tray_icon)
374 532 hiro
{
375 532 hiro
}
376 532 hiro
377 1198 hiro
void trayicon_hide(TrayIcon *tray_icon)
378 1198 hiro
{
379 1198 hiro
}
380 1198 hiro
381 1191 hiro
void trayicon_destroy(TrayIcon *tray_icon)
382 532 hiro
{
383 532 hiro
}
384 532 hiro
385 1191 hiro
void trayicon_set_tooltip(const gchar *text)
386 1190 Hiro
{
387 1190 Hiro
}
388 1190 Hiro
389 1191 hiro
void trayicon_set_notify(gboolean enabled)
390 1190 Hiro
{
391 1190 Hiro
}
392 1190 Hiro
393 1191 hiro
void trayicon_set_stock_icon(StockPixmap icon)
394 1191 hiro
{
395 1191 hiro
}
396 1191 hiro
397 1189 hiro
#endif /* GTK_CHECK_VERSION(2, 10, 0) || defined(GDK_WINDOWING_X11) */