Mon, 31 Oct 2005 06:06:14 +0000
[gaim-migrate @ 14218]
Better error handling for Howl when your mDNS daemon is not running
| 11553 | 1 | /* |
| 2 | * Gaim is the legal property of its developers, whose names are too numerous | |
| 3 | * to list here. Please refer to the COPYRIGHT file distributed with this | |
| 4 | * source distribution. | |
| 5 | * | |
| 6 | * This program is free software; you can redistribute it and/or modify | |
| 7 | * under the terms of the GNU General Public License as published by | |
| 8 | * the Free Software Foundation; either version 2 of the License, or | |
| 9 | * (at your option) any later version. | |
| 10 | * | |
| 11 | * This program is distributed in the hope that it will be useful, | |
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 | * GNU General Public License for more details. | |
| 15 | * | |
| 16 | * You should have received a copy of the GNU General Public License | |
| 17 | * along with this program; if not, write to the Free Software | |
| 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 19 | */ | |
|
11908
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
20 | #include "debug.h" |
|
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
21 | |
| 11553 | 22 | #include "gtkmenutray.h" |
| 23 | ||
|
11787
fb0c7b22368d
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11599
diff
changeset
|
24 | #include <gtk/gtkiconfactory.h> |
|
fb0c7b22368d
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11599
diff
changeset
|
25 | #include <gtk/gtkversion.h> |
|
fb0c7b22368d
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11599
diff
changeset
|
26 | |
| 11553 | 27 | /****************************************************************************** |
| 28 | * Enums | |
| 29 | *****************************************************************************/ | |
| 30 | enum { | |
| 31 | PROP_ZERO = 0, | |
| 32 | PROP_BOX | |
| 33 | }; | |
| 34 | ||
| 35 | /****************************************************************************** | |
| 36 | * Globals | |
| 37 | *****************************************************************************/ | |
| 38 | static GObjectClass *parent_class = NULL; | |
| 39 | ||
| 40 | /****************************************************************************** | |
| 41 | * Internal Stuff | |
| 42 | *****************************************************************************/ | |
| 43 | ||
| 44 | /****************************************************************************** | |
| 45 | * Item Stuff | |
| 46 | *****************************************************************************/ | |
| 47 | static void | |
| 48 | gaim_gtk_menu_tray_select(GtkItem *item) { | |
| 49 | /* this may look like nothing, but it's really overriding the | |
| 50 | * GtkMenuItem's select function so that it doesn't get highlighted like | |
| 51 | * a normal menu item would. | |
| 52 | */ | |
| 53 | } | |
| 54 | ||
| 55 | static void | |
| 56 | gaim_gtk_menu_tray_deselect(GtkItem *item) { | |
| 57 | /* Probably not necessary, but I'd rather be safe than sorry. We're | |
| 58 | * overridding the select, so it makes sense to override deselect as well. | |
| 59 | */ | |
| 60 | } | |
| 61 | ||
| 62 | /****************************************************************************** | |
| 63 | * Widget Stuff | |
| 64 | *****************************************************************************/ | |
| 65 | ||
| 66 | /****************************************************************************** | |
| 67 | * Object Stuff | |
| 68 | *****************************************************************************/ | |
| 69 | static void | |
| 70 | gaim_gtk_menu_tray_get_property(GObject *obj, guint param_id, GValue *value, | |
| 71 | GParamSpec *pspec) | |
| 72 | { | |
| 73 | GaimGtkMenuTray *menu_tray = GAIM_GTK_MENU_TRAY(obj); | |
| 74 | ||
| 75 | switch(param_id) { | |
| 76 | case PROP_BOX: | |
| 77 | g_value_set_object(value, gaim_gtk_menu_tray_get_box(menu_tray)); | |
| 78 | break; | |
| 79 | default: | |
| 80 | G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); | |
| 81 | break; | |
| 82 | } | |
| 83 | } | |
| 84 | ||
| 85 | static void | |
| 86 | gaim_gtk_menu_tray_finalize(GObject *obj) { | |
|
11599
431352c132c8
[gaim-migrate @ 13869]
Gary Kramlich <grim@reaperworld.com>
parents:
11558
diff
changeset
|
87 | #if 0 |
|
431352c132c8
[gaim-migrate @ 13869]
Gary Kramlich <grim@reaperworld.com>
parents:
11558
diff
changeset
|
88 | /* This _might_ be leaking, but I have a sneaking suspicion that the widget is |
|
431352c132c8
[gaim-migrate @ 13869]
Gary Kramlich <grim@reaperworld.com>
parents:
11558
diff
changeset
|
89 | * getting destroyed in GtkContainer's finalize function. But if were are |
|
431352c132c8
[gaim-migrate @ 13869]
Gary Kramlich <grim@reaperworld.com>
parents:
11558
diff
changeset
|
90 | * leaking here, be sure to figure out why this causes a crash. |
|
431352c132c8
[gaim-migrate @ 13869]
Gary Kramlich <grim@reaperworld.com>
parents:
11558
diff
changeset
|
91 | * -- Gary |
|
431352c132c8
[gaim-migrate @ 13869]
Gary Kramlich <grim@reaperworld.com>
parents:
11558
diff
changeset
|
92 | */ |
| 11558 | 93 | GaimGtkMenuTray *tray = GAIM_GTK_MENU_TRAY(obj); |
|
11599
431352c132c8
[gaim-migrate @ 13869]
Gary Kramlich <grim@reaperworld.com>
parents:
11558
diff
changeset
|
94 | |
| 11558 | 95 | if(GTK_IS_WIDGET(tray->tray)) |
| 96 | gtk_widget_destroy(GTK_WIDGET(tray->tray)); | |
|
11599
431352c132c8
[gaim-migrate @ 13869]
Gary Kramlich <grim@reaperworld.com>
parents:
11558
diff
changeset
|
97 | #endif |
| 11553 | 98 | |
| 99 | G_OBJECT_CLASS(parent_class)->finalize(obj); | |
| 100 | } | |
| 101 | ||
| 102 | static void | |
| 103 | gaim_gtk_menu_tray_class_init(GaimGtkMenuTrayClass *klass) { | |
| 104 | GObjectClass *object_class = G_OBJECT_CLASS(klass); | |
| 105 | GtkItemClass *item_class = GTK_ITEM_CLASS(klass); | |
| 106 | GParamSpec *pspec; | |
| 107 | ||
| 108 | parent_class = g_type_class_peek_parent(klass); | |
| 109 | ||
| 110 | object_class->finalize = gaim_gtk_menu_tray_finalize; | |
| 111 | object_class->get_property = gaim_gtk_menu_tray_get_property; | |
| 112 | ||
| 113 | item_class->select = gaim_gtk_menu_tray_select; | |
| 114 | item_class->deselect = gaim_gtk_menu_tray_deselect; | |
| 115 | ||
| 116 | pspec = g_param_spec_object("box", "The box", | |
| 117 | "The box", | |
| 118 | GTK_TYPE_BOX, | |
| 119 | G_PARAM_READABLE); | |
| 120 | g_object_class_install_property(object_class, PROP_BOX, pspec); | |
| 121 | } | |
| 122 | ||
| 123 | static void | |
| 124 | gaim_gtk_menu_tray_init(GaimGtkMenuTray *menu_tray) { | |
|
11787
fb0c7b22368d
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11599
diff
changeset
|
125 | GtkWidget *widget = GTK_WIDGET(menu_tray); |
|
11888
525706b75438
[gaim-migrate @ 14179]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11787
diff
changeset
|
126 | #if GTK_CHECK_VERSION(2,2,0) |
|
11787
fb0c7b22368d
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11599
diff
changeset
|
127 | GtkSettings *settings; |
|
11888
525706b75438
[gaim-migrate @ 14179]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11787
diff
changeset
|
128 | #endif |
|
11787
fb0c7b22368d
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11599
diff
changeset
|
129 | gint height = -1; |
|
fb0c7b22368d
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11599
diff
changeset
|
130 | |
| 11553 | 131 | gtk_menu_item_set_right_justified(GTK_MENU_ITEM(menu_tray), TRUE); |
| 132 | ||
| 11558 | 133 | if(!GTK_IS_WIDGET(menu_tray->tray)) |
| 134 | menu_tray->tray = gtk_hbox_new(FALSE, 0); | |
| 11553 | 135 | |
|
11908
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
136 | menu_tray->tooltips = gtk_tooltips_new(); |
|
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
137 | |
|
11787
fb0c7b22368d
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11599
diff
changeset
|
138 | #if GTK_CHECK_VERSION(2,2,0) |
|
fb0c7b22368d
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11599
diff
changeset
|
139 | settings = |
|
fb0c7b22368d
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11599
diff
changeset
|
140 | gtk_settings_get_for_screen(gtk_widget_get_screen(widget)); |
|
fb0c7b22368d
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11599
diff
changeset
|
141 | |
|
fb0c7b22368d
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11599
diff
changeset
|
142 | if(gtk_icon_size_lookup_for_settings(settings, GTK_ICON_SIZE_MENU, |
|
fb0c7b22368d
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11599
diff
changeset
|
143 | NULL, &height)) |
|
11888
525706b75438
[gaim-migrate @ 14179]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11787
diff
changeset
|
144 | #else |
|
525706b75438
[gaim-migrate @ 14179]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11787
diff
changeset
|
145 | if(gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, NULL, &height)) |
|
525706b75438
[gaim-migrate @ 14179]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11787
diff
changeset
|
146 | #endif |
|
11787
fb0c7b22368d
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11599
diff
changeset
|
147 | { |
|
fb0c7b22368d
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11599
diff
changeset
|
148 | gtk_widget_set_size_request(widget, -1, height); |
|
fb0c7b22368d
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11599
diff
changeset
|
149 | } |
|
fb0c7b22368d
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11599
diff
changeset
|
150 | |
| 11558 | 151 | gtk_container_add(GTK_CONTAINER(menu_tray), menu_tray->tray); |
| 11553 | 152 | |
| 11558 | 153 | gtk_widget_show(menu_tray->tray); |
| 11553 | 154 | } |
| 155 | ||
| 156 | /****************************************************************************** | |
| 157 | * API | |
| 158 | *****************************************************************************/ | |
| 159 | GType | |
| 160 | gaim_gtk_menu_tray_get_gtype(void) { | |
| 161 | static GType type = 0; | |
| 162 | ||
| 163 | if(type == 0) { | |
| 164 | static const GTypeInfo info = { | |
| 165 | sizeof(GaimGtkMenuTrayClass), | |
| 166 | NULL, | |
| 167 | NULL, | |
| 168 | (GClassInitFunc)gaim_gtk_menu_tray_class_init, | |
| 169 | NULL, | |
| 170 | NULL, | |
| 171 | sizeof(GaimGtkMenuTray), | |
| 172 | 0, | |
| 173 | (GInstanceInitFunc)gaim_gtk_menu_tray_init, | |
| 174 | NULL | |
| 175 | }; | |
| 176 | ||
| 177 | type = g_type_register_static(GTK_TYPE_MENU_ITEM, | |
| 178 | "GaimGtkMenuTray", | |
| 179 | &info, 0); | |
| 180 | } | |
| 181 | ||
| 182 | return type; | |
| 183 | } | |
| 184 | ||
| 185 | GtkWidget * | |
| 186 | gaim_gtk_menu_tray_new() { | |
| 187 | return g_object_new(GAIM_GTK_TYPE_MENU_TRAY, NULL); | |
| 188 | } | |
| 189 | ||
| 190 | GtkWidget * | |
| 191 | gaim_gtk_menu_tray_get_box(GaimGtkMenuTray *menu_tray) { | |
| 192 | g_return_val_if_fail(GAIM_GTK_IS_MENU_TRAY(menu_tray), NULL); | |
| 11558 | 193 | return menu_tray->tray; |
| 11553 | 194 | } |
| 195 | ||
| 196 | void | |
|
11908
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
197 | gaim_gtk_menu_tray_append(GaimGtkMenuTray *menu_tray, GtkWidget *widget, const char *tooltip) |
|
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
198 | { |
| 11553 | 199 | g_return_if_fail(GAIM_GTK_IS_MENU_TRAY(menu_tray)); |
| 200 | g_return_if_fail(GTK_IS_WIDGET(widget)); | |
| 201 | ||
|
11908
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
202 | gaim_gtk_menu_tray_set_tooltip(menu_tray, widget, tooltip); |
| 11558 | 203 | gtk_box_pack_end(GTK_BOX(menu_tray->tray), widget, FALSE, FALSE, 0); |
| 11553 | 204 | } |
| 205 | ||
| 206 | void | |
|
11908
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
207 | gaim_gtk_menu_tray_prepend(GaimGtkMenuTray *menu_tray, GtkWidget *widget, const char *tooltip) |
|
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
208 | { |
| 11553 | 209 | g_return_if_fail(GAIM_GTK_IS_MENU_TRAY(menu_tray)); |
| 210 | g_return_if_fail(GTK_IS_WIDGET(widget)); | |
| 211 | ||
|
11908
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
212 | gaim_gtk_menu_tray_set_tooltip(menu_tray, widget, tooltip); |
| 11558 | 213 | gtk_box_pack_start(GTK_BOX(menu_tray->tray), widget, FALSE, FALSE, 0); |
| 11553 | 214 | } |
|
11908
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
215 | |
|
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
216 | void |
|
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
217 | gaim_gtk_menu_tray_set_tooltip(GaimGtkMenuTray *menu_tray, GtkWidget *widget, const char *tooltip) |
|
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
218 | { |
|
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
219 | if (!menu_tray->tooltips) |
|
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
220 | return; |
|
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
221 | |
|
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
222 | /* Should we check whether widget is a child of menu_tray? */ |
|
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
223 | if (GTK_WIDGET_NO_WINDOW(widget)) |
|
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
224 | gaim_debug_warning("GtkMenuTray", |
|
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
225 | "The widget does not have it's own window. Tooltip cannot be set for this widget.\n"); |
|
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
226 | else |
|
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
227 | gtk_tooltips_set_tip(menu_tray->tooltips, widget, tooltip, NULL); |
|
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
228 | } |
|
ad9c7ca74793
[gaim-migrate @ 14199]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11888
diff
changeset
|
229 |