Mercurial > pidgin.yaz
annotate src/gtkstatusbox.c @ 11485:16b0da1f376f
[gaim-migrate @ 13727]
Fix the /nick weirdness bug I introduced.
Also, patch 1283539, from Peter Lawler (two changes)
1. When in a chat where Gaim can tell which users are buddies (i.e. non-Jabber chats), only the names of buddies are bolded. I'm not sure if I'll like this, but I'm committing it so we can all try it out.
2. "remove bold, underline, and italics when we're ignoring formatting, as well"
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Fri, 09 Sep 2005 20:14:32 +0000 |
parents | 62db025d3eb0 |
children | 6f9fc83ee25c |
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 { | |
10861 | 60 static GType status_box_type = 0; |
10643 | 61 |
10861 | 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 }; | |
10643 | 76 |
10861 | 77 status_box_type = g_type_register_static(GTK_TYPE_COMBO_BOX, |
78 "GtkGaimStatusBox", | |
79 &status_box_info, | |
80 0); | |
81 } | |
10643 | 82 |
10861 | 83 return status_box_type; |
10643 | 84 } |
85 | |
86 static void | |
87 gtk_gaim_status_box_class_init (GtkGaimStatusBoxClass *klass) | |
88 { | |
10861 | 89 GObjectClass *object_class; |
90 GtkWidgetClass *widget_class; | |
91 GtkComboBoxClass *parent_class = (GtkComboBoxClass*)klass; | |
92 GtkContainerClass *container_class = (GtkContainerClass*)klass; | |
10643 | 93 |
10861 | 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; | |
10643 | 102 |
10861 | 103 combo_box_forall = container_class->forall; |
104 container_class->forall = gtk_gaim_status_box_forall; | |
105 | |
106 object_class = (GObjectClass *)klass; | |
10643 | 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>", | |
10861 | 129 title, status_box->error); |
10643 | 130 } else if (status_box->typing) { |
10861 | 131 text = g_strdup_printf("%s\n<span size=\"smaller\" color=\"%s\">%s</span>", |
132 title, aa_color, _("Typing")); | |
10643 | 133 } else if (status_box->connecting) { |
10861 | 134 text = g_strdup_printf("%s\n<span size=\"smaller\" color=\"%s\">%s</span>", |
135 title, aa_color, _("Connecting")); | |
136 } else if (status_box->desc) { | |
137 text = g_strdup_printf("%s\n<span size=\"smaller\" color=\"%s\">%s</span>", | |
138 title, aa_color, status_box->desc); | |
10643 | 139 } else { |
10672
0925c898b73c
[gaim-migrate @ 12212]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10661
diff
changeset
|
140 text = g_strdup_printf("%s", title); |
10643 | 141 } |
10861 | 142 |
143 if (status_box->error) | |
10643 | 144 pixbuf = status_box->error_pixbuf; |
145 else if (status_box->typing) | |
146 pixbuf = status_box->typing_pixbufs[status_box->typing_index]; | |
147 else if (status_box->connecting) | |
148 pixbuf = status_box->connecting_pixbufs[status_box->connecting_index]; | |
149 else | |
150 pixbuf = status_box->pixbuf; | |
151 | |
152 gtk_list_store_set(status_box->store, &(status_box->iter), | |
153 ICON_COLUMN, pixbuf, | |
10861 | 154 TEXT_COLUMN, text, |
10672
0925c898b73c
[gaim-migrate @ 12212]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10661
diff
changeset
|
155 TITLE_COLUMN, title, |
10861 | 156 DESC_COLUMN, status_box->desc, |
10643 | 157 TYPE_COLUMN, NULL, -1); |
10702 | 158 path = gtk_tree_path_new_from_string("0"); |
159 gtk_cell_view_set_displayed_row(GTK_CELL_VIEW(status_box->cell_view), path); | |
160 gtk_tree_path_free(path); | |
10643 | 161 |
162 g_free(text); | |
163 } | |
164 | |
165 static void | |
166 gtk_gaim_status_box_init (GtkGaimStatusBox *status_box) | |
167 { | |
11400 | 168 GtkCellRenderer *text_rend; |
169 GtkCellRenderer *icon_rend; | |
10643 | 170 GtkTextBuffer *buffer; |
171 GdkPixbuf *pixbuf, *pixbuf2, *pixbuf3, *pixbuf4; | |
11400 | 172 GtkIconSize icon_size; |
173 | |
174 text_rend = gtk_cell_renderer_text_new(); | |
175 icon_rend = gtk_cell_renderer_pixbuf_new(); | |
176 icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS); | |
10643 | 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; | |
10861 | 182 status_box->connecting_pixbufs[0] = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_CONNECT0, |
10643 | 183 icon_size, "GtkGaimStatusBox"); |
10861 | 184 status_box->connecting_pixbufs[1] = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_CONNECT1, |
10643 | 185 icon_size, "GtkGaimStatusBox"); |
10861 | 186 status_box->connecting_pixbufs[2] = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_CONNECT2, |
10643 | 187 icon_size, "GtkGaimStatusBox"); |
10861 | 188 status_box->connecting_pixbufs[3] = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_CONNECT3, |
10643 | 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; | |
10861 | 203 status_box->pixbuf = NULL; |
10643 | 204 status_box->cell_view = gtk_cell_view_new(); |
205 gtk_widget_show (status_box->cell_view); | |
10861 | 206 |
10643 | 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); | |
10861 | 216 |
10643 | 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); | |
10861 | 221 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box), text_rend, TRUE); |
10643 | 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"); | |
11306 | 254 /* |
255 * TODO: This triggers a callback of gaim_gtk_status_box_changed(). | |
256 * That's bad. We should at least try not figure out what | |
257 * status the user's accounts are set to instead of always | |
258 * using "Available." | |
259 */ | |
11347 | 260 /* gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), 0); */ |
10643 | 261 |
262 } | |
263 | |
264 | |
265 static void | |
10861 | 266 gtk_gaim_status_box_size_request(GtkWidget *widget, |
267 GtkRequisition *requisition) | |
10643 | 268 { |
269 GtkRequisition box_req; | |
270 combo_box_size_request(widget, requisition); | |
10861 | 271 |
10643 | 272 gtk_widget_size_request(GTK_GAIM_STATUS_BOX(widget)->vbox, &box_req); |
273 if (box_req.height > 1) | |
274 requisition->height = requisition->height + box_req.height + 6; | |
10861 | 275 |
10643 | 276 requisition->width = 1; |
277 | |
278 } | |
279 | |
280 static void | |
10861 | 281 gtk_gaim_status_box_size_allocate(GtkWidget *widget, |
282 GtkAllocation *allocation) | |
10643 | 283 { |
284 GtkRequisition req = {0,0}; | |
11400 | 285 GtkAllocation parent_alc, box_alc; |
286 | |
287 parent_alc = *allocation; | |
288 box_alc = *allocation; | |
10643 | 289 combo_box_size_request(widget, &req); |
10861 | 290 |
10643 | 291 /* EVIL XXX */ |
10861 | 292 box_alc.height = 80; |
293 /* box_alc.height = MAX(1,box_alc.height - req.height - 6); */ | |
294 | |
10643 | 295 box_alc.y = box_alc.y + req.height + 6; |
296 gtk_widget_size_allocate((GTK_GAIM_STATUS_BOX(widget))->vbox, &box_alc); | |
10861 | 297 |
10643 | 298 parent_alc.height = MAX(1,req.height); |
299 combo_box_size_allocate(widget, &parent_alc); | |
300 widget->allocation = *allocation; | |
301 } | |
302 | |
303 | |
304 static gboolean | |
10861 | 305 gtk_gaim_status_box_expose_event(GtkWidget *widget, |
306 GdkEventExpose *event) | |
10643 | 307 { |
10861 | 308 GtkGaimStatusBox *status_box = GTK_GAIM_STATUS_BOX(widget); |
309 combo_box_expose_event(widget, event); | |
10643 | 310 |
10861 | 311 gtk_container_propagate_expose(GTK_CONTAINER(widget), |
312 status_box->vbox, event); | |
313 return FALSE; | |
10643 | 314 } |
315 | |
316 static void | |
10861 | 317 gtk_gaim_status_box_forall(GtkContainer *container, |
318 gboolean include_internals, | |
319 GtkCallback callback, | |
320 gpointer callback_data) | |
10643 | 321 { |
10861 | 322 GtkGaimStatusBox *status_box = GTK_GAIM_STATUS_BOX (container); |
10643 | 323 |
10861 | 324 if (include_internals) |
325 { | |
326 (* callback) (status_box->vbox, callback_data); | |
327 } | |
10643 | 328 |
10861 | 329 combo_box_forall(container, include_internals, callback, callback_data); |
10643 | 330 } |
331 | |
332 GtkWidget * | |
333 gtk_gaim_status_box_new() | |
334 { | |
335 return g_object_new(GTK_GAIM_TYPE_STATUS_BOX, NULL); | |
336 } | |
337 | |
338 | |
339 void | |
340 gtk_gaim_status_box_add(GtkGaimStatusBox *status_box, GdkPixbuf *pixbuf, const char *text, const char *sec_text, char *edit) | |
341 { | |
342 GtkTreeIter iter; | |
343 char *t; | |
10861 | 344 |
10643 | 345 if (sec_text) { |
346 char aa_color[8]; | |
347 GtkStyle *style = gtk_widget_get_style(GTK_WIDGET(status_box)); | |
348 snprintf(aa_color, sizeof(aa_color), "#%02x%02x%02x", | |
349 style->text_aa[GTK_STATE_NORMAL].red >> 8, | |
350 style->text_aa[GTK_STATE_NORMAL].green >> 8, | |
10861 | 351 style->text_aa[GTK_STATE_NORMAL].blue >> 8); |
10643 | 352 t = g_strdup_printf("%s\n<span color=\"%s\">%s</span>", text, aa_color, sec_text); |
353 } else { | |
354 t = g_strdup(text); | |
355 } | |
10861 | 356 |
10643 | 357 gtk_list_store_append(status_box->dropdown_store, &iter); |
358 gtk_list_store_set(status_box->dropdown_store, &iter, | |
359 ICON_COLUMN, pixbuf, | |
10861 | 360 TEXT_COLUMN, t, |
10643 | 361 TITLE_COLUMN, text, |
10861 | 362 DESC_COLUMN, sec_text, |
10643 | 363 TYPE_COLUMN, edit, -1); |
364 } | |
365 | |
366 void | |
367 gtk_gaim_status_box_set_error(GtkGaimStatusBox *status_box, const gchar *error) | |
368 { | |
369 status_box->error = g_strdup(error); | |
370 gtk_gaim_status_box_refresh(status_box); | |
371 } | |
372 | |
373 void | |
374 gtk_gaim_status_box_set_connecting(GtkGaimStatusBox *status_box, gboolean connecting) | |
375 { | |
376 if (!status_box) | |
377 return; | |
378 status_box->connecting = connecting; | |
379 gtk_gaim_status_box_refresh(status_box); | |
380 } | |
381 | |
382 void | |
383 gtk_gaim_status_box_pulse_connecting(GtkGaimStatusBox *status_box) | |
384 { | |
385 if (!status_box) | |
386 return; | |
387 if (status_box->connecting_index == 3) | |
388 status_box->connecting_index = 0; | |
10861 | 389 else |
10643 | 390 status_box->connecting_index++; |
391 gtk_gaim_status_box_refresh(status_box); | |
392 } | |
393 | |
394 void | |
395 gtk_gaim_status_box_pulse_typing(GtkGaimStatusBox *status_box) | |
396 { | |
397 if (status_box->typing_index == 3) | |
398 status_box->typing_index = 0; | |
10861 | 399 else |
10643 | 400 status_box->typing_index++; |
401 gtk_gaim_status_box_refresh(status_box); | |
402 } | |
403 | |
404 static void remove_typing_cb(GtkGaimStatusBox *box) | |
405 { | |
406 gchar *status_type_id; | |
407 GList *l; | |
408 GtkTreeIter iter; | |
409 | |
410 gtk_combo_box_get_active_iter(GTK_COMBO_BOX(box), &iter); | |
411 gtk_tree_model_get(GTK_TREE_MODEL(box->dropdown_store), &iter, TYPE_COLUMN, &status_type_id, -1); | |
412 for (l = gaim_accounts_get_all(); l != NULL; l = l->next) { | |
413 GaimAccount *account = (GaimAccount*)l->data; | |
414 GaimStatusType *status_type; | |
10861 | 415 |
10643 | 416 if (!gaim_account_get_enabled(account, GAIM_GTK_UI)) |
417 continue; | |
418 | |
419 status_type = gaim_account_get_status_type(account, status_type_id); | |
420 | |
421 if (status_type == NULL) | |
422 continue; | |
10861 | 423 gaim_account_set_status(account, status_type_id, TRUE, |
10643 | 424 "message",gtk_imhtml_get_markup(GTK_IMHTML(box->imhtml)), NULL); |
425 } | |
426 g_source_remove(box->typing); | |
427 box->typing = 0; | |
428 gtk_gaim_status_box_refresh(box); | |
429 } | |
430 | |
431 static void gtk_gaim_status_box_changed(GtkComboBox *box) | |
432 { | |
11400 | 433 GtkGaimStatusBox *status_box; |
10643 | 434 GtkTreeIter iter; |
435 char *text, *sec_text; | |
436 GdkPixbuf *pixbuf; | |
437 gchar *status_type_id; | |
438 GList *l; | |
439 | |
11400 | 440 status_box = GTK_GAIM_STATUS_BOX(box); |
441 | |
10643 | 442 gtk_combo_box_get_active_iter(GTK_COMBO_BOX(status_box), &iter); |
443 gtk_tree_model_get(GTK_TREE_MODEL(status_box->dropdown_store), &iter, TITLE_COLUMN, &text, | |
10861 | 444 DESC_COLUMN, &sec_text, ICON_COLUMN, &pixbuf, |
10643 | 445 TYPE_COLUMN, &status_type_id, -1); |
446 if (status_box->title) | |
447 g_free(status_box->title); | |
448 status_box->title = g_strdup(text); | |
449 if (status_box->desc && sec_text) | |
10861 | 450 g_free(status_box->desc); |
10643 | 451 status_box->desc = g_strdup(sec_text); |
452 if (status_box->pixbuf) | |
453 g_object_unref(status_box->pixbuf); | |
454 status_box->pixbuf = pixbuf; | |
10861 | 455 |
10643 | 456 if (!strcmp(status_type_id, "away")) { |
457 gtk_widget_show_all(status_box->vbox); | |
458 status_box->typing = g_timeout_add(3000, (GSourceFunc)remove_typing_cb, status_box); | |
459 gtk_imhtml_clear(GTK_IMHTML(status_box->imhtml)); | |
460 gtk_widget_grab_focus(status_box->imhtml); | |
461 } else { | |
462 if (status_box->typing) { | |
463 g_source_remove(status_box->typing); | |
464 status_box->typing = 0; | |
465 } | |
466 gtk_widget_hide_all(status_box->vbox); | |
467 for (l = gaim_accounts_get_all(); l != NULL; l = l->next) { | |
468 GaimAccount *account = (GaimAccount*)l->data; | |
469 GaimStatusType *status_type; | |
470 | |
471 if (!gaim_account_get_enabled(account, GAIM_GTK_UI)) | |
472 continue; | |
473 | |
474 status_type = gaim_account_get_status_type(account, status_type_id); | |
475 | |
476 if (status_type == NULL) | |
477 continue; | |
478 gaim_account_set_status(account, status_type_id, TRUE, NULL); | |
479 } | |
480 } | |
481 gtk_gaim_status_box_refresh(status_box); | |
482 } | |
483 | |
484 static void imhtml_changed_cb(GtkTextBuffer *buffer, void *data) | |
485 { | |
486 GtkGaimStatusBox *box = (GtkGaimStatusBox*)data; | |
487 if (box->typing) { | |
488 gtk_gaim_status_box_pulse_typing(box); | |
489 g_source_remove(box->typing); | |
10861 | 490 } |
10643 | 491 box->typing = g_timeout_add(3000, (GSourceFunc)remove_typing_cb, box); |
492 gtk_gaim_status_box_refresh(box); | |
493 } | |
10649 | 494 |
495 const char *gtk_gaim_status_box_get_active_type(GtkGaimStatusBox *status_box) | |
496 { | |
497 GtkTreeIter iter; | |
498 char *type; | |
499 gtk_combo_box_get_active_iter(GTK_COMBO_BOX(status_box), &iter); | |
10861 | 500 gtk_tree_model_get(GTK_TREE_MODEL(status_box->dropdown_store), &iter, |
10649 | 501 TYPE_COLUMN, &type, -1); |
502 return type; | |
503 } | |
504 | |
505 const char *gtk_gaim_status_box_get_message(GtkGaimStatusBox *status_box) | |
506 { | |
507 if (status_box->imhtml_visible) | |
508 return gtk_imhtml_get_markup(GTK_IMHTML(status_box->imhtml)); | |
509 else | |
510 return NULL; | |
511 } |