src/mn-mail-icon.gob (8753B) - raw
1 /*
2 * Size adjustment code (size_allocate_h(), find_icon_size()) taken
3 * from GtkStatusIcon,
4 * Copyright (C) 2003 Sun Microsystems, Inc.
5 * Copyright (C) 2005 Hans Breuer <hans@breuer.org>
6 * Copyright (C) 2005 Novell, Inc.
7 *
8 * Mail Notification
9 * Copyright (C) 2003-2008 Jean-Yves Lefort <jylefort@brutele.be>
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 3 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along
22 * with this program; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 */
25
26 %headertop{
27 #include <gtk/gtk.h>
28 #include "eggtrayicon.h"
29 %}
30
31 %privateheader{
32 #include "mn-tooltips.h"
33 %}
34
35 %{
36 #include <glib/gi18n.h>
37 #include <gdk/gdkkeysyms.h>
38 #include "mn-stock.h"
39 #include "mn-util.h"
40 #include "mn-mail-icon-widget.h"
41 %}
42
43 class MN:Mail:Icon from Egg:Tray:Icon
44 {
45 private MNTooltips *tooltips = {mn_tooltips_new()} unrefwith g_object_unref;
46 private GtkWidget *widget = {mn_mail_icon_widget_new()};
47
48 private char *stock_id destroywith g_free;
49 private int size;
50
51 private GtkWidget *menu = {gtk_menu_new()} destroywith gtk_widget_destroy;
52 public GtkWidget *mail_reader_item;
53 public GtkWidget *open_latest_message_item;
54 public GtkWidget *update_item;
55 public GtkWidget *consider_new_mail_as_read_item;
56
57 signal (ACTION) private NONE (NONE)
58 void activate (self);
59 signal (ACTION) private NONE (NONE)
60 void activate_mail_reader (self);
61 signal (ACTION) private NONE (NONE)
62 void activate_open_latest_message (self);
63 signal (ACTION) private NONE (NONE)
64 void activate_consider_new_mail_as_read (self);
65 signal (ACTION) private NONE (NONE)
66 void activate_update (self);
67 signal (ACTION) private NONE (NONE)
68 void activate_properties (self);
69 signal (ACTION) private NONE (NONE)
70 void activate_help (self);
71 signal (ACTION) private NONE (NONE)
72 void activate_about (self);
73 signal (ACTION) private NONE (NONE)
74 void activate_remove (self);
75
76 init (self)
77 {
78 GtkMenuShell *shell;
79 GtkWidget *properties_item;
80 GtkWidget *help_item;
81 GtkWidget *about_item;
82 GtkWidget *remove_item;
83
84 shell = GTK_MENU_SHELL(selfp->menu);
85 /* translators: header capitalization */
86 self->mail_reader_item = mn_menu_shell_append(shell, MN_STOCK_MAIL_READER, _("_Mail Reader"));
87 /* translators: header capitalization */
88 self->open_latest_message_item = mn_menu_shell_append(shell, MN_STOCK_OPEN_MESSAGE, _("_Open Latest Message"));
89
90 mn_menu_shell_append(shell, NULL, NULL);
91
92 /* translators: header capitalization */
93 self->consider_new_mail_as_read_item = mn_menu_shell_append(shell, MN_STOCK_CONSIDER_NEW_MAIL_AS_READ, _("_Consider New Mail as Read"));
94 /* translators: header capitalization */
95 self->update_item = mn_menu_shell_append(shell, GTK_STOCK_REFRESH, _("_Update"));
96
97 mn_menu_shell_append(shell, NULL, NULL);
98
99 properties_item = mn_menu_shell_append(shell, GTK_STOCK_PROPERTIES, NULL);
100 help_item = mn_menu_shell_append(shell, GTK_STOCK_HELP, NULL);
101 about_item = mn_menu_shell_append(shell, GTK_STOCK_ABOUT, NULL);
102
103 mn_menu_shell_append(shell, NULL, NULL);
104
105 /* translators: header capitalization */
106 remove_item = mn_menu_shell_append(shell, GTK_STOCK_REMOVE, _("R_emove From Notification Area"));
107
108 g_signal_connect_swapped(self->mail_reader_item, "activate", G_CALLBACK(self_activate_mail_reader), self);
109 g_signal_connect_swapped(self->open_latest_message_item, "activate", G_CALLBACK(self_activate_open_latest_message), self);
110 g_signal_connect_swapped(self->consider_new_mail_as_read_item, "activate", G_CALLBACK(self_activate_consider_new_mail_as_read), self);
111 g_signal_connect_swapped(self->update_item, "activate", G_CALLBACK(self_activate_update), self);
112 g_signal_connect_swapped(properties_item, "activate", G_CALLBACK(self_activate_properties), self);
113 g_signal_connect_swapped(help_item, "activate", G_CALLBACK(self_activate_help), self);
114 g_signal_connect_swapped(about_item, "activate", G_CALLBACK(self_activate_about), self);
115 g_signal_connect_swapped(remove_item, "activate", G_CALLBACK(self_activate_remove), self);
116
117 gtk_widget_add_events(GTK_WIDGET(self), GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
118
119 gtk_container_add(GTK_CONTAINER(self), selfp->widget);
120
121 g_object_connect(self,
122 "signal::button-press-event", self_button_press_event_h, self,
123 "signal::button-release-event", self_button_release_event_h, self,
124 NULL);
125
126 g_signal_connect(selfp->widget, "size-allocate", G_CALLBACK(self_size_allocate_h), self);
127
128 gtk_widget_show(selfp->widget);
129 }
130
131 private void
132 size_allocate_h (GtkWidget *widget,
133 GtkAllocation *allocation,
134 gpointer user_data)
135 {
136 Self *self = user_data;
137 GtkOrientation orientation;
138 int size;
139
140 orientation = egg_tray_icon_get_orientation(EGG_TRAY_ICON(self));
141
142 if (orientation == GTK_ORIENTATION_HORIZONTAL)
143 size = allocation->height;
144 else
145 size = allocation->width;
146
147 if (selfp->size != size)
148 {
149 selfp->size = size;
150 self_update_image(self);
151 }
152 }
153
154 private GtkIconSize
155 find_icon_size (Gtk:Widget *widget (check null type), int pixel_size)
156 {
157 GdkScreen *screen;
158 GtkSettings *settings;
159 GtkIconSize s, size;
160 int w, h, d, dist;
161
162 screen = gtk_widget_get_screen(widget);
163
164 if (! screen)
165 return GTK_ICON_SIZE_MENU;
166
167 settings = gtk_settings_get_for_screen(screen);
168
169 dist = G_MAXINT;
170 size = GTK_ICON_SIZE_MENU;
171
172 for (s = GTK_ICON_SIZE_MENU; s < GTK_ICON_SIZE_DIALOG; s++)
173 {
174 if (gtk_icon_size_lookup_for_settings(settings, s, &w, &h)
175 && w <= pixel_size
176 && h <= pixel_size)
177 {
178 d = MAX(pixel_size - w, pixel_size - h);
179 if (d < dist)
180 {
181 dist = d;
182 size = s;
183 }
184 }
185 }
186
187 return size;
188 }
189
190 private void
191 update_image (self)
192 {
193 GtkIconSize size;
194
195 size = self_find_icon_size(selfp->widget, selfp->size);
196 mn_mail_icon_widget_set_from_stock(MN_MAIL_ICON_WIDGET(selfp->widget), selfp->stock_id, size);
197 }
198
199 private gboolean
200 button_press_event_h (GtkWidget *widget,
201 GdkEventButton *event,
202 gpointer user_data)
203 {
204 Self *self = user_data;
205
206 if (event->button == 1)
207 self_activate(self);
208 else if (event->button == 3)
209 {
210 gtk_menu_popup(GTK_MENU(selfp->menu), NULL, NULL, self_popup_menu_position_cb, self, event->button, event->time);
211 return TRUE; /* do not propagate event */
212 }
213
214 return FALSE; /* propagate event */
215 }
216
217 private gboolean
218 button_release_event_h (GtkWidget *widget,
219 GdkEventButton *event,
220 gpointer user_data)
221 {
222 Self *self = user_data;
223
224 if (event->button == 3)
225 {
226 gtk_menu_popdown(GTK_MENU(selfp->menu));
227 return TRUE; /* do not propagate event */
228 }
229
230 return FALSE; /* propagate event */
231 }
232
233 private void
234 popup_menu_position_cb (GtkMenu *menu,
235 int *x,
236 int *y,
237 gboolean *push_in,
238 gpointer user_data)
239 {
240 GtkWidget *widget = user_data;
241
242 gdk_window_get_origin(widget->window, x, y);
243
244 *x += widget->allocation.x;
245 *y += widget->allocation.y;
246
247 if (*y > gdk_screen_get_height(gtk_widget_get_screen(widget)) / 2)
248 {
249 GtkRequisition req;
250
251 gtk_widget_size_request(GTK_WIDGET(menu), &req);
252 *y -= req.height;
253 }
254 else
255 *y += widget->allocation.height;
256
257 *push_in = TRUE;
258 }
259
260 public void
261 set_from_stock (self, const char *stock_id)
262 {
263 g_free(selfp->stock_id);
264 selfp->stock_id = g_strdup(stock_id);
265
266 self_update_image(self);
267 }
268
269 public void
270 set_blinking (self, gboolean blinking)
271 {
272 mn_mail_icon_widget_set_blinking(MN_MAIL_ICON_WIDGET(selfp->widget), blinking);
273 }
274
275 public void
276 set_count (self, int count)
277 {
278 mn_mail_icon_widget_set_count(MN_MAIL_ICON_WIDGET(selfp->widget), count);
279 }
280
281 public void
282 set_tip (self, const char *tip)
283 {
284 mn_tooltips_set_tip(selfp->tooltips, GTK_WIDGET(self), tip);
285 }
286
287 public void
288 set_tip_widget (self, Gtk:Widget *tip_widget)
289 {
290 mn_tooltips_set_tip_widget(selfp->tooltips, GTK_WIDGET(self), tip_widget);
291 }
292
293 public GtkWidget *
294 new (void)
295 {
296 return GTK_WIDGET(GET_NEW_VARG("title", _("Mail Notification"), NULL));
297 }
298 }