Mercurial > pidgin
annotate src/gtkstatusbox.c @ 12804:86d67bd4ef24
[gaim-migrate @ 15151]
I believe this fixes the "attempt to free unreferenced scalar" messages that
everyone was getting and doesn't seem to break anything else. Will Thompson
said it worked for him, so that's at least two of us. Let me know if this
breaks things for anyone.
committer: Tailor Script <tailor@pidgin.im>
author | Etan Reisner <pidgin@unreliablesource.net> |
---|---|
date | Tue, 10 Jan 2006 05:14:30 +0000 |
parents | 57d94c725dbc |
children | ff267281e882 |
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 | |
12274 | 26 #include <gdk/gdkkeysyms.h> |
27 | |
11627 | 28 #include "account.h" |
10643 | 29 #include "internal.h" |
11627 | 30 #include "savedstatuses.h" |
10643 | 31 #include "status.h" |
11732 | 32 #include "debug.h" |
11627 | 33 |
10643 | 34 #include "gtkgaim.h" |
11729 | 35 #include "gtksavedstatuses.h" |
10643 | 36 #include "gtkstock.h" |
37 #include "gtkstatusbox.h" | |
12080 | 38 #include "gtkutils.h" |
10643 | 39 |
12651 | 40 #ifdef USE_GTKSPELL |
41 # include <gtkspell/gtkspell.h> | |
42 # ifdef _WIN32 | |
43 # include "wspell.h" | |
44 # endif | |
45 #endif | |
46 | |
12309 | 47 #define TYPING_TIMEOUT 4000 |
48 | |
10643 | 49 static void imhtml_changed_cb(GtkTextBuffer *buffer, void *data); |
12460
3d999a4d4892
[gaim-migrate @ 14770]
Richard Laager <rlaager@wiktel.com>
parents:
12379
diff
changeset
|
50 static void imhtml_format_changed_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, void *data); |
11562 | 51 static void remove_typing_cb(GtkGaimStatusBox *box); |
12597
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
52 static void update_size (GtkGaimStatusBox *box); |
10643 | 53 |
12274 | 54 static void gtk_gaim_status_box_pulse_typing(GtkGaimStatusBox *status_box); |
11967 | 55 static void gtk_gaim_status_box_refresh(GtkGaimStatusBox *status_box); |
11732 | 56 static void gtk_gaim_status_box_regenerate(GtkGaimStatusBox *status_box); |
10643 | 57 static void gtk_gaim_status_box_changed(GtkComboBox *box); |
58 static void gtk_gaim_status_box_size_request (GtkWidget *widget, GtkRequisition *requisition); | |
59 static void gtk_gaim_status_box_size_allocate (GtkWidget *widget, GtkAllocation *allocation); | |
60 static gboolean gtk_gaim_status_box_expose_event (GtkWidget *widget, GdkEventExpose *event); | |
61 static void gtk_gaim_status_box_forall (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data); | |
62 | |
63 static void (*combo_box_size_request)(GtkWidget *widget, GtkRequisition *requisition); | |
64 static void (*combo_box_size_allocate)(GtkWidget *widget, GtkAllocation *allocation); | |
65 static void (*combo_box_forall) (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data); | |
11739 | 66 |
10643 | 67 enum { |
11739 | 68 TYPE_COLUMN, /* A GtkGaimStatusBoxItemType */ |
11738 | 69 ICON_COLUMN, /* This is a GdkPixbuf (the other columns are strings) */ |
70 TEXT_COLUMN, /* A string */ | |
71 TITLE_COLUMN, /* The plain-English title of this item */ | |
72 DESC_COLUMN, /* A plain-English description of this item */ | |
12779 | 73 DATA_COLUMN, /* Keep track of the creation time of popular |
74 statuses, and also the GaimStatusPrimitive */ | |
10643 | 75 NUM_COLUMNS |
76 }; | |
77 | |
11499 | 78 enum { |
79 PROP_0, | |
80 PROP_ACCOUNT | |
81 }; | |
82 | |
12379
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
83 GtkComboBoxClass *parent_class = NULL; |
12651 | 84 |
10643 | 85 static void gtk_gaim_status_box_class_init (GtkGaimStatusBoxClass *klass); |
86 static void gtk_gaim_status_box_init (GtkGaimStatusBox *status_box); | |
87 | |
88 GType | |
89 gtk_gaim_status_box_get_type (void) | |
90 { | |
10861 | 91 static GType status_box_type = 0; |
10643 | 92 |
10861 | 93 if (!status_box_type) |
94 { | |
95 static const GTypeInfo status_box_info = | |
96 { | |
97 sizeof (GtkGaimStatusBoxClass), | |
98 NULL, /* base_init */ | |
99 NULL, /* base_finalize */ | |
100 (GClassInitFunc) gtk_gaim_status_box_class_init, | |
101 NULL, /* class_finalize */ | |
102 NULL, /* class_data */ | |
103 sizeof (GtkGaimStatusBox), | |
104 0, | |
12221
152748df85cf
[gaim-migrate @ 14523]
Richard Laager <rlaager@wiktel.com>
parents:
12125
diff
changeset
|
105 (GInstanceInitFunc) gtk_gaim_status_box_init, |
152748df85cf
[gaim-migrate @ 14523]
Richard Laager <rlaager@wiktel.com>
parents:
12125
diff
changeset
|
106 NULL /* value_table */ |
10861 | 107 }; |
10643 | 108 |
10861 | 109 status_box_type = g_type_register_static(GTK_TYPE_COMBO_BOX, |
110 "GtkGaimStatusBox", | |
111 &status_box_info, | |
112 0); | |
113 } | |
10643 | 114 |
10861 | 115 return status_box_type; |
10643 | 116 } |
117 | |
118 static void | |
11499 | 119 gtk_gaim_status_box_get_property(GObject *object, guint param_id, |
120 GValue *value, GParamSpec *psec) | |
121 { | |
122 GtkGaimStatusBox *statusbox = GTK_GAIM_STATUS_BOX(object); | |
123 | |
124 switch (param_id) { | |
125 case PROP_ACCOUNT: | |
126 g_value_set_pointer(value, statusbox->account); | |
127 break; | |
128 default: | |
129 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, psec); | |
130 break; | |
131 } | |
132 } | |
133 | |
134 static void | |
11967 | 135 update_to_reflect_account_status(GtkGaimStatusBox *status_box, GaimAccount *account, GaimStatus *newstatus) |
11960 | 136 { |
11967 | 137 const GList *l; |
138 int status_no = -1; | |
139 const GaimStatusType *statustype = NULL; | |
12060 | 140 const char *message; |
11967 | 141 |
142 statustype = gaim_status_type_find_with_id((GList *)gaim_account_get_status_types(account), | |
143 (char *)gaim_status_type_get_id(gaim_status_get_type(newstatus))); | |
144 | |
145 for (l = gaim_account_get_status_types(account); l != NULL; l = l->next) { | |
146 GaimStatusType *status_type = (GaimStatusType *)l->data; | |
147 | |
148 if (!gaim_status_type_is_user_settable(status_type)) | |
149 continue; | |
150 status_no++; | |
151 if (statustype == status_type) | |
152 break; | |
153 } | |
154 | |
155 if (status_no != -1) { | |
156 gtk_widget_set_sensitive(GTK_WIDGET(status_box), FALSE); | |
157 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
|
158 |
12060 | 159 message = gaim_status_get_attr_string(newstatus, "message"); |
160 | |
161 if (!message || !*message) | |
162 { | |
163 gtk_widget_hide_all(status_box->vbox); | |
164 status_box->imhtml_visible = FALSE; | |
165 } | |
166 else | |
167 { | |
168 gtk_widget_show_all(status_box->vbox); | |
169 status_box->imhtml_visible = TRUE; | |
170 gtk_imhtml_clear(GTK_IMHTML(status_box->imhtml)); | |
12274 | 171 gtk_imhtml_clear_formatting(GTK_IMHTML(status_box->imhtml)); |
12060 | 172 gtk_imhtml_append_text(GTK_IMHTML(status_box->imhtml), message, 0); |
173 } | |
11967 | 174 gtk_widget_set_sensitive(GTK_WIDGET(status_box), TRUE); |
12274 | 175 gtk_gaim_status_box_refresh(status_box); |
11967 | 176 } |
177 } | |
178 | |
179 static void | |
180 account_status_changed_cb(GaimAccount *account, GaimStatus *oldstatus, GaimStatus *newstatus, GtkGaimStatusBox *status_box) | |
181 { | |
182 if (status_box->account == account) | |
183 update_to_reflect_account_status(status_box, account, newstatus); | |
11960 | 184 } |
185 | |
186 static void | |
11499 | 187 gtk_gaim_status_box_set_property(GObject *object, guint param_id, |
188 const GValue *value, GParamSpec *pspec) | |
189 { | |
190 GtkGaimStatusBox *statusbox = GTK_GAIM_STATUS_BOX(object); | |
191 | |
192 switch (param_id) { | |
193 case PROP_ACCOUNT: | |
194 statusbox->account = g_value_get_pointer(value); | |
11960 | 195 |
11967 | 196 if (statusbox->status_changed_signal) { |
197 gaim_signal_disconnect(gaim_accounts_get_handle(), "account-status-changed", | |
198 statusbox, GAIM_CALLBACK(account_status_changed_cb)); | |
199 statusbox->status_changed_signal = 0; | |
200 } | |
12286
255e6912607b
[gaim-migrate @ 14590]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12275
diff
changeset
|
201 |
11960 | 202 if (statusbox->account) |
11967 | 203 statusbox->status_changed_signal = gaim_signal_connect(gaim_accounts_get_handle(), "account-status-changed", |
11960 | 204 statusbox, GAIM_CALLBACK(account_status_changed_cb), |
205 statusbox); | |
11732 | 206 gtk_gaim_status_box_regenerate(statusbox); |
12256 | 207 |
11499 | 208 break; |
209 default: | |
210 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec); | |
211 break; | |
212 } | |
213 } | |
214 | |
215 static void | |
12379
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
216 gtk_gaim_status_box_finalize(GObject *obj) |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
217 { |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
218 GtkGaimStatusBox *statusbox = GTK_GAIM_STATUS_BOX(obj); |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
219 |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
220 if (statusbox->status_changed_signal) { |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
221 gaim_signal_disconnect(gaim_accounts_get_handle(), "account-status-changed", |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
222 statusbox, GAIM_CALLBACK(account_status_changed_cb)); |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
223 statusbox->status_changed_signal = 0; |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
224 } |
12651 | 225 gaim_prefs_disconnect_by_handle(statusbox); |
12379
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
226 |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
227 G_OBJECT_CLASS(parent_class)->finalize(obj); |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
228 } |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
229 |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
230 static void |
10643 | 231 gtk_gaim_status_box_class_init (GtkGaimStatusBoxClass *klass) |
232 { | |
10861 | 233 GObjectClass *object_class; |
12379
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
234 GtkComboBoxClass *combo_class; |
10861 | 235 GtkWidgetClass *widget_class; |
236 GtkContainerClass *container_class = (GtkContainerClass*)klass; | |
10643 | 237 |
12379
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
238 parent_class = g_type_class_peek_parent(klass); |
12651 | 239 |
12379
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
240 combo_class = (GtkComboBoxClass*)klass; |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
241 combo_class->changed = gtk_gaim_status_box_changed; |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
242 |
10861 | 243 widget_class = (GtkWidgetClass*)klass; |
244 combo_box_size_request = widget_class->size_request; | |
245 widget_class->size_request = gtk_gaim_status_box_size_request; | |
246 combo_box_size_allocate = widget_class->size_allocate; | |
247 widget_class->size_allocate = gtk_gaim_status_box_size_allocate; | |
248 widget_class->expose_event = gtk_gaim_status_box_expose_event; | |
10643 | 249 |
10861 | 250 combo_box_forall = container_class->forall; |
251 container_class->forall = gtk_gaim_status_box_forall; | |
252 | |
253 object_class = (GObjectClass *)klass; | |
11499 | 254 |
12379
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
255 object_class->finalize = gtk_gaim_status_box_finalize; |
24c5fbfca306
[gaim-migrate @ 14683]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12320
diff
changeset
|
256 |
11499 | 257 object_class->get_property = gtk_gaim_status_box_get_property; |
258 object_class->set_property = gtk_gaim_status_box_set_property; | |
259 | |
260 g_object_class_install_property(object_class, | |
261 PROP_ACCOUNT, | |
262 g_param_spec_pointer("account", | |
263 "Account", | |
264 "The account, or NULL for all accounts", | |
265 G_PARAM_READWRITE | |
266 ) | |
267 ); | |
10643 | 268 } |
269 | |
270 static void | |
271 gtk_gaim_status_box_refresh(GtkGaimStatusBox *status_box) | |
272 { | |
12228 | 273 char *text = NULL, *title; |
10643 | 274 char aa_color[8]; |
275 GdkPixbuf *pixbuf; | |
10702 | 276 GtkTreePath *path; |
11870 | 277 GtkStyle *style; |
10643 | 278 |
11870 | 279 style = gtk_widget_get_style(GTK_WIDGET(status_box)); |
10643 | 280 snprintf(aa_color, sizeof(aa_color), "#%02x%02x%02x", |
281 style->text_aa[GTK_STATE_NORMAL].red >> 8, | |
282 style->text_aa[GTK_STATE_NORMAL].green >> 8, | |
283 style->text_aa[GTK_STATE_NORMAL].blue >> 8); | |
10672
0925c898b73c
[gaim-migrate @ 12212]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10661
diff
changeset
|
284 |
0925c898b73c
[gaim-migrate @ 12212]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10661
diff
changeset
|
285 title = status_box->title; |
0925c898b73c
[gaim-migrate @ 12212]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10661
diff
changeset
|
286 if (!title) |
0925c898b73c
[gaim-migrate @ 12212]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10661
diff
changeset
|
287 title = ""; |
0925c898b73c
[gaim-migrate @ 12212]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10661
diff
changeset
|
288 |
10643 | 289 if (status_box->error) { |
12228 | 290 text = g_strdup_printf("<span size=\"smaller\" weight=\"bold\" color=\"red\">%s</span>", |
291 status_box->error); | |
10643 | 292 } else if (status_box->typing) { |
12228 | 293 text = g_strdup_printf("<span size=\"smaller\" color=\"%s\">%s</span>", |
294 aa_color, _("Typing")); | |
10643 | 295 } else if (status_box->connecting) { |
12228 | 296 text = g_strdup_printf("<span size=\"smaller\" color=\"%s\">%s</span>", |
297 aa_color, _("Connecting")); | |
10861 | 298 } else if (status_box->desc) { |
12228 | 299 text = g_strdup_printf("<span size=\"smaller\" color=\"%s\">%s</span>", |
300 aa_color, status_box->desc); | |
10643 | 301 } |
10861 | 302 |
11960 | 303 if (status_box->account) { |
12228 | 304 char *text2 = g_strdup_printf("%s\n<span size=\"smaller\">%s</span>", |
305 gaim_account_get_username(status_box->account), | |
306 text ? text : title); | |
11960 | 307 g_free(text); |
308 text = text2; | |
12228 | 309 } else if (text) { |
310 char *text2 = g_strdup_printf("%s\n%s", title, text); | |
311 g_free(text); | |
312 text = text2; | |
313 } else { | |
314 text = g_strdup(title); | |
11960 | 315 } |
316 | |
11523 | 317 if (status_box->connecting) |
318 pixbuf = status_box->connecting_pixbufs[status_box->connecting_index]; | |
319 else if (status_box->error) | |
10643 | 320 pixbuf = status_box->error_pixbuf; |
321 else if (status_box->typing) | |
322 pixbuf = status_box->typing_pixbufs[status_box->typing_index]; | |
323 else | |
324 pixbuf = status_box->pixbuf; | |
325 | |
326 gtk_list_store_set(status_box->store, &(status_box->iter), | |
11755 | 327 TYPE_COLUMN, -1, /* This field is not used in this list store */ |
10643 | 328 ICON_COLUMN, pixbuf, |
10861 | 329 TEXT_COLUMN, text, |
10672
0925c898b73c
[gaim-migrate @ 12212]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10661
diff
changeset
|
330 TITLE_COLUMN, title, |
10861 | 331 DESC_COLUMN, status_box->desc, |
12778 | 332 DATA_COLUMN, -1, /* This field is not used in this list store */ |
11739 | 333 -1); |
10702 | 334 path = gtk_tree_path_new_from_string("0"); |
335 gtk_cell_view_set_displayed_row(GTK_CELL_VIEW(status_box->cell_view), path); | |
336 gtk_tree_path_free(path); | |
10643 | 337 |
338 g_free(text); | |
12597
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
339 update_size(status_box); |
10643 | 340 } |
341 | |
11870 | 342 /** |
343 * This updates the GtkTreeView so that it correctly shows the state | |
344 * we are currently using. It is used when the current state is | |
345 * updated from somewhere other than the GtkStatusBox (from a plugin, | |
346 * or when signing on with the "-n" option, for example). It is | |
347 * also used when the user selects the "Custom..." option. | |
348 * | |
349 * Maybe we could accomplish this by triggering off the mouse and | |
350 * keyboard signals instead of the changed signal? | |
351 */ | |
352 static void | |
353 update_to_reflect_current_status(GtkGaimStatusBox *status_box) | |
354 { | |
355 GaimSavedStatus *saved_status; | |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
356 guint index; |
12125 | 357 const char *message; |
11870 | 358 |
11983 | 359 /* this function is inappropriate for ones with accounts */ |
360 if (status_box->account) | |
361 return; | |
362 | |
12125 | 363 saved_status = gaim_savedstatus_get_current(); |
11951 | 364 |
365 /* | |
366 * Suppress the "changed" signal because the status | |
367 * was changed programmatically. | |
368 */ | |
369 gtk_widget_set_sensitive(GTK_WIDGET(status_box), FALSE); | |
370 | |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
371 if (gaim_savedstatus_has_substatuses(saved_status)) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
372 index = 5; |
11870 | 373 else |
374 { | |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
375 switch (gaim_savedstatus_get_type(saved_status)) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
376 { |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
377 case GAIM_STATUS_AVAILABLE: |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
378 index = 0; |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
379 break; |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
380 case GAIM_STATUS_AWAY: |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
381 index = 1; |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
382 break; |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
383 case GAIM_STATUS_INVISIBLE: |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
384 index = 2; |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
385 break; |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
386 case GAIM_STATUS_OFFLINE: |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
387 index = 3; |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
388 break; |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
389 default: |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
390 index = 5; |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
391 break; |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
392 } |
12125 | 393 } |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
394 gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), index); |
11870 | 395 |
12125 | 396 message = gaim_savedstatus_get_message(saved_status); |
397 if (!message || !*message) | |
398 { | |
399 status_box->imhtml_visible = FALSE; | |
400 gtk_widget_hide_all(status_box->vbox); | |
401 } | |
402 else | |
403 { | |
404 status_box->imhtml_visible = TRUE; | |
405 gtk_widget_show_all(status_box->vbox); | |
11870 | 406 |
12125 | 407 /* |
408 * Suppress the "changed" signal because the status | |
409 * was changed programmatically. | |
410 */ | |
411 gtk_widget_set_sensitive(GTK_WIDGET(status_box->imhtml), FALSE); | |
11954 | 412 |
12125 | 413 gtk_imhtml_clear(GTK_IMHTML(status_box->imhtml)); |
12274 | 414 gtk_imhtml_clear_formatting(GTK_IMHTML(status_box->imhtml)); |
12125 | 415 gtk_imhtml_append_text(GTK_IMHTML(status_box->imhtml), message, 0); |
416 gtk_widget_set_sensitive(GTK_WIDGET(status_box->imhtml), TRUE); | |
11870 | 417 } |
11951 | 418 |
12634
8512c990967b
[gaim-migrate @ 14970]
Richard Laager <rlaager@wiktel.com>
parents:
12619
diff
changeset
|
419 update_size(status_box); |
8512c990967b
[gaim-migrate @ 14970]
Richard Laager <rlaager@wiktel.com>
parents:
12619
diff
changeset
|
420 |
11951 | 421 /* Stop suppressing the "changed" signal. */ |
422 gtk_widget_set_sensitive(GTK_WIDGET(status_box), TRUE); | |
11870 | 423 } |
424 | |
11732 | 425 static void |
12778 | 426 add_popular_statuses(GtkGaimStatusBox *statusbox) |
427 { | |
428 GList *list, *cur; | |
429 GtkIconSize icon_size; | |
430 GdkPixbuf *pixbuf; | |
431 | |
432 list = gaim_savedstatuses_get_popular(6); | |
433 if (list == NULL) | |
434 /* Odd... oh well, nothing we can do about it. */ | |
435 return; | |
436 | |
437 if (gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons")) | |
438 icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS); | |
439 else | |
440 icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS_SMALL); | |
441 | |
442 pixbuf = gtk_widget_render_icon(GTK_WIDGET(statusbox->vbox), GAIM_STOCK_STATUS_AWAY, | |
443 icon_size, "GtkGaimStatusBox"); | |
444 | |
12779 | 445 gtk_gaim_status_box_add_separator(statusbox); |
446 | |
12778 | 447 for (cur = list; cur != NULL; cur = cur->next) |
448 { | |
449 GaimSavedStatus *saved = cur->data; | |
450 gtk_gaim_status_box_add(statusbox, GTK_GAIM_STATUS_BOX_TYPE_POPULAR, | |
451 pixbuf, gaim_savedstatus_get_title(saved), NULL, | |
452 GINT_TO_POINTER(gaim_savedstatus_get_creation_time(saved))); | |
453 } | |
454 | |
455 g_list_free(list); | |
456 } | |
457 | |
458 static void | |
11732 | 459 gtk_gaim_status_box_regenerate(GtkGaimStatusBox *status_box) |
460 { | |
11739 | 461 GaimAccount *account; |
11732 | 462 GdkPixbuf *pixbuf, *pixbuf2, *pixbuf3, *pixbuf4; |
463 GtkIconSize icon_size; | |
464 | |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
465 if (gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons")) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
466 icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
467 else |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
468 icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS_SMALL); |
11732 | 469 |
12256 | 470 /* Unset the model while clearing it */ |
471 gtk_combo_box_set_model(GTK_COMBO_BOX(status_box), NULL); | |
11732 | 472 gtk_list_store_clear(status_box->dropdown_store); |
12256 | 473 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
|
474 |
11739 | 475 account = GTK_GAIM_STATUS_BOX(status_box)->account; |
476 if (account == NULL) | |
477 { | |
12779 | 478 /* Global */ |
11756 | 479 pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), GAIM_STOCK_STATUS_ONLINE, |
11732 | 480 icon_size, "GtkGaimStatusBox"); |
11756 | 481 pixbuf2 = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), GAIM_STOCK_STATUS_AWAY, |
11732 | 482 icon_size, "GtkGaimStatusBox"); |
11756 | 483 pixbuf3 = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), GAIM_STOCK_STATUS_OFFLINE, |
11732 | 484 icon_size, "GtkGaimStatusBox"); |
11756 | 485 pixbuf4 = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), GAIM_STOCK_STATUS_INVISIBLE, |
11732 | 486 icon_size, "GtkGaimStatusBox"); |
12779 | 487 |
488 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)); | |
489 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)); | |
490 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)); | |
491 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)); | |
492 | |
493 add_popular_statuses(status_box); | |
494 | |
11738 | 495 gtk_gaim_status_box_add_separator(GTK_GAIM_STATUS_BOX(status_box)); |
12778 | 496 gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), GTK_GAIM_STATUS_BOX_TYPE_CUSTOM, pixbuf, _("Custom..."), NULL, NULL); |
497 gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), GTK_GAIM_STATUS_BOX_TYPE_SAVED, pixbuf, _("Saved..."), NULL, NULL); | |
498 | |
11870 | 499 update_to_reflect_current_status(status_box); |
11732 | 500 |
501 } else { | |
12779 | 502 /* Per-account */ |
11732 | 503 const GList *l; |
11739 | 504 |
505 for (l = gaim_account_get_status_types(account); l != NULL; l = l->next) | |
506 { | |
11732 | 507 GaimStatusType *status_type = (GaimStatusType *)l->data; |
508 | |
509 if (!gaim_status_type_is_user_settable(status_type)) | |
510 continue; | |
511 | |
11739 | 512 gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), |
513 gaim_status_type_get_primitive(status_type), | |
12080 | 514 gaim_gtk_create_prpl_icon_with_status(account, status_type), |
11739 | 515 gaim_status_type_get_name(status_type), |
12778 | 516 NULL, NULL); |
11732 | 517 } |
12779 | 518 |
11967 | 519 update_to_reflect_account_status(status_box, account, gaim_account_get_active_status(account)); |
11732 | 520 } |
521 } | |
522 | |
12075
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
523 static gboolean scroll_event_cb(GtkWidget *w, GdkEventScroll *event, GtkIMHtml *imhtml) |
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
524 { |
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
525 if (event->direction == GDK_SCROLL_UP) |
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
526 gtk_imhtml_page_up(imhtml); |
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
527 else if (event->direction == GDK_SCROLL_DOWN) |
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
528 gtk_imhtml_page_down(imhtml); |
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
529 return TRUE; |
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
530 } |
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
531 |
12274 | 532 static int imhtml_remove_focus(GtkWidget *w, GdkEventKey *event, GtkGaimStatusBox *box) |
533 { | |
534 if (event->keyval == GDK_Tab || event->keyval == GDK_KP_Tab) | |
535 { | |
536 /* If last inserted character is a tab, then remove the focus from here */ | |
537 GtkWidget *top = gtk_widget_get_toplevel(w); | |
538 g_signal_emit_by_name(G_OBJECT(top), "move_focus", | |
539 (event->state & GDK_SHIFT_MASK) ? | |
540 GTK_DIR_TAB_BACKWARD: GTK_DIR_TAB_FORWARD); | |
541 return TRUE; | |
542 } | |
543 if (!box->typing) | |
544 return FALSE; | |
545 gtk_gaim_status_box_pulse_typing(box); | |
546 g_source_remove(box->typing); | |
12309 | 547 box->typing = g_timeout_add(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, box); |
12460
3d999a4d4892
[gaim-migrate @ 14770]
Richard Laager <rlaager@wiktel.com>
parents:
12379
diff
changeset
|
548 |
12274 | 549 return FALSE; |
550 } | |
551 | |
11753 | 552 #if GTK_CHECK_VERSION(2,6,0) |
11738 | 553 static gboolean |
554 dropdown_store_row_separator_func(GtkTreeModel *model, | |
555 GtkTreeIter *iter, gpointer data) | |
556 { | |
11739 | 557 GtkGaimStatusBoxItemType type; |
11738 | 558 |
11885 | 559 gtk_tree_model_get(model, iter, TYPE_COLUMN, &type, -1); |
11738 | 560 |
11739 | 561 if (type == GTK_GAIM_STATUS_BOX_TYPE_SEPARATOR) |
11738 | 562 return TRUE; |
563 | |
564 return FALSE; | |
565 } | |
11753 | 566 #endif |
11738 | 567 |
10643 | 568 static void |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
569 cache_pixbufs(GtkGaimStatusBox *status_box) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
570 { |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
571 GtkIconSize icon_size; |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
572 |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
573 if (gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons")) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
574 icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS_TWO_LINE); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
575 else |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
576 icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS_SMALL_TWO_LINE); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
577 |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
578 if (status_box->error_pixbuf != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
579 gdk_pixbuf_unref(status_box->error_pixbuf); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
580 |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
581 status_box->error_pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), GAIM_STOCK_STATUS_OFFLINE, |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
582 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
583 if (status_box->connecting_pixbufs[0] != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
584 gdk_pixbuf_unref(status_box->connecting_pixbufs[0]); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
585 if (status_box->connecting_pixbufs[1] != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
586 gdk_pixbuf_unref(status_box->connecting_pixbufs[1]); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
587 if (status_box->connecting_pixbufs[2] != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
588 gdk_pixbuf_unref(status_box->connecting_pixbufs[2]); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
589 if (status_box->connecting_pixbufs[3] != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
590 gdk_pixbuf_unref(status_box->connecting_pixbufs[3]); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
591 |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
592 status_box->connecting_index = 0; |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
593 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
|
594 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
595 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
|
596 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
597 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
|
598 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
599 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
|
600 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
601 |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
602 if (status_box->typing_pixbufs[0] != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
603 gdk_pixbuf_unref(status_box->typing_pixbufs[0]); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
604 if (status_box->typing_pixbufs[1] != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
605 gdk_pixbuf_unref(status_box->typing_pixbufs[1]); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
606 if (status_box->typing_pixbufs[2] != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
607 gdk_pixbuf_unref(status_box->typing_pixbufs[2]); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
608 if (status_box->typing_pixbufs[3] != NULL) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
609 gdk_pixbuf_unref(status_box->typing_pixbufs[3]); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
610 |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
611 status_box->typing_index = 0; |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
612 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
|
613 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
614 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
|
615 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
616 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
|
617 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
618 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
|
619 icon_size, "GtkGaimStatusBox"); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
620 } |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
621 |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
622 static void |
11954 | 623 current_status_pref_changed_cb(const char *name, GaimPrefType type, |
624 gpointer val, gpointer data) | |
625 { | |
12244 | 626 GtkGaimStatusBox *box = data; |
12778 | 627 |
628 /* Make sure our current status is added to the list of popular statuses */ | |
629 gtk_gaim_status_box_regenerate(box); | |
630 | |
12244 | 631 if (box->account) |
632 update_to_reflect_account_status(box, box->account, | |
633 gaim_account_get_active_status(box->account)); | |
634 else | |
635 update_to_reflect_current_status(box); | |
11954 | 636 } |
637 | |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
638 static void |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
639 buddy_list_details_pref_changed_cb(const char *name, GaimPrefType type, |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
640 gpointer val, gpointer data) |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
641 { |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
642 GtkGaimStatusBox *status_box = (GtkGaimStatusBox *)data; |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
643 |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
644 cache_pixbufs(status_box); |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
645 gtk_gaim_status_box_regenerate(status_box); |
12606
51b0ce9d45d9
[gaim-migrate @ 14942]
Richard Laager <rlaager@wiktel.com>
parents:
12598
diff
changeset
|
646 update_size(status_box); |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
647 } |
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
648 |
12651 | 649 static void |
650 spellcheck_prefs_cb(const char *name, GaimPrefType type, | |
651 gpointer value, gpointer data) | |
652 { | |
653 #ifdef USE_GTKSPELL | |
654 GtkGaimStatusBox *status_box = (GtkGaimStatusBox *)data; | |
655 | |
656 if (value) | |
657 gaim_gtk_setup_gtkspell(GTK_TEXT_VIEW(status_box->imhtml)); | |
658 else | |
659 { | |
660 GtkSpell *spell; | |
661 spell = gtkspell_get_from_text_view(GTK_TEXT_VIEW(status_box->imhtml)); | |
662 gtkspell_detach(spell); | |
663 } | |
664 #endif | |
665 } | |
666 | |
12294
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
667 #if 0 |
12262 | 668 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
|
669 { |
12286
255e6912607b
[gaim-migrate @ 14590]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12275
diff
changeset
|
670 |
12274 | 671 if (event->button != 1) |
672 return FALSE; | |
12262 | 673 gtk_combo_box_popdown(GTK_COMBO_BOX(box)); |
674 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(box->toggle_button), FALSE); | |
675 if (!box->imhtml_visible) | |
676 g_signal_emit_by_name(G_OBJECT(box), "changed", NULL, NULL); | |
677 return TRUE; | |
678 } | |
679 | |
680 static gboolean button_pressed_cb(GtkWidget *widget, GdkEventButton *event, GtkGaimStatusBox *box) | |
681 { | |
12274 | 682 if (event->button != 1) |
683 return FALSE; | |
12262 | 684 gtk_combo_box_popup(GTK_COMBO_BOX(box)); |
12274 | 685 // Disabled until button_released_cb works |
686 // gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(box->toggle_button), TRUE); | |
12262 | 687 return TRUE; |
12074
950acb2bc835
[gaim-migrate @ 14370]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12060
diff
changeset
|
688 } |
12294
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
689 #endif |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
690 |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
691 static void |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
692 toggled_cb(GtkWidget *widget, GtkGaimStatusBox *box) |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
693 { |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
694 gtk_combo_box_popup(GTK_COMBO_BOX(box)); |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
695 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
|
696 } |
12074
950acb2bc835
[gaim-migrate @ 14370]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12060
diff
changeset
|
697 |
11954 | 698 static void |
10643 | 699 gtk_gaim_status_box_init (GtkGaimStatusBox *status_box) |
700 { | |
12269 | 701 GtkWidget *vbox; |
11400 | 702 GtkCellRenderer *text_rend; |
703 GtkCellRenderer *icon_rend; | |
10643 | 704 GtkTextBuffer *buffer; |
11732 | 705 GtkTreePath *path; |
11400 | 706 |
707 text_rend = gtk_cell_renderer_text_new(); | |
708 icon_rend = gtk_cell_renderer_pixbuf_new(); | |
10643 | 709 |
710 status_box->imhtml_visible = FALSE; | |
711 status_box->connecting = FALSE; | |
712 status_box->typing = FALSE; | |
713 status_box->title = NULL; | |
10861 | 714 status_box->pixbuf = NULL; |
12262 | 715 status_box->toggle_button = gtk_toggle_button_new(); |
716 status_box->hbox = gtk_hbox_new(FALSE, 6); | |
10643 | 717 status_box->cell_view = gtk_cell_view_new(); |
12262 | 718 status_box->vsep = gtk_vseparator_new(); |
719 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
|
720 |
12778 | 721 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); |
722 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 | 723 gtk_combo_box_set_model(GTK_COMBO_BOX(status_box), GTK_TREE_MODEL(status_box->dropdown_store)); |
724 gtk_cell_view_set_model(GTK_CELL_VIEW(status_box->cell_view), GTK_TREE_MODEL(status_box->store)); | |
725 gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(status_box), 0); | |
726 gtk_list_store_append(status_box->store, &(status_box->iter)); | |
727 gtk_gaim_status_box_refresh(status_box); | |
11593
4b7fb30b8926
[gaim-migrate @ 13863]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11562
diff
changeset
|
728 path = gtk_tree_path_new_from_string("0"); |
4b7fb30b8926
[gaim-migrate @ 13863]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11562
diff
changeset
|
729 gtk_cell_view_set_displayed_row(GTK_CELL_VIEW(status_box->cell_view), path); |
4b7fb30b8926
[gaim-migrate @ 13863]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11562
diff
changeset
|
730 gtk_tree_path_free(path); |
12074
950acb2bc835
[gaim-migrate @ 14370]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12060
diff
changeset
|
731 |
12262 | 732 gtk_container_add(GTK_CONTAINER(status_box->toggle_button), status_box->hbox); |
733 gtk_box_pack_start(GTK_BOX(status_box->hbox), status_box->cell_view, TRUE, TRUE, 0); | |
12274 | 734 gtk_box_pack_start(GTK_BOX(status_box->hbox), status_box->vsep, FALSE, FALSE, 0); |
735 gtk_box_pack_start(GTK_BOX(status_box->hbox), status_box->arrow, FALSE, FALSE, 0); | |
12262 | 736 gtk_widget_show_all(status_box->toggle_button); |
737 #if GTK_CHECK_VERSION(2,4,0) | |
738 gtk_button_set_focus_on_click(GTK_BUTTON(status_box->toggle_button), FALSE); | |
739 #endif | |
10643 | 740 status_box->icon_rend = gtk_cell_renderer_pixbuf_new(); |
741 status_box->text_rend = gtk_cell_renderer_text_new(); | |
742 | |
743 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box), icon_rend, FALSE); | |
10861 | 744 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box), text_rend, TRUE); |
10643 | 745 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box), icon_rend, "pixbuf", ICON_COLUMN, NULL); |
746 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box), text_rend, "markup", TEXT_COLUMN, NULL); | |
747 | |
748 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box->cell_view), status_box->icon_rend, FALSE); | |
11499 | 749 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box->cell_view), status_box->text_rend, TRUE); |
10643 | 750 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), status_box->icon_rend, "pixbuf", ICON_COLUMN, NULL); |
751 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), status_box->text_rend, "markup", TEXT_COLUMN, NULL); | |
752 | |
12262 | 753 g_object_set(G_OBJECT(status_box->icon_rend), "xpad", 6, NULL); |
754 | |
10643 | 755 status_box->vbox = gtk_vbox_new(0, FALSE); |
12269 | 756 vbox = gtk_vbox_new(0,FALSE); |
12274 | 757 status_box->imhtml = gtk_imhtml_new(NULL, NULL); |
12286
255e6912607b
[gaim-migrate @ 14590]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12275
diff
changeset
|
758 |
10643 | 759 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
|
760 #if 0 |
12274 | 761 g_signal_connect(G_OBJECT(status_box->toggle_button), "button-press-event", |
762 G_CALLBACK(button_pressed_cb), status_box); | |
763 g_signal_connect(G_OBJECT(status_box->toggle_button), "button-release-event", | |
764 G_CALLBACK(button_released_cb), status_box); | |
12294
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
765 #endif |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
766 g_signal_connect(G_OBJECT(status_box->toggle_button), "toggled", |
d6b5373948f9
[gaim-migrate @ 14598]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12286
diff
changeset
|
767 G_CALLBACK(toggled_cb), status_box); |
10643 | 768 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
|
769 g_signal_connect(G_OBJECT(status_box->imhtml), "format_function_toggle", |
3d999a4d4892
[gaim-migrate @ 14770]
Richard Laager <rlaager@wiktel.com>
parents:
12379
diff
changeset
|
770 G_CALLBACK(imhtml_format_changed_cb), status_box); |
12274 | 771 g_signal_connect(G_OBJECT(status_box->imhtml), "key_press_event", |
772 G_CALLBACK(imhtml_remove_focus), status_box); | |
11562 | 773 g_signal_connect_swapped(G_OBJECT(status_box->imhtml), "message_send", G_CALLBACK(remove_typing_cb), status_box); |
10643 | 774 gtk_imhtml_set_editable(GTK_IMHTML(status_box->imhtml), TRUE); |
12651 | 775 #ifdef USE_GTKSPELL |
776 if (gaim_prefs_get_bool("/gaim/gtk/conversations/spellcheck")) | |
777 gaim_gtk_setup_gtkspell(GTK_TEXT_VIEW(status_box->imhtml)); | |
778 #endif | |
10643 | 779 gtk_widget_set_parent(status_box->vbox, GTK_WIDGET(status_box)); |
12262 | 780 gtk_widget_set_parent(status_box->toggle_button, GTK_WIDGET(status_box)); |
12275 | 781 GTK_BIN(status_box)->child = status_box->toggle_button; |
10643 | 782 status_box->sw = gtk_scrolled_window_new(NULL, NULL); |
783 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(status_box->sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); | |
784 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(status_box->sw), GTK_SHADOW_IN); | |
12320 | 785 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(status_box->sw), vbox); |
12269 | 786 gtk_box_pack_start(GTK_BOX(vbox), status_box->imhtml, TRUE, TRUE, 0); |
787 | |
10643 | 788 gtk_box_pack_start(GTK_BOX(status_box->vbox), status_box->sw, TRUE, TRUE, 0); |
11654 | 789 |
12286
255e6912607b
[gaim-migrate @ 14590]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12275
diff
changeset
|
790 g_signal_connect(G_OBJECT(status_box->imhtml), "scroll_event", |
12075
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
791 G_CALLBACK(scroll_event_cb), status_box->imhtml); |
f62022e07351
[gaim-migrate @ 14372]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12074
diff
changeset
|
792 |
11850 | 793 #if GTK_CHECK_VERSION(2,6,0) |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
794 gtk_combo_box_set_row_separator_func(GTK_COMBO_BOX(status_box), dropdown_store_row_separator_func, NULL, NULL); |
11850 | 795 #endif |
796 | |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
797 cache_pixbufs(status_box); |
11732 | 798 gtk_gaim_status_box_regenerate(status_box); |
11954 | 799 |
12123 | 800 gaim_prefs_connect_callback(status_box, "/core/savedstatus/current", |
11954 | 801 current_status_pref_changed_cb, status_box); |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12585
diff
changeset
|
802 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
|
803 buddy_list_details_pref_changed_cb, status_box); |
12651 | 804 gaim_prefs_connect_callback(status_box, "/gaim/gtk/conversations/spellcheck", |
805 spellcheck_prefs_cb, status_box); | |
10643 | 806 } |
807 | |
808 static void | |
10861 | 809 gtk_gaim_status_box_size_request(GtkWidget *widget, |
810 GtkRequisition *requisition) | |
10643 | 811 { |
812 GtkRequisition box_req; | |
813 combo_box_size_request(widget, requisition); | |
12596
037a673ba862
[gaim-migrate @ 14926]
Richard Laager <rlaager@wiktel.com>
parents:
12595
diff
changeset
|
814 requisition->height += 3; |
10861 | 815 |
10643 | 816 gtk_widget_size_request(GTK_GAIM_STATUS_BOX(widget)->vbox, &box_req); |
817 if (box_req.height > 1) | |
12596
037a673ba862
[gaim-migrate @ 14926]
Richard Laager <rlaager@wiktel.com>
parents:
12595
diff
changeset
|
818 requisition->height = requisition->height + box_req.height + 3; |
12286
255e6912607b
[gaim-migrate @ 14590]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12275
diff
changeset
|
819 |
10643 | 820 requisition->width = 1; |
821 } | |
822 | |
823 static void | |
10861 | 824 gtk_gaim_status_box_size_allocate(GtkWidget *widget, |
825 GtkAllocation *allocation) | |
10643 | 826 { |
827 GtkRequisition req = {0,0}; | |
11400 | 828 GtkAllocation parent_alc, box_alc; |
829 | |
830 parent_alc = *allocation; | |
831 box_alc = *allocation; | |
10643 | 832 combo_box_size_request(widget, &req); |
10861 | 833 |
12596
037a673ba862
[gaim-migrate @ 14926]
Richard Laager <rlaager@wiktel.com>
parents:
12595
diff
changeset
|
834 box_alc.height = MAX(1, (allocation->height - req.height - 6)); |
037a673ba862
[gaim-migrate @ 14926]
Richard Laager <rlaager@wiktel.com>
parents:
12595
diff
changeset
|
835 box_alc.y = box_alc.y + req.height + 6; |
10861 | 836 |
12102
8df87db79bad
[gaim-migrate @ 14399]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12100
diff
changeset
|
837 box_alc.width -= 6; |
8df87db79bad
[gaim-migrate @ 14399]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12100
diff
changeset
|
838 box_alc.x += 3; |
12100 | 839 |
10643 | 840 gtk_widget_size_allocate((GTK_GAIM_STATUS_BOX(widget))->vbox, &box_alc); |
10861 | 841 |
10643 | 842 parent_alc.height = MAX(1,req.height); |
12102
8df87db79bad
[gaim-migrate @ 14399]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12100
diff
changeset
|
843 parent_alc.width -= 6; |
8df87db79bad
[gaim-migrate @ 14399]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12100
diff
changeset
|
844 parent_alc.x += 3; |
8df87db79bad
[gaim-migrate @ 14399]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12100
diff
changeset
|
845 parent_alc.y += 3; |
12100 | 846 |
10643 | 847 combo_box_size_allocate(widget, &parent_alc); |
12262 | 848 gtk_widget_size_allocate((GTK_GAIM_STATUS_BOX(widget))->toggle_button, &parent_alc); |
10643 | 849 widget->allocation = *allocation; |
850 } | |
851 | |
852 static gboolean | |
10861 | 853 gtk_gaim_status_box_expose_event(GtkWidget *widget, |
12262 | 854 GdkEventExpose *event) |
10643 | 855 { |
10861 | 856 GtkGaimStatusBox *status_box = GTK_GAIM_STATUS_BOX(widget); |
12262 | 857 gtk_container_propagate_expose(GTK_CONTAINER(widget), status_box->vbox, event); |
12275 | 858 gtk_container_propagate_expose(GTK_CONTAINER(widget), status_box->toggle_button, event); |
10861 | 859 return FALSE; |
10643 | 860 } |
861 | |
862 static void | |
10861 | 863 gtk_gaim_status_box_forall(GtkContainer *container, |
864 gboolean include_internals, | |
865 GtkCallback callback, | |
866 gpointer callback_data) | |
10643 | 867 { |
10861 | 868 GtkGaimStatusBox *status_box = GTK_GAIM_STATUS_BOX (container); |
10643 | 869 |
10861 | 870 if (include_internals) |
871 { | |
872 (* callback) (status_box->vbox, callback_data); | |
12275 | 873 (* callback) (status_box->toggle_button, callback_data); |
874 (* callback) (status_box->arrow, callback_data); | |
10861 | 875 } |
10643 | 876 |
10861 | 877 combo_box_forall(container, include_internals, callback, callback_data); |
10643 | 878 } |
879 | |
880 GtkWidget * | |
881 gtk_gaim_status_box_new() | |
882 { | |
883 return g_object_new(GTK_GAIM_TYPE_STATUS_BOX, NULL); | |
884 } | |
885 | |
11499 | 886 GtkWidget * |
887 gtk_gaim_status_box_new_with_account(GaimAccount *account) | |
888 { | |
889 return g_object_new(GTK_GAIM_TYPE_STATUS_BOX, "account", account, NULL); | |
890 } | |
10643 | 891 |
892 void | |
12778 | 893 gtk_gaim_status_box_add(GtkGaimStatusBox *status_box, GtkGaimStatusBoxItemType type, GdkPixbuf *pixbuf, const char *text, const char *sec_text, gpointer data) |
10643 | 894 { |
895 GtkTreeIter iter; | |
896 char *t; | |
10861 | 897 |
10643 | 898 if (sec_text) { |
899 char aa_color[8]; | |
900 GtkStyle *style = gtk_widget_get_style(GTK_WIDGET(status_box)); | |
901 snprintf(aa_color, sizeof(aa_color), "#%02x%02x%02x", | |
902 style->text_aa[GTK_STATE_NORMAL].red >> 8, | |
903 style->text_aa[GTK_STATE_NORMAL].green >> 8, | |
10861 | 904 style->text_aa[GTK_STATE_NORMAL].blue >> 8); |
10643 | 905 t = g_strdup_printf("%s\n<span color=\"%s\">%s</span>", text, aa_color, sec_text); |
906 } else { | |
907 t = g_strdup(text); | |
908 } | |
10861 | 909 |
10643 | 910 gtk_list_store_append(status_box->dropdown_store, &iter); |
911 gtk_list_store_set(status_box->dropdown_store, &iter, | |
11739 | 912 TYPE_COLUMN, type, |
10643 | 913 ICON_COLUMN, pixbuf, |
10861 | 914 TEXT_COLUMN, t, |
10643 | 915 TITLE_COLUMN, text, |
10861 | 916 DESC_COLUMN, sec_text, |
12778 | 917 DATA_COLUMN, data, |
11739 | 918 -1); |
11638 | 919 g_free(t); |
10643 | 920 } |
921 | |
922 void | |
11738 | 923 gtk_gaim_status_box_add_separator(GtkGaimStatusBox *status_box) |
924 { | |
11756 | 925 /* Don't do anything unless GTK actually supports |
926 * gtk_combo_box_set_row_separator_func */ | |
927 #if GTK_CHECK_VERSION(2,6,0) | |
11738 | 928 GtkTreeIter iter; |
929 | |
930 gtk_list_store_append(status_box->dropdown_store, &iter); | |
931 gtk_list_store_set(status_box->dropdown_store, &iter, | |
11739 | 932 TYPE_COLUMN, GTK_GAIM_STATUS_BOX_TYPE_SEPARATOR, |
933 -1); | |
11756 | 934 #endif |
11738 | 935 } |
936 | |
937 void | |
10643 | 938 gtk_gaim_status_box_set_error(GtkGaimStatusBox *status_box, const gchar *error) |
939 { | |
11523 | 940 if (status_box->error) |
941 g_free(status_box->error); | |
11891 | 942 status_box->error = NULL; |
943 if (error != NULL) | |
944 status_box->error = g_strdup(error); | |
10643 | 945 gtk_gaim_status_box_refresh(status_box); |
946 } | |
947 | |
948 void | |
949 gtk_gaim_status_box_set_connecting(GtkGaimStatusBox *status_box, gboolean connecting) | |
950 { | |
951 if (!status_box) | |
952 return; | |
953 status_box->connecting = connecting; | |
954 gtk_gaim_status_box_refresh(status_box); | |
955 } | |
956 | |
957 void | |
958 gtk_gaim_status_box_pulse_connecting(GtkGaimStatusBox *status_box) | |
959 { | |
960 if (!status_box) | |
961 return; | |
962 if (status_box->connecting_index == 3) | |
963 status_box->connecting_index = 0; | |
10861 | 964 else |
10643 | 965 status_box->connecting_index++; |
966 gtk_gaim_status_box_refresh(status_box); | |
967 } | |
968 | |
12274 | 969 static void |
10643 | 970 gtk_gaim_status_box_pulse_typing(GtkGaimStatusBox *status_box) |
971 { | |
972 if (status_box->typing_index == 3) | |
973 status_box->typing_index = 0; | |
10861 | 974 else |
10643 | 975 status_box->typing_index++; |
976 gtk_gaim_status_box_refresh(status_box); | |
977 } | |
978 | |
11993 | 979 static GaimStatusType |
980 *find_status_type_by_index(const GaimAccount *account, gint active) | |
981 { | |
982 const GList *l = gaim_account_get_status_types(account); | |
983 gint i; | |
984 | |
985 for (i = 0; l; l = l->next) { | |
986 GaimStatusType *status_type = l->data; | |
987 if (!gaim_status_type_is_user_settable(status_type)) | |
988 continue; | |
989 | |
990 if (active == i) | |
991 return status_type; | |
992 i++; | |
993 } | |
994 | |
995 return NULL; | |
996 } | |
997 | |
12076
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
998 static gboolean |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
999 message_changed(const char *one, const char *two) |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1000 { |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1001 if (one == NULL && two == NULL) |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1002 return FALSE; |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1003 |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1004 if (one == NULL || two == NULL) |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1005 return TRUE; |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1006 |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1007 return (g_utf8_collate(one, two) != 0); |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1008 } |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1009 |
11654 | 1010 static void |
1011 activate_currently_selected_status(GtkGaimStatusBox *status_box) | |
10643 | 1012 { |
11739 | 1013 GtkGaimStatusBoxItemType type; |
12779 | 1014 gpointer data; |
11739 | 1015 gchar *title; |
10643 | 1016 GtkTreeIter iter; |
11654 | 1017 char *message; |
1018 GaimSavedStatus *saved_status; | |
12076
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1019 gboolean changed = TRUE; |
10643 | 1020 |
11951 | 1021 if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(status_box), &iter)) |
1022 return; | |
12659 | 1023 |
11654 | 1024 gtk_tree_model_get(GTK_TREE_MODEL(status_box->dropdown_store), &iter, |
12779 | 1025 TYPE_COLUMN, &type, |
1026 DATA_COLUMN, &data, | |
1027 -1); | |
12074
950acb2bc835
[gaim-migrate @ 14370]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12060
diff
changeset
|
1028 |
11739 | 1029 /* |
1030 * If the currently selected status is "Custom..." or | |
12779 | 1031 * "Saved..." or a popular status then do nothing. |
1032 * Custom statuses are | |
11954 | 1033 * activated elsewhere, and we update the status_box |
1034 * accordingly by monitoring the preference | |
12123 | 1035 * "/core/savedstatus/current" and then calling |
11954 | 1036 * update_to_reflect_current_status() |
11739 | 1037 */ |
12779 | 1038 if (type != GTK_GAIM_STATUS_BOX_TYPE_PRIMITIVE) |
11739 | 1039 return; |
11654 | 1040 |
12659 | 1041 gtk_tree_model_get(GTK_TREE_MODEL(status_box->dropdown_store), &iter, |
1042 TITLE_COLUMN, &title, -1); | |
1043 | |
1044 message = gtk_gaim_status_box_get_message(status_box); | |
1045 if (!message || !*message) | |
1046 { | |
1047 gtk_widget_hide_all(status_box->vbox); | |
1048 status_box->imhtml_visible = FALSE; | |
1049 } | |
1050 | |
12779 | 1051 if (status_box->account == NULL) { |
1052 /* Global */ | |
1053 /* Save the newly selected status to prefs.xml and status.xml */ | |
1054 | |
1055 /* Has the status been really changed? */ | |
1056 saved_status = gaim_savedstatus_get_current(); | |
1057 if (gaim_savedstatus_get_type(saved_status) == GPOINTER_TO_INT(data)) | |
1058 { | |
1059 if (!message_changed(gaim_savedstatus_get_message(saved_status), message)) | |
1060 changed = FALSE; | |
1061 } | |
1062 | |
1063 if (changed) | |
1064 { | |
1065 /* Create a new transient saved status */ | |
1066 saved_status = gaim_savedstatus_new(NULL, GPOINTER_TO_INT(data)); | |
1067 gaim_savedstatus_set_message(saved_status, message); | |
1068 | |
1069 /* Set the status for each account */ | |
1070 gaim_savedstatus_activate(saved_status); | |
1071 } | |
1072 } else { | |
1073 /* Per-account */ | |
11981 | 1074 gint active; |
1075 GaimStatusType *status_type; | |
12076
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1076 GaimStatus *status; |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1077 const char *id = NULL; |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1078 |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1079 status = gaim_account_get_active_status(status_box->account); |
11981 | 1080 |
1081 g_object_get(G_OBJECT(status_box), "active", &active, NULL); | |
11654 | 1082 |
11993 | 1083 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
|
1084 id = gaim_status_type_get_id(status_type); |
11981 | 1085 |
12076
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1086 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
|
1087 { |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1088 /* Selected status and previous status is the same */ |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1089 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
|
1090 changed = FALSE; |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1091 } |
12123 | 1092 |
12076
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1093 if (changed) |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1094 { |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1095 if (message) |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1096 gaim_account_set_status(status_box->account, id, |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1097 TRUE, "message", message, NULL); |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1098 else |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1099 gaim_account_set_status(status_box->account, id, |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1100 TRUE, NULL); |
4fb1edd43f45
[gaim-migrate @ 14373]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12075
diff
changeset
|
1101 } |
11981 | 1102 } |
11627 | 1103 |
11638 | 1104 g_free(title); |
11654 | 1105 g_free(message); |
1106 } | |
1107 | |
12597
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1108 static void update_size(GtkGaimStatusBox *status_box) |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1109 { |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1110 GtkTextBuffer *buffer; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1111 GtkTextIter iter; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1112 int wrapped_lines; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1113 int lines; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1114 GdkRectangle oneline; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1115 int height; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1116 int pad_top, pad_inside, pad_bottom; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1117 |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1118 if (!status_box->imhtml_visible) |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1119 { |
12598
1c122dbc8e9e
[gaim-migrate @ 14928]
Richard Laager <rlaager@wiktel.com>
parents:
12597
diff
changeset
|
1120 if (status_box->vbox != NULL) |
1c122dbc8e9e
[gaim-migrate @ 14928]
Richard Laager <rlaager@wiktel.com>
parents:
12597
diff
changeset
|
1121 gtk_widget_set_size_request(status_box->vbox, -1, -1); |
12597
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1122 return; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1123 } |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1124 |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1125 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
|
1126 |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1127 wrapped_lines = 1; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1128 gtk_text_buffer_get_start_iter(buffer, &iter); |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1129 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
|
1130 wrapped_lines++; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1131 |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1132 lines = gtk_text_buffer_get_line_count(buffer); |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1133 |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1134 /* Show a maximum of 4 lines */ |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1135 lines = MIN(lines, 4); |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1136 wrapped_lines = MIN(wrapped_lines, 4); |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1137 |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1138 gtk_text_buffer_get_start_iter(buffer, &iter); |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1139 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
|
1140 |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1141 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
|
1142 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
|
1143 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
|
1144 |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1145 height = (oneline.height + pad_top + pad_bottom) * lines; |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1146 height += (oneline.height + pad_inside) * (wrapped_lines - lines); |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1147 |
12598
1c122dbc8e9e
[gaim-migrate @ 14928]
Richard Laager <rlaager@wiktel.com>
parents:
12597
diff
changeset
|
1148 gtk_widget_set_size_request(status_box->vbox, -1, height); |
12597
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1149 } |
842b3b897cde
[gaim-migrate @ 14927]
Richard Laager <rlaager@wiktel.com>
parents:
12596
diff
changeset
|
1150 |
11654 | 1151 static void remove_typing_cb(GtkGaimStatusBox *status_box) |
1152 { | |
12782 | 1153 if (status_box->typing == 0) |
1154 /* Nothing has changed, so we don't need to do anything */ | |
1155 return; | |
1156 | |
11654 | 1157 activate_currently_selected_status(status_box); |
1158 | |
1159 g_source_remove(status_box->typing); | |
1160 status_box->typing = 0; | |
1161 gtk_gaim_status_box_refresh(status_box); | |
10643 | 1162 } |
1163 | |
1164 static void gtk_gaim_status_box_changed(GtkComboBox *box) | |
1165 { | |
11400 | 1166 GtkGaimStatusBox *status_box; |
10643 | 1167 GtkTreeIter iter; |
11739 | 1168 GtkGaimStatusBoxItemType type; |
10643 | 1169 char *text, *sec_text; |
1170 GdkPixbuf *pixbuf; | |
12778 | 1171 gpointer data; |
11960 | 1172 GList *accounts = NULL, *node; |
10643 | 1173 |
11400 | 1174 status_box = GTK_GAIM_STATUS_BOX(box); |
1175 | |
12074
950acb2bc835
[gaim-migrate @ 14370]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12060
diff
changeset
|
1176 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
|
1177 return; |
11739 | 1178 gtk_tree_model_get(GTK_TREE_MODEL(status_box->dropdown_store), &iter, |
1179 TYPE_COLUMN, &type, | |
1180 TITLE_COLUMN, &text, | |
12778 | 1181 DESC_COLUMN, &sec_text, |
1182 ICON_COLUMN, &pixbuf, | |
1183 DATA_COLUMN, &data, | |
11739 | 1184 -1); |
10643 | 1185 if (status_box->title) |
1186 g_free(status_box->title); | |
11638 | 1187 status_box->title = text; |
10643 | 1188 if (status_box->desc && sec_text) |
11638 | 1189 g_free(status_box->desc); |
1190 status_box->desc = sec_text; | |
10643 | 1191 if (status_box->pixbuf) |
1192 g_object_unref(status_box->pixbuf); | |
1193 status_box->pixbuf = pixbuf; | |
11638 | 1194 if (status_box->typing) |
1195 g_source_remove(status_box->typing); | |
1196 status_box->typing = 0; | |
10861 | 1197 |
11951 | 1198 if (GTK_WIDGET_IS_SENSITIVE(GTK_WIDGET(status_box))) |
11729 | 1199 { |
12778 | 1200 if (type == GTK_GAIM_STATUS_BOX_TYPE_POPULAR) |
1201 { | |
1202 GaimSavedStatus *saved; | |
1203 saved = gaim_savedstatus_find_by_creation_time(GPOINTER_TO_INT(data)); | |
1204 g_return_if_fail(saved != NULL); | |
1205 gaim_savedstatus_activate(saved); | |
1206 return; | |
1207 } | |
1208 | |
11951 | 1209 if (type == GTK_GAIM_STATUS_BOX_TYPE_CUSTOM) |
1210 { | |
1211 gaim_gtk_status_editor_show(NULL); | |
1212 update_to_reflect_current_status(status_box); | |
1213 return; | |
1214 } | |
11729 | 1215 |
11951 | 1216 if (type == GTK_GAIM_STATUS_BOX_TYPE_SAVED) |
1217 { | |
1218 gaim_gtk_status_window_show(); | |
1219 update_to_reflect_current_status(status_box); | |
1220 return; | |
1221 } | |
11729 | 1222 } |
1223 | |
11654 | 1224 /* |
12779 | 1225 * Show the message box whenever the primitive allows for a |
11960 | 1226 * message attribute on any protocol that is enabled, |
1227 * or our protocol, if we have account set | |
11654 | 1228 */ |
11960 | 1229 if (status_box->account) |
1230 accounts = g_list_prepend(accounts, status_box->account); | |
1231 else | |
1232 accounts = gaim_accounts_get_all_active(); | |
11755 | 1233 status_box->imhtml_visible = FALSE; |
1234 for (node = accounts; node != NULL; node = node->next) | |
1235 { | |
1236 GaimAccount *account; | |
1237 GaimStatusType *status_type; | |
1238 | |
1239 account = node->data; | |
12779 | 1240 status_type = gaim_account_get_status_type_with_primitive(account, GPOINTER_TO_INT(data)); |
11755 | 1241 if ((status_type != NULL) && |
1242 (gaim_status_type_get_attr(status_type, "message") != NULL)) | |
1243 { | |
1244 status_box->imhtml_visible = TRUE; | |
1245 break; | |
1246 } | |
1247 } | |
1248 g_list_free(accounts); | |
11654 | 1249 |
1250 if (status_box->imhtml_visible) | |
1251 { | |
12585 | 1252 GtkTextBuffer *buf; |
1253 GtkTextIter start, end; | |
10643 | 1254 gtk_widget_show_all(status_box->vbox); |
12274 | 1255 if (GTK_WIDGET_IS_SENSITIVE(GTK_WIDGET(status_box))) { |
12309 | 1256 status_box->typing = g_timeout_add(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, status_box); |
12274 | 1257 } |
12778 | 1258 gtk_widget_grab_focus(status_box->imhtml); |
1259 buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(status_box->imhtml)); | |
12585 | 1260 gtk_text_buffer_get_start_iter(buf, &start); |
1261 gtk_text_buffer_get_end_iter(buf, &end); | |
1262 gtk_text_buffer_move_mark_by_name(buf, "insert", &end); | |
1263 gtk_text_buffer_move_mark_by_name(buf, "selection_bound", &start); | |
11654 | 1264 } |
1265 else | |
1266 { | |
10643 | 1267 gtk_widget_hide_all(status_box->vbox); |
11951 | 1268 if (GTK_WIDGET_IS_SENSITIVE(GTK_WIDGET(status_box))) |
11981 | 1269 activate_currently_selected_status(status_box); /* This is where we actually set the status */ |
10643 | 1270 } |
1271 gtk_gaim_status_box_refresh(status_box); | |
1272 } | |
1273 | |
1274 static void imhtml_changed_cb(GtkTextBuffer *buffer, void *data) | |
1275 { | |
1276 GtkGaimStatusBox *box = (GtkGaimStatusBox*)data; | |
11951 | 1277 if (GTK_WIDGET_IS_SENSITIVE(GTK_WIDGET(box))) |
1278 { | |
1279 if (box->typing) { | |
1280 gtk_gaim_status_box_pulse_typing(box); | |
1281 g_source_remove(box->typing); | |
1282 } | |
12309 | 1283 box->typing = g_timeout_add(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, box); |
10861 | 1284 } |
10643 | 1285 gtk_gaim_status_box_refresh(box); |
1286 } | |
10649 | 1287 |
12460
3d999a4d4892
[gaim-migrate @ 14770]
Richard Laager <rlaager@wiktel.com>
parents:
12379
diff
changeset
|
1288 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
|
1289 { |
3d999a4d4892
[gaim-migrate @ 14770]
Richard Laager <rlaager@wiktel.com>
parents:
12379
diff
changeset
|
1290 imhtml_changed_cb(NULL, data); |
3d999a4d4892
[gaim-migrate @ 14770]
Richard Laager <rlaager@wiktel.com>
parents:
12379
diff
changeset
|
1291 } |
3d999a4d4892
[gaim-migrate @ 14770]
Richard Laager <rlaager@wiktel.com>
parents:
12379
diff
changeset
|
1292 |
11638 | 1293 char *gtk_gaim_status_box_get_message(GtkGaimStatusBox *status_box) |
10649 | 1294 { |
1295 if (status_box->imhtml_visible) | |
1296 return gtk_imhtml_get_markup(GTK_IMHTML(status_box->imhtml)); | |
1297 else | |
1298 return NULL; | |
1299 } |