| 44 |
44 |
| 45 /****************************************************************************** |
45 /****************************************************************************** |
| 46 * Item Stuff |
46 * Item Stuff |
| 47 *****************************************************************************/ |
47 *****************************************************************************/ |
| 48 static void |
48 static void |
| 49 gaim_gtk_menu_tray_select(GtkItem *item) { |
49 pidgin_menu_tray_select(GtkItem *item) { |
| 50 /* this may look like nothing, but it's really overriding the |
50 /* this may look like nothing, but it's really overriding the |
| 51 * GtkMenuItem's select function so that it doesn't get highlighted like |
51 * GtkMenuItem's select function so that it doesn't get highlighted like |
| 52 * a normal menu item would. |
52 * a normal menu item would. |
| 53 */ |
53 */ |
| 54 } |
54 } |
| 55 |
55 |
| 56 static void |
56 static void |
| 57 gaim_gtk_menu_tray_deselect(GtkItem *item) { |
57 pidgin_menu_tray_deselect(GtkItem *item) { |
| 58 /* Probably not necessary, but I'd rather be safe than sorry. We're |
58 /* Probably not necessary, but I'd rather be safe than sorry. We're |
| 59 * overridding the select, so it makes sense to override deselect as well. |
59 * overridding the select, so it makes sense to override deselect as well. |
| 60 */ |
60 */ |
| 61 } |
61 } |
| 62 |
62 |
| 66 |
66 |
| 67 /****************************************************************************** |
67 /****************************************************************************** |
| 68 * Object Stuff |
68 * Object Stuff |
| 69 *****************************************************************************/ |
69 *****************************************************************************/ |
| 70 static void |
70 static void |
| 71 gaim_gtk_menu_tray_get_property(GObject *obj, guint param_id, GValue *value, |
71 pidgin_menu_tray_get_property(GObject *obj, guint param_id, GValue *value, |
| 72 GParamSpec *pspec) |
72 GParamSpec *pspec) |
| 73 { |
73 { |
| 74 GaimGtkMenuTray *menu_tray = GAIM_GTK_MENU_TRAY(obj); |
74 PidginMenuTray *menu_tray = PIDGIN_MENU_TRAY(obj); |
| 75 |
75 |
| 76 switch(param_id) { |
76 switch(param_id) { |
| 77 case PROP_BOX: |
77 case PROP_BOX: |
| 78 g_value_set_object(value, gaim_gtk_menu_tray_get_box(menu_tray)); |
78 g_value_set_object(value, pidgin_menu_tray_get_box(menu_tray)); |
| 79 break; |
79 break; |
| 80 default: |
80 default: |
| 81 G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); |
81 G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); |
| 82 break; |
82 break; |
| 83 } |
83 } |
| 84 } |
84 } |
| 85 |
85 |
| 86 static void |
86 static void |
| 87 gaim_gtk_menu_tray_finalize(GObject *obj) { |
87 pidgin_menu_tray_finalize(GObject *obj) { |
| 88 #if 0 |
88 #if 0 |
| 89 /* This _might_ be leaking, but I have a sneaking suspicion that the widget is |
89 /* This _might_ be leaking, but I have a sneaking suspicion that the widget is |
| 90 * getting destroyed in GtkContainer's finalize function. But if were are |
90 * getting destroyed in GtkContainer's finalize function. But if were are |
| 91 * leaking here, be sure to figure out why this causes a crash. |
91 * leaking here, be sure to figure out why this causes a crash. |
| 92 * -- Gary |
92 * -- Gary |
| 93 */ |
93 */ |
| 94 GaimGtkMenuTray *tray = GAIM_GTK_MENU_TRAY(obj); |
94 PidginMenuTray *tray = PIDGIN_MENU_TRAY(obj); |
| 95 |
95 |
| 96 if(GTK_IS_WIDGET(tray->tray)) |
96 if(GTK_IS_WIDGET(tray->tray)) |
| 97 gtk_widget_destroy(GTK_WIDGET(tray->tray)); |
97 gtk_widget_destroy(GTK_WIDGET(tray->tray)); |
| 98 #endif |
98 #endif |
| 99 |
99 |
| 100 G_OBJECT_CLASS(parent_class)->finalize(obj); |
100 G_OBJECT_CLASS(parent_class)->finalize(obj); |
| 101 } |
101 } |
| 102 |
102 |
| 103 static void |
103 static void |
| 104 gaim_gtk_menu_tray_class_init(GaimGtkMenuTrayClass *klass) { |
104 pidgin_menu_tray_class_init(PidginMenuTrayClass *klass) { |
| 105 GObjectClass *object_class = G_OBJECT_CLASS(klass); |
105 GObjectClass *object_class = G_OBJECT_CLASS(klass); |
| 106 GtkItemClass *item_class = GTK_ITEM_CLASS(klass); |
106 GtkItemClass *item_class = GTK_ITEM_CLASS(klass); |
| 107 GParamSpec *pspec; |
107 GParamSpec *pspec; |
| 108 |
108 |
| 109 parent_class = g_type_class_peek_parent(klass); |
109 parent_class = g_type_class_peek_parent(klass); |
| 110 |
110 |
| 111 object_class->finalize = gaim_gtk_menu_tray_finalize; |
111 object_class->finalize = pidgin_menu_tray_finalize; |
| 112 object_class->get_property = gaim_gtk_menu_tray_get_property; |
112 object_class->get_property = pidgin_menu_tray_get_property; |
| 113 |
113 |
| 114 item_class->select = gaim_gtk_menu_tray_select; |
114 item_class->select = pidgin_menu_tray_select; |
| 115 item_class->deselect = gaim_gtk_menu_tray_deselect; |
115 item_class->deselect = pidgin_menu_tray_deselect; |
| 116 |
116 |
| 117 pspec = g_param_spec_object("box", "The box", |
117 pspec = g_param_spec_object("box", "The box", |
| 118 "The box", |
118 "The box", |
| 119 GTK_TYPE_BOX, |
119 GTK_TYPE_BOX, |
| 120 G_PARAM_READABLE); |
120 G_PARAM_READABLE); |
| 121 g_object_class_install_property(object_class, PROP_BOX, pspec); |
121 g_object_class_install_property(object_class, PROP_BOX, pspec); |
| 122 } |
122 } |
| 123 |
123 |
| 124 static void |
124 static void |
| 125 gaim_gtk_menu_tray_init(GaimGtkMenuTray *menu_tray) { |
125 pidgin_menu_tray_init(PidginMenuTray *menu_tray) { |
| 126 GtkWidget *widget = GTK_WIDGET(menu_tray); |
126 GtkWidget *widget = GTK_WIDGET(menu_tray); |
| 127 #if GTK_CHECK_VERSION(2,2,0) |
127 #if GTK_CHECK_VERSION(2,2,0) |
| 128 GtkSettings *settings; |
128 GtkSettings *settings; |
| 129 #endif |
129 #endif |
| 130 gint height = -1; |
130 gint height = -1; |
| 156 |
156 |
| 157 /****************************************************************************** |
157 /****************************************************************************** |
| 158 * API |
158 * API |
| 159 *****************************************************************************/ |
159 *****************************************************************************/ |
| 160 GType |
160 GType |
| 161 gaim_gtk_menu_tray_get_gtype(void) { |
161 pidgin_menu_tray_get_gtype(void) { |
| 162 static GType type = 0; |
162 static GType type = 0; |
| 163 |
163 |
| 164 if(type == 0) { |
164 if(type == 0) { |
| 165 static const GTypeInfo info = { |
165 static const GTypeInfo info = { |
| 166 sizeof(GaimGtkMenuTrayClass), |
166 sizeof(PidginMenuTrayClass), |
| 167 NULL, |
167 NULL, |
| 168 NULL, |
168 NULL, |
| 169 (GClassInitFunc)gaim_gtk_menu_tray_class_init, |
169 (GClassInitFunc)pidgin_menu_tray_class_init, |
| 170 NULL, |
170 NULL, |
| 171 NULL, |
171 NULL, |
| 172 sizeof(GaimGtkMenuTray), |
172 sizeof(PidginMenuTray), |
| 173 0, |
173 0, |
| 174 (GInstanceInitFunc)gaim_gtk_menu_tray_init, |
174 (GInstanceInitFunc)pidgin_menu_tray_init, |
| 175 NULL |
175 NULL |
| 176 }; |
176 }; |
| 177 |
177 |
| 178 type = g_type_register_static(GTK_TYPE_MENU_ITEM, |
178 type = g_type_register_static(GTK_TYPE_MENU_ITEM, |
| 179 "GaimGtkMenuTray", |
179 "PidginMenuTray", |
| 180 &info, 0); |
180 &info, 0); |
| 181 } |
181 } |
| 182 |
182 |
| 183 return type; |
183 return type; |
| 184 } |
184 } |
| 185 |
185 |
| 186 GtkWidget * |
186 GtkWidget * |
| 187 gaim_gtk_menu_tray_new() { |
187 pidgin_menu_tray_new() { |
| 188 return g_object_new(GAIM_GTK_TYPE_MENU_TRAY, NULL); |
188 return g_object_new(PIDGIN_TYPE_MENU_TRAY, NULL); |
| 189 } |
189 } |
| 190 |
190 |
| 191 GtkWidget * |
191 GtkWidget * |
| 192 gaim_gtk_menu_tray_get_box(GaimGtkMenuTray *menu_tray) { |
192 pidgin_menu_tray_get_box(PidginMenuTray *menu_tray) { |
| 193 g_return_val_if_fail(GAIM_GTK_IS_MENU_TRAY(menu_tray), NULL); |
193 g_return_val_if_fail(PIDGIN_IS_MENU_TRAY(menu_tray), NULL); |
| 194 return menu_tray->tray; |
194 return menu_tray->tray; |
| 195 } |
195 } |
| 196 |
196 |
| 197 static void |
197 static void |
| 198 gaim_gtk_menu_tray_add(GaimGtkMenuTray *menu_tray, GtkWidget *widget, |
198 pidgin_menu_tray_add(PidginMenuTray *menu_tray, GtkWidget *widget, |
| 199 const char *tooltip, gboolean prepend) |
199 const char *tooltip, gboolean prepend) |
| 200 { |
200 { |
| 201 g_return_if_fail(GAIM_GTK_IS_MENU_TRAY(menu_tray)); |
201 g_return_if_fail(PIDGIN_IS_MENU_TRAY(menu_tray)); |
| 202 g_return_if_fail(GTK_IS_WIDGET(widget)); |
202 g_return_if_fail(GTK_IS_WIDGET(widget)); |
| 203 |
203 |
| 204 if (GTK_WIDGET_NO_WINDOW(widget)) |
204 if (GTK_WIDGET_NO_WINDOW(widget)) |
| 205 { |
205 { |
| 206 GtkWidget *event; |
206 GtkWidget *event; |
| 209 gtk_container_add(GTK_CONTAINER(event), widget); |
209 gtk_container_add(GTK_CONTAINER(event), widget); |
| 210 gtk_widget_show(event); |
210 gtk_widget_show(event); |
| 211 widget = event; |
211 widget = event; |
| 212 } |
212 } |
| 213 |
213 |
| 214 gaim_gtk_menu_tray_set_tooltip(menu_tray, widget, tooltip); |
214 pidgin_menu_tray_set_tooltip(menu_tray, widget, tooltip); |
| 215 |
215 |
| 216 if (prepend) |
216 if (prepend) |
| 217 gtk_box_pack_start(GTK_BOX(menu_tray->tray), widget, FALSE, FALSE, 0); |
217 gtk_box_pack_start(GTK_BOX(menu_tray->tray), widget, FALSE, FALSE, 0); |
| 218 else |
218 else |
| 219 gtk_box_pack_end(GTK_BOX(menu_tray->tray), widget, FALSE, FALSE, 0); |
219 gtk_box_pack_end(GTK_BOX(menu_tray->tray), widget, FALSE, FALSE, 0); |
| 220 } |
220 } |
| 221 |
221 |
| 222 void |
222 void |
| 223 gaim_gtk_menu_tray_append(GaimGtkMenuTray *menu_tray, GtkWidget *widget, const char *tooltip) |
223 pidgin_menu_tray_append(PidginMenuTray *menu_tray, GtkWidget *widget, const char *tooltip) |
| 224 { |
224 { |
| 225 gaim_gtk_menu_tray_add(menu_tray, widget, tooltip, FALSE); |
225 pidgin_menu_tray_add(menu_tray, widget, tooltip, FALSE); |
| 226 } |
226 } |
| 227 |
227 |
| 228 void |
228 void |
| 229 gaim_gtk_menu_tray_prepend(GaimGtkMenuTray *menu_tray, GtkWidget *widget, const char *tooltip) |
229 pidgin_menu_tray_prepend(PidginMenuTray *menu_tray, GtkWidget *widget, const char *tooltip) |
| 230 { |
230 { |
| 231 gaim_gtk_menu_tray_add(menu_tray, widget, tooltip, TRUE); |
231 pidgin_menu_tray_add(menu_tray, widget, tooltip, TRUE); |
| 232 } |
232 } |
| 233 |
233 |
| 234 void |
234 void |
| 235 gaim_gtk_menu_tray_set_tooltip(GaimGtkMenuTray *menu_tray, GtkWidget *widget, const char *tooltip) |
235 pidgin_menu_tray_set_tooltip(PidginMenuTray *menu_tray, GtkWidget *widget, const char *tooltip) |
| 236 { |
236 { |
| 237 if (!menu_tray->tooltips) |
237 if (!menu_tray->tooltips) |
| 238 return; |
238 return; |
| 239 |
239 |
| 240 /* Should we check whether widget is a child of menu_tray? */ |
240 /* Should we check whether widget is a child of menu_tray? */ |