Mercurial > pidgin
annotate src/gtkstatusbox.c @ 10749:3839df4f7074
[gaim-migrate @ 12351]
This fixes the auto-reconnect plugin bug. The whole "wants_to_die"
thing feels a little dirty. Eh, it's fine for now.
Also, the gtkstatusbox starts off in the "available" state instead
of using the GaimStatus of whatever account is online. This negates
the effect of saving the GaimStatuses for an account.
More tomorrow...
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sun, 27 Mar 2005 05:17:18 +0000 |
parents | f51e040affc6 |
children | 42c16b293867 |
rev | line source |
---|---|
10643 | 1 /* |
2 * @file gtkstatusbox.c GTK+ Status Selection Widget | |
3 * @ingroup gtkui | |
4 * | |
5 * gaim | |
6 * | |
7 * Gaim is the legal property of its developers, whose names are too numerous | |
8 * to list here. Please refer to the COPYRIGHT file distributed with this | |
9 * source distribution. | |
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 2 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 | |
22 * along with this program; if not, write to the Free Software | |
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
24 */ | |
25 | |
26 #include "internal.h" | |
27 #include "account.h" | |
28 #include "status.h" | |
29 #include "gtkgaim.h" | |
30 #include "gtkstock.h" | |
31 #include "gtkstatusbox.h" | |
32 | |
33 static void imhtml_changed_cb(GtkTextBuffer *buffer, void *data); | |
34 | |
35 static void gtk_gaim_status_box_changed(GtkComboBox *box); | |
36 static void gtk_gaim_status_box_size_request (GtkWidget *widget, GtkRequisition *requisition); | |
37 static void gtk_gaim_status_box_size_allocate (GtkWidget *widget, GtkAllocation *allocation); | |
38 static gboolean gtk_gaim_status_box_expose_event (GtkWidget *widget, GdkEventExpose *event); | |
39 static void gtk_gaim_status_box_forall (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data); | |
40 | |
41 static void (*combo_box_size_request)(GtkWidget *widget, GtkRequisition *requisition); | |
42 static void (*combo_box_size_allocate)(GtkWidget *widget, GtkAllocation *allocation); | |
43 static gboolean (*combo_box_expose_event)(GtkWidget *widget, GdkEventExpose *event); | |
44 static void (*combo_box_forall) (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data); | |
45 enum { | |
46 ICON_COLUMN, | |
47 TEXT_COLUMN, | |
48 TITLE_COLUMN, | |
49 DESC_COLUMN, | |
50 TYPE_COLUMN, | |
51 NUM_COLUMNS | |
52 }; | |
53 | |
54 static void gtk_gaim_status_box_class_init (GtkGaimStatusBoxClass *klass); | |
55 static void gtk_gaim_status_box_init (GtkGaimStatusBox *status_box); | |
56 | |
57 GType | |
58 gtk_gaim_status_box_get_type (void) | |
59 { | |
60 static GType status_box_type = 0; | |
61 | |
62 if (!status_box_type) | |
63 { | |
64 static const GTypeInfo status_box_info = | |
65 { | |
66 sizeof (GtkGaimStatusBoxClass), | |
67 NULL, /* base_init */ | |
68 NULL, /* base_finalize */ | |
69 (GClassInitFunc) gtk_gaim_status_box_class_init, | |
70 NULL, /* class_finalize */ | |
71 NULL, /* class_data */ | |
72 sizeof (GtkGaimStatusBox), | |
73 0, | |
74 (GInstanceInitFunc) gtk_gaim_status_box_init | |
75 }; | |
76 | |
77 status_box_type = g_type_register_static (GTK_TYPE_COMBO_BOX, | |
78 "GtkGaimStatusBox", | |
79 &status_box_info, | |
80 0); | |
81 } | |
82 | |
83 return status_box_type; | |
84 } | |
85 | |
86 static void | |
87 gtk_gaim_status_box_class_init (GtkGaimStatusBoxClass *klass) | |
88 { | |
89 GObjectClass *object_class; | |
90 GtkWidgetClass *widget_class; | |
91 GtkComboBoxClass *parent_class = (GtkComboBoxClass*)klass; | |
92 GtkContainerClass *container_class = (GtkContainerClass*)klass; | |
93 | |
94 parent_class->changed = gtk_gaim_status_box_changed; | |
95 widget_class = (GtkWidgetClass*)klass; | |
96 combo_box_size_request = widget_class->size_request; | |
97 widget_class->size_request = gtk_gaim_status_box_size_request; | |
98 combo_box_size_allocate = widget_class->size_allocate; | |
99 widget_class->size_allocate = gtk_gaim_status_box_size_allocate; | |
100 combo_box_expose_event = widget_class->expose_event; | |
101 widget_class->expose_event = gtk_gaim_status_box_expose_event; | |
102 | |
103 combo_box_forall = container_class->forall; | |
104 container_class->forall = gtk_gaim_status_box_forall; | |
105 | |
106 object_class = (GObjectClass *)klass; | |
107 } | |
108 | |
109 static void | |
110 gtk_gaim_status_box_refresh(GtkGaimStatusBox *status_box) | |
111 { | |
10672
0925c898b73c
[gaim-migrate @ 12212]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10661
diff
changeset
|
112 char *text, *title; |
10643 | 113 char aa_color[8]; |
114 GdkPixbuf *pixbuf; | |
10702 | 115 GtkTreePath *path; |
10643 | 116 |
117 GtkStyle *style = gtk_widget_get_style(GTK_WIDGET(status_box)); | |
118 snprintf(aa_color, sizeof(aa_color), "#%02x%02x%02x", | |
119 style->text_aa[GTK_STATE_NORMAL].red >> 8, | |
120 style->text_aa[GTK_STATE_NORMAL].green >> 8, | |
121 style->text_aa[GTK_STATE_NORMAL].blue >> 8); | |
10672
0925c898b73c
[gaim-migrate @ 12212]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10661
diff
changeset
|
122 |
0925c898b73c
[gaim-migrate @ 12212]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10661
diff
changeset
|
123 title = status_box->title; |
0925c898b73c
[gaim-migrate @ 12212]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10661
diff
changeset
|
124 if (!title) |
0925c898b73c
[gaim-migrate @ 12212]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10661
diff
changeset
|
125 title = ""; |
0925c898b73c
[gaim-migrate @ 12212]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10661
diff
changeset
|
126 |
10643 | 127 if (status_box->error) { |
128 text = g_strdup_printf("%s\n<span size=\"smaller\" weight=\"bold\" color=\"red\">%s</span>", | |
10672
0925c898b73c
[gaim-migrate @ 12212]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10661
diff
changeset
|
129 title, status_box->error); |
10643 | 130 } else if (status_box->typing) { |
10661
f02873d475dc
[gaim-migrate @ 12198]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10649
diff
changeset
|
131 text = g_strdup_printf("%s\n<span size=\"smaller\" color=\"%s\">%s</span>", |
10672
0925c898b73c
[gaim-migrate @ 12212]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10661
diff
changeset
|
132 title, |
10643 | 133 aa_color, |
134 _("Typing")); | |
135 } else if (status_box->connecting) { | |
136 text = g_strdup_printf("%s\n<span size=\"smaller\" color=\"%s\">%s</span>", | |
10672
0925c898b73c
[gaim-migrate @ 12212]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10661
diff
changeset
|
137 title, |
10643 | 138 aa_color, |
139 _("Connecting")); | |
140 } else if (status_box->desc) { | |
141 text = g_strdup_printf("%s\n<span size=\"smaller\" color=\"%s\">%s</span>", | |
10672
0925c898b73c
[gaim-migrate @ 12212]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10661
diff
changeset
|
142 title, aa_color, status_box->desc); |
10643 | 143 } else { |
10672
0925c898b73c
[gaim-migrate @ 12212]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10661
diff
changeset
|
144 text = g_strdup_printf("%s", title); |
10643 | 145 } |
146 | |
147 if (status_box->error) | |
148 pixbuf = status_box->error_pixbuf; | |
149 else if (status_box->typing) | |
150 pixbuf = status_box->typing_pixbufs[status_box->typing_index]; | |
151 else if (status_box->connecting) | |
152 pixbuf = status_box->connecting_pixbufs[status_box->connecting_index]; | |
153 else | |
154 pixbuf = status_box->pixbuf; | |
155 | |
156 gtk_list_store_set(status_box->store, &(status_box->iter), | |
157 ICON_COLUMN, pixbuf, | |
158 TEXT_COLUMN, text, | |
10672
0925c898b73c
[gaim-migrate @ 12212]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10661
diff
changeset
|
159 TITLE_COLUMN, title, |
10643 | 160 DESC_COLUMN, status_box->desc, |
161 TYPE_COLUMN, NULL, -1); | |
10702 | 162 path = gtk_tree_path_new_from_string("0"); |
163 gtk_cell_view_set_displayed_row(GTK_CELL_VIEW(status_box->cell_view), path); | |
164 gtk_tree_path_free(path); | |
10643 | 165 |
166 g_free(text); | |
167 } | |
168 | |
169 static void | |
170 gtk_gaim_status_box_init (GtkGaimStatusBox *status_box) | |
171 { | |
172 GtkCellRenderer *text_rend = gtk_cell_renderer_text_new(); | |
173 GtkCellRenderer *icon_rend = gtk_cell_renderer_pixbuf_new(); | |
174 GtkTextBuffer *buffer; | |
175 GdkPixbuf *pixbuf, *pixbuf2, *pixbuf3, *pixbuf4; | |
176 GtkIconSize icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS); | |
177 | |
178 status_box->imhtml_visible = FALSE; | |
179 status_box->error_pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_OFFLINE, | |
180 icon_size, "GtkGaimStatusBox"); | |
181 status_box->connecting_index = 0; | |
182 status_box->connecting_pixbufs[0] = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_CONNECT0, | |
183 icon_size, "GtkGaimStatusBox"); | |
184 status_box->connecting_pixbufs[1] = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_CONNECT1, | |
185 icon_size, "GtkGaimStatusBox"); | |
186 status_box->connecting_pixbufs[2] = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_CONNECT2, | |
187 icon_size, "GtkGaimStatusBox"); | |
188 status_box->connecting_pixbufs[3] = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_CONNECT3, | |
189 icon_size, "GtkGaimStatusBox"); | |
190 | |
191 status_box->typing_index = 0; | |
192 status_box->typing_pixbufs[0] = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_TYPING0, | |
193 icon_size, "GtkGaimStatusBox"); | |
194 status_box->typing_pixbufs[1] = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_TYPING1, | |
195 icon_size, "GtkGaimStatusBox"); | |
196 status_box->typing_pixbufs[2] = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_TYPING2, | |
197 icon_size, "GtkGaimStatusBox"); | |
198 status_box->typing_pixbufs[3] = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_TYPING3, | |
199 icon_size, "GtkGaimStatusBox"); | |
200 status_box->connecting = FALSE; | |
201 status_box->typing = FALSE; | |
202 status_box->title = NULL; | |
203 status_box->pixbuf = NULL; | |
204 status_box->cell_view = gtk_cell_view_new(); | |
205 gtk_widget_show (status_box->cell_view); | |
206 | |
207 status_box->store = gtk_list_store_new(NUM_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); | |
208 status_box->dropdown_store = gtk_list_store_new(NUM_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); | |
209 gtk_combo_box_set_model(GTK_COMBO_BOX(status_box), GTK_TREE_MODEL(status_box->dropdown_store)); | |
210 gtk_cell_view_set_model(GTK_CELL_VIEW(status_box->cell_view), GTK_TREE_MODEL(status_box->store)); | |
211 gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(status_box), 0); | |
212 gtk_list_store_append(status_box->store, &(status_box->iter)); | |
213 gtk_gaim_status_box_refresh(status_box); | |
214 gtk_cell_view_set_displayed_row(GTK_CELL_VIEW(status_box->cell_view), gtk_tree_path_new_from_string("0")); | |
215 gtk_container_add(GTK_CONTAINER(status_box), status_box->cell_view); | |
216 | |
217 status_box->icon_rend = gtk_cell_renderer_pixbuf_new(); | |
218 status_box->text_rend = gtk_cell_renderer_text_new(); | |
219 | |
220 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box), icon_rend, FALSE); | |
221 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box), text_rend, TRUE); | |
222 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box), icon_rend, "pixbuf", ICON_COLUMN, NULL); | |
223 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box), text_rend, "markup", TEXT_COLUMN, NULL); | |
224 | |
225 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box->cell_view), status_box->icon_rend, FALSE); | |
226 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box->cell_view), status_box->text_rend, TRUE); | |
227 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), status_box->icon_rend, "pixbuf", ICON_COLUMN, NULL); | |
228 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), status_box->text_rend, "markup", TEXT_COLUMN, NULL); | |
229 | |
230 status_box->vbox = gtk_vbox_new(0, FALSE); | |
231 status_box->imhtml = gtk_imhtml_new(NULL, NULL); | |
232 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(status_box->imhtml)); | |
233 g_signal_connect(G_OBJECT(buffer), "changed", G_CALLBACK(imhtml_changed_cb), status_box); | |
234 gtk_imhtml_set_editable(GTK_IMHTML(status_box->imhtml), TRUE); | |
235 gtk_widget_set_parent(status_box->vbox, GTK_WIDGET(status_box)); | |
236 status_box->sw = gtk_scrolled_window_new(NULL, NULL); | |
237 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(status_box->sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); | |
238 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(status_box->sw), GTK_SHADOW_IN); | |
239 gtk_container_add(GTK_CONTAINER(status_box->sw), status_box->imhtml); | |
240 gtk_box_pack_start(GTK_BOX(status_box->vbox), status_box->sw, TRUE, TRUE, 0); | |
241 pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_ONLINE, | |
242 icon_size, "GtkGaimStatusBox"); | |
243 pixbuf2 = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_AWAY, | |
244 icon_size, "GtkGaimStatusBox"); | |
245 pixbuf3 = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_OFFLINE, | |
246 icon_size, "GtkGaimStatusBox"); | |
247 pixbuf4 = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_INVISIBLE, | |
248 icon_size, "GtkGaimStatusBox"); | |
249 /* hacks */ | |
250 gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), pixbuf, _("Available"), NULL, "available"); | |
251 gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), pixbuf2, _("Away"), NULL, "away"); | |
252 gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), pixbuf4, _("Invisible"), NULL, "invisible"); | |
253 gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), pixbuf3, _("Offline"), NULL, "offline"); | |
254 gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), 0); | |
255 | |
256 } | |
257 | |
258 | |
259 static void | |
260 gtk_gaim_status_box_size_request (GtkWidget *widget, | |
261 GtkRequisition *requisition) | |
262 { | |
263 GtkRequisition box_req; | |
264 combo_box_size_request(widget, requisition); | |
265 | |
266 gtk_widget_size_request(GTK_GAIM_STATUS_BOX(widget)->vbox, &box_req); | |
267 if (box_req.height > 1) | |
268 requisition->height = requisition->height + box_req.height + 6; | |
269 | |
270 requisition->width = 1; | |
271 | |
272 } | |
273 | |
274 static void | |
275 gtk_gaim_status_box_size_allocate (GtkWidget *widget, | |
276 GtkAllocation *allocation) | |
277 { | |
278 GtkRequisition req = {0,0}; | |
279 GtkAllocation parent_alc = *allocation, box_alc = *allocation ; | |
280 combo_box_size_request(widget, &req); | |
281 | |
282 /* EVIL XXX */ | |
283 box_alc.height = 80;//MAX(1,box_alc.height - req.height - 6); | |
284 | |
285 box_alc.y = box_alc.y + req.height + 6; | |
286 gtk_widget_size_allocate((GTK_GAIM_STATUS_BOX(widget))->vbox, &box_alc); | |
287 | |
288 parent_alc.height = MAX(1,req.height); | |
289 combo_box_size_allocate(widget, &parent_alc); | |
290 widget->allocation = *allocation; | |
291 } | |
292 | |
293 | |
294 static gboolean | |
295 gtk_gaim_status_box_expose_event (GtkWidget *widget, | |
296 GdkEventExpose *event) | |
297 { | |
298 | |
299 GtkGaimStatusBox *status_box = GTK_GAIM_STATUS_BOX (widget); | |
300 combo_box_expose_event(widget, event); | |
301 | |
302 gtk_container_propagate_expose (GTK_CONTAINER (widget), | |
303 status_box->vbox, event); | |
304 return FALSE; | |
305 } | |
306 | |
307 static void | |
308 gtk_gaim_status_box_forall (GtkContainer *container, | |
309 gboolean include_internals, | |
310 GtkCallback callback, | |
311 gpointer callback_data) | |
312 { | |
313 GtkGaimStatusBox *status_box = GTK_GAIM_STATUS_BOX (container); | |
314 | |
315 if (include_internals) | |
316 { | |
317 (* callback) (status_box->vbox, callback_data); | |
318 } | |
319 | |
320 combo_box_forall(container, include_internals, callback, callback_data); | |
321 } | |
322 | |
323 GtkWidget * | |
324 gtk_gaim_status_box_new() | |
325 { | |
326 return g_object_new(GTK_GAIM_TYPE_STATUS_BOX, NULL); | |
327 } | |
328 | |
329 | |
330 void | |
331 gtk_gaim_status_box_add(GtkGaimStatusBox *status_box, GdkPixbuf *pixbuf, const char *text, const char *sec_text, char *edit) | |
332 { | |
333 GtkTreeIter iter; | |
334 char *t; | |
335 | |
336 if (sec_text) { | |
337 char aa_color[8]; | |
338 GtkStyle *style = gtk_widget_get_style(GTK_WIDGET(status_box)); | |
339 snprintf(aa_color, sizeof(aa_color), "#%02x%02x%02x", | |
340 style->text_aa[GTK_STATE_NORMAL].red >> 8, | |
341 style->text_aa[GTK_STATE_NORMAL].green >> 8, | |
342 style->text_aa[GTK_STATE_NORMAL].blue >> 8); | |
343 t = g_strdup_printf("%s\n<span color=\"%s\">%s</span>", text, aa_color, sec_text); | |
344 } else { | |
345 t = g_strdup(text); | |
346 } | |
347 | |
348 gtk_list_store_append(status_box->dropdown_store, &iter); | |
349 gtk_list_store_set(status_box->dropdown_store, &iter, | |
350 ICON_COLUMN, pixbuf, | |
351 TEXT_COLUMN, t, | |
352 TITLE_COLUMN, text, | |
353 DESC_COLUMN, sec_text, | |
354 TYPE_COLUMN, edit, -1); | |
355 } | |
356 | |
357 void | |
358 gtk_gaim_status_box_set_error(GtkGaimStatusBox *status_box, const gchar *error) | |
359 { | |
360 status_box->error = g_strdup(error); | |
361 gtk_gaim_status_box_refresh(status_box); | |
362 } | |
363 | |
364 void | |
365 gtk_gaim_status_box_set_connecting(GtkGaimStatusBox *status_box, gboolean connecting) | |
366 { | |
367 if (!status_box) | |
368 return; | |
369 status_box->connecting = connecting; | |
370 gtk_gaim_status_box_refresh(status_box); | |
371 } | |
372 | |
373 void | |
374 gtk_gaim_status_box_pulse_connecting(GtkGaimStatusBox *status_box) | |
375 { | |
376 if (!status_box) | |
377 return; | |
378 if (status_box->connecting_index == 3) | |
379 status_box->connecting_index = 0; | |
380 else | |
381 status_box->connecting_index++; | |
382 gtk_gaim_status_box_refresh(status_box); | |
383 } | |
384 | |
385 void | |
386 gtk_gaim_status_box_pulse_typing(GtkGaimStatusBox *status_box) | |
387 { | |
388 if (status_box->typing_index == 3) | |
389 status_box->typing_index = 0; | |
390 else | |
391 status_box->typing_index++; | |
392 gtk_gaim_status_box_refresh(status_box); | |
393 } | |
394 | |
395 static void remove_typing_cb(GtkGaimStatusBox *box) | |
396 { | |
397 gchar *status_type_id; | |
398 GList *l; | |
399 GtkTreeIter iter; | |
400 | |
401 gtk_combo_box_get_active_iter(GTK_COMBO_BOX(box), &iter); | |
402 gtk_tree_model_get(GTK_TREE_MODEL(box->dropdown_store), &iter, TYPE_COLUMN, &status_type_id, -1); | |
403 for (l = gaim_accounts_get_all(); l != NULL; l = l->next) { | |
404 GaimAccount *account = (GaimAccount*)l->data; | |
405 GaimStatusType *status_type; | |
406 | |
407 if (!gaim_account_get_enabled(account, GAIM_GTK_UI)) | |
408 continue; | |
409 | |
410 status_type = gaim_account_get_status_type(account, status_type_id); | |
411 | |
412 if (status_type == NULL) | |
413 continue; | |
414 gaim_account_set_status(account, status_type_id, TRUE, | |
415 "message",gtk_imhtml_get_markup(GTK_IMHTML(box->imhtml)), NULL); | |
416 } | |
417 g_source_remove(box->typing); | |
418 box->typing = 0; | |
419 gtk_gaim_status_box_refresh(box); | |
420 } | |
421 | |
10749 | 422 /* |
423 * TODO: This callback is triggered immediately, without the user actually | |
424 * changing anything. That's bad. | |
425 */ | |
10643 | 426 static void gtk_gaim_status_box_changed(GtkComboBox *box) |
427 { | |
428 GtkGaimStatusBox *status_box = GTK_GAIM_STATUS_BOX(box); | |
429 GtkTreeIter iter; | |
430 char *text, *sec_text; | |
431 GdkPixbuf *pixbuf; | |
432 gchar *status_type_id; | |
433 GList *l; | |
434 | |
435 gtk_combo_box_get_active_iter(GTK_COMBO_BOX(status_box), &iter); | |
436 gtk_tree_model_get(GTK_TREE_MODEL(status_box->dropdown_store), &iter, TITLE_COLUMN, &text, | |
437 DESC_COLUMN, &sec_text, ICON_COLUMN, &pixbuf, | |
438 TYPE_COLUMN, &status_type_id, -1); | |
439 if (status_box->title) | |
440 g_free(status_box->title); | |
441 status_box->title = g_strdup(text); | |
442 if (status_box->desc && sec_text) | |
443 g_free(status_box->desc); | |
444 status_box->desc = g_strdup(sec_text); | |
445 if (status_box->pixbuf) | |
446 g_object_unref(status_box->pixbuf); | |
447 status_box->pixbuf = pixbuf; | |
448 | |
449 if (!strcmp(status_type_id, "away")) { | |
450 gtk_widget_show_all(status_box->vbox); | |
451 status_box->typing = g_timeout_add(3000, (GSourceFunc)remove_typing_cb, status_box); | |
452 gtk_imhtml_clear(GTK_IMHTML(status_box->imhtml)); | |
453 gtk_widget_grab_focus(status_box->imhtml); | |
454 } else { | |
455 if (status_box->typing) { | |
456 g_source_remove(status_box->typing); | |
457 status_box->typing = 0; | |
458 } | |
459 gtk_widget_hide_all(status_box->vbox); | |
460 for (l = gaim_accounts_get_all(); l != NULL; l = l->next) { | |
461 GaimAccount *account = (GaimAccount*)l->data; | |
462 GaimStatusType *status_type; | |
463 | |
464 if (!gaim_account_get_enabled(account, GAIM_GTK_UI)) | |
465 continue; | |
466 | |
467 status_type = gaim_account_get_status_type(account, status_type_id); | |
468 | |
469 if (status_type == NULL) | |
470 continue; | |
471 gaim_account_set_status(account, status_type_id, TRUE, NULL); | |
472 } | |
473 } | |
474 gtk_gaim_status_box_refresh(status_box); | |
475 } | |
476 | |
477 static void imhtml_changed_cb(GtkTextBuffer *buffer, void *data) | |
478 { | |
479 GtkGaimStatusBox *box = (GtkGaimStatusBox*)data; | |
480 if (box->typing) { | |
481 gtk_gaim_status_box_pulse_typing(box); | |
482 g_source_remove(box->typing); | |
483 } | |
484 box->typing = g_timeout_add(3000, (GSourceFunc)remove_typing_cb, box); | |
485 gtk_gaim_status_box_refresh(box); | |
486 } | |
10649 | 487 |
488 const char *gtk_gaim_status_box_get_active_type(GtkGaimStatusBox *status_box) | |
489 { | |
490 GtkTreeIter iter; | |
491 char *type; | |
492 gtk_combo_box_get_active_iter(GTK_COMBO_BOX(status_box), &iter); | |
493 gtk_tree_model_get(GTK_TREE_MODEL(status_box->dropdown_store), &iter, | |
494 TYPE_COLUMN, &type, -1); | |
495 return type; | |
496 } | |
497 | |
498 const char *gtk_gaim_status_box_get_message(GtkGaimStatusBox *status_box) | |
499 { | |
500 if (status_box->imhtml_visible) | |
501 return gtk_imhtml_get_markup(GTK_IMHTML(status_box->imhtml)); | |
502 else | |
503 return NULL; | |
504 } |