Statistics
| Revision:

root / src / trayicon.c @ 1195

History | View | Annotate | Download (9.9 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 1195 hiro
static void trayicon_window_present        (GtkWindow        *window);
82 1195 hiro
83 1189 hiro
static void trayicon_present                (GtkWidget        *widget,
84 1189 hiro
                                         gpointer         data);
85 896 hiro
static void trayicon_inc                (GtkWidget        *widget,
86 896 hiro
                                         gpointer         data);
87 896 hiro
static void trayicon_inc_all                (GtkWidget        *widget,
88 896 hiro
                                         gpointer         data);
89 896 hiro
static void trayicon_send                (GtkWidget        *widget,
90 896 hiro
                                         gpointer         data);
91 896 hiro
static void trayicon_compose                (GtkWidget        *widget,
92 896 hiro
                                         gpointer         data);
93 896 hiro
static void trayicon_app_exit                (GtkWidget        *widget,
94 896 hiro
                                         gpointer         data);
95 896 hiro
96 1189 hiro
TrayIcon *trayicon_create(MainWindow *mainwin)
97 510 hiro
{
98 896 hiro
        GtkWidget *menuitem;
99 896 hiro
100 1189 hiro
#if GTK_CHECK_VERSION(2, 10, 0)
101 1189 hiro
        GdkPixbuf *pixbuf;
102 1189 hiro
103 1189 hiro
        stock_pixbuf_gdk(NULL, STOCK_PIXMAP_SYLPHEED, &pixbuf);
104 1189 hiro
        trayicon.status_icon = gtk_status_icon_new_from_pixbuf(pixbuf);
105 1189 hiro
106 1189 hiro
        g_signal_connect(G_OBJECT(trayicon.status_icon), "activate",
107 1189 hiro
                         G_CALLBACK(trayicon_activated), mainwin);
108 1189 hiro
        g_signal_connect(G_OBJECT(trayicon.status_icon), "popup-menu",
109 1189 hiro
                         G_CALLBACK(trayicon_popup_menu_cb), mainwin);
110 1189 hiro
#else
111 1189 hiro
        trayicon.widget = GTK_WIDGET(egg_tray_icon_new("Sylpheed"));
112 1189 hiro
        g_signal_connect(G_OBJECT(trayicon.widget), "destroy",
113 653 hiro
                         G_CALLBACK(trayicon_destroy_cb), mainwin);
114 510 hiro
115 510 hiro
        eventbox = gtk_event_box_new();
116 896 hiro
        gtk_widget_show(eventbox);
117 1189 hiro
        gtk_container_add(GTK_CONTAINER(trayicon.widget), eventbox);
118 510 hiro
        g_signal_connect(G_OBJECT(eventbox), "button_press_event",
119 510 hiro
                         G_CALLBACK(trayicon_button_pressed), mainwin);
120 510 hiro
        trayicon_img = stock_pixbuf_widget_scale(NULL, STOCK_PIXMAP_SYLPHEED,
121 532 hiro
                                                 24, 24);
122 896 hiro
        gtk_widget_show(trayicon_img);
123 510 hiro
        gtk_container_add(GTK_CONTAINER(eventbox), trayicon_img);
124 510 hiro
125 1189 hiro
        trayicon_tip = gtk_tooltips_new();
126 1189 hiro
#endif
127 962 hiro
        default_tooltip = FALSE;
128 962 hiro
        trayicon_set_tooltip(NULL);
129 510 hiro
130 896 hiro
        if (!trayicon_menu) {
131 896 hiro
                trayicon_menu = gtk_menu_new();
132 896 hiro
                gtk_widget_show(trayicon_menu);
133 909 hiro
                MENUITEM_ADD_WITH_MNEMONIC(trayicon_menu, menuitem,
134 1189 hiro
                                           _("_Display Sylpheed"), 0);
135 1189 hiro
                g_signal_connect(G_OBJECT(menuitem), "activate",
136 1189 hiro
                                 G_CALLBACK(trayicon_present), mainwin);
137 1189 hiro
                MENUITEM_ADD(trayicon_menu, menuitem, NULL, 0);
138 1189 hiro
                MENUITEM_ADD_WITH_MNEMONIC(trayicon_menu, menuitem,
139 909 hiro
                                           _("Get from _current account"), 0);
140 896 hiro
                g_signal_connect(G_OBJECT(menuitem), "activate",
141 896 hiro
                                 G_CALLBACK(trayicon_inc), mainwin);
142 909 hiro
                MENUITEM_ADD_WITH_MNEMONIC(trayicon_menu, menuitem,
143 909 hiro
                                           _("Get from _all accounts"), 0);
144 896 hiro
                g_signal_connect(G_OBJECT(menuitem), "activate",
145 896 hiro
                                 G_CALLBACK(trayicon_inc_all), mainwin);
146 909 hiro
                MENUITEM_ADD_WITH_MNEMONIC(trayicon_menu, menuitem,
147 909 hiro
                                           _("_Send queued messages"), 0);
148 896 hiro
                g_signal_connect(G_OBJECT(menuitem), "activate",
149 896 hiro
                                 G_CALLBACK(trayicon_send), mainwin);
150 510 hiro
151 896 hiro
                MENUITEM_ADD(trayicon_menu, menuitem, NULL, 0);
152 909 hiro
                MENUITEM_ADD_WITH_MNEMONIC(trayicon_menu, menuitem,
153 909 hiro
                                           _("Compose _new message"), 0);
154 896 hiro
                g_signal_connect(G_OBJECT(menuitem), "activate",
155 896 hiro
                                 G_CALLBACK(trayicon_compose), mainwin);
156 896 hiro
157 896 hiro
                MENUITEM_ADD(trayicon_menu, menuitem, NULL, 0);
158 909 hiro
                MENUITEM_ADD_WITH_MNEMONIC(trayicon_menu, menuitem,
159 909 hiro
                                           _("E_xit"), 0);
160 896 hiro
                g_signal_connect(G_OBJECT(menuitem), "activate",
161 896 hiro
                                 G_CALLBACK(trayicon_app_exit), mainwin);
162 896 hiro
        }
163 896 hiro
164 1189 hiro
        return &trayicon;
165 510 hiro
}
166 510 hiro
167 1189 hiro
#if GTK_CHECK_VERSION(2, 10, 0)
168 1189 hiro
169 1191 hiro
void trayicon_show(TrayIcon *tray_icon)
170 1191 hiro
{
171 1191 hiro
        gtk_status_icon_set_visible(trayicon.status_icon, TRUE);
172 1191 hiro
};
173 1191 hiro
174 1191 hiro
void trayicon_destroy(TrayIcon *tray_icon)
175 1191 hiro
{
176 1191 hiro
#if 0
177 1191 hiro
        g_object_unref(tray_icon->status_icon);
178 1191 hiro
        tray_icon->status_icon = NULL;
179 1191 hiro
#endif
180 1191 hiro
        gtk_status_icon_set_visible(tray_icon->status_icon, FALSE);
181 1191 hiro
}
182 1191 hiro
183 510 hiro
void trayicon_set_tooltip(const gchar *text)
184 510 hiro
{
185 962 hiro
        if (text) {
186 962 hiro
                default_tooltip = FALSE;
187 1189 hiro
                gtk_status_icon_set_tooltip(trayicon.status_icon, text);
188 962 hiro
        } else if (!default_tooltip) {
189 962 hiro
                default_tooltip = TRUE;
190 1189 hiro
                gtk_status_icon_set_tooltip(trayicon.status_icon,
191 1189 hiro
                                            _("Sylpheed"));
192 1189 hiro
        }
193 1189 hiro
}
194 1189 hiro
195 1191 hiro
static guint notify_tag = 0;
196 1191 hiro
197 1191 hiro
gboolean notify_timeout_cb(gpointer data)
198 1191 hiro
{
199 1191 hiro
        gtk_status_icon_set_blinking(trayicon.status_icon, FALSE);
200 1191 hiro
        notify_tag = 0;
201 1191 hiro
        return FALSE;
202 1191 hiro
}
203 1191 hiro
204 1191 hiro
void trayicon_set_notify(gboolean enabled)
205 1191 hiro
{
206 1191 hiro
        if (enabled && notify_tag == 0) {
207 1191 hiro
                gtk_status_icon_set_blinking(trayicon.status_icon, enabled);
208 1191 hiro
                notify_tag = g_timeout_add(5000, notify_timeout_cb, NULL);
209 1191 hiro
        } else if (!enabled && notify_tag > 0)
210 1191 hiro
                g_source_remove(notify_tag);
211 1191 hiro
}
212 1191 hiro
213 1189 hiro
void trayicon_set_stock_icon(StockPixmap icon)
214 1189 hiro
{
215 1189 hiro
        GdkPixbuf *pixbuf;
216 1189 hiro
        GdkPixbuf *scaled_pixbuf;
217 1189 hiro
218 1189 hiro
        stock_pixbuf_gdk(NULL, icon, &pixbuf);
219 1189 hiro
        scaled_pixbuf = gdk_pixbuf_scale_simple(pixbuf, 24, 24,
220 1189 hiro
                                                GDK_INTERP_HYPER);
221 1189 hiro
        gtk_status_icon_set_from_pixbuf(trayicon.status_icon, scaled_pixbuf);
222 1189 hiro
        g_object_unref(scaled_pixbuf);
223 1189 hiro
}
224 1189 hiro
225 1189 hiro
static void trayicon_activated(GtkStatusIcon *status_icon, gpointer data)
226 1189 hiro
{
227 1189 hiro
        MainWindow *mainwin = (MainWindow *)data;
228 1189 hiro
229 1195 hiro
        trayicon_window_present(GTK_WINDOW(mainwin->window));
230 1189 hiro
}
231 1189 hiro
232 1189 hiro
static void trayicon_popup_menu_cb(GtkStatusIcon *status_icon, guint button,
233 1189 hiro
                                   guint activate_time, gpointer data)
234 1189 hiro
{
235 1189 hiro
        gtk_menu_popup(GTK_MENU(trayicon_menu), NULL, NULL, NULL, NULL,
236 1189 hiro
                       button, activate_time);
237 1189 hiro
}
238 1189 hiro
239 1189 hiro
#else
240 1189 hiro
241 1191 hiro
void trayicon_show(TrayIcon *tray_icon)
242 1191 hiro
{
243 1191 hiro
        gtk_widget_show(tray_icon->widget);
244 1191 hiro
};
245 1191 hiro
246 1191 hiro
void trayicon_destroy(TrayIcon *tray_icon)
247 1191 hiro
{
248 1191 hiro
        gtk_widget_destroy(tray_icon->widget);
249 1191 hiro
        tray_icon->widget = NULL;
250 1191 hiro
}
251 1191 hiro
252 1189 hiro
void trayicon_set_tooltip(const gchar *text)
253 1189 hiro
{
254 1189 hiro
        if (text) {
255 1189 hiro
                default_tooltip = FALSE;
256 1189 hiro
                gtk_tooltips_set_tip(trayicon_tip, trayicon.widget, text,
257 962 hiro
                                     NULL);
258 1189 hiro
        } else if (!default_tooltip) {
259 1189 hiro
                default_tooltip = TRUE;
260 1189 hiro
                gtk_tooltips_set_tip(trayicon_tip, trayicon.widget,
261 1189 hiro
                                     _("Sylpheed"), NULL);
262 962 hiro
        }
263 510 hiro
}
264 510 hiro
265 1191 hiro
void trayicon_set_notify(gboolean enabled)
266 1191 hiro
{
267 1191 hiro
}
268 1191 hiro
269 510 hiro
void trayicon_set_stock_icon(StockPixmap icon)
270 510 hiro
{
271 510 hiro
        GdkPixbuf *pixbuf;
272 510 hiro
        GdkPixbuf *scaled_pixbuf;
273 510 hiro
274 510 hiro
        stock_pixbuf_gdk(NULL, icon, &pixbuf);
275 510 hiro
        scaled_pixbuf = gdk_pixbuf_scale_simple(pixbuf, 24, 24,
276 510 hiro
                                                GDK_INTERP_HYPER);
277 510 hiro
        gtk_image_set_from_pixbuf(GTK_IMAGE(trayicon_img), scaled_pixbuf);
278 510 hiro
        g_object_unref(scaled_pixbuf);
279 510 hiro
}
280 510 hiro
281 510 hiro
static void trayicon_button_pressed(GtkWidget *widget, GdkEventButton *event,
282 510 hiro
                                    gpointer data)
283 510 hiro
{
284 510 hiro
        MainWindow *mainwin = (MainWindow *)data;
285 510 hiro
286 896 hiro
        if (!event)
287 896 hiro
                return;
288 896 hiro
289 1195 hiro
        if (event->button == 1)
290 1195 hiro
                trayicon_window_present(GTK_WINDOW(mainwin->window));
291 1195 hiro
        else if (event->button == 3) {
292 896 hiro
                gtk_menu_popup(GTK_MENU(trayicon_menu), NULL, NULL, NULL, NULL,
293 896 hiro
                               event->button, event->time);
294 896 hiro
        }
295 510 hiro
}
296 532 hiro
297 653 hiro
static gboolean trayicon_restore(gpointer data)
298 653 hiro
{
299 896 hiro
        MainWindow *mainwin = (MainWindow *)data;
300 896 hiro
301 896 hiro
        mainwin->tray_icon = trayicon_create(mainwin);
302 653 hiro
        return FALSE;
303 653 hiro
}
304 653 hiro
305 653 hiro
static void trayicon_destroy_cb(GtkWidget *widget, gpointer data)
306 653 hiro
{
307 653 hiro
        g_idle_add(trayicon_restore, data);
308 653 hiro
}
309 653 hiro
310 1189 hiro
#endif
311 1189 hiro
312 1195 hiro
static void trayicon_window_present(GtkWindow *window)
313 1195 hiro
{
314 1195 hiro
        gtk_window_set_skip_taskbar_hint(window, FALSE);
315 1195 hiro
        gtk_window_present(window);
316 1195 hiro
}
317 1195 hiro
318 1189 hiro
static void trayicon_present(GtkWidget *widget, gpointer data)
319 1189 hiro
{
320 1189 hiro
        MainWindow *mainwin = (MainWindow *)data;
321 1189 hiro
322 1195 hiro
        trayicon_window_present(GTK_WINDOW(mainwin->window));
323 1189 hiro
}
324 1189 hiro
325 896 hiro
static void trayicon_inc(GtkWidget *widget, gpointer data)
326 896 hiro
{
327 962 hiro
        if (!inc_is_active() && !gtkut_window_modal_exist())
328 896 hiro
                inc_mail((MainWindow *)data);
329 896 hiro
}
330 896 hiro
331 896 hiro
static void trayicon_inc_all(GtkWidget *widget, gpointer data)
332 896 hiro
{
333 962 hiro
        if (!inc_is_active() && !gtkut_window_modal_exist())
334 896 hiro
                inc_all_account_mail((MainWindow *)data, FALSE);
335 896 hiro
}
336 896 hiro
337 896 hiro
static void trayicon_send(GtkWidget *widget, gpointer data)
338 896 hiro
{
339 962 hiro
        if (!gtkut_window_modal_exist())
340 962 hiro
                main_window_send_queue((MainWindow *)data);
341 896 hiro
}
342 896 hiro
343 896 hiro
static void trayicon_compose(GtkWidget *widget, gpointer data)
344 896 hiro
{
345 962 hiro
        if (!gtkut_window_modal_exist())
346 962 hiro
                compose_new(NULL, NULL, NULL, NULL);
347 896 hiro
}
348 896 hiro
349 896 hiro
static void trayicon_app_exit(GtkWidget *widget, gpointer data)
350 896 hiro
{
351 896 hiro
        MainWindow *mainwin = (MainWindow *)data;
352 896 hiro
353 962 hiro
        if (mainwin->lock_count == 0 && !gtkut_window_modal_exist())
354 896 hiro
                app_will_exit(FALSE);
355 896 hiro
}
356 896 hiro
357 1189 hiro
#else /* GTK_CHECK_VERSION(2, 10, 0) || defined(GDK_WINDOWING_X11) */
358 532 hiro
359 1190 Hiro
TrayIcon *trayicon_create(MainWindow *mainwin)
360 532 hiro
{
361 532 hiro
        return NULL;
362 532 hiro
}
363 532 hiro
364 1191 hiro
void trayicon_show(TrayIcon *tray_icon)
365 532 hiro
{
366 532 hiro
}
367 532 hiro
368 1191 hiro
void trayicon_destroy(TrayIcon *tray_icon)
369 532 hiro
{
370 532 hiro
}
371 532 hiro
372 1191 hiro
void trayicon_set_tooltip(const gchar *text)
373 1190 Hiro
{
374 1190 Hiro
}
375 1190 Hiro
376 1191 hiro
void trayicon_set_notify(gboolean enabled)
377 1190 Hiro
{
378 1190 Hiro
}
379 1190 Hiro
380 1191 hiro
void trayicon_set_stock_icon(StockPixmap icon)
381 1191 hiro
{
382 1191 hiro
}
383 1191 hiro
384 1189 hiro
#endif /* GTK_CHECK_VERSION(2, 10, 0) || defined(GDK_WINDOWING_X11) */