Mercurial > pidgin.yaz
annotate src/gtkstatusbox.c @ 13280:3de53fe8345f
[gaim-migrate @ 15646]
Always show a vertical scrollbar on conversations imhtmls. This will solve the shrinking conversation window bug. I chose this approach instead of saving the size of the window (as I had previous talked about), as this prevents the contents of the scrollback from rewrapping when the scrollbars appear or disappear. It also just seems to feel like the right thing to do, but maybe that's me being lazy.
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Tue, 14 Feb 2006 05:43:43 +0000 |
parents | c97c76d9d347 |
children | 4dcd0fba99a9 |
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 | |
13044 | 26 /* |
27 * The status box is made up of two main pieces: | |
28 * - The box that displays the current status, which is made | |
29 * of a GtkListStore ("status_box->store") and GtkCellView | |
30 * ("status_box->cell_view"). There is always exactly 1 row | |
31 * in this list store. Only the TYPE_ICON and TYPE_TEXT | |
32 * columns are used in this list store. | |
33 * - The dropdown menu that lets users select a status, which | |
34 * is made of a GtkComboBox ("status_box") and GtkListStore | |
35 * ("status_box->dropdown_store"). This dropdown is shown | |
36 * when the user clicks on the box that displays the current | |
37 * status. This list store contains one row for Available, | |
38 * one row for Away, etc., a few rows for popular statuses, | |
39 * and the "New..." and "Saved..." options. | |
40 */ | |
41 | |
12274 | 42 #include <gdk/gdkkeysyms.h> |
43 | |
11627 | 44 #include "account.h" |
10643 | 45 #include "internal.h" |
11627 | 46 #include "savedstatuses.h" |
10643 | 47 #include "status.h" |
11732 | 48 #include "debug.h" |
11627 | 49 |
10643 | 50 #include "gtkgaim.h" |
11729 | 51 #include "gtksavedstatuses.h" |
10643 | 52 #include "gtkstock.h" |
53 #include "gtkstatusbox.h" | |
12080 | 54 #include "gtkutils.h" |
10643 | 55 |
12651 | 56 #ifdef USE_GTKSPELL |
57 # include <gtkspell/gtkspell.h> | |
58 # ifdef _WIN32 | |
59 # include "wspell.h" | |
60 # endif | |
61 #endif | |
62 | |
12309 | 63 #define TYPING_TIMEOUT 4000 |
64 | |
10643 | 65 static void imhtml_changed_cb(GtkTextBuffer *buffer, void *data); |
12460
3d999a4d4892
[gaim-migrate @ 14770]
Richard Laager <rlaager@wiktel.com>
parents:
12379
diff
changeset
|
66 static void imhtml_format_changed_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, void *data); |
11562 | 67 static void remove_typing_cb(GtkGaimStatusBox *box); |
12597
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
68 static void update_size (GtkGaimStatusBox *box); |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
69 static gint get_statusbox_index(GtkGaimStatusBox *box, GaimSavedStatus *saved_status); |
10643 | 70 |
12274 | 71 static void gtk_gaim_status_box_pulse_typing(GtkGaimStatusBox *status_box); |
11967 | 72 static void gtk_gaim_status_box_refresh(GtkGaimStatusBox *status_box); |
11732 | 73 static void gtk_gaim_status_box_regenerate(GtkGaimStatusBox *status_box); |
10643 | 74 static void gtk_gaim_status_box_changed(GtkComboBox *box); |
75 static void gtk_gaim_status_box_size_request (GtkWidget *widget, GtkRequisition *requisition); | |
76 static void gtk_gaim_status_box_size_allocate (GtkWidget *widget, GtkAllocation *allocation); | |
77 static gboolean gtk_gaim_status_box_expose_event (GtkWidget *widget, GdkEventExpose *event); | |
78 static void gtk_gaim_status_box_forall (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data); | |
79 | |
80 static void (*combo_box_size_request)(GtkWidget *widget, GtkRequisition *requisition); | |
81 static void (*combo_box_size_allocate)(GtkWidget *widget, GtkAllocation *allocation); | |
82 static void (*combo_box_forall) (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data); | |
11739 | 83 |
10643 | 84 enum { |
13044 | 85 /** A GtkGaimStatusBoxItemType */ |
86 TYPE_COLUMN, | |
87 | |
88 /** | |
89 * This is a GdkPixbuf (the other columns are strings). | |
90 * This column is visible. | |
91 */ | |
92 ICON_COLUMN, | |
93 | |
94 /** The text displayed on the status box. This column is visible. */ | |
95 TEXT_COLUMN, | |
96 | |
97 /** The plain-English title of this item */ | |
98 TITLE_COLUMN, | |
99 | |
100 /** A plain-English description of this item */ | |
101 DESC_COLUMN, | |
102 | |
103 /* | |
104 * This value depends on TYPE_COLUMN. For POPULAR types, | |
105 * this is the creation time. For PRIMITIVE types, | |
106 * this is the GaimStatusPrimitive. | |
107 */ | |
108 DATA_COLUMN, | |
109 | |
10643 | 110 NUM_COLUMNS |
111 }; | |
112 | |
11499 | 113 enum { |
114 PROP_0, | |
115 PROP_ACCOUNT | |
116 }; | |
117 | |
12379
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
118 GtkComboBoxClass *parent_class = NULL; |
12651 | 119 |
10643 | 120 static void gtk_gaim_status_box_class_init (GtkGaimStatusBoxClass *klass); |
121 static void gtk_gaim_status_box_init (GtkGaimStatusBox *status_box); | |
122 | |
123 GType | |
124 gtk_gaim_status_box_get_type (void) | |
125 { | |
10861 | 126 static GType status_box_type = 0; |
10643 | 127 |
10861 | 128 if (!status_box_type) |
129 { | |
130 static const GTypeInfo status_box_info = | |
131 { | |
132 sizeof (GtkGaimStatusBoxClass), | |
133 NULL, /* base_init */ | |
134 NULL, /* base_finalize */ | |
135 (GClassInitFunc) gtk_gaim_status_box_class_init, | |
136 NULL, /* class_finalize */ | |
137 NULL, /* class_data */ | |
138 sizeof (GtkGaimStatusBox), | |
139 0, | |
12221
152748df85cf
[gaim-migrate @ 14523]
Richard Laager <rlaager@wiktel.com>
parents:
12125
diff
changeset
|
140 (GInstanceInitFunc) gtk_gaim_status_box_init, |
152748df85cf
[gaim-migrate @ 14523]
Richard Laager <rlaager@wiktel.com>
parents:
12125
diff
changeset
|
141 NULL /* value_table */ |
10861 | 142 }; |
10643 | 143 |
10861 | 144 status_box_type = g_type_register_static(GTK_TYPE_COMBO_BOX, |
145 "GtkGaimStatusBox", | |
146 &status_box_info, | |
147 0); | |
148 } | |
10643 | 149 |
10861 | 150 return status_box_type; |
10643 | 151 } |
152 | |
153 static void | |
11499 | 154 gtk_gaim_status_box_get_property(GObject *object, guint param_id, |
155 GValue *value, GParamSpec *psec) | |
156 { | |
157 GtkGaimStatusBox *statusbox = GTK_GAIM_STATUS_BOX(object); | |
158 | |
159 switch (param_id) { | |
160 case PROP_ACCOUNT: | |
161 g_value_set_pointer(value, statusbox->account); | |
162 break; | |
163 default: | |
164 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, psec); | |
165 break; | |
166 } | |
167 } | |
168 | |
169 static void | |
11967 | 170 update_to_reflect_account_status(GtkGaimStatusBox *status_box, GaimAccount *account, GaimStatus *newstatus) |
11960 | 171 { |
11967 | 172 const GList *l; |
173 int status_no = -1; | |
174 const GaimStatusType *statustype = NULL; | |
12060 | 175 const char *message; |
11967 | 176 |
177 statustype = gaim_status_type_find_with_id((GList *)gaim_account_get_status_types(account), | |
178 (char *)gaim_status_type_get_id(gaim_status_get_type(newstatus))); | |
179 | |
180 for (l = gaim_account_get_status_types(account); l != NULL; l = l->next) { | |
181 GaimStatusType *status_type = (GaimStatusType *)l->data; | |
182 | |
183 if (!gaim_status_type_is_user_settable(status_type)) | |
184 continue; | |
185 status_no++; | |
186 if (statustype == status_type) | |
187 break; | |
188 } | |
189 | |
190 if (status_no != -1) { | |
191 gtk_widget_set_sensitive(GTK_WIDGET(status_box), FALSE); | |
192 gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), status_no); | |
12286
255e6912607b
[gaim-migrate @ 14590]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12275
diff
changeset
|
193 |
12060 | 194 message = gaim_status_get_attr_string(newstatus, "message"); |
195 | |
196 if (!message || !*message) | |
197 { | |
198 gtk_widget_hide_all(status_box->vbox); | |
199 status_box->imhtml_visible = FALSE; | |
200 } | |
201 else | |
202 { | |
203 gtk_widget_show_all(status_box->vbox); | |
204 status_box->imhtml_visible = TRUE; | |
205 gtk_imhtml_clear(GTK_IMHTML(status_box->imhtml)); | |
12274 | 206 gtk_imhtml_clear_formatting(GTK_IMHTML(status_box->imhtml)); |
12060 | 207 gtk_imhtml_append_text(GTK_IMHTML(status_box->imhtml), message, 0); |
208 } | |
11967 | 209 gtk_widget_set_sensitive(GTK_WIDGET(status_box), TRUE); |
12274 | 210 gtk_gaim_status_box_refresh(status_box); |
11967 | 211 } |
212 } | |
213 | |
214 static void | |
215 account_status_changed_cb(GaimAccount *account, GaimStatus *oldstatus, GaimStatus *newstatus, GtkGaimStatusBox *status_box) | |
216 { | |
217 if (status_box->account == account) | |
218 update_to_reflect_account_status(status_box, account, newstatus); | |
11960 | 219 } |
220 | |
221 static void | |
11499 | 222 gtk_gaim_status_box_set_property(GObject *object, guint param_id, |
223 const GValue *value, GParamSpec *pspec) | |
224 { | |
225 GtkGaimStatusBox *statusbox = GTK_GAIM_STATUS_BOX(object); | |
226 | |
227 switch (param_id) { | |
228 case PROP_ACCOUNT: | |
229 statusbox->account = g_value_get_pointer(value); | |
11960 | 230 |
11967 | 231 if (statusbox->status_changed_signal) { |
232 gaim_signal_disconnect(gaim_accounts_get_handle(), "account-status-changed", | |
233 statusbox, GAIM_CALLBACK(account_status_changed_cb)); | |
234 statusbox->status_changed_signal = 0; | |
235 } | |
12286
255e6912607b
[gaim-migrate @ 14590]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12275
diff
changeset
|
236 |
11960 | 237 if (statusbox->account) |
11967 | 238 statusbox->status_changed_signal = gaim_signal_connect(gaim_accounts_get_handle(), "account-status-changed", |
11960 | 239 statusbox, GAIM_CALLBACK(account_status_changed_cb), |
240 statusbox); | |
11732 | 241 gtk_gaim_status_box_regenerate(statusbox); |
12256 | 242 |
11499 | 243 break; |
244 default: | |
245 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec); | |
246 break; | |
247 } | |
248 } | |
249 | |
250 static void | |
12379
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
251 gtk_gaim_status_box_finalize(GObject *obj) |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
252 { |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
253 GtkGaimStatusBox *statusbox = GTK_GAIM_STATUS_BOX(obj); |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
254 |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
255 if (statusbox->status_changed_signal) { |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
256 gaim_signal_disconnect(gaim_accounts_get_handle(), "account-status-changed", |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
257 statusbox, GAIM_CALLBACK(account_status_changed_cb)); |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
258 statusbox->status_changed_signal = 0; |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
259 } |
12651 | 260 gaim_prefs_disconnect_by_handle(statusbox); |
12379
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
261 |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
262 G_OBJECT_CLASS(parent_class)->finalize(obj); |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
263 } |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
264 |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
265 static void |
10643 | 266 gtk_gaim_status_box_class_init (GtkGaimStatusBoxClass *klass) |
267 { | |
10861 | 268 GObjectClass *object_class; |
12379
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
269 GtkComboBoxClass *combo_class; |
10861 | 270 GtkWidgetClass *widget_class; |
271 GtkContainerClass *container_class = (GtkContainerClass*)klass; | |
10643 | 272 |
12379
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
273 parent_class = g_type_class_peek_parent(klass); |
12651 | 274 |
12379
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
275 combo_class = (GtkComboBoxClass*)klass; |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
276 combo_class->changed = gtk_gaim_status_box_changed; |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
277 |
10861 | 278 widget_class = (GtkWidgetClass*)klass; |
279 combo_box_size_request = widget_class->size_request; | |
280 widget_class->size_request = gtk_gaim_status_box_size_request; | |
281 combo_box_size_allocate = widget_class->size_allocate; | |
282 widget_class->size_allocate = gtk_gaim_status_box_size_allocate; | |
283 widget_class->expose_event = gtk_gaim_status_box_expose_event; | |
10643 | 284 |
10861 | 285 combo_box_forall = container_class->forall; |
286 container_class->forall = gtk_gaim_status_box_forall; | |
287 | |
288 object_class = (GObjectClass *)klass; | |
11499 | 289 |
12379
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
290 object_class->finalize = gtk_gaim_status_box_finalize; |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
291 |
11499 | 292 object_class->get_property = gtk_gaim_status_box_get_property; |
293 object_class->set_property = gtk_gaim_status_box_set_property; | |
294 | |
295 g_object_class_install_property(object_class, | |
296 PROP_ACCOUNT, | |
297 g_param_spec_pointer("account", | |
298 "Account", | |
299 "The account, or NULL for all accounts", | |
300 G_PARAM_READWRITE | |
301 ) | |
302 ); | |
10643 | 303 } |
304 | |
13044 | 305 /** |
306 * This updates the text displayed on the status box so that it shows | |
13123 | 307 * the current status. This is the only function in this file that |
308 * should modify status_box->store | |
13044 | 309 */ |
10643 | 310 static void |
311 gtk_gaim_status_box_refresh(GtkGaimStatusBox *status_box) | |
312 { | |
13124 | 313 gboolean show_buddy_icons; |
314 GtkIconSize icon_size; | |
315 GtkStyle *style; | |
316 char aa_color[8]; | |
317 GaimSavedStatus *saved_status; | |
13123 | 318 char *primary, *secondary, *text; |
10643 | 319 GdkPixbuf *pixbuf; |
10702 | 320 GtkTreePath *path; |
10643 | 321 |
13121 | 322 show_buddy_icons = gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons"); |
13124 | 323 if (show_buddy_icons) |
324 icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS); | |
325 else | |
326 icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS_SMALL); | |
327 | |
11870 | 328 style = gtk_widget_get_style(GTK_WIDGET(status_box)); |
10643 | 329 snprintf(aa_color, sizeof(aa_color), "#%02x%02x%02x", |
330 style->text_aa[GTK_STATE_NORMAL].red >> 8, | |
331 style->text_aa[GTK_STATE_NORMAL].green >> 8, | |
332 style->text_aa[GTK_STATE_NORMAL].blue >> 8); | |
10672
0925c898b73c
[gaim-migrate @ 12212]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10661
diff
changeset
|
333 |
13121 | 334 saved_status = gaim_savedstatus_get_current(); |
335 | |
13124 | 336 /* Primary */ |
13123 | 337 if (status_box->typing != 0) |
338 { | |
339 GtkTreeIter iter; | |
340 GtkGaimStatusBoxItemType type; | |
341 gpointer data; | |
342 | |
343 /* Primary (get the status selected in the dropdown) */ | |
344 gtk_combo_box_get_active_iter(GTK_COMBO_BOX(status_box), &iter); | |
345 gtk_tree_model_get(GTK_TREE_MODEL(status_box->dropdown_store), &iter, | |
346 TYPE_COLUMN, &type, | |
347 DATA_COLUMN, &data, | |
348 -1); | |
349 if (type == GTK_GAIM_STATUS_BOX_TYPE_PRIMITIVE) | |
13124 | 350 primary = g_strdup(gaim_primitive_get_name_from_type(GPOINTER_TO_INT(data))); |
13123 | 351 else |
13124 | 352 /* This should never happen, but just in case... */ |
353 primary = g_strdup("New status"); | |
354 } | |
355 else if (gaim_savedstatus_is_transient(saved_status)) | |
356 primary = g_strdup(gaim_primitive_get_name_from_type(gaim_savedstatus_get_type(saved_status))); | |
357 else | |
358 primary = g_markup_escape_text(gaim_savedstatus_get_title(saved_status), -1); | |
13123 | 359 |
13124 | 360 /* Secondary */ |
361 if (status_box->typing != 0) | |
13123 | 362 secondary = g_strdup(_("Typing")); |
363 else if (status_box->connecting) | |
364 secondary = g_strdup(_("Connecting")); | |
13124 | 365 else if (gaim_savedstatus_is_transient(saved_status)) |
366 secondary = NULL; | |
13123 | 367 else |
368 { | |
13124 | 369 const char *message; |
370 char *tmp; | |
371 message = gaim_savedstatus_get_message(saved_status); | |
372 if (message != NULL) | |
13123 | 373 { |
13124 | 374 tmp = gaim_markup_strip_html(message); |
375 gaim_util_chrreplace(tmp, '\n', ' '); | |
376 secondary = g_markup_escape_text(tmp, -1); | |
377 g_free(tmp); | |
13123 | 378 } |
379 else | |
13124 | 380 secondary = NULL; |
381 } | |
13123 | 382 |
13124 | 383 /* Pixbuf */ |
384 if (status_box->typing != 0) | |
385 pixbuf = status_box->typing_pixbufs[status_box->typing_index]; | |
386 else if (status_box->connecting) | |
387 pixbuf = status_box->connecting_pixbufs[status_box->connecting_index]; | |
388 else | |
389 { | |
13123 | 390 pixbuf = gaim_gtk_create_gaim_icon_with_status( |
391 gaim_savedstatus_get_type(saved_status), | |
392 show_buddy_icons ? 1.0 : 0.5); | |
13124 | 393 |
394 if (!gaim_savedstatus_is_transient(saved_status)) | |
395 { | |
396 GdkPixbuf *emblem; | |
397 | |
398 /* Overlay a disk in the bottom left corner */ | |
399 emblem = gtk_widget_render_icon(GTK_WIDGET(status_box->vbox), | |
400 GTK_STOCK_SAVE, icon_size, "GtkGaimStatusBox"); | |
401 if (emblem != NULL) | |
402 { | |
403 int width, height; | |
404 width = gdk_pixbuf_get_width(pixbuf) / 2; | |
405 height = gdk_pixbuf_get_height(pixbuf) / 2; | |
406 gdk_pixbuf_composite(emblem, pixbuf, 0, height, | |
407 width, height, 0, height, | |
408 0.5, 0.5, GDK_INTERP_BILINEAR, 255); | |
409 g_object_unref(G_OBJECT(emblem)); | |
410 } | |
411 } | |
10643 | 412 } |
10861 | 413 |
13121 | 414 if (status_box->account != NULL) { |
13123 | 415 text = g_strdup_printf("%s\n<span size=\"smaller\">%s</span>", |
12228 | 416 gaim_account_get_username(status_box->account), |
13123 | 417 secondary ? secondary : primary); |
418 } else if (secondary != NULL) { | |
13121 | 419 char *separator; |
420 separator = show_buddy_icons ? "\n" : " - "; | |
13123 | 421 text = g_strdup_printf("%s<span size=\"smaller\" color=\"%s\">%s%s</span>", |
422 primary, aa_color, separator, secondary); | |
12228 | 423 } else { |
13123 | 424 text = g_strdup(primary); |
11960 | 425 } |
13123 | 426 g_free(primary); |
427 g_free(secondary); | |
10643 | 428 |
13044 | 429 /* |
430 * Only two columns are used in this list store (does it | |
431 * really need to be a list store?) | |
432 */ | |
10643 | 433 gtk_list_store_set(status_box->store, &(status_box->iter), |
434 ICON_COLUMN, pixbuf, | |
10861 | 435 TEXT_COLUMN, text, |
11739 | 436 -1); |
13124 | 437 if ((status_box->typing == 0) && (!status_box->connecting)) |
438 g_object_unref(pixbuf); | |
13123 | 439 g_free(text); |
440 | |
441 /* Make sure to activate the only row in the tree view */ | |
10702 | 442 path = gtk_tree_path_new_from_string("0"); |
443 gtk_cell_view_set_displayed_row(GTK_CELL_VIEW(status_box->cell_view), path); | |
444 gtk_tree_path_free(path); | |
10643 | 445 |
12597
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
446 update_size(status_box); |
10643 | 447 } |
448 | |
11870 | 449 /** |
450 * This updates the GtkTreeView so that it correctly shows the state | |
451 * we are currently using. It is used when the current state is | |
452 * updated from somewhere other than the GtkStatusBox (from a plugin, | |
453 * or when signing on with the "-n" option, for example). It is | |
13025 | 454 * also used when the user selects the "New..." option. |
11870 | 455 * |
456 * Maybe we could accomplish this by triggering off the mouse and | |
457 * keyboard signals instead of the changed signal? | |
458 */ | |
459 static void | |
13124 | 460 status_menu_refresh_iter(GtkGaimStatusBox *status_box) |
11870 | 461 { |
462 GaimSavedStatus *saved_status; | |
13050 | 463 GaimStatusPrimitive primitive; |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
464 gint index; |
12125 | 465 const char *message; |
11870 | 466 |
11983 | 467 /* this function is inappropriate for ones with accounts */ |
468 if (status_box->account) | |
469 return; | |
470 | |
12125 | 471 saved_status = gaim_savedstatus_get_current(); |
11951 | 472 |
473 /* | |
474 * Suppress the "changed" signal because the status | |
475 * was changed programmatically. | |
476 */ | |
477 gtk_widget_set_sensitive(GTK_WIDGET(status_box), FALSE); | |
478 | |
13050 | 479 /* |
480 * If the saved_status is transient, is Available, Away, Invisible | |
481 * or Offline, and it does not have an substatuses, then select | |
482 * the primitive in the dropdown menu. Otherwise select the | |
483 * popular status in the dropdown menu. | |
484 */ | |
485 primitive = gaim_savedstatus_get_type(saved_status); | |
486 if (gaim_savedstatus_is_transient(saved_status) && | |
487 ((primitive == GAIM_STATUS_AVAILABLE) || (primitive == GAIM_STATUS_AWAY) || | |
488 (primitive == GAIM_STATUS_INVISIBLE) || (primitive == GAIM_STATUS_OFFLINE)) && | |
489 (!gaim_savedstatus_has_substatuses(saved_status))) | |
490 { | |
491 index = get_statusbox_index(status_box, saved_status); | |
13066 | 492 gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), index); |
13050 | 493 } |
11870 | 494 else |
495 { | |
13066 | 496 GtkTreeIter iter; |
13111 | 497 GtkGaimStatusBoxItemType type; |
498 gpointer data; | |
13066 | 499 |
500 /* Unset the active item */ | |
501 gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), -1); | |
502 | |
503 /* If this saved status is in the list store, then set it as the active item */ | |
504 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(status_box->dropdown_store), &iter)) | |
505 { | |
506 do | |
507 { | |
508 gtk_tree_model_get(GTK_TREE_MODEL(status_box->dropdown_store), &iter, | |
13111 | 509 TYPE_COLUMN, &type, |
13066 | 510 DATA_COLUMN, &data, |
511 -1); | |
13111 | 512 if ((type == GTK_GAIM_STATUS_BOX_TYPE_POPULAR) && |
513 (GPOINTER_TO_INT(data) == gaim_savedstatus_get_creation_time(saved_status))) | |
13066 | 514 { |
515 /* Found! */ | |
516 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(status_box), &iter); | |
517 break; | |
518 } | |
519 } | |
520 while (gtk_tree_model_iter_next(GTK_TREE_MODEL(status_box->dropdown_store), &iter)); | |
521 } | |
12125 | 522 } |
13050 | 523 |
12125 | 524 message = gaim_savedstatus_get_message(saved_status); |
13050 | 525 if (!gaim_savedstatus_is_transient(saved_status) || !message || !*message) |
12125 | 526 { |
527 status_box->imhtml_visible = FALSE; | |
528 gtk_widget_hide_all(status_box->vbox); | |
529 } | |
530 else | |
531 { | |
532 status_box->imhtml_visible = TRUE; | |
533 gtk_widget_show_all(status_box->vbox); | |
11870 | 534 |
12125 | 535 /* |
536 * Suppress the "changed" signal because the status | |
537 * was changed programmatically. | |
538 */ | |
539 gtk_widget_set_sensitive(GTK_WIDGET(status_box->imhtml), FALSE); | |
11954 | 540 |
12125 | 541 gtk_imhtml_clear(GTK_IMHTML(status_box->imhtml)); |
12274 | 542 gtk_imhtml_clear_formatting(GTK_IMHTML(status_box->imhtml)); |
12125 | 543 gtk_imhtml_append_text(GTK_IMHTML(status_box->imhtml), message, 0); |
544 gtk_widget_set_sensitive(GTK_WIDGET(status_box->imhtml), TRUE); | |
11870 | 545 } |
11951 | 546 |
12634
8512c990967b
[gaim-migrate @ 14970]
Richard Laager <rlaager@wiktel.com>
parents:
12619
diff
changeset
|
547 update_size(status_box); |
8512c990967b
[gaim-migrate @ 14970]
Richard Laager <rlaager@wiktel.com>
parents:
12619
diff
changeset
|
548 |
11951 | 549 /* Stop suppressing the "changed" signal. */ |
550 gtk_widget_set_sensitive(GTK_WIDGET(status_box), TRUE); | |
11870 | 551 } |
552 | |
11732 | 553 static void |
12778 | 554 add_popular_statuses(GtkGaimStatusBox *statusbox) |
555 { | |
13090 | 556 gboolean show_buddy_icons; |
13124 | 557 GtkIconSize icon_size; |
12778 | 558 GList *list, *cur; |
13062 | 559 GdkPixbuf *pixbuf, *emblem; |
560 int width, height; | |
12778 | 561 |
562 list = gaim_savedstatuses_get_popular(6); | |
563 if (list == NULL) | |
564 /* Odd... oh well, nothing we can do about it. */ | |
565 return; | |
566 | |
13090 | 567 show_buddy_icons = gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons"); |
568 if (show_buddy_icons) | |
12778 | 569 icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS); |
570 else | |
571 icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS_SMALL); | |
572 | |
12779 | 573 gtk_gaim_status_box_add_separator(statusbox); |
574 | |
12778 | 575 for (cur = list; cur != NULL; cur = cur->next) |
576 { | |
577 GaimSavedStatus *saved = cur->data; | |
13050 | 578 const gchar *message; |
13098
44a4bd35cc97
[gaim-migrate @ 15460]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
579 gchar *stripped = NULL; |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
580 |
13090 | 581 /* Get an appropriate status icon */ |
13121 | 582 pixbuf = gaim_gtk_create_gaim_icon_with_status( |
583 gaim_savedstatus_get_type(saved), | |
13090 | 584 show_buddy_icons ? 1.0 : 0.5); |
13050 | 585 |
586 if (gaim_savedstatus_is_transient(saved)) | |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
587 { |
13050 | 588 /* |
589 * Transient statuses do not have a title, so the savedstatus | |
590 * API returns the message when gaim_savedstatus_get_title() is | |
591 * called, so we don't need to get the message a second time. | |
592 */ | |
593 } | |
594 else | |
595 { | |
596 message = gaim_savedstatus_get_message(saved); | |
13098
44a4bd35cc97
[gaim-migrate @ 15460]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
597 if (message != NULL) |
44a4bd35cc97
[gaim-migrate @ 15460]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
598 { |
44a4bd35cc97
[gaim-migrate @ 15460]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
599 stripped = gaim_markup_strip_html(message); |
44a4bd35cc97
[gaim-migrate @ 15460]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
600 gaim_util_chrreplace(stripped, '\n', ' '); |
44a4bd35cc97
[gaim-migrate @ 15460]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
601 } |
13090 | 602 |
603 /* Overlay a disk in the bottom left corner */ | |
604 emblem = gtk_widget_render_icon(GTK_WIDGET(statusbox->vbox), | |
605 GTK_STOCK_SAVE, icon_size, "GtkGaimStatusBox"); | |
606 if (emblem != NULL) | |
607 { | |
608 width = gdk_pixbuf_get_width(pixbuf) / 2; | |
609 height = gdk_pixbuf_get_height(pixbuf) / 2; | |
610 gdk_pixbuf_composite(emblem, pixbuf, 0, height, | |
611 width, height, 0, height, | |
612 0.5, 0.5, GDK_INTERP_BILINEAR, 255); | |
613 g_object_unref(G_OBJECT(emblem)); | |
614 } | |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
615 } |
13090 | 616 |
12778 | 617 gtk_gaim_status_box_add(statusbox, GTK_GAIM_STATUS_BOX_TYPE_POPULAR, |
13079 | 618 pixbuf, gaim_savedstatus_get_title(saved), stripped, |
12778 | 619 GINT_TO_POINTER(gaim_savedstatus_get_creation_time(saved))); |
13050 | 620 g_free(stripped); |
13090 | 621 if (pixbuf != NULL) |
622 g_object_unref(G_OBJECT(pixbuf)); | |
12778 | 623 } |
624 | |
625 g_list_free(list); | |
626 } | |
627 | |
628 static void | |
11732 | 629 gtk_gaim_status_box_regenerate(GtkGaimStatusBox *status_box) |
630 { | |
13090 | 631 gboolean show_buddy_icons; |
11739 | 632 GaimAccount *account; |
13090 | 633 GdkPixbuf *pixbuf, *pixbuf2, *pixbuf3, *pixbuf4, *tmp; |
11732 | 634 GtkIconSize icon_size; |
635 | |
13090 | 636 show_buddy_icons = gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons"); |
637 if (show_buddy_icons) | |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
638 icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
639 else |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
640 icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS_SMALL); |
11732 | 641 |
12256 | 642 /* Unset the model while clearing it */ |
643 gtk_combo_box_set_model(GTK_COMBO_BOX(status_box), NULL); | |
11732 | 644 gtk_list_store_clear(status_box->dropdown_store); |
13241 | 645 /* Don't set the model until the new statuses have been added to the box. |
646 * What is presumably a bug in Gtk < 2.4 causes things to get all confused | |
647 * if we do this here. */ | |
648 /* gtk_combo_box_set_model(GTK_COMBO_BOX(status_box), GTK_TREE_MODEL(status_box->dropdown_store)); */ | |
12286
255e6912607b
[gaim-migrate @ 14590]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12275
diff
changeset
|
649 |
11739 | 650 account = GTK_GAIM_STATUS_BOX(status_box)->account; |
651 if (account == NULL) | |
652 { | |
12779 | 653 /* Global */ |
11756 | 654 pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), GAIM_STOCK_STATUS_ONLINE, |
11732 | 655 icon_size, "GtkGaimStatusBox"); |
11756 | 656 pixbuf2 = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), GAIM_STOCK_STATUS_AWAY, |
11732 | 657 icon_size, "GtkGaimStatusBox"); |
11756 | 658 pixbuf3 = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), GAIM_STOCK_STATUS_OFFLINE, |
11732 | 659 icon_size, "GtkGaimStatusBox"); |
11756 | 660 pixbuf4 = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), GAIM_STOCK_STATUS_INVISIBLE, |
11732 | 661 icon_size, "GtkGaimStatusBox"); |
12779 | 662 |
663 gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), GTK_GAIM_STATUS_BOX_TYPE_PRIMITIVE, pixbuf, _("Available"), NULL, GINT_TO_POINTER(GAIM_STATUS_AVAILABLE)); | |
664 gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), GTK_GAIM_STATUS_BOX_TYPE_PRIMITIVE, pixbuf2, _("Away"), NULL, GINT_TO_POINTER(GAIM_STATUS_AWAY)); | |
665 gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), GTK_GAIM_STATUS_BOX_TYPE_PRIMITIVE, pixbuf4, _("Invisible"), NULL, GINT_TO_POINTER(GAIM_STATUS_INVISIBLE)); | |
666 gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), GTK_GAIM_STATUS_BOX_TYPE_PRIMITIVE, pixbuf3, _("Offline"), NULL, GINT_TO_POINTER(GAIM_STATUS_OFFLINE)); | |
667 | |
668 add_popular_statuses(status_box); | |
669 | |
11738 | 670 gtk_gaim_status_box_add_separator(GTK_GAIM_STATUS_BOX(status_box)); |
13025 | 671 gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), GTK_GAIM_STATUS_BOX_TYPE_CUSTOM, pixbuf, _("New..."), NULL, NULL); |
12778 | 672 gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), GTK_GAIM_STATUS_BOX_TYPE_SAVED, pixbuf, _("Saved..."), NULL, NULL); |
673 | |
13241 | 674 gtk_combo_box_set_model(GTK_COMBO_BOX(status_box), GTK_TREE_MODEL(status_box->dropdown_store)); |
13124 | 675 status_menu_refresh_iter(status_box); |
11732 | 676 |
677 } else { | |
12779 | 678 /* Per-account */ |
11732 | 679 const GList *l; |
11739 | 680 |
681 for (l = gaim_account_get_status_types(account); l != NULL; l = l->next) | |
682 { | |
11732 | 683 GaimStatusType *status_type = (GaimStatusType *)l->data; |
684 | |
685 if (!gaim_status_type_is_user_settable(status_type)) | |
686 continue; | |
687 | |
13090 | 688 tmp = gaim_gtk_create_prpl_icon_with_status(account, status_type, |
689 show_buddy_icons ? 1.0 : 0.5); | |
11739 | 690 gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), |
691 gaim_status_type_get_primitive(status_type), | |
13090 | 692 tmp, |
11739 | 693 gaim_status_type_get_name(status_type), |
12778 | 694 NULL, NULL); |
13090 | 695 if (tmp != NULL) |
696 g_object_unref(tmp); | |
11732 | 697 } |
13241 | 698 gtk_combo_box_set_model(GTK_COMBO_BOX(status_box), GTK_TREE_MODEL(status_box->dropdown_store)); |
11967 | 699 update_to_reflect_account_status(status_box, account, gaim_account_get_active_status(account)); |
11732 | 700 } |
701 } | |
702 | |
12827
0f40c44348f4
[gaim-migrate @ 15175]
Richard Laager <rlaager@wiktel.com>
parents:
12816
diff
changeset
|
703 static gboolean combo_box_scroll_event_cb(GtkWidget *w, GdkEventScroll *event, GtkIMHtml *imhtml) |
0f40c44348f4
[gaim-migrate @ 15175]
Richard Laager <rlaager@wiktel.com>
parents:
12816
diff
changeset
|
704 { |
0f40c44348f4
[gaim-migrate @ 15175]
Richard Laager <rlaager@wiktel.com>
parents:
12816
diff
changeset
|
705 gtk_combo_box_popup(GTK_COMBO_BOX(w)); |
0f40c44348f4
[gaim-migrate @ 15175]
Richard Laager <rlaager@wiktel.com>
parents:
12816
diff
changeset
|
706 return TRUE; |
0f40c44348f4
[gaim-migrate @ 15175]
Richard Laager <rlaager@wiktel.com>
parents:
12816
diff
changeset
|
707 } |
0f40c44348f4
[gaim-migrate @ 15175]
Richard Laager <rlaager@wiktel.com>
parents:
12816
diff
changeset
|
708 |
0f40c44348f4
[gaim-migrate @ 15175]
Richard Laager <rlaager@wiktel.com>
parents:
12816
diff
changeset
|
709 static gboolean imhtml_scroll_event_cb(GtkWidget *w, GdkEventScroll *event, GtkIMHtml *imhtml) |
12075
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
710 { |
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
711 if (event->direction == GDK_SCROLL_UP) |
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
712 gtk_imhtml_page_up(imhtml); |
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
713 else if (event->direction == GDK_SCROLL_DOWN) |
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
714 gtk_imhtml_page_down(imhtml); |
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
715 return TRUE; |
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
716 } |
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
717 |
13123 | 718 static int imhtml_remove_focus(GtkWidget *w, GdkEventKey *event, GtkGaimStatusBox *status_box) |
12274 | 719 { |
720 if (event->keyval == GDK_Tab || event->keyval == GDK_KP_Tab) | |
721 { | |
722 /* If last inserted character is a tab, then remove the focus from here */ | |
723 GtkWidget *top = gtk_widget_get_toplevel(w); | |
724 g_signal_emit_by_name(G_OBJECT(top), "move_focus", | |
725 (event->state & GDK_SHIFT_MASK) ? | |
726 GTK_DIR_TAB_BACKWARD: GTK_DIR_TAB_FORWARD); | |
727 return TRUE; | |
728 } | |
13123 | 729 if (!status_box->typing != 0) |
12274 | 730 return FALSE; |
13123 | 731 gtk_gaim_status_box_pulse_typing(status_box); |
732 g_source_remove(status_box->typing); | |
733 status_box->typing = g_timeout_add(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, status_box); | |
12460
3d999a4d4892
[gaim-migrate @ 14770]
Richard Laager <rlaager@wiktel.com>
parents:
12379
diff
changeset
|
734 |
12274 | 735 return FALSE; |
736 } | |
737 | |
11753 | 738 #if GTK_CHECK_VERSION(2,6,0) |
11738 | 739 static gboolean |
740 dropdown_store_row_separator_func(GtkTreeModel *model, | |
741 GtkTreeIter *iter, gpointer data) | |
742 { | |
11739 | 743 GtkGaimStatusBoxItemType type; |
11738 | 744 |
11885 | 745 gtk_tree_model_get(model, iter, TYPE_COLUMN, &type, -1); |
11738 | 746 |
11739 | 747 if (type == GTK_GAIM_STATUS_BOX_TYPE_SEPARATOR) |
11738 | 748 return TRUE; |
749 | |
750 return FALSE; | |
751 } | |
11753 | 752 #endif |
11738 | 753 |
10643 | 754 static void |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
755 cache_pixbufs(GtkGaimStatusBox *status_box) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
756 { |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
757 GtkIconSize icon_size; |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
758 |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
759 if (gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons")) |
13065 | 760 { |
761 g_object_set(G_OBJECT(status_box->icon_rend), "xpad", 6, NULL); | |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
762 icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS_TWO_LINE); |
13065 | 763 } else { |
764 g_object_set(G_OBJECT(status_box->icon_rend), "xpad", 3, NULL); | |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
765 icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS_SMALL_TWO_LINE); |
13065 | 766 } |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
767 |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
768 if (status_box->connecting_pixbufs[0] != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
769 gdk_pixbuf_unref(status_box->connecting_pixbufs[0]); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
770 if (status_box->connecting_pixbufs[1] != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
771 gdk_pixbuf_unref(status_box->connecting_pixbufs[1]); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
772 if (status_box->connecting_pixbufs[2] != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
773 gdk_pixbuf_unref(status_box->connecting_pixbufs[2]); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
774 if (status_box->connecting_pixbufs[3] != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
775 gdk_pixbuf_unref(status_box->connecting_pixbufs[3]); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
776 |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
777 status_box->connecting_index = 0; |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
778 status_box->connecting_pixbufs[0] = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), GAIM_STOCK_STATUS_CONNECT0, |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
779 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
780 status_box->connecting_pixbufs[1] = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), GAIM_STOCK_STATUS_CONNECT1, |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
781 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
782 status_box->connecting_pixbufs[2] = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), GAIM_STOCK_STATUS_CONNECT2, |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
783 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
784 status_box->connecting_pixbufs[3] = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), GAIM_STOCK_STATUS_CONNECT3, |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
785 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
786 |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
787 if (status_box->typing_pixbufs[0] != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
788 gdk_pixbuf_unref(status_box->typing_pixbufs[0]); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
789 if (status_box->typing_pixbufs[1] != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
790 gdk_pixbuf_unref(status_box->typing_pixbufs[1]); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
791 if (status_box->typing_pixbufs[2] != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
792 gdk_pixbuf_unref(status_box->typing_pixbufs[2]); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
793 if (status_box->typing_pixbufs[3] != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
794 gdk_pixbuf_unref(status_box->typing_pixbufs[3]); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
795 |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
796 status_box->typing_index = 0; |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
797 status_box->typing_pixbufs[0] = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), GAIM_STOCK_STATUS_TYPING0, |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
798 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
799 status_box->typing_pixbufs[1] = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), GAIM_STOCK_STATUS_TYPING1, |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
800 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
801 status_box->typing_pixbufs[2] = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), GAIM_STOCK_STATUS_TYPING2, |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
802 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
803 status_box->typing_pixbufs[3] = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), GAIM_STOCK_STATUS_TYPING3, |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
804 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
805 } |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
806 |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
807 static void |
11954 | 808 current_status_pref_changed_cb(const char *name, GaimPrefType type, |
12816 | 809 gconstpointer val, gpointer data) |
11954 | 810 { |
13121 | 811 GtkGaimStatusBox *status_box = data; |
12778 | 812 |
813 /* Make sure our current status is added to the list of popular statuses */ | |
13121 | 814 gtk_gaim_status_box_regenerate(status_box); |
12778 | 815 |
13121 | 816 if (status_box->account != NULL) |
817 update_to_reflect_account_status(status_box, status_box->account, | |
818 gaim_account_get_active_status(status_box->account)); | |
12244 | 819 else |
13124 | 820 status_menu_refresh_iter(status_box); |
13121 | 821 |
822 gtk_gaim_status_box_refresh(status_box); | |
11954 | 823 } |
824 | |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
825 static void |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
826 buddy_list_details_pref_changed_cb(const char *name, GaimPrefType type, |
12816 | 827 gconstpointer val, gpointer data) |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
828 { |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
829 GtkGaimStatusBox *status_box = (GtkGaimStatusBox *)data; |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
830 |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
831 cache_pixbufs(status_box); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
832 gtk_gaim_status_box_regenerate(status_box); |
13121 | 833 gtk_gaim_status_box_refresh(status_box); |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
834 } |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
835 |
12651 | 836 static void |
837 spellcheck_prefs_cb(const char *name, GaimPrefType type, | |
12816 | 838 gconstpointer value, gpointer data) |
12651 | 839 { |
840 #ifdef USE_GTKSPELL | |
841 GtkGaimStatusBox *status_box = (GtkGaimStatusBox *)data; | |
842 | |
843 if (value) | |
844 gaim_gtk_setup_gtkspell(GTK_TEXT_VIEW(status_box->imhtml)); | |
845 else | |
846 { | |
847 GtkSpell *spell; | |
848 spell = gtkspell_get_from_text_view(GTK_TEXT_VIEW(status_box->imhtml)); | |
849 gtkspell_detach(spell); | |
850 } | |
851 #endif | |
852 } | |
853 | |
12294
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
854 #if 0 |
12262 | 855 static gboolean button_released_cb(GtkWidget *widget, GdkEventButton *event, GtkGaimStatusBox *box) |
12074
950acb2bc835
[gaim-migrate @ 14370]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12060
diff
changeset
|
856 { |
12286
255e6912607b
[gaim-migrate @ 14590]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12275
diff
changeset
|
857 |
12274 | 858 if (event->button != 1) |
859 return FALSE; | |
12262 | 860 gtk_combo_box_popdown(GTK_COMBO_BOX(box)); |
861 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(box->toggle_button), FALSE); | |
862 if (!box->imhtml_visible) | |
863 g_signal_emit_by_name(G_OBJECT(box), "changed", NULL, NULL); | |
864 return TRUE; | |
865 } | |
866 | |
867 static gboolean button_pressed_cb(GtkWidget *widget, GdkEventButton *event, GtkGaimStatusBox *box) | |
868 { | |
12274 | 869 if (event->button != 1) |
870 return FALSE; | |
12262 | 871 gtk_combo_box_popup(GTK_COMBO_BOX(box)); |
12274 | 872 // Disabled until button_released_cb works |
873 // gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(box->toggle_button), TRUE); | |
12262 | 874 return TRUE; |
12074
950acb2bc835
[gaim-migrate @ 14370]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12060
diff
changeset
|
875 } |
12294
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
876 #endif |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
877 |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
878 static void |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
879 toggled_cb(GtkWidget *widget, GtkGaimStatusBox *box) |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
880 { |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
881 gtk_combo_box_popup(GTK_COMBO_BOX(box)); |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
882 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(box->toggle_button), FALSE); |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
883 } |
12074
950acb2bc835
[gaim-migrate @ 14370]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12060
diff
changeset
|
884 |
11954 | 885 static void |
10643 | 886 gtk_gaim_status_box_init (GtkGaimStatusBox *status_box) |
887 { | |
11400 | 888 GtkCellRenderer *text_rend; |
889 GtkCellRenderer *icon_rend; | |
10643 | 890 GtkTextBuffer *buffer; |
891 | |
892 status_box->imhtml_visible = FALSE; | |
893 status_box->connecting = FALSE; | |
13123 | 894 status_box->typing = 0; |
12262 | 895 status_box->toggle_button = gtk_toggle_button_new(); |
896 status_box->hbox = gtk_hbox_new(FALSE, 6); | |
10643 | 897 status_box->cell_view = gtk_cell_view_new(); |
12262 | 898 status_box->vsep = gtk_vseparator_new(); |
899 status_box->arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE); | |
12286
255e6912607b
[gaim-migrate @ 14590]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12275
diff
changeset
|
900 |
12778 | 901 status_box->store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_INT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); |
902 status_box->dropdown_store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_INT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); | |
10643 | 903 gtk_combo_box_set_model(GTK_COMBO_BOX(status_box), GTK_TREE_MODEL(status_box->dropdown_store)); |
904 gtk_cell_view_set_model(GTK_CELL_VIEW(status_box->cell_view), GTK_TREE_MODEL(status_box->store)); | |
905 gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(status_box), 0); | |
906 gtk_list_store_append(status_box->store, &(status_box->iter)); | |
907 gtk_gaim_status_box_refresh(status_box); | |
12074
950acb2bc835
[gaim-migrate @ 14370]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12060
diff
changeset
|
908 |
12262 | 909 gtk_container_add(GTK_CONTAINER(status_box->toggle_button), status_box->hbox); |
910 gtk_box_pack_start(GTK_BOX(status_box->hbox), status_box->cell_view, TRUE, TRUE, 0); | |
12274 | 911 gtk_box_pack_start(GTK_BOX(status_box->hbox), status_box->vsep, FALSE, FALSE, 0); |
912 gtk_box_pack_start(GTK_BOX(status_box->hbox), status_box->arrow, FALSE, FALSE, 0); | |
12262 | 913 gtk_widget_show_all(status_box->toggle_button); |
914 #if GTK_CHECK_VERSION(2,4,0) | |
915 gtk_button_set_focus_on_click(GTK_BUTTON(status_box->toggle_button), FALSE); | |
916 #endif | |
10643 | 917 |
13044 | 918 text_rend = gtk_cell_renderer_text_new(); |
919 icon_rend = gtk_cell_renderer_pixbuf_new(); | |
10643 | 920 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box), icon_rend, FALSE); |
10861 | 921 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box), text_rend, TRUE); |
10643 | 922 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box), icon_rend, "pixbuf", ICON_COLUMN, NULL); |
923 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box), text_rend, "markup", TEXT_COLUMN, NULL); | |
13045 | 924 #if GTK_CHECK_VERSION(2, 6, 0) |
925 g_object_set(text_rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL); | |
926 #endif | |
10643 | 927 |
13044 | 928 status_box->icon_rend = gtk_cell_renderer_pixbuf_new(); |
929 status_box->text_rend = gtk_cell_renderer_text_new(); | |
10643 | 930 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box->cell_view), status_box->icon_rend, FALSE); |
11499 | 931 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box->cell_view), status_box->text_rend, TRUE); |
10643 | 932 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), status_box->icon_rend, "pixbuf", ICON_COLUMN, NULL); |
933 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), status_box->text_rend, "markup", TEXT_COLUMN, NULL); | |
13045 | 934 #if GTK_CHECK_VERSION(2, 6, 0) |
935 g_object_set(status_box->text_rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL); | |
936 #endif | |
10643 | 937 |
938 status_box->vbox = gtk_vbox_new(0, FALSE); | |
13280
3de53fe8345f
[gaim-migrate @ 15646]
Richard Laager <rlaager@wiktel.com>
parents:
13244
diff
changeset
|
939 status_box->sw = gaim_gtk_create_imhtml(FALSE, &status_box->imhtml, NULL, NULL); |
12879
f8748df5c17a
[gaim-migrate @ 15231]
Gary Kramlich <grim@reaperworld.com>
parents:
12827
diff
changeset
|
940 gtk_imhtml_set_editable(GTK_IMHTML(status_box->imhtml), TRUE); |
12286
255e6912607b
[gaim-migrate @ 14590]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12275
diff
changeset
|
941 |
10643 | 942 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(status_box->imhtml)); |
12294
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
943 #if 0 |
12274 | 944 g_signal_connect(G_OBJECT(status_box->toggle_button), "button-press-event", |
945 G_CALLBACK(button_pressed_cb), status_box); | |
946 g_signal_connect(G_OBJECT(status_box->toggle_button), "button-release-event", | |
947 G_CALLBACK(button_released_cb), status_box); | |
12294
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
948 #endif |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
949 g_signal_connect(G_OBJECT(status_box->toggle_button), "toggled", |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
950 G_CALLBACK(toggled_cb), status_box); |
10643 | 951 g_signal_connect(G_OBJECT(buffer), "changed", G_CALLBACK(imhtml_changed_cb), status_box); |
12460
3d999a4d4892
[gaim-migrate @ 14770]
Richard Laager <rlaager@wiktel.com>
parents:
12379
diff
changeset
|
952 g_signal_connect(G_OBJECT(status_box->imhtml), "format_function_toggle", |
3d999a4d4892
[gaim-migrate @ 14770]
Richard Laager <rlaager@wiktel.com>
parents:
12379
diff
changeset
|
953 G_CALLBACK(imhtml_format_changed_cb), status_box); |
12274 | 954 g_signal_connect(G_OBJECT(status_box->imhtml), "key_press_event", |
955 G_CALLBACK(imhtml_remove_focus), status_box); | |
11562 | 956 g_signal_connect_swapped(G_OBJECT(status_box->imhtml), "message_send", G_CALLBACK(remove_typing_cb), status_box); |
10643 | 957 gtk_imhtml_set_editable(GTK_IMHTML(status_box->imhtml), TRUE); |
12651 | 958 #ifdef USE_GTKSPELL |
959 if (gaim_prefs_get_bool("/gaim/gtk/conversations/spellcheck")) | |
960 gaim_gtk_setup_gtkspell(GTK_TEXT_VIEW(status_box->imhtml)); | |
961 #endif | |
10643 | 962 gtk_widget_set_parent(status_box->vbox, GTK_WIDGET(status_box)); |
12262 | 963 gtk_widget_set_parent(status_box->toggle_button, GTK_WIDGET(status_box)); |
12275 | 964 GTK_BIN(status_box)->child = status_box->toggle_button; |
12269 | 965 |
10643 | 966 gtk_box_pack_start(GTK_BOX(status_box->vbox), status_box->sw, TRUE, TRUE, 0); |
11654 | 967 |
12827
0f40c44348f4
[gaim-migrate @ 15175]
Richard Laager <rlaager@wiktel.com>
parents:
12816
diff
changeset
|
968 g_signal_connect(G_OBJECT(status_box), "scroll_event", G_CALLBACK(combo_box_scroll_event_cb), NULL); |
12286
255e6912607b
[gaim-migrate @ 14590]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12275
diff
changeset
|
969 g_signal_connect(G_OBJECT(status_box->imhtml), "scroll_event", |
12827
0f40c44348f4
[gaim-migrate @ 15175]
Richard Laager <rlaager@wiktel.com>
parents:
12816
diff
changeset
|
970 G_CALLBACK(imhtml_scroll_event_cb), status_box->imhtml); |
12075
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
971 |
11850 | 972 #if GTK_CHECK_VERSION(2,6,0) |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
973 gtk_combo_box_set_row_separator_func(GTK_COMBO_BOX(status_box), dropdown_store_row_separator_func, NULL, NULL); |
11850 | 974 #endif |
975 | |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
976 cache_pixbufs(status_box); |
11732 | 977 gtk_gaim_status_box_regenerate(status_box); |
11954 | 978 |
12123 | 979 gaim_prefs_connect_callback(status_box, "/core/savedstatus/current", |
11954 | 980 current_status_pref_changed_cb, status_box); |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
981 gaim_prefs_connect_callback(status_box, "/gaim/gtk/blist/show_buddy_icons", |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
982 buddy_list_details_pref_changed_cb, status_box); |
12651 | 983 gaim_prefs_connect_callback(status_box, "/gaim/gtk/conversations/spellcheck", |
984 spellcheck_prefs_cb, status_box); | |
10643 | 985 } |
986 | |
987 static void | |
10861 | 988 gtk_gaim_status_box_size_request(GtkWidget *widget, |
989 GtkRequisition *requisition) | |
10643 | 990 { |
991 GtkRequisition box_req; | |
992 combo_box_size_request(widget, requisition); | |
12596
037a673ba862
[gaim-migrate @ 14926]
Richard Laager <rlaager@wiktel.com>
parents:
12595
diff
changeset
|
993 requisition->height += 3; |
10861 | 994 |
13065 | 995 /* If the gtkimhtml is visible, then add some additional padding */ |
10643 | 996 gtk_widget_size_request(GTK_GAIM_STATUS_BOX(widget)->vbox, &box_req); |
997 if (box_req.height > 1) | |
13065 | 998 requisition->height += box_req.height + 3; |
12286
255e6912607b
[gaim-migrate @ 14590]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12275
diff
changeset
|
999 |
10643 | 1000 requisition->width = 1; |
1001 } | |
1002 | |
1003 static void | |
10861 | 1004 gtk_gaim_status_box_size_allocate(GtkWidget *widget, |
1005 GtkAllocation *allocation) | |
10643 | 1006 { |
1007 GtkRequisition req = {0,0}; | |
11400 | 1008 GtkAllocation parent_alc, box_alc; |
1009 | |
10643 | 1010 combo_box_size_request(widget, &req); |
10861 | 1011 |
13065 | 1012 box_alc = *allocation; |
12596
037a673ba862
[gaim-migrate @ 14926]
Richard Laager <rlaager@wiktel.com>
parents:
12595
diff
changeset
|
1013 box_alc.height = MAX(1, (allocation->height - req.height - 6)); |
13065 | 1014 box_alc.y += req.height + 6; |
10643 | 1015 gtk_widget_size_allocate((GTK_GAIM_STATUS_BOX(widget))->vbox, &box_alc); |
10861 | 1016 |
13065 | 1017 parent_alc = *allocation; |
10643 | 1018 parent_alc.height = MAX(1,req.height); |
12102
8df87db79bad
[gaim-migrate @ 14399]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12100
diff
changeset
|
1019 parent_alc.y += 3; |
10643 | 1020 combo_box_size_allocate(widget, &parent_alc); |
12262 | 1021 gtk_widget_size_allocate((GTK_GAIM_STATUS_BOX(widget))->toggle_button, &parent_alc); |
10643 | 1022 widget->allocation = *allocation; |
1023 } | |
1024 | |
1025 static gboolean | |
10861 | 1026 gtk_gaim_status_box_expose_event(GtkWidget *widget, |
12262 | 1027 GdkEventExpose *event) |
10643 | 1028 { |
10861 | 1029 GtkGaimStatusBox *status_box = GTK_GAIM_STATUS_BOX(widget); |
12262 | 1030 gtk_container_propagate_expose(GTK_CONTAINER(widget), status_box->vbox, event); |
12275 | 1031 gtk_container_propagate_expose(GTK_CONTAINER(widget), status_box->toggle_button, event); |
10861 | 1032 return FALSE; |
10643 | 1033 } |
1034 | |
1035 static void | |
10861 | 1036 gtk_gaim_status_box_forall(GtkContainer *container, |
1037 gboolean include_internals, | |
1038 GtkCallback callback, | |
1039 gpointer callback_data) | |
10643 | 1040 { |
10861 | 1041 GtkGaimStatusBox *status_box = GTK_GAIM_STATUS_BOX (container); |
10643 | 1042 |
10861 | 1043 if (include_internals) |
1044 { | |
1045 (* callback) (status_box->vbox, callback_data); | |
12275 | 1046 (* callback) (status_box->toggle_button, callback_data); |
1047 (* callback) (status_box->arrow, callback_data); | |
10861 | 1048 } |
10643 | 1049 |
10861 | 1050 combo_box_forall(container, include_internals, callback, callback_data); |
10643 | 1051 } |
1052 | |
1053 GtkWidget * | |
1054 gtk_gaim_status_box_new() | |
1055 { | |
1056 return g_object_new(GTK_GAIM_TYPE_STATUS_BOX, NULL); | |
1057 } | |
1058 | |
11499 | 1059 GtkWidget * |
1060 gtk_gaim_status_box_new_with_account(GaimAccount *account) | |
1061 { | |
1062 return g_object_new(GTK_GAIM_TYPE_STATUS_BOX, "account", account, NULL); | |
1063 } | |
10643 | 1064 |
13050 | 1065 /** |
1066 * Add a row to the dropdown menu. | |
1067 * | |
1068 * @param status_box The status box itself. | |
1069 * @param type A GtkGaimStatusBoxItemType. | |
1070 * @param pixbuf The icon to associate with this row in the menu. | |
1071 * @param title The title of this item. For the primitive entries, | |
1072 * this is something like "Available" or "Away." For | |
1073 * the saved statuses, this is something like | |
1074 * "My favorite away message!" This should be | |
1075 * plaintext (non-markedup) (this function escapes it). | |
1076 * @param desc The secondary text for this item. This will be | |
1077 * placed on the row below the title, in a dimmer | |
1078 * font (generally gray). This text should be plaintext | |
1079 * (non-markedup) (this function escapes it). | |
1080 * @param data Data to be associated with this row in the dropdown | |
1081 * menu. For primitives this is the value of the | |
1082 * GaimStatusPrimitive. For saved statuses this is the | |
1083 * creation timestamp. | |
1084 */ | |
10643 | 1085 void |
13050 | 1086 gtk_gaim_status_box_add(GtkGaimStatusBox *status_box, GtkGaimStatusBoxItemType type, GdkPixbuf *pixbuf, const char *title, const char *desc, gpointer data) |
10643 | 1087 { |
1088 GtkTreeIter iter; | |
13050 | 1089 char *text; |
10861 | 1090 |
13050 | 1091 if (desc == NULL) |
1092 { | |
1093 text = g_markup_escape_text(title, -1); | |
1094 } | |
1095 else | |
1096 { | |
10643 | 1097 char aa_color[8]; |
13050 | 1098 gchar *escaped_title, *escaped_desc; |
1099 GtkStyle *style; | |
1100 | |
1101 style = gtk_widget_get_style(GTK_WIDGET(status_box)); | |
10643 | 1102 snprintf(aa_color, sizeof(aa_color), "#%02x%02x%02x", |
1103 style->text_aa[GTK_STATE_NORMAL].red >> 8, | |
1104 style->text_aa[GTK_STATE_NORMAL].green >> 8, | |
10861 | 1105 style->text_aa[GTK_STATE_NORMAL].blue >> 8); |
13050 | 1106 |
1107 escaped_title = g_markup_escape_text(title, -1); | |
1108 escaped_desc = g_markup_escape_text(desc, -1); | |
1109 text = g_strdup_printf("%s\n<span color=\"%s\" size=\"smaller\">%s</span>", | |
1110 escaped_title, aa_color, escaped_desc); | |
1111 g_free(escaped_title); | |
1112 g_free(escaped_desc); | |
10643 | 1113 } |
10861 | 1114 |
10643 | 1115 gtk_list_store_append(status_box->dropdown_store, &iter); |
1116 gtk_list_store_set(status_box->dropdown_store, &iter, | |
13050 | 1117 TYPE_COLUMN, type, |
1118 ICON_COLUMN, pixbuf, | |
1119 TEXT_COLUMN, text, | |
1120 TITLE_COLUMN, title, | |
1121 DESC_COLUMN, desc, | |
1122 DATA_COLUMN, data, | |
1123 -1); | |
1124 g_free(text); | |
10643 | 1125 } |
1126 | |
1127 void | |
11738 | 1128 gtk_gaim_status_box_add_separator(GtkGaimStatusBox *status_box) |
1129 { | |
11756 | 1130 /* Don't do anything unless GTK actually supports |
1131 * gtk_combo_box_set_row_separator_func */ | |
1132 #if GTK_CHECK_VERSION(2,6,0) | |
11738 | 1133 GtkTreeIter iter; |
1134 | |
1135 gtk_list_store_append(status_box->dropdown_store, &iter); | |
1136 gtk_list_store_set(status_box->dropdown_store, &iter, | |
11739 | 1137 TYPE_COLUMN, GTK_GAIM_STATUS_BOX_TYPE_SEPARATOR, |
1138 -1); | |
11756 | 1139 #endif |
11738 | 1140 } |
1141 | |
1142 void | |
10643 | 1143 gtk_gaim_status_box_set_connecting(GtkGaimStatusBox *status_box, gboolean connecting) |
1144 { | |
1145 if (!status_box) | |
1146 return; | |
1147 status_box->connecting = connecting; | |
1148 gtk_gaim_status_box_refresh(status_box); | |
1149 } | |
1150 | |
1151 void | |
1152 gtk_gaim_status_box_pulse_connecting(GtkGaimStatusBox *status_box) | |
1153 { | |
1154 if (!status_box) | |
1155 return; | |
1156 if (status_box->connecting_index == 3) | |
1157 status_box->connecting_index = 0; | |
10861 | 1158 else |
10643 | 1159 status_box->connecting_index++; |
1160 gtk_gaim_status_box_refresh(status_box); | |
1161 } | |
1162 | |
12274 | 1163 static void |
10643 | 1164 gtk_gaim_status_box_pulse_typing(GtkGaimStatusBox *status_box) |
1165 { | |
1166 if (status_box->typing_index == 3) | |
1167 status_box->typing_index = 0; | |
10861 | 1168 else |
10643 | 1169 status_box->typing_index++; |
1170 gtk_gaim_status_box_refresh(status_box); | |
1171 } | |
1172 | |
13050 | 1173 static GaimStatusType * |
1174 find_status_type_by_index(const GaimAccount *account, gint active) | |
11993 | 1175 { |
1176 const GList *l = gaim_account_get_status_types(account); | |
1177 gint i; | |
1178 | |
1179 for (i = 0; l; l = l->next) { | |
1180 GaimStatusType *status_type = l->data; | |
1181 if (!gaim_status_type_is_user_settable(status_type)) | |
1182 continue; | |
1183 | |
1184 if (active == i) | |
1185 return status_type; | |
1186 i++; | |
1187 } | |
1188 | |
1189 return NULL; | |
1190 } | |
1191 | |
12076
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1192 static gboolean |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1193 message_changed(const char *one, const char *two) |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1194 { |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1195 if (one == NULL && two == NULL) |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1196 return FALSE; |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1197 |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1198 if (one == NULL || two == NULL) |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1199 return TRUE; |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1200 |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1201 return (g_utf8_collate(one, two) != 0); |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1202 } |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1203 |
11654 | 1204 static void |
1205 activate_currently_selected_status(GtkGaimStatusBox *status_box) | |
10643 | 1206 { |
11739 | 1207 GtkGaimStatusBoxItemType type; |
12779 | 1208 gpointer data; |
11739 | 1209 gchar *title; |
10643 | 1210 GtkTreeIter iter; |
11654 | 1211 char *message; |
1212 GaimSavedStatus *saved_status; | |
12076
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1213 gboolean changed = TRUE; |
10643 | 1214 |
11951 | 1215 if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(status_box), &iter)) |
1216 return; | |
12659 | 1217 |
11654 | 1218 gtk_tree_model_get(GTK_TREE_MODEL(status_box->dropdown_store), &iter, |
12779 | 1219 TYPE_COLUMN, &type, |
1220 DATA_COLUMN, &data, | |
1221 -1); | |
12074
950acb2bc835
[gaim-migrate @ 14370]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12060
diff
changeset
|
1222 |
11739 | 1223 /* |
13025 | 1224 * If the currently selected status is "New..." or |
12779 | 1225 * "Saved..." or a popular status then do nothing. |
13124 | 1226 * Popular statuses are |
11954 | 1227 * activated elsewhere, and we update the status_box |
1228 * accordingly by monitoring the preference | |
12123 | 1229 * "/core/savedstatus/current" and then calling |
13124 | 1230 * status_menu_refresh_iter() |
11739 | 1231 */ |
12779 | 1232 if (type != GTK_GAIM_STATUS_BOX_TYPE_PRIMITIVE) |
11739 | 1233 return; |
11654 | 1234 |
12659 | 1235 gtk_tree_model_get(GTK_TREE_MODEL(status_box->dropdown_store), &iter, |
1236 TITLE_COLUMN, &title, -1); | |
1237 | |
1238 message = gtk_gaim_status_box_get_message(status_box); | |
1239 if (!message || !*message) | |
1240 { | |
1241 gtk_widget_hide_all(status_box->vbox); | |
1242 status_box->imhtml_visible = FALSE; | |
13230 | 1243 if (message != NULL) |
1244 { | |
1245 g_free(message); | |
1246 message = NULL; | |
1247 } | |
12659 | 1248 } |
1249 | |
12779 | 1250 if (status_box->account == NULL) { |
1251 /* Global */ | |
1252 /* Save the newly selected status to prefs.xml and status.xml */ | |
1253 | |
13111 | 1254 /* Has the status really been changed? */ |
12779 | 1255 saved_status = gaim_savedstatus_get_current(); |
1256 if (gaim_savedstatus_get_type(saved_status) == GPOINTER_TO_INT(data)) | |
1257 { | |
1258 if (!message_changed(gaim_savedstatus_get_message(saved_status), message)) | |
1259 changed = FALSE; | |
1260 } | |
1261 | |
1262 if (changed) | |
1263 { | |
13012 | 1264 /* If we've used this type+message before, lookup the transient status */ |
13244 | 1265 saved_status = gaim_savedstatus_find_transient_by_type_and_message( |
13012 | 1266 GPOINTER_TO_INT(data), message); |
1267 | |
1268 /* If this type+message is unique then create a new transient saved status */ | |
1269 if (saved_status == NULL) | |
1270 { | |
1271 saved_status = gaim_savedstatus_new(NULL, GPOINTER_TO_INT(data)); | |
1272 gaim_savedstatus_set_message(saved_status, message); | |
1273 } | |
12779 | 1274 |
1275 /* Set the status for each account */ | |
1276 gaim_savedstatus_activate(saved_status); | |
1277 } | |
1278 } else { | |
1279 /* Per-account */ | |
11981 | 1280 gint active; |
1281 GaimStatusType *status_type; | |
12076
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1282 GaimStatus *status; |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1283 const char *id = NULL; |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1284 |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1285 status = gaim_account_get_active_status(status_box->account); |
11981 | 1286 |
1287 g_object_get(G_OBJECT(status_box), "active", &active, NULL); | |
11654 | 1288 |
11993 | 1289 status_type = find_status_type_by_index(status_box->account, active); |
12076
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1290 id = gaim_status_type_get_id(status_type); |
11981 | 1291 |
12076
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1292 if (strncmp(id, gaim_status_get_id(status), strlen(id)) == 0) |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1293 { |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1294 /* Selected status and previous status is the same */ |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1295 if (!message_changed(message, gaim_status_get_attr_string(status, "message"))) |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1296 changed = FALSE; |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1297 } |
12123 | 1298 |
12076
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1299 if (changed) |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1300 { |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1301 if (message) |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1302 gaim_account_set_status(status_box->account, id, |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1303 TRUE, "message", message, NULL); |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1304 else |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1305 gaim_account_set_status(status_box->account, id, |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1306 TRUE, NULL); |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1307 } |
11981 | 1308 } |
11627 | 1309 |
11638 | 1310 g_free(title); |
11654 | 1311 g_free(message); |
1312 } | |
1313 | |
12597
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1314 static void update_size(GtkGaimStatusBox *status_box) |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1315 { |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1316 GtkTextBuffer *buffer; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1317 GtkTextIter iter; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1318 int wrapped_lines; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1319 int lines; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1320 GdkRectangle oneline; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1321 int height; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1322 int pad_top, pad_inside, pad_bottom; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1323 |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1324 if (!status_box->imhtml_visible) |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1325 { |
12598
1c122dbc8e9e
[gaim-migrate @ 14928]
Richard Laager <rlaager@wiktel.com>
parents:
12597
diff
changeset
|
1326 if (status_box->vbox != NULL) |
1c122dbc8e9e
[gaim-migrate @ 14928]
Richard Laager <rlaager@wiktel.com>
parents:
12597
diff
changeset
|
1327 gtk_widget_set_size_request(status_box->vbox, -1, -1); |
12597
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1328 return; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1329 } |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1330 |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1331 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(status_box->imhtml)); |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1332 |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1333 wrapped_lines = 1; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1334 gtk_text_buffer_get_start_iter(buffer, &iter); |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1335 while (gtk_text_view_forward_display_line(GTK_TEXT_VIEW(status_box->imhtml), &iter)) |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1336 wrapped_lines++; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1337 |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1338 lines = gtk_text_buffer_get_line_count(buffer); |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1339 |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1340 /* Show a maximum of 4 lines */ |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1341 lines = MIN(lines, 4); |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1342 wrapped_lines = MIN(wrapped_lines, 4); |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1343 |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1344 gtk_text_buffer_get_start_iter(buffer, &iter); |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1345 gtk_text_view_get_iter_location(GTK_TEXT_VIEW(status_box->imhtml), &iter, &oneline); |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1346 |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1347 pad_top = gtk_text_view_get_pixels_above_lines(GTK_TEXT_VIEW(status_box->imhtml)); |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1348 pad_bottom = gtk_text_view_get_pixels_below_lines(GTK_TEXT_VIEW(status_box->imhtml)); |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1349 pad_inside = gtk_text_view_get_pixels_inside_wrap(GTK_TEXT_VIEW(status_box->imhtml)); |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1350 |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1351 height = (oneline.height + pad_top + pad_bottom) * lines; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1352 height += (oneline.height + pad_inside) * (wrapped_lines - lines); |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1353 |
12905
ee0c8c446eef
[gaim-migrate @ 15258]
Richard Laager <rlaager@wiktel.com>
parents:
12879
diff
changeset
|
1354 gtk_widget_set_size_request(status_box->vbox, -1, height + GAIM_HIG_BOX_SPACE); |
12597
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1355 } |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1356 |
11654 | 1357 static void remove_typing_cb(GtkGaimStatusBox *status_box) |
1358 { | |
12782 | 1359 if (status_box->typing == 0) |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1360 { |
12782 | 1361 /* Nothing has changed, so we don't need to do anything */ |
13124 | 1362 status_menu_refresh_iter(status_box); |
12782 | 1363 return; |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1364 } |
12782 | 1365 |
11654 | 1366 activate_currently_selected_status(status_box); |
1367 | |
1368 g_source_remove(status_box->typing); | |
1369 status_box->typing = 0; | |
1370 gtk_gaim_status_box_refresh(status_box); | |
10643 | 1371 } |
1372 | |
1373 static void gtk_gaim_status_box_changed(GtkComboBox *box) | |
1374 { | |
11400 | 1375 GtkGaimStatusBox *status_box; |
10643 | 1376 GtkTreeIter iter; |
11739 | 1377 GtkGaimStatusBoxItemType type; |
13050 | 1378 char *text, *desc; |
10643 | 1379 GdkPixbuf *pixbuf; |
12778 | 1380 gpointer data; |
11960 | 1381 GList *accounts = NULL, *node; |
10643 | 1382 |
11400 | 1383 status_box = GTK_GAIM_STATUS_BOX(box); |
1384 | |
12074
950acb2bc835
[gaim-migrate @ 14370]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12060
diff
changeset
|
1385 if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(status_box), &iter)) |
950acb2bc835
[gaim-migrate @ 14370]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12060
diff
changeset
|
1386 return; |
11739 | 1387 gtk_tree_model_get(GTK_TREE_MODEL(status_box->dropdown_store), &iter, |
1388 TYPE_COLUMN, &type, | |
1389 TITLE_COLUMN, &text, | |
13050 | 1390 DESC_COLUMN, &desc, |
12778 | 1391 ICON_COLUMN, &pixbuf, |
1392 DATA_COLUMN, &data, | |
11739 | 1393 -1); |
13123 | 1394 if (status_box->typing != 0) |
11638 | 1395 g_source_remove(status_box->typing); |
1396 status_box->typing = 0; | |
10861 | 1397 |
11951 | 1398 if (GTK_WIDGET_IS_SENSITIVE(GTK_WIDGET(status_box))) |
11729 | 1399 { |
12778 | 1400 if (type == GTK_GAIM_STATUS_BOX_TYPE_POPULAR) |
1401 { | |
1402 GaimSavedStatus *saved; | |
1403 saved = gaim_savedstatus_find_by_creation_time(GPOINTER_TO_INT(data)); | |
1404 g_return_if_fail(saved != NULL); | |
1405 gaim_savedstatus_activate(saved); | |
1406 return; | |
1407 } | |
1408 | |
11951 | 1409 if (type == GTK_GAIM_STATUS_BOX_TYPE_CUSTOM) |
1410 { | |
13175 | 1411 GaimSavedStatus *saved_status; |
1412 saved_status = gaim_savedstatus_get_current(); | |
1413 gaim_gtk_status_editor_show(FALSE, | |
1414 gaim_savedstatus_is_transient(saved_status) | |
1415 ? saved_status : NULL); | |
13124 | 1416 status_menu_refresh_iter(status_box); |
11951 | 1417 return; |
1418 } | |
11729 | 1419 |
11951 | 1420 if (type == GTK_GAIM_STATUS_BOX_TYPE_SAVED) |
1421 { | |
1422 gaim_gtk_status_window_show(); | |
13124 | 1423 status_menu_refresh_iter(status_box); |
11951 | 1424 return; |
1425 } | |
11729 | 1426 } |
1427 | |
11654 | 1428 /* |
12779 | 1429 * Show the message box whenever the primitive allows for a |
11960 | 1430 * message attribute on any protocol that is enabled, |
1431 * or our protocol, if we have account set | |
11654 | 1432 */ |
11960 | 1433 if (status_box->account) |
1434 accounts = g_list_prepend(accounts, status_box->account); | |
1435 else | |
1436 accounts = gaim_accounts_get_all_active(); | |
11755 | 1437 status_box->imhtml_visible = FALSE; |
1438 for (node = accounts; node != NULL; node = node->next) | |
1439 { | |
1440 GaimAccount *account; | |
1441 GaimStatusType *status_type; | |
1442 | |
1443 account = node->data; | |
12779 | 1444 status_type = gaim_account_get_status_type_with_primitive(account, GPOINTER_TO_INT(data)); |
11755 | 1445 if ((status_type != NULL) && |
1446 (gaim_status_type_get_attr(status_type, "message") != NULL)) | |
1447 { | |
1448 status_box->imhtml_visible = TRUE; | |
1449 break; | |
1450 } | |
1451 } | |
1452 g_list_free(accounts); | |
11654 | 1453 |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1454 if (GTK_WIDGET_IS_SENSITIVE(GTK_WIDGET(status_box))) |
11654 | 1455 { |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1456 if (status_box->imhtml_visible) |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1457 { |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1458 GtkTextBuffer *buf; |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1459 GtkTextIter start, end; |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1460 gtk_widget_show_all(status_box->vbox); |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1461 if (GTK_WIDGET_IS_SENSITIVE(GTK_WIDGET(status_box))) { |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1462 status_box->typing = g_timeout_add(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, status_box); |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1463 } |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1464 gtk_widget_grab_focus(status_box->imhtml); |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1465 buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(status_box->imhtml)); |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1466 gtk_text_buffer_get_start_iter(buf, &start); |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1467 gtk_text_buffer_get_end_iter(buf, &end); |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1468 gtk_text_buffer_move_mark_by_name(buf, "insert", &end); |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1469 gtk_text_buffer_move_mark_by_name(buf, "selection_bound", &start); |
12274 | 1470 } |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1471 else |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1472 { |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1473 gtk_widget_hide_all(status_box->vbox); |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1474 if (GTK_WIDGET_IS_SENSITIVE(GTK_WIDGET(status_box))) |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1475 activate_currently_selected_status(status_box); /* This is where we actually set the status */ |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1476 } |
10643 | 1477 } |
1478 gtk_gaim_status_box_refresh(status_box); | |
1479 } | |
1480 | |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1481 static gint |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1482 get_statusbox_index(GtkGaimStatusBox *box, GaimSavedStatus *saved_status) |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1483 { |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1484 gint index; |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1485 |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1486 switch (gaim_savedstatus_get_type(saved_status)) |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1487 { |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1488 case GAIM_STATUS_AVAILABLE: |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1489 index = 0; |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1490 break; |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1491 case GAIM_STATUS_AWAY: |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1492 index = 1; |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1493 break; |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1494 case GAIM_STATUS_INVISIBLE: |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1495 index = 2; |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1496 break; |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1497 case GAIM_STATUS_OFFLINE: |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1498 index = 3; |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1499 break; |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1500 default: |
13079 | 1501 index = -1; |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1502 break; |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1503 } |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1504 |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1505 return index; |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1506 } |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1507 |
10643 | 1508 static void imhtml_changed_cb(GtkTextBuffer *buffer, void *data) |
1509 { | |
13123 | 1510 GtkGaimStatusBox *status_box = (GtkGaimStatusBox*)data; |
1511 if (GTK_WIDGET_IS_SENSITIVE(GTK_WIDGET(status_box))) | |
11951 | 1512 { |
13123 | 1513 if (status_box->typing != 0) { |
1514 gtk_gaim_status_box_pulse_typing(status_box); | |
1515 g_source_remove(status_box->typing); | |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1516 } else { |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1517 gint index; |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1518 GaimSavedStatus *saved = gaim_savedstatus_get_current(); |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1519 |
13123 | 1520 index = get_statusbox_index(status_box, saved); |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1521 |
13123 | 1522 gtk_widget_set_sensitive(GTK_WIDGET(status_box), FALSE); |
1523 gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), index); | |
1524 gtk_widget_set_sensitive(GTK_WIDGET(status_box), TRUE); | |
1525 gtk_widget_grab_focus(status_box->imhtml); | |
11951 | 1526 } |
13123 | 1527 status_box->typing = g_timeout_add(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, status_box); |
10861 | 1528 } |
13123 | 1529 gtk_gaim_status_box_refresh(status_box); |
10643 | 1530 } |
10649 | 1531 |
12460
3d999a4d4892
[gaim-migrate @ 14770]
Richard Laager <rlaager@wiktel.com>
parents:
12379
diff
changeset
|
1532 static void imhtml_format_changed_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, void *data) |
3d999a4d4892
[gaim-migrate @ 14770]
Richard Laager <rlaager@wiktel.com>
parents:
12379
diff
changeset
|
1533 { |
3d999a4d4892
[gaim-migrate @ 14770]
Richard Laager <rlaager@wiktel.com>
parents:
12379
diff
changeset
|
1534 imhtml_changed_cb(NULL, data); |
3d999a4d4892
[gaim-migrate @ 14770]
Richard Laager <rlaager@wiktel.com>
parents:
12379
diff
changeset
|
1535 } |
3d999a4d4892
[gaim-migrate @ 14770]
Richard Laager <rlaager@wiktel.com>
parents:
12379
diff
changeset
|
1536 |
11638 | 1537 char *gtk_gaim_status_box_get_message(GtkGaimStatusBox *status_box) |
10649 | 1538 { |
1539 if (status_box->imhtml_visible) | |
1540 return gtk_imhtml_get_markup(GTK_IMHTML(status_box->imhtml)); | |
1541 else | |
1542 return NULL; | |
1543 } |