Mercurial > pidgin
annotate src/gtkstatusbox.c @ 13623:51d436a267ac
[gaim-migrate @ 16009]
Use the GSlice allocator (for logs and log sets) when compiling with glib 2.10 or greater and eliminate some unnecessary memory zeroing. This cuts the log loading time in half for one of Luke's contacts.
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Tue, 11 Apr 2006 16:06:24 +0000 |
parents | 1a965241c8b9 |
children | 2b9aa05b6fa1 |
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 } | |
13316
41c4b4aa523a
[gaim-migrate @ 15682]
Richard Laager <rlaager@wiktel.com>
parents:
13283
diff
changeset
|
355 else if (status_box->account != NULL) |
41c4b4aa523a
[gaim-migrate @ 15682]
Richard Laager <rlaager@wiktel.com>
parents:
13283
diff
changeset
|
356 { |
41c4b4aa523a
[gaim-migrate @ 15682]
Richard Laager <rlaager@wiktel.com>
parents:
13283
diff
changeset
|
357 primary = g_strdup(gaim_status_get_name(gaim_account_get_active_status(status_box->account))); |
41c4b4aa523a
[gaim-migrate @ 15682]
Richard Laager <rlaager@wiktel.com>
parents:
13283
diff
changeset
|
358 } |
13124 | 359 else if (gaim_savedstatus_is_transient(saved_status)) |
360 primary = g_strdup(gaim_primitive_get_name_from_type(gaim_savedstatus_get_type(saved_status))); | |
361 else | |
362 primary = g_markup_escape_text(gaim_savedstatus_get_title(saved_status), -1); | |
13123 | 363 |
13124 | 364 /* Secondary */ |
365 if (status_box->typing != 0) | |
13123 | 366 secondary = g_strdup(_("Typing")); |
367 else if (status_box->connecting) | |
368 secondary = g_strdup(_("Connecting")); | |
13124 | 369 else if (gaim_savedstatus_is_transient(saved_status)) |
370 secondary = NULL; | |
13123 | 371 else |
372 { | |
13124 | 373 const char *message; |
374 char *tmp; | |
375 message = gaim_savedstatus_get_message(saved_status); | |
376 if (message != NULL) | |
13123 | 377 { |
13124 | 378 tmp = gaim_markup_strip_html(message); |
379 gaim_util_chrreplace(tmp, '\n', ' '); | |
380 secondary = g_markup_escape_text(tmp, -1); | |
381 g_free(tmp); | |
13123 | 382 } |
383 else | |
13124 | 384 secondary = NULL; |
385 } | |
13123 | 386 |
13124 | 387 /* Pixbuf */ |
388 if (status_box->typing != 0) | |
389 pixbuf = status_box->typing_pixbufs[status_box->typing_index]; | |
390 else if (status_box->connecting) | |
391 pixbuf = status_box->connecting_pixbufs[status_box->connecting_index]; | |
392 else | |
393 { | |
13316
41c4b4aa523a
[gaim-migrate @ 15682]
Richard Laager <rlaager@wiktel.com>
parents:
13283
diff
changeset
|
394 if (status_box->account != NULL) |
41c4b4aa523a
[gaim-migrate @ 15682]
Richard Laager <rlaager@wiktel.com>
parents:
13283
diff
changeset
|
395 pixbuf = gaim_gtk_create_prpl_icon_with_status(status_box->account, |
41c4b4aa523a
[gaim-migrate @ 15682]
Richard Laager <rlaager@wiktel.com>
parents:
13283
diff
changeset
|
396 gaim_status_get_type(gaim_account_get_active_status(status_box->account)), |
41c4b4aa523a
[gaim-migrate @ 15682]
Richard Laager <rlaager@wiktel.com>
parents:
13283
diff
changeset
|
397 show_buddy_icons ? 1.0 : 0.5); |
41c4b4aa523a
[gaim-migrate @ 15682]
Richard Laager <rlaager@wiktel.com>
parents:
13283
diff
changeset
|
398 else |
41c4b4aa523a
[gaim-migrate @ 15682]
Richard Laager <rlaager@wiktel.com>
parents:
13283
diff
changeset
|
399 pixbuf = gaim_gtk_create_gaim_icon_with_status( |
41c4b4aa523a
[gaim-migrate @ 15682]
Richard Laager <rlaager@wiktel.com>
parents:
13283
diff
changeset
|
400 gaim_savedstatus_get_type(saved_status), |
41c4b4aa523a
[gaim-migrate @ 15682]
Richard Laager <rlaager@wiktel.com>
parents:
13283
diff
changeset
|
401 show_buddy_icons ? 1.0 : 0.5); |
13124 | 402 |
403 if (!gaim_savedstatus_is_transient(saved_status)) | |
404 { | |
405 GdkPixbuf *emblem; | |
406 | |
407 /* Overlay a disk in the bottom left corner */ | |
408 emblem = gtk_widget_render_icon(GTK_WIDGET(status_box->vbox), | |
409 GTK_STOCK_SAVE, icon_size, "GtkGaimStatusBox"); | |
410 if (emblem != NULL) | |
411 { | |
412 int width, height; | |
413 width = gdk_pixbuf_get_width(pixbuf) / 2; | |
414 height = gdk_pixbuf_get_height(pixbuf) / 2; | |
415 gdk_pixbuf_composite(emblem, pixbuf, 0, height, | |
416 width, height, 0, height, | |
417 0.5, 0.5, GDK_INTERP_BILINEAR, 255); | |
418 g_object_unref(G_OBJECT(emblem)); | |
419 } | |
420 } | |
10643 | 421 } |
10861 | 422 |
13121 | 423 if (status_box->account != NULL) { |
13316
41c4b4aa523a
[gaim-migrate @ 15682]
Richard Laager <rlaager@wiktel.com>
parents:
13283
diff
changeset
|
424 text = g_strdup_printf("%s%s<span size=\"smaller\" color=\"%s\">%s</span>", |
12228 | 425 gaim_account_get_username(status_box->account), |
13316
41c4b4aa523a
[gaim-migrate @ 15682]
Richard Laager <rlaager@wiktel.com>
parents:
13283
diff
changeset
|
426 show_buddy_icons ? "\n" : " - ", aa_color, |
13123 | 427 secondary ? secondary : primary); |
428 } else if (secondary != NULL) { | |
13121 | 429 char *separator; |
430 separator = show_buddy_icons ? "\n" : " - "; | |
13123 | 431 text = g_strdup_printf("%s<span size=\"smaller\" color=\"%s\">%s%s</span>", |
432 primary, aa_color, separator, secondary); | |
12228 | 433 } else { |
13123 | 434 text = g_strdup(primary); |
11960 | 435 } |
13123 | 436 g_free(primary); |
437 g_free(secondary); | |
10643 | 438 |
13044 | 439 /* |
440 * Only two columns are used in this list store (does it | |
441 * really need to be a list store?) | |
442 */ | |
10643 | 443 gtk_list_store_set(status_box->store, &(status_box->iter), |
444 ICON_COLUMN, pixbuf, | |
10861 | 445 TEXT_COLUMN, text, |
11739 | 446 -1); |
13124 | 447 if ((status_box->typing == 0) && (!status_box->connecting)) |
448 g_object_unref(pixbuf); | |
13123 | 449 g_free(text); |
450 | |
451 /* Make sure to activate the only row in the tree view */ | |
10702 | 452 path = gtk_tree_path_new_from_string("0"); |
453 gtk_cell_view_set_displayed_row(GTK_CELL_VIEW(status_box->cell_view), path); | |
454 gtk_tree_path_free(path); | |
10643 | 455 |
12597
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
456 update_size(status_box); |
10643 | 457 } |
458 | |
11870 | 459 /** |
460 * This updates the GtkTreeView so that it correctly shows the state | |
461 * we are currently using. It is used when the current state is | |
462 * updated from somewhere other than the GtkStatusBox (from a plugin, | |
463 * or when signing on with the "-n" option, for example). It is | |
13025 | 464 * also used when the user selects the "New..." option. |
11870 | 465 * |
466 * Maybe we could accomplish this by triggering off the mouse and | |
467 * keyboard signals instead of the changed signal? | |
468 */ | |
469 static void | |
13124 | 470 status_menu_refresh_iter(GtkGaimStatusBox *status_box) |
11870 | 471 { |
472 GaimSavedStatus *saved_status; | |
13050 | 473 GaimStatusPrimitive primitive; |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
474 gint index; |
12125 | 475 const char *message; |
11870 | 476 |
11983 | 477 /* this function is inappropriate for ones with accounts */ |
478 if (status_box->account) | |
479 return; | |
480 | |
12125 | 481 saved_status = gaim_savedstatus_get_current(); |
11951 | 482 |
483 /* | |
484 * Suppress the "changed" signal because the status | |
485 * was changed programmatically. | |
486 */ | |
487 gtk_widget_set_sensitive(GTK_WIDGET(status_box), FALSE); | |
488 | |
13050 | 489 /* |
490 * If the saved_status is transient, is Available, Away, Invisible | |
491 * or Offline, and it does not have an substatuses, then select | |
492 * the primitive in the dropdown menu. Otherwise select the | |
493 * popular status in the dropdown menu. | |
494 */ | |
495 primitive = gaim_savedstatus_get_type(saved_status); | |
496 if (gaim_savedstatus_is_transient(saved_status) && | |
497 ((primitive == GAIM_STATUS_AVAILABLE) || (primitive == GAIM_STATUS_AWAY) || | |
498 (primitive == GAIM_STATUS_INVISIBLE) || (primitive == GAIM_STATUS_OFFLINE)) && | |
499 (!gaim_savedstatus_has_substatuses(saved_status))) | |
500 { | |
501 index = get_statusbox_index(status_box, saved_status); | |
13066 | 502 gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), index); |
13050 | 503 } |
11870 | 504 else |
505 { | |
13066 | 506 GtkTreeIter iter; |
13111 | 507 GtkGaimStatusBoxItemType type; |
508 gpointer data; | |
13066 | 509 |
510 /* Unset the active item */ | |
511 gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), -1); | |
512 | |
513 /* If this saved status is in the list store, then set it as the active item */ | |
514 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(status_box->dropdown_store), &iter)) | |
515 { | |
516 do | |
517 { | |
518 gtk_tree_model_get(GTK_TREE_MODEL(status_box->dropdown_store), &iter, | |
13111 | 519 TYPE_COLUMN, &type, |
13066 | 520 DATA_COLUMN, &data, |
521 -1); | |
13111 | 522 if ((type == GTK_GAIM_STATUS_BOX_TYPE_POPULAR) && |
523 (GPOINTER_TO_INT(data) == gaim_savedstatus_get_creation_time(saved_status))) | |
13066 | 524 { |
525 /* Found! */ | |
526 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(status_box), &iter); | |
527 break; | |
528 } | |
529 } | |
530 while (gtk_tree_model_iter_next(GTK_TREE_MODEL(status_box->dropdown_store), &iter)); | |
531 } | |
12125 | 532 } |
13050 | 533 |
12125 | 534 message = gaim_savedstatus_get_message(saved_status); |
13050 | 535 if (!gaim_savedstatus_is_transient(saved_status) || !message || !*message) |
12125 | 536 { |
537 status_box->imhtml_visible = FALSE; | |
538 gtk_widget_hide_all(status_box->vbox); | |
539 } | |
540 else | |
541 { | |
542 status_box->imhtml_visible = TRUE; | |
543 gtk_widget_show_all(status_box->vbox); | |
11870 | 544 |
12125 | 545 /* |
546 * Suppress the "changed" signal because the status | |
547 * was changed programmatically. | |
548 */ | |
549 gtk_widget_set_sensitive(GTK_WIDGET(status_box->imhtml), FALSE); | |
11954 | 550 |
12125 | 551 gtk_imhtml_clear(GTK_IMHTML(status_box->imhtml)); |
12274 | 552 gtk_imhtml_clear_formatting(GTK_IMHTML(status_box->imhtml)); |
12125 | 553 gtk_imhtml_append_text(GTK_IMHTML(status_box->imhtml), message, 0); |
554 gtk_widget_set_sensitive(GTK_WIDGET(status_box->imhtml), TRUE); | |
11870 | 555 } |
11951 | 556 |
12634
8512c990967b
[gaim-migrate @ 14970]
Richard Laager <rlaager@wiktel.com>
parents:
12619
diff
changeset
|
557 update_size(status_box); |
8512c990967b
[gaim-migrate @ 14970]
Richard Laager <rlaager@wiktel.com>
parents:
12619
diff
changeset
|
558 |
11951 | 559 /* Stop suppressing the "changed" signal. */ |
560 gtk_widget_set_sensitive(GTK_WIDGET(status_box), TRUE); | |
11870 | 561 } |
562 | |
11732 | 563 static void |
12778 | 564 add_popular_statuses(GtkGaimStatusBox *statusbox) |
565 { | |
13090 | 566 gboolean show_buddy_icons; |
13124 | 567 GtkIconSize icon_size; |
12778 | 568 GList *list, *cur; |
13062 | 569 GdkPixbuf *pixbuf, *emblem; |
570 int width, height; | |
12778 | 571 |
572 list = gaim_savedstatuses_get_popular(6); | |
573 if (list == NULL) | |
574 /* Odd... oh well, nothing we can do about it. */ | |
575 return; | |
576 | |
13090 | 577 show_buddy_icons = gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons"); |
578 if (show_buddy_icons) | |
12778 | 579 icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS); |
580 else | |
581 icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS_SMALL); | |
582 | |
12779 | 583 gtk_gaim_status_box_add_separator(statusbox); |
584 | |
12778 | 585 for (cur = list; cur != NULL; cur = cur->next) |
586 { | |
587 GaimSavedStatus *saved = cur->data; | |
13050 | 588 const gchar *message; |
13098
44a4bd35cc97
[gaim-migrate @ 15460]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
589 gchar *stripped = NULL; |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
590 |
13090 | 591 /* Get an appropriate status icon */ |
13121 | 592 pixbuf = gaim_gtk_create_gaim_icon_with_status( |
593 gaim_savedstatus_get_type(saved), | |
13090 | 594 show_buddy_icons ? 1.0 : 0.5); |
13050 | 595 |
596 if (gaim_savedstatus_is_transient(saved)) | |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
597 { |
13050 | 598 /* |
599 * Transient statuses do not have a title, so the savedstatus | |
600 * API returns the message when gaim_savedstatus_get_title() is | |
601 * called, so we don't need to get the message a second time. | |
602 */ | |
603 } | |
604 else | |
605 { | |
606 message = gaim_savedstatus_get_message(saved); | |
13098
44a4bd35cc97
[gaim-migrate @ 15460]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
607 if (message != NULL) |
44a4bd35cc97
[gaim-migrate @ 15460]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
608 { |
44a4bd35cc97
[gaim-migrate @ 15460]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
609 stripped = gaim_markup_strip_html(message); |
44a4bd35cc97
[gaim-migrate @ 15460]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
610 gaim_util_chrreplace(stripped, '\n', ' '); |
44a4bd35cc97
[gaim-migrate @ 15460]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
611 } |
13090 | 612 |
613 /* Overlay a disk in the bottom left corner */ | |
614 emblem = gtk_widget_render_icon(GTK_WIDGET(statusbox->vbox), | |
615 GTK_STOCK_SAVE, icon_size, "GtkGaimStatusBox"); | |
616 if (emblem != NULL) | |
617 { | |
618 width = gdk_pixbuf_get_width(pixbuf) / 2; | |
619 height = gdk_pixbuf_get_height(pixbuf) / 2; | |
620 gdk_pixbuf_composite(emblem, pixbuf, 0, height, | |
621 width, height, 0, height, | |
622 0.5, 0.5, GDK_INTERP_BILINEAR, 255); | |
623 g_object_unref(G_OBJECT(emblem)); | |
624 } | |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
625 } |
13090 | 626 |
12778 | 627 gtk_gaim_status_box_add(statusbox, GTK_GAIM_STATUS_BOX_TYPE_POPULAR, |
13079 | 628 pixbuf, gaim_savedstatus_get_title(saved), stripped, |
12778 | 629 GINT_TO_POINTER(gaim_savedstatus_get_creation_time(saved))); |
13050 | 630 g_free(stripped); |
13090 | 631 if (pixbuf != NULL) |
632 g_object_unref(G_OBJECT(pixbuf)); | |
12778 | 633 } |
634 | |
635 g_list_free(list); | |
636 } | |
637 | |
638 static void | |
11732 | 639 gtk_gaim_status_box_regenerate(GtkGaimStatusBox *status_box) |
640 { | |
13090 | 641 gboolean show_buddy_icons; |
11739 | 642 GaimAccount *account; |
13090 | 643 GdkPixbuf *pixbuf, *pixbuf2, *pixbuf3, *pixbuf4, *tmp; |
11732 | 644 GtkIconSize icon_size; |
645 | |
13090 | 646 show_buddy_icons = gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons"); |
647 if (show_buddy_icons) | |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
648 icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
649 else |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
650 icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS_SMALL); |
11732 | 651 |
12256 | 652 /* Unset the model while clearing it */ |
653 gtk_combo_box_set_model(GTK_COMBO_BOX(status_box), NULL); | |
11732 | 654 gtk_list_store_clear(status_box->dropdown_store); |
13241 | 655 /* Don't set the model until the new statuses have been added to the box. |
656 * What is presumably a bug in Gtk < 2.4 causes things to get all confused | |
657 * if we do this here. */ | |
658 /* 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
|
659 |
11739 | 660 account = GTK_GAIM_STATUS_BOX(status_box)->account; |
661 if (account == NULL) | |
662 { | |
12779 | 663 /* Global */ |
11756 | 664 pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), GAIM_STOCK_STATUS_ONLINE, |
11732 | 665 icon_size, "GtkGaimStatusBox"); |
11756 | 666 pixbuf2 = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), GAIM_STOCK_STATUS_AWAY, |
11732 | 667 icon_size, "GtkGaimStatusBox"); |
11756 | 668 pixbuf3 = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), GAIM_STOCK_STATUS_OFFLINE, |
11732 | 669 icon_size, "GtkGaimStatusBox"); |
11756 | 670 pixbuf4 = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), GAIM_STOCK_STATUS_INVISIBLE, |
11732 | 671 icon_size, "GtkGaimStatusBox"); |
12779 | 672 |
673 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)); | |
674 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)); | |
675 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)); | |
676 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)); | |
677 | |
678 add_popular_statuses(status_box); | |
679 | |
11738 | 680 gtk_gaim_status_box_add_separator(GTK_GAIM_STATUS_BOX(status_box)); |
13025 | 681 gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), GTK_GAIM_STATUS_BOX_TYPE_CUSTOM, pixbuf, _("New..."), NULL, NULL); |
12778 | 682 gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), GTK_GAIM_STATUS_BOX_TYPE_SAVED, pixbuf, _("Saved..."), NULL, NULL); |
683 | |
13241 | 684 gtk_combo_box_set_model(GTK_COMBO_BOX(status_box), GTK_TREE_MODEL(status_box->dropdown_store)); |
13124 | 685 status_menu_refresh_iter(status_box); |
11732 | 686 |
687 } else { | |
12779 | 688 /* Per-account */ |
11732 | 689 const GList *l; |
11739 | 690 |
691 for (l = gaim_account_get_status_types(account); l != NULL; l = l->next) | |
692 { | |
11732 | 693 GaimStatusType *status_type = (GaimStatusType *)l->data; |
694 | |
695 if (!gaim_status_type_is_user_settable(status_type)) | |
696 continue; | |
697 | |
13090 | 698 tmp = gaim_gtk_create_prpl_icon_with_status(account, status_type, |
699 show_buddy_icons ? 1.0 : 0.5); | |
11739 | 700 gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), |
13316
41c4b4aa523a
[gaim-migrate @ 15682]
Richard Laager <rlaager@wiktel.com>
parents:
13283
diff
changeset
|
701 GTK_GAIM_STATUS_BOX_TYPE_PRIMITIVE, tmp, |
11739 | 702 gaim_status_type_get_name(status_type), |
13316
41c4b4aa523a
[gaim-migrate @ 15682]
Richard Laager <rlaager@wiktel.com>
parents:
13283
diff
changeset
|
703 NULL, |
41c4b4aa523a
[gaim-migrate @ 15682]
Richard Laager <rlaager@wiktel.com>
parents:
13283
diff
changeset
|
704 GINT_TO_POINTER(gaim_status_type_get_primitive(status_type))); |
13090 | 705 if (tmp != NULL) |
706 g_object_unref(tmp); | |
11732 | 707 } |
13241 | 708 gtk_combo_box_set_model(GTK_COMBO_BOX(status_box), GTK_TREE_MODEL(status_box->dropdown_store)); |
11967 | 709 update_to_reflect_account_status(status_box, account, gaim_account_get_active_status(account)); |
11732 | 710 } |
711 } | |
712 | |
12827
0f40c44348f4
[gaim-migrate @ 15175]
Richard Laager <rlaager@wiktel.com>
parents:
12816
diff
changeset
|
713 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
|
714 { |
0f40c44348f4
[gaim-migrate @ 15175]
Richard Laager <rlaager@wiktel.com>
parents:
12816
diff
changeset
|
715 gtk_combo_box_popup(GTK_COMBO_BOX(w)); |
0f40c44348f4
[gaim-migrate @ 15175]
Richard Laager <rlaager@wiktel.com>
parents:
12816
diff
changeset
|
716 return TRUE; |
0f40c44348f4
[gaim-migrate @ 15175]
Richard Laager <rlaager@wiktel.com>
parents:
12816
diff
changeset
|
717 } |
0f40c44348f4
[gaim-migrate @ 15175]
Richard Laager <rlaager@wiktel.com>
parents:
12816
diff
changeset
|
718 |
0f40c44348f4
[gaim-migrate @ 15175]
Richard Laager <rlaager@wiktel.com>
parents:
12816
diff
changeset
|
719 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
|
720 { |
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
721 if (event->direction == GDK_SCROLL_UP) |
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
722 gtk_imhtml_page_up(imhtml); |
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
723 else if (event->direction == GDK_SCROLL_DOWN) |
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
724 gtk_imhtml_page_down(imhtml); |
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
725 return TRUE; |
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
726 } |
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
727 |
13123 | 728 static int imhtml_remove_focus(GtkWidget *w, GdkEventKey *event, GtkGaimStatusBox *status_box) |
12274 | 729 { |
730 if (event->keyval == GDK_Tab || event->keyval == GDK_KP_Tab) | |
731 { | |
732 /* If last inserted character is a tab, then remove the focus from here */ | |
733 GtkWidget *top = gtk_widget_get_toplevel(w); | |
734 g_signal_emit_by_name(G_OBJECT(top), "move_focus", | |
735 (event->state & GDK_SHIFT_MASK) ? | |
736 GTK_DIR_TAB_BACKWARD: GTK_DIR_TAB_FORWARD); | |
737 return TRUE; | |
738 } | |
13123 | 739 if (!status_box->typing != 0) |
12274 | 740 return FALSE; |
13123 | 741 gtk_gaim_status_box_pulse_typing(status_box); |
742 g_source_remove(status_box->typing); | |
743 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
|
744 |
12274 | 745 return FALSE; |
746 } | |
747 | |
11753 | 748 #if GTK_CHECK_VERSION(2,6,0) |
11738 | 749 static gboolean |
750 dropdown_store_row_separator_func(GtkTreeModel *model, | |
751 GtkTreeIter *iter, gpointer data) | |
752 { | |
11739 | 753 GtkGaimStatusBoxItemType type; |
11738 | 754 |
11885 | 755 gtk_tree_model_get(model, iter, TYPE_COLUMN, &type, -1); |
11738 | 756 |
11739 | 757 if (type == GTK_GAIM_STATUS_BOX_TYPE_SEPARATOR) |
11738 | 758 return TRUE; |
759 | |
760 return FALSE; | |
761 } | |
11753 | 762 #endif |
11738 | 763 |
10643 | 764 static void |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
765 cache_pixbufs(GtkGaimStatusBox *status_box) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
766 { |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
767 GtkIconSize icon_size; |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
768 |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
769 if (gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons")) |
13065 | 770 { |
771 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
|
772 icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS_TWO_LINE); |
13065 | 773 } else { |
774 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
|
775 icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS_SMALL_TWO_LINE); |
13065 | 776 } |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
777 |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
778 if (status_box->connecting_pixbufs[0] != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
779 gdk_pixbuf_unref(status_box->connecting_pixbufs[0]); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
780 if (status_box->connecting_pixbufs[1] != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
781 gdk_pixbuf_unref(status_box->connecting_pixbufs[1]); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
782 if (status_box->connecting_pixbufs[2] != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
783 gdk_pixbuf_unref(status_box->connecting_pixbufs[2]); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
784 if (status_box->connecting_pixbufs[3] != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
785 gdk_pixbuf_unref(status_box->connecting_pixbufs[3]); |
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 status_box->connecting_index = 0; |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
788 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
|
789 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
790 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
|
791 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
792 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
|
793 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
794 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
|
795 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
796 |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
797 if (status_box->typing_pixbufs[0] != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
798 gdk_pixbuf_unref(status_box->typing_pixbufs[0]); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
799 if (status_box->typing_pixbufs[1] != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
800 gdk_pixbuf_unref(status_box->typing_pixbufs[1]); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
801 if (status_box->typing_pixbufs[2] != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
802 gdk_pixbuf_unref(status_box->typing_pixbufs[2]); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
803 if (status_box->typing_pixbufs[3] != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
804 gdk_pixbuf_unref(status_box->typing_pixbufs[3]); |
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 status_box->typing_index = 0; |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
807 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
|
808 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
809 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
|
810 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
811 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
|
812 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
813 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
|
814 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
815 } |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
816 |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
817 static void |
11954 | 818 current_status_pref_changed_cb(const char *name, GaimPrefType type, |
12816 | 819 gconstpointer val, gpointer data) |
11954 | 820 { |
13121 | 821 GtkGaimStatusBox *status_box = data; |
12778 | 822 |
823 /* Make sure our current status is added to the list of popular statuses */ | |
13121 | 824 gtk_gaim_status_box_regenerate(status_box); |
12778 | 825 |
13121 | 826 if (status_box->account != NULL) |
827 update_to_reflect_account_status(status_box, status_box->account, | |
828 gaim_account_get_active_status(status_box->account)); | |
12244 | 829 else |
13124 | 830 status_menu_refresh_iter(status_box); |
13121 | 831 |
832 gtk_gaim_status_box_refresh(status_box); | |
11954 | 833 } |
834 | |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
835 static void |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
836 buddy_list_details_pref_changed_cb(const char *name, GaimPrefType type, |
12816 | 837 gconstpointer val, gpointer data) |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
838 { |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
839 GtkGaimStatusBox *status_box = (GtkGaimStatusBox *)data; |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
840 |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
841 cache_pixbufs(status_box); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
842 gtk_gaim_status_box_regenerate(status_box); |
13121 | 843 gtk_gaim_status_box_refresh(status_box); |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
844 } |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
845 |
12651 | 846 static void |
847 spellcheck_prefs_cb(const char *name, GaimPrefType type, | |
12816 | 848 gconstpointer value, gpointer data) |
12651 | 849 { |
850 #ifdef USE_GTKSPELL | |
851 GtkGaimStatusBox *status_box = (GtkGaimStatusBox *)data; | |
852 | |
853 if (value) | |
854 gaim_gtk_setup_gtkspell(GTK_TEXT_VIEW(status_box->imhtml)); | |
855 else | |
856 { | |
857 GtkSpell *spell; | |
858 spell = gtkspell_get_from_text_view(GTK_TEXT_VIEW(status_box->imhtml)); | |
859 gtkspell_detach(spell); | |
860 } | |
861 #endif | |
862 } | |
863 | |
12294
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
864 #if 0 |
12262 | 865 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
|
866 { |
12286
255e6912607b
[gaim-migrate @ 14590]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12275
diff
changeset
|
867 |
12274 | 868 if (event->button != 1) |
869 return FALSE; | |
12262 | 870 gtk_combo_box_popdown(GTK_COMBO_BOX(box)); |
871 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(box->toggle_button), FALSE); | |
872 if (!box->imhtml_visible) | |
873 g_signal_emit_by_name(G_OBJECT(box), "changed", NULL, NULL); | |
874 return TRUE; | |
875 } | |
876 | |
877 static gboolean button_pressed_cb(GtkWidget *widget, GdkEventButton *event, GtkGaimStatusBox *box) | |
878 { | |
12274 | 879 if (event->button != 1) |
880 return FALSE; | |
12262 | 881 gtk_combo_box_popup(GTK_COMBO_BOX(box)); |
12274 | 882 // Disabled until button_released_cb works |
883 // gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(box->toggle_button), TRUE); | |
12262 | 884 return TRUE; |
12074
950acb2bc835
[gaim-migrate @ 14370]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12060
diff
changeset
|
885 } |
12294
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
886 #endif |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
887 |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
888 static void |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
889 toggled_cb(GtkWidget *widget, GtkGaimStatusBox *box) |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
890 { |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
891 gtk_combo_box_popup(GTK_COMBO_BOX(box)); |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
892 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
|
893 } |
12074
950acb2bc835
[gaim-migrate @ 14370]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12060
diff
changeset
|
894 |
11954 | 895 static void |
10643 | 896 gtk_gaim_status_box_init (GtkGaimStatusBox *status_box) |
897 { | |
11400 | 898 GtkCellRenderer *text_rend; |
899 GtkCellRenderer *icon_rend; | |
10643 | 900 GtkTextBuffer *buffer; |
901 | |
902 status_box->imhtml_visible = FALSE; | |
903 status_box->connecting = FALSE; | |
13123 | 904 status_box->typing = 0; |
12262 | 905 status_box->toggle_button = gtk_toggle_button_new(); |
906 status_box->hbox = gtk_hbox_new(FALSE, 6); | |
10643 | 907 status_box->cell_view = gtk_cell_view_new(); |
12262 | 908 status_box->vsep = gtk_vseparator_new(); |
909 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
|
910 |
12778 | 911 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); |
912 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 | 913 gtk_combo_box_set_model(GTK_COMBO_BOX(status_box), GTK_TREE_MODEL(status_box->dropdown_store)); |
914 gtk_cell_view_set_model(GTK_CELL_VIEW(status_box->cell_view), GTK_TREE_MODEL(status_box->store)); | |
915 gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(status_box), 0); | |
916 gtk_list_store_append(status_box->store, &(status_box->iter)); | |
917 gtk_gaim_status_box_refresh(status_box); | |
12074
950acb2bc835
[gaim-migrate @ 14370]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12060
diff
changeset
|
918 |
12262 | 919 gtk_container_add(GTK_CONTAINER(status_box->toggle_button), status_box->hbox); |
920 gtk_box_pack_start(GTK_BOX(status_box->hbox), status_box->cell_view, TRUE, TRUE, 0); | |
12274 | 921 gtk_box_pack_start(GTK_BOX(status_box->hbox), status_box->vsep, FALSE, FALSE, 0); |
922 gtk_box_pack_start(GTK_BOX(status_box->hbox), status_box->arrow, FALSE, FALSE, 0); | |
12262 | 923 gtk_widget_show_all(status_box->toggle_button); |
924 #if GTK_CHECK_VERSION(2,4,0) | |
925 gtk_button_set_focus_on_click(GTK_BUTTON(status_box->toggle_button), FALSE); | |
926 #endif | |
10643 | 927 |
13044 | 928 text_rend = gtk_cell_renderer_text_new(); |
929 icon_rend = gtk_cell_renderer_pixbuf_new(); | |
10643 | 930 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box), icon_rend, FALSE); |
10861 | 931 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box), text_rend, TRUE); |
10643 | 932 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box), icon_rend, "pixbuf", ICON_COLUMN, NULL); |
933 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box), text_rend, "markup", TEXT_COLUMN, NULL); | |
13045 | 934 #if GTK_CHECK_VERSION(2, 6, 0) |
935 g_object_set(text_rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL); | |
936 #endif | |
10643 | 937 |
13044 | 938 status_box->icon_rend = gtk_cell_renderer_pixbuf_new(); |
939 status_box->text_rend = gtk_cell_renderer_text_new(); | |
10643 | 940 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box->cell_view), status_box->icon_rend, FALSE); |
11499 | 941 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box->cell_view), status_box->text_rend, TRUE); |
10643 | 942 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), status_box->icon_rend, "pixbuf", ICON_COLUMN, NULL); |
943 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), status_box->text_rend, "markup", TEXT_COLUMN, NULL); | |
13045 | 944 #if GTK_CHECK_VERSION(2, 6, 0) |
945 g_object_set(status_box->text_rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL); | |
946 #endif | |
10643 | 947 |
948 status_box->vbox = gtk_vbox_new(0, FALSE); | |
13280
3de53fe8345f
[gaim-migrate @ 15646]
Richard Laager <rlaager@wiktel.com>
parents:
13244
diff
changeset
|
949 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
|
950 gtk_imhtml_set_editable(GTK_IMHTML(status_box->imhtml), TRUE); |
12286
255e6912607b
[gaim-migrate @ 14590]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12275
diff
changeset
|
951 |
10643 | 952 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
|
953 #if 0 |
12274 | 954 g_signal_connect(G_OBJECT(status_box->toggle_button), "button-press-event", |
955 G_CALLBACK(button_pressed_cb), status_box); | |
956 g_signal_connect(G_OBJECT(status_box->toggle_button), "button-release-event", | |
957 G_CALLBACK(button_released_cb), status_box); | |
12294
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
958 #endif |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
959 g_signal_connect(G_OBJECT(status_box->toggle_button), "toggled", |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
960 G_CALLBACK(toggled_cb), status_box); |
10643 | 961 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
|
962 g_signal_connect(G_OBJECT(status_box->imhtml), "format_function_toggle", |
3d999a4d4892
[gaim-migrate @ 14770]
Richard Laager <rlaager@wiktel.com>
parents:
12379
diff
changeset
|
963 G_CALLBACK(imhtml_format_changed_cb), status_box); |
12274 | 964 g_signal_connect(G_OBJECT(status_box->imhtml), "key_press_event", |
965 G_CALLBACK(imhtml_remove_focus), status_box); | |
11562 | 966 g_signal_connect_swapped(G_OBJECT(status_box->imhtml), "message_send", G_CALLBACK(remove_typing_cb), status_box); |
10643 | 967 gtk_imhtml_set_editable(GTK_IMHTML(status_box->imhtml), TRUE); |
12651 | 968 #ifdef USE_GTKSPELL |
969 if (gaim_prefs_get_bool("/gaim/gtk/conversations/spellcheck")) | |
970 gaim_gtk_setup_gtkspell(GTK_TEXT_VIEW(status_box->imhtml)); | |
971 #endif | |
10643 | 972 gtk_widget_set_parent(status_box->vbox, GTK_WIDGET(status_box)); |
12262 | 973 gtk_widget_set_parent(status_box->toggle_button, GTK_WIDGET(status_box)); |
12275 | 974 GTK_BIN(status_box)->child = status_box->toggle_button; |
12269 | 975 |
10643 | 976 gtk_box_pack_start(GTK_BOX(status_box->vbox), status_box->sw, TRUE, TRUE, 0); |
11654 | 977 |
12827
0f40c44348f4
[gaim-migrate @ 15175]
Richard Laager <rlaager@wiktel.com>
parents:
12816
diff
changeset
|
978 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
|
979 g_signal_connect(G_OBJECT(status_box->imhtml), "scroll_event", |
12827
0f40c44348f4
[gaim-migrate @ 15175]
Richard Laager <rlaager@wiktel.com>
parents:
12816
diff
changeset
|
980 G_CALLBACK(imhtml_scroll_event_cb), status_box->imhtml); |
12075
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
981 |
11850 | 982 #if GTK_CHECK_VERSION(2,6,0) |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
983 gtk_combo_box_set_row_separator_func(GTK_COMBO_BOX(status_box), dropdown_store_row_separator_func, NULL, NULL); |
11850 | 984 #endif |
985 | |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
986 cache_pixbufs(status_box); |
11732 | 987 gtk_gaim_status_box_regenerate(status_box); |
11954 | 988 |
12123 | 989 gaim_prefs_connect_callback(status_box, "/core/savedstatus/current", |
11954 | 990 current_status_pref_changed_cb, status_box); |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
991 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
|
992 buddy_list_details_pref_changed_cb, status_box); |
12651 | 993 gaim_prefs_connect_callback(status_box, "/gaim/gtk/conversations/spellcheck", |
994 spellcheck_prefs_cb, status_box); | |
10643 | 995 } |
996 | |
997 static void | |
10861 | 998 gtk_gaim_status_box_size_request(GtkWidget *widget, |
999 GtkRequisition *requisition) | |
10643 | 1000 { |
1001 GtkRequisition box_req; | |
1002 combo_box_size_request(widget, requisition); | |
12596
037a673ba862
[gaim-migrate @ 14926]
Richard Laager <rlaager@wiktel.com>
parents:
12595
diff
changeset
|
1003 requisition->height += 3; |
10861 | 1004 |
13065 | 1005 /* If the gtkimhtml is visible, then add some additional padding */ |
10643 | 1006 gtk_widget_size_request(GTK_GAIM_STATUS_BOX(widget)->vbox, &box_req); |
1007 if (box_req.height > 1) | |
13065 | 1008 requisition->height += box_req.height + 3; |
12286
255e6912607b
[gaim-migrate @ 14590]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12275
diff
changeset
|
1009 |
10643 | 1010 requisition->width = 1; |
1011 } | |
1012 | |
1013 static void | |
10861 | 1014 gtk_gaim_status_box_size_allocate(GtkWidget *widget, |
1015 GtkAllocation *allocation) | |
10643 | 1016 { |
1017 GtkRequisition req = {0,0}; | |
11400 | 1018 GtkAllocation parent_alc, box_alc; |
1019 | |
10643 | 1020 combo_box_size_request(widget, &req); |
10861 | 1021 |
13065 | 1022 box_alc = *allocation; |
12596
037a673ba862
[gaim-migrate @ 14926]
Richard Laager <rlaager@wiktel.com>
parents:
12595
diff
changeset
|
1023 box_alc.height = MAX(1, (allocation->height - req.height - 6)); |
13065 | 1024 box_alc.y += req.height + 6; |
10643 | 1025 gtk_widget_size_allocate((GTK_GAIM_STATUS_BOX(widget))->vbox, &box_alc); |
10861 | 1026 |
13065 | 1027 parent_alc = *allocation; |
10643 | 1028 parent_alc.height = MAX(1,req.height); |
12102
8df87db79bad
[gaim-migrate @ 14399]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12100
diff
changeset
|
1029 parent_alc.y += 3; |
10643 | 1030 combo_box_size_allocate(widget, &parent_alc); |
12262 | 1031 gtk_widget_size_allocate((GTK_GAIM_STATUS_BOX(widget))->toggle_button, &parent_alc); |
10643 | 1032 widget->allocation = *allocation; |
1033 } | |
1034 | |
1035 static gboolean | |
10861 | 1036 gtk_gaim_status_box_expose_event(GtkWidget *widget, |
12262 | 1037 GdkEventExpose *event) |
10643 | 1038 { |
10861 | 1039 GtkGaimStatusBox *status_box = GTK_GAIM_STATUS_BOX(widget); |
12262 | 1040 gtk_container_propagate_expose(GTK_CONTAINER(widget), status_box->vbox, event); |
12275 | 1041 gtk_container_propagate_expose(GTK_CONTAINER(widget), status_box->toggle_button, event); |
10861 | 1042 return FALSE; |
10643 | 1043 } |
1044 | |
1045 static void | |
10861 | 1046 gtk_gaim_status_box_forall(GtkContainer *container, |
1047 gboolean include_internals, | |
1048 GtkCallback callback, | |
1049 gpointer callback_data) | |
10643 | 1050 { |
10861 | 1051 GtkGaimStatusBox *status_box = GTK_GAIM_STATUS_BOX (container); |
10643 | 1052 |
10861 | 1053 if (include_internals) |
1054 { | |
1055 (* callback) (status_box->vbox, callback_data); | |
12275 | 1056 (* callback) (status_box->toggle_button, callback_data); |
1057 (* callback) (status_box->arrow, callback_data); | |
10861 | 1058 } |
10643 | 1059 |
10861 | 1060 combo_box_forall(container, include_internals, callback, callback_data); |
10643 | 1061 } |
1062 | |
1063 GtkWidget * | |
1064 gtk_gaim_status_box_new() | |
1065 { | |
1066 return g_object_new(GTK_GAIM_TYPE_STATUS_BOX, NULL); | |
1067 } | |
1068 | |
11499 | 1069 GtkWidget * |
1070 gtk_gaim_status_box_new_with_account(GaimAccount *account) | |
1071 { | |
1072 return g_object_new(GTK_GAIM_TYPE_STATUS_BOX, "account", account, NULL); | |
1073 } | |
10643 | 1074 |
13050 | 1075 /** |
1076 * Add a row to the dropdown menu. | |
1077 * | |
1078 * @param status_box The status box itself. | |
1079 * @param type A GtkGaimStatusBoxItemType. | |
1080 * @param pixbuf The icon to associate with this row in the menu. | |
1081 * @param title The title of this item. For the primitive entries, | |
1082 * this is something like "Available" or "Away." For | |
1083 * the saved statuses, this is something like | |
1084 * "My favorite away message!" This should be | |
1085 * plaintext (non-markedup) (this function escapes it). | |
1086 * @param desc The secondary text for this item. This will be | |
1087 * placed on the row below the title, in a dimmer | |
1088 * font (generally gray). This text should be plaintext | |
1089 * (non-markedup) (this function escapes it). | |
1090 * @param data Data to be associated with this row in the dropdown | |
1091 * menu. For primitives this is the value of the | |
1092 * GaimStatusPrimitive. For saved statuses this is the | |
1093 * creation timestamp. | |
1094 */ | |
10643 | 1095 void |
13050 | 1096 gtk_gaim_status_box_add(GtkGaimStatusBox *status_box, GtkGaimStatusBoxItemType type, GdkPixbuf *pixbuf, const char *title, const char *desc, gpointer data) |
10643 | 1097 { |
1098 GtkTreeIter iter; | |
13050 | 1099 char *text; |
10861 | 1100 |
13050 | 1101 if (desc == NULL) |
1102 { | |
1103 text = g_markup_escape_text(title, -1); | |
1104 } | |
1105 else | |
1106 { | |
13385 | 1107 gboolean show_buddy_icons; |
1108 GtkStyle *style; | |
10643 | 1109 char aa_color[8]; |
13050 | 1110 gchar *escaped_title, *escaped_desc; |
1111 | |
13385 | 1112 show_buddy_icons = gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons"); |
13050 | 1113 style = gtk_widget_get_style(GTK_WIDGET(status_box)); |
10643 | 1114 snprintf(aa_color, sizeof(aa_color), "#%02x%02x%02x", |
1115 style->text_aa[GTK_STATE_NORMAL].red >> 8, | |
1116 style->text_aa[GTK_STATE_NORMAL].green >> 8, | |
10861 | 1117 style->text_aa[GTK_STATE_NORMAL].blue >> 8); |
13050 | 1118 |
1119 escaped_title = g_markup_escape_text(title, -1); | |
1120 escaped_desc = g_markup_escape_text(desc, -1); | |
13385 | 1121 text = g_strdup_printf("%s%s<span color=\"%s\" size=\"smaller\">%s</span>", |
1122 escaped_title, | |
1123 show_buddy_icons ? "\n" : " - ", | |
1124 aa_color, escaped_desc); | |
13050 | 1125 g_free(escaped_title); |
1126 g_free(escaped_desc); | |
10643 | 1127 } |
10861 | 1128 |
10643 | 1129 gtk_list_store_append(status_box->dropdown_store, &iter); |
1130 gtk_list_store_set(status_box->dropdown_store, &iter, | |
13050 | 1131 TYPE_COLUMN, type, |
1132 ICON_COLUMN, pixbuf, | |
1133 TEXT_COLUMN, text, | |
1134 TITLE_COLUMN, title, | |
1135 DESC_COLUMN, desc, | |
1136 DATA_COLUMN, data, | |
1137 -1); | |
1138 g_free(text); | |
10643 | 1139 } |
1140 | |
1141 void | |
11738 | 1142 gtk_gaim_status_box_add_separator(GtkGaimStatusBox *status_box) |
1143 { | |
11756 | 1144 /* Don't do anything unless GTK actually supports |
1145 * gtk_combo_box_set_row_separator_func */ | |
1146 #if GTK_CHECK_VERSION(2,6,0) | |
11738 | 1147 GtkTreeIter iter; |
1148 | |
1149 gtk_list_store_append(status_box->dropdown_store, &iter); | |
1150 gtk_list_store_set(status_box->dropdown_store, &iter, | |
11739 | 1151 TYPE_COLUMN, GTK_GAIM_STATUS_BOX_TYPE_SEPARATOR, |
1152 -1); | |
11756 | 1153 #endif |
11738 | 1154 } |
1155 | |
1156 void | |
10643 | 1157 gtk_gaim_status_box_set_connecting(GtkGaimStatusBox *status_box, gboolean connecting) |
1158 { | |
1159 if (!status_box) | |
1160 return; | |
1161 status_box->connecting = connecting; | |
1162 gtk_gaim_status_box_refresh(status_box); | |
1163 } | |
1164 | |
1165 void | |
1166 gtk_gaim_status_box_pulse_connecting(GtkGaimStatusBox *status_box) | |
1167 { | |
1168 if (!status_box) | |
1169 return; | |
1170 if (status_box->connecting_index == 3) | |
1171 status_box->connecting_index = 0; | |
10861 | 1172 else |
10643 | 1173 status_box->connecting_index++; |
1174 gtk_gaim_status_box_refresh(status_box); | |
1175 } | |
1176 | |
12274 | 1177 static void |
10643 | 1178 gtk_gaim_status_box_pulse_typing(GtkGaimStatusBox *status_box) |
1179 { | |
1180 if (status_box->typing_index == 3) | |
1181 status_box->typing_index = 0; | |
10861 | 1182 else |
10643 | 1183 status_box->typing_index++; |
1184 gtk_gaim_status_box_refresh(status_box); | |
1185 } | |
1186 | |
13050 | 1187 static GaimStatusType * |
1188 find_status_type_by_index(const GaimAccount *account, gint active) | |
11993 | 1189 { |
1190 const GList *l = gaim_account_get_status_types(account); | |
1191 gint i; | |
1192 | |
1193 for (i = 0; l; l = l->next) { | |
1194 GaimStatusType *status_type = l->data; | |
1195 if (!gaim_status_type_is_user_settable(status_type)) | |
1196 continue; | |
1197 | |
1198 if (active == i) | |
1199 return status_type; | |
1200 i++; | |
1201 } | |
1202 | |
1203 return NULL; | |
1204 } | |
1205 | |
12076
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1206 static gboolean |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1207 message_changed(const char *one, const char *two) |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1208 { |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1209 if (one == NULL && two == NULL) |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1210 return FALSE; |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1211 |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1212 if (one == NULL || two == NULL) |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1213 return TRUE; |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1214 |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1215 return (g_utf8_collate(one, two) != 0); |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1216 } |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1217 |
11654 | 1218 static void |
1219 activate_currently_selected_status(GtkGaimStatusBox *status_box) | |
10643 | 1220 { |
11739 | 1221 GtkGaimStatusBoxItemType type; |
12779 | 1222 gpointer data; |
11739 | 1223 gchar *title; |
10643 | 1224 GtkTreeIter iter; |
11654 | 1225 char *message; |
1226 GaimSavedStatus *saved_status; | |
12076
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1227 gboolean changed = TRUE; |
10643 | 1228 |
11951 | 1229 if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(status_box), &iter)) |
1230 return; | |
12659 | 1231 |
11654 | 1232 gtk_tree_model_get(GTK_TREE_MODEL(status_box->dropdown_store), &iter, |
12779 | 1233 TYPE_COLUMN, &type, |
1234 DATA_COLUMN, &data, | |
1235 -1); | |
12074
950acb2bc835
[gaim-migrate @ 14370]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12060
diff
changeset
|
1236 |
11739 | 1237 /* |
13025 | 1238 * If the currently selected status is "New..." or |
12779 | 1239 * "Saved..." or a popular status then do nothing. |
13124 | 1240 * Popular statuses are |
11954 | 1241 * activated elsewhere, and we update the status_box |
1242 * accordingly by monitoring the preference | |
12123 | 1243 * "/core/savedstatus/current" and then calling |
13124 | 1244 * status_menu_refresh_iter() |
11739 | 1245 */ |
12779 | 1246 if (type != GTK_GAIM_STATUS_BOX_TYPE_PRIMITIVE) |
11739 | 1247 return; |
11654 | 1248 |
12659 | 1249 gtk_tree_model_get(GTK_TREE_MODEL(status_box->dropdown_store), &iter, |
1250 TITLE_COLUMN, &title, -1); | |
1251 | |
1252 message = gtk_gaim_status_box_get_message(status_box); | |
1253 if (!message || !*message) | |
1254 { | |
1255 gtk_widget_hide_all(status_box->vbox); | |
1256 status_box->imhtml_visible = FALSE; | |
13230 | 1257 if (message != NULL) |
1258 { | |
1259 g_free(message); | |
1260 message = NULL; | |
1261 } | |
12659 | 1262 } |
1263 | |
12779 | 1264 if (status_box->account == NULL) { |
1265 /* Global */ | |
1266 /* Save the newly selected status to prefs.xml and status.xml */ | |
1267 | |
13111 | 1268 /* Has the status really been changed? */ |
12779 | 1269 saved_status = gaim_savedstatus_get_current(); |
1270 if (gaim_savedstatus_get_type(saved_status) == GPOINTER_TO_INT(data)) | |
1271 { | |
1272 if (!message_changed(gaim_savedstatus_get_message(saved_status), message)) | |
1273 changed = FALSE; | |
1274 } | |
1275 | |
1276 if (changed) | |
1277 { | |
13012 | 1278 /* If we've used this type+message before, lookup the transient status */ |
13244 | 1279 saved_status = gaim_savedstatus_find_transient_by_type_and_message( |
13012 | 1280 GPOINTER_TO_INT(data), message); |
1281 | |
1282 /* If this type+message is unique then create a new transient saved status */ | |
1283 if (saved_status == NULL) | |
1284 { | |
1285 saved_status = gaim_savedstatus_new(NULL, GPOINTER_TO_INT(data)); | |
1286 gaim_savedstatus_set_message(saved_status, message); | |
1287 } | |
12779 | 1288 |
1289 /* Set the status for each account */ | |
1290 gaim_savedstatus_activate(saved_status); | |
1291 } | |
1292 } else { | |
1293 /* Per-account */ | |
11981 | 1294 gint active; |
1295 GaimStatusType *status_type; | |
12076
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1296 GaimStatus *status; |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1297 const char *id = NULL; |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1298 |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1299 status = gaim_account_get_active_status(status_box->account); |
11981 | 1300 |
1301 g_object_get(G_OBJECT(status_box), "active", &active, NULL); | |
11654 | 1302 |
11993 | 1303 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
|
1304 id = gaim_status_type_get_id(status_type); |
11981 | 1305 |
12076
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1306 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
|
1307 { |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1308 /* Selected status and previous status is the same */ |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1309 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
|
1310 changed = FALSE; |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1311 } |
12123 | 1312 |
12076
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1313 if (changed) |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1314 { |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1315 if (message) |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1316 gaim_account_set_status(status_box->account, id, |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1317 TRUE, "message", message, NULL); |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1318 else |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1319 gaim_account_set_status(status_box->account, id, |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1320 TRUE, NULL); |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1321 } |
11981 | 1322 } |
11627 | 1323 |
11638 | 1324 g_free(title); |
11654 | 1325 g_free(message); |
1326 } | |
1327 | |
12597
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1328 static void update_size(GtkGaimStatusBox *status_box) |
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 GtkTextBuffer *buffer; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1331 GtkTextIter iter; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1332 int wrapped_lines; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1333 int lines; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1334 GdkRectangle oneline; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1335 int height; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1336 int pad_top, pad_inside, pad_bottom; |
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 if (!status_box->imhtml_visible) |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1339 { |
12598
1c122dbc8e9e
[gaim-migrate @ 14928]
Richard Laager <rlaager@wiktel.com>
parents:
12597
diff
changeset
|
1340 if (status_box->vbox != NULL) |
1c122dbc8e9e
[gaim-migrate @ 14928]
Richard Laager <rlaager@wiktel.com>
parents:
12597
diff
changeset
|
1341 gtk_widget_set_size_request(status_box->vbox, -1, -1); |
12597
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1342 return; |
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 |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1345 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
|
1346 |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1347 wrapped_lines = 1; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1348 gtk_text_buffer_get_start_iter(buffer, &iter); |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1349 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
|
1350 wrapped_lines++; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1351 |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1352 lines = gtk_text_buffer_get_line_count(buffer); |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1353 |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1354 /* Show a maximum of 4 lines */ |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1355 lines = MIN(lines, 4); |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1356 wrapped_lines = MIN(wrapped_lines, 4); |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1357 |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1358 gtk_text_buffer_get_start_iter(buffer, &iter); |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1359 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
|
1360 |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1361 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
|
1362 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
|
1363 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
|
1364 |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1365 height = (oneline.height + pad_top + pad_bottom) * lines; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1366 height += (oneline.height + pad_inside) * (wrapped_lines - lines); |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1367 |
12905
ee0c8c446eef
[gaim-migrate @ 15258]
Richard Laager <rlaager@wiktel.com>
parents:
12879
diff
changeset
|
1368 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
|
1369 } |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1370 |
11654 | 1371 static void remove_typing_cb(GtkGaimStatusBox *status_box) |
1372 { | |
12782 | 1373 if (status_box->typing == 0) |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1374 { |
12782 | 1375 /* Nothing has changed, so we don't need to do anything */ |
13124 | 1376 status_menu_refresh_iter(status_box); |
12782 | 1377 return; |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1378 } |
12782 | 1379 |
11654 | 1380 activate_currently_selected_status(status_box); |
1381 | |
1382 g_source_remove(status_box->typing); | |
1383 status_box->typing = 0; | |
1384 gtk_gaim_status_box_refresh(status_box); | |
10643 | 1385 } |
1386 | |
1387 static void gtk_gaim_status_box_changed(GtkComboBox *box) | |
1388 { | |
11400 | 1389 GtkGaimStatusBox *status_box; |
10643 | 1390 GtkTreeIter iter; |
11739 | 1391 GtkGaimStatusBoxItemType type; |
12778 | 1392 gpointer data; |
11960 | 1393 GList *accounts = NULL, *node; |
10643 | 1394 |
11400 | 1395 status_box = GTK_GAIM_STATUS_BOX(box); |
1396 | |
12074
950acb2bc835
[gaim-migrate @ 14370]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12060
diff
changeset
|
1397 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
|
1398 return; |
11739 | 1399 gtk_tree_model_get(GTK_TREE_MODEL(status_box->dropdown_store), &iter, |
1400 TYPE_COLUMN, &type, | |
12778 | 1401 DATA_COLUMN, &data, |
11739 | 1402 -1); |
13123 | 1403 if (status_box->typing != 0) |
11638 | 1404 g_source_remove(status_box->typing); |
1405 status_box->typing = 0; | |
10861 | 1406 |
11951 | 1407 if (GTK_WIDGET_IS_SENSITIVE(GTK_WIDGET(status_box))) |
11729 | 1408 { |
12778 | 1409 if (type == GTK_GAIM_STATUS_BOX_TYPE_POPULAR) |
1410 { | |
1411 GaimSavedStatus *saved; | |
1412 saved = gaim_savedstatus_find_by_creation_time(GPOINTER_TO_INT(data)); | |
1413 g_return_if_fail(saved != NULL); | |
1414 gaim_savedstatus_activate(saved); | |
1415 return; | |
1416 } | |
1417 | |
11951 | 1418 if (type == GTK_GAIM_STATUS_BOX_TYPE_CUSTOM) |
1419 { | |
13175 | 1420 GaimSavedStatus *saved_status; |
1421 saved_status = gaim_savedstatus_get_current(); | |
1422 gaim_gtk_status_editor_show(FALSE, | |
1423 gaim_savedstatus_is_transient(saved_status) | |
1424 ? saved_status : NULL); | |
13124 | 1425 status_menu_refresh_iter(status_box); |
11951 | 1426 return; |
1427 } | |
11729 | 1428 |
11951 | 1429 if (type == GTK_GAIM_STATUS_BOX_TYPE_SAVED) |
1430 { | |
1431 gaim_gtk_status_window_show(); | |
13124 | 1432 status_menu_refresh_iter(status_box); |
11951 | 1433 return; |
1434 } | |
11729 | 1435 } |
1436 | |
11654 | 1437 /* |
12779 | 1438 * Show the message box whenever the primitive allows for a |
11960 | 1439 * message attribute on any protocol that is enabled, |
1440 * or our protocol, if we have account set | |
11654 | 1441 */ |
11960 | 1442 if (status_box->account) |
1443 accounts = g_list_prepend(accounts, status_box->account); | |
1444 else | |
1445 accounts = gaim_accounts_get_all_active(); | |
11755 | 1446 status_box->imhtml_visible = FALSE; |
1447 for (node = accounts; node != NULL; node = node->next) | |
1448 { | |
1449 GaimAccount *account; | |
1450 GaimStatusType *status_type; | |
1451 | |
1452 account = node->data; | |
12779 | 1453 status_type = gaim_account_get_status_type_with_primitive(account, GPOINTER_TO_INT(data)); |
11755 | 1454 if ((status_type != NULL) && |
1455 (gaim_status_type_get_attr(status_type, "message") != NULL)) | |
1456 { | |
1457 status_box->imhtml_visible = TRUE; | |
1458 break; | |
1459 } | |
1460 } | |
1461 g_list_free(accounts); | |
11654 | 1462 |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1463 if (GTK_WIDGET_IS_SENSITIVE(GTK_WIDGET(status_box))) |
11654 | 1464 { |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1465 if (status_box->imhtml_visible) |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1466 { |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1467 GtkTextBuffer *buf; |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1468 GtkTextIter start, end; |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1469 gtk_widget_show_all(status_box->vbox); |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1470 if (GTK_WIDGET_IS_SENSITIVE(GTK_WIDGET(status_box))) { |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1471 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
|
1472 } |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1473 gtk_widget_grab_focus(status_box->imhtml); |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1474 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
|
1475 gtk_text_buffer_get_start_iter(buf, &start); |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1476 gtk_text_buffer_get_end_iter(buf, &end); |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1477 gtk_text_buffer_move_mark_by_name(buf, "insert", &end); |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1478 gtk_text_buffer_move_mark_by_name(buf, "selection_bound", &start); |
12274 | 1479 } |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1480 else |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1481 { |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1482 gtk_widget_hide_all(status_box->vbox); |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1483 if (GTK_WIDGET_IS_SENSITIVE(GTK_WIDGET(status_box))) |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1484 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
|
1485 } |
10643 | 1486 } |
1487 gtk_gaim_status_box_refresh(status_box); | |
1488 } | |
1489 | |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1490 static gint |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1491 get_statusbox_index(GtkGaimStatusBox *box, GaimSavedStatus *saved_status) |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1492 { |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1493 gint index; |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1494 |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1495 switch (gaim_savedstatus_get_type(saved_status)) |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1496 { |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1497 case GAIM_STATUS_AVAILABLE: |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1498 index = 0; |
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 case GAIM_STATUS_AWAY: |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1501 index = 1; |
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 case GAIM_STATUS_INVISIBLE: |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1504 index = 2; |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1505 break; |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1506 case GAIM_STATUS_OFFLINE: |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1507 index = 3; |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1508 break; |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1509 default: |
13079 | 1510 index = -1; |
12932
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1511 break; |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1512 } |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1513 |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1514 return index; |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1515 } |
d7b9fa3b7baf
[gaim-migrate @ 15285]
Luke Schierer <lschiere@pidgin.im>
parents:
12905
diff
changeset
|
1516 |
10643 | 1517 static void imhtml_changed_cb(GtkTextBuffer *buffer, void *data) |
1518 { | |
13123 | 1519 GtkGaimStatusBox *status_box = (GtkGaimStatusBox*)data; |
1520 if (GTK_WIDGET_IS_SENSITIVE(GTK_WIDGET(status_box))) | |
11951 | 1521 { |
13123 | 1522 if (status_box->typing != 0) { |
1523 gtk_gaim_status_box_pulse_typing(status_box); | |
1524 g_source_remove(status_box->typing); | |
11951 | 1525 } |
13123 | 1526 status_box->typing = g_timeout_add(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, status_box); |
10861 | 1527 } |
13123 | 1528 gtk_gaim_status_box_refresh(status_box); |
10643 | 1529 } |
10649 | 1530 |
12460
3d999a4d4892
[gaim-migrate @ 14770]
Richard Laager <rlaager@wiktel.com>
parents:
12379
diff
changeset
|
1531 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
|
1532 { |
3d999a4d4892
[gaim-migrate @ 14770]
Richard Laager <rlaager@wiktel.com>
parents:
12379
diff
changeset
|
1533 imhtml_changed_cb(NULL, data); |
3d999a4d4892
[gaim-migrate @ 14770]
Richard Laager <rlaager@wiktel.com>
parents:
12379
diff
changeset
|
1534 } |
3d999a4d4892
[gaim-migrate @ 14770]
Richard Laager <rlaager@wiktel.com>
parents:
12379
diff
changeset
|
1535 |
11638 | 1536 char *gtk_gaim_status_box_get_message(GtkGaimStatusBox *status_box) |
10649 | 1537 { |
1538 if (status_box->imhtml_visible) | |
1539 return gtk_imhtml_get_markup(GTK_IMHTML(status_box->imhtml)); | |
1540 else | |
1541 return NULL; | |
1542 } |