Mercurial > pidgin.yaz
annotate src/gtkconn.c @ 7863:6ee2fe9bb74e
[gaim-migrate @ 8517]
"Patch 2: ssl-plugins.patch
Other plugins might need to use the NSS/GNUTLS libraries,
which shouldn't be initialized multiple times in the same
thread (at least NSS says this is a bad thing to do).
This patch
enables other plugins to load either the NSS or
GNUTLS plugin,
and
a) have them init on load, rather when sslconn inits them
b) have them not stomp on each other if the other one has
already loaded." --Bill Tompkins (obobo)
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Sun, 14 Dec 2003 16:46:28 +0000 |
parents | 4707d8436806 |
children | 40b37b1e0905 |
rev | line source |
---|---|
5717 | 1 /* |
2 * gaim | |
3 * | |
4 * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net> | |
5 * | |
6 * This program is free software; you can redistribute it and/or modify | |
7 * it under the terms of the GNU General Public License as published by | |
8 * the Free Software Foundation; either version 2 of the License, or | |
9 * (at your option) any later version. | |
10 * | |
11 * This program is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 * GNU General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License | |
17 * along with this program; if not, write to the Free Software | |
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
19 */ | |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6216
diff
changeset
|
20 #include "gtkinternal.h" |
5717 | 21 |
22 #include "account.h" | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
23 #include "debug.h" |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
24 #include "notify.h" |
6216 | 25 #include "prefs.h" |
7399 | 26 #include "stock.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
27 #include "util.h" |
5717 | 28 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
29 #include "gtkblist.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
30 #include "gtkutils.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
31 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
32 #include "ui.h" |
5717 | 33 |
34 struct signon_meter { | |
35 GaimAccount *account; | |
36 GtkWidget *button; | |
37 GtkWidget *progress; | |
38 GtkWidget *status; | |
39 }; | |
40 | |
41 struct meter_window { | |
42 GtkWidget *window; | |
43 GtkWidget *table; | |
44 gint rows; | |
45 gint active_count; | |
46 GSList *meters; | |
47 } *meter_win = NULL; | |
48 | |
5991
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
49 static void kill_meter(struct signon_meter *meter, const char *text); |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
50 |
5717 | 51 static void cancel_signon(GtkWidget *button, struct signon_meter *meter) |
52 { | |
5991
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
53 if (meter->account->gc != NULL) { |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
54 meter->account->gc->wants_to_die = TRUE; |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
55 gaim_connection_destroy(meter->account->gc); |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
56 } |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
57 else { |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
58 kill_meter(meter, _("Done.")); |
5987
6e19ad2ef712
[gaim-migrate @ 6435]
Christian Hammond <chipx86@chipx86.com>
parents:
5936
diff
changeset
|
59 |
5991
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
60 if (gaim_connections_get_all() == NULL) { |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
61 destroy_all_dialogs(); |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
62 |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
63 gaim_blist_destroy(); |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
64 |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
65 show_login(); |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
66 } |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
67 } |
5717 | 68 } |
69 | |
70 static void cancel_all () { | |
71 GSList *m = meter_win ? meter_win->meters : NULL; | |
6114 | 72 struct signon_meter *meter; |
5717 | 73 |
74 while (m) { | |
6114 | 75 meter = m->data; |
76 cancel_signon(NULL, meter); | |
77 m = m->next; | |
5717 | 78 } |
79 } | |
80 | |
81 static gint meter_destroy(GtkWidget *window, GdkEvent *evt, struct signon_meter *meter) | |
82 { | |
83 return TRUE; | |
84 } | |
85 | |
86 static struct signon_meter *find_signon_meter(GaimConnection *gc) | |
87 { | |
88 GSList *m = meter_win ? meter_win->meters : NULL; | |
6114 | 89 struct signon_meter *meter; |
5717 | 90 |
91 while (m) { | |
6114 | 92 meter = m->data; |
93 if (meter->account == gaim_connection_get_account(gc)) | |
5717 | 94 return m->data; |
95 m = m->next; | |
96 } | |
97 | |
98 return NULL; | |
99 } | |
100 | |
101 static GtkWidget* create_meter_pixmap (GaimConnection *gc) | |
102 { | |
103 GdkPixbuf *pb = create_prpl_icon(gc->account); | |
104 GdkPixbuf *scale = gdk_pixbuf_scale_simple(pb, 30,30,GDK_INTERP_BILINEAR); | |
105 GtkWidget *image = | |
106 gtk_image_new_from_pixbuf(scale); | |
107 g_object_unref(G_OBJECT(pb)); | |
108 g_object_unref(G_OBJECT(scale)); | |
109 return image; | |
110 } | |
111 | |
112 | |
113 | |
114 static struct signon_meter * | |
115 new_meter(GaimConnection *gc, GtkWidget *widget, | |
116 GtkWidget *table, gint *rows) | |
117 { | |
118 GtkWidget *graphic; | |
119 GtkWidget *label; | |
120 GtkWidget *nest_vbox; | |
121 GString *name_to_print; | |
122 struct signon_meter *meter; | |
123 | |
124 | |
125 meter = g_new0(struct signon_meter, 1); | |
126 | |
127 meter->account = gaim_connection_get_account(gc); | |
128 name_to_print = g_string_new(gaim_account_get_username(meter->account)); | |
129 | |
130 (*rows)++; | |
131 gtk_table_resize (GTK_TABLE(table), *rows, 4); | |
132 | |
133 graphic = create_meter_pixmap(gc); | |
134 | |
135 nest_vbox = gtk_vbox_new (FALSE, 0); | |
136 | |
137 g_string_prepend(name_to_print, _("Signon: ")); | |
138 label = gtk_label_new (name_to_print->str); | |
139 g_string_free(name_to_print, TRUE); | |
140 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); | |
141 | |
142 meter->status = gtk_label_new(""); | |
143 gtk_misc_set_alignment(GTK_MISC(meter->status), 0, 0.5); | |
144 gtk_widget_set_size_request(meter->status, 250, -1); | |
145 | |
146 meter->progress = gtk_progress_bar_new (); | |
147 | |
148 meter->button = gaim_pixbuf_button_from_stock (_("Cancel"), GTK_STOCK_CANCEL, GAIM_BUTTON_HORIZONTAL); | |
149 g_signal_connect(G_OBJECT (meter->button), "clicked", | |
150 G_CALLBACK (cancel_signon), meter); | |
151 | |
152 gtk_table_attach (GTK_TABLE (table), graphic, 0, 1, *rows, *rows+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); | |
153 gtk_table_attach (GTK_TABLE (table), nest_vbox, 1, 2, *rows, *rows+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); | |
154 gtk_box_pack_start (GTK_BOX (nest_vbox), GTK_WIDGET (label), FALSE, FALSE, 0); | |
155 gtk_box_pack_start (GTK_BOX (nest_vbox), GTK_WIDGET (meter->status), FALSE, FALSE, 0); | |
156 gtk_table_attach (GTK_TABLE (table), meter->progress, 2, 3, *rows, *rows+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); | |
157 gtk_table_attach (GTK_TABLE (table), meter->button, 3, 4, *rows, *rows+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); | |
158 | |
159 gtk_widget_show_all (GTK_WIDGET (meter_win->window)); | |
160 | |
161 meter_win->active_count++; | |
162 | |
163 return meter; | |
164 } | |
165 | |
166 static void kill_meter(struct signon_meter *meter, const char *text) { | |
167 gtk_widget_set_sensitive (meter->button, FALSE); | |
168 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(meter->progress), 1); | |
169 gtk_label_set_text(GTK_LABEL(meter->status), text); | |
170 meter_win->active_count--; | |
171 if (meter_win->active_count == 0) { | |
172 gtk_widget_destroy(meter_win->window); | |
173 g_free (meter_win); | |
174 meter_win = NULL; | |
175 } | |
176 } | |
177 | |
178 static void gaim_gtk_connection_connect_progress(GaimConnection *gc, | |
179 const char *text, size_t step, size_t step_count) | |
180 { | |
181 struct signon_meter *meter; | |
182 | |
183 if(!meter_win) { | |
184 GtkWidget *vbox; | |
185 GtkWidget *cancel_button; | |
186 | |
187 if(mainwindow) | |
188 gtk_widget_hide(mainwindow); | |
189 | |
190 meter_win = g_new0(struct meter_window, 1); | |
191 meter_win->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
192 gtk_window_set_resizable(GTK_WINDOW(meter_win->window), FALSE); | |
193 gtk_window_set_role(GTK_WINDOW(meter_win->window), "signon"); | |
194 gtk_container_set_border_width(GTK_CONTAINER(meter_win->window), 5); | |
195 gtk_window_set_title(GTK_WINDOW(meter_win->window), _("Signon")); | |
196 gtk_widget_realize(meter_win->window); | |
197 | |
198 vbox = gtk_vbox_new (FALSE, 0); | |
199 gtk_container_add(GTK_CONTAINER(meter_win->window), vbox); | |
200 | |
201 meter_win->table = gtk_table_new(1, 4, FALSE); | |
202 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(meter_win->table), | |
203 FALSE, FALSE, 0); | |
204 gtk_container_set_border_width(GTK_CONTAINER(meter_win->table), 5); | |
205 gtk_table_set_row_spacings(GTK_TABLE(meter_win->table), 5); | |
206 gtk_table_set_col_spacings(GTK_TABLE(meter_win->table), 10); | |
207 | |
208 cancel_button = gaim_pixbuf_button_from_stock(_("Cancel All"), | |
209 GTK_STOCK_QUIT, GAIM_BUTTON_HORIZONTAL); | |
210 g_signal_connect_swapped(G_OBJECT(cancel_button), "clicked", | |
211 G_CALLBACK(cancel_all), NULL); | |
212 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(cancel_button), | |
213 FALSE, FALSE, 0); | |
214 | |
215 g_signal_connect(G_OBJECT(meter_win->window), "delete_event", | |
216 G_CALLBACK(meter_destroy), NULL); | |
217 } | |
218 | |
219 meter = find_signon_meter(gc); | |
220 if(!meter) { | |
221 meter = new_meter(gc, meter_win->window, meter_win->table, | |
222 &meter_win->rows); | |
223 | |
224 meter_win->meters = g_slist_append(meter_win->meters, meter); | |
225 } | |
226 | |
227 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(meter->progress), | |
228 (float)step / (float)step_count); | |
229 gtk_label_set_text(GTK_LABEL(meter->status), text); | |
230 } | |
231 | |
232 static void gaim_gtk_connection_connected(GaimConnection *gc) | |
233 { | |
234 struct signon_meter *meter = find_signon_meter(gc); | |
235 | |
5885
02569519d0cc
[gaim-migrate @ 6317]
Christian Hammond <chipx86@chipx86.com>
parents:
5883
diff
changeset
|
236 gaim_setup(gc); |
02569519d0cc
[gaim-migrate @ 6317]
Christian Hammond <chipx86@chipx86.com>
parents:
5883
diff
changeset
|
237 |
02569519d0cc
[gaim-migrate @ 6317]
Christian Hammond <chipx86@chipx86.com>
parents:
5883
diff
changeset
|
238 do_away_menu(); |
5936
1b56a833d665
[gaim-migrate @ 6376]
Christian Hammond <chipx86@chipx86.com>
parents:
5885
diff
changeset
|
239 gaim_gtk_blist_update_protocol_actions(); |
5885
02569519d0cc
[gaim-migrate @ 6317]
Christian Hammond <chipx86@chipx86.com>
parents:
5883
diff
changeset
|
240 |
5717 | 241 if(meter) |
242 kill_meter(meter, _("Done.")); | |
243 } | |
244 | |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
245 static void gaim_gtk_connection_disconnected(GaimConnection *gc) |
5717 | 246 { |
247 struct signon_meter *meter = find_signon_meter(gc); | |
5883
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
248 |
5885
02569519d0cc
[gaim-migrate @ 6317]
Christian Hammond <chipx86@chipx86.com>
parents:
5883
diff
changeset
|
249 do_away_menu(); |
5936
1b56a833d665
[gaim-migrate @ 6376]
Christian Hammond <chipx86@chipx86.com>
parents:
5885
diff
changeset
|
250 gaim_gtk_blist_update_protocol_actions(); |
5883
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
251 |
5717 | 252 if(meter) |
253 kill_meter(meter, _("Done.")); | |
5883
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
254 |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
255 if (gaim_connections_get_all() != NULL) |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
256 return; |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
257 |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
258 destroy_all_dialogs(); |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
259 |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
260 gaim_blist_destroy(); |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
261 |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
262 show_login(); |
5717 | 263 } |
264 | |
265 static void gaim_gtk_connection_notice(GaimConnection *gc, | |
266 const char *text) | |
267 { | |
268 } | |
269 | |
7399 | 270 struct disconnect_window { |
271 GtkWidget *window; | |
272 GtkWidget *treeview; | |
273 GtkWidget *sw; | |
274 GtkWidget *label; | |
7808 | 275 GtkWidget *reconnect_btn; |
7399 | 276 }; |
277 struct disconnect_window *disconnect_window = NULL; | |
278 | |
7493 | 279 static void disconnect_window_hide() |
280 { | |
281 gtk_widget_destroy(disconnect_window->window); | |
282 g_free(disconnect_window); | |
283 disconnect_window = NULL; | |
284 } | |
285 | |
7399 | 286 static void disconnect_response_cb(GtkDialog *dialog, gint id, GtkWidget *widget) |
287 { | |
7483 | 288 GtkTreeIter iter; |
289 GtkTreeSelection *sel = NULL; | |
290 GtkTreeModel *model = NULL; | |
7431 | 291 GaimAccount *account = NULL; |
292 | |
7399 | 293 switch(id) { |
7506 | 294 case GTK_RESPONSE_DELETE_EVENT: |
7399 | 295 case GTK_RESPONSE_CLOSE: |
7493 | 296 disconnect_window_hide(); |
7399 | 297 break; |
7808 | 298 case GTK_RESPONSE_APPLY: //Reconnect All |
299 model = gtk_tree_view_get_model(GTK_TREE_VIEW(disconnect_window->treeview)); | |
300 if (gtk_tree_model_get_iter_first(model, &iter)) { | |
301 /* tree rows to be deleted */ | |
302 GList *l_del = NULL, *l_del_iter = NULL; | |
303 /* accounts to be connected */ | |
304 GList *l_accts = NULL, *l_accts_iter =NULL; | |
305 do { | |
306 GtkTreePath *path = gtk_tree_model_get_path(model, &iter); | |
307 GtkTreeRowReference* del_row = gtk_tree_row_reference_new(model, path); | |
308 l_del = g_list_append(l_del, del_row); | |
309 gtk_tree_path_free(path); | |
310 | |
311 gtk_tree_model_get(model, &iter, 4, &account, -1); | |
312 if (!gaim_account_is_connected(account) && g_list_find(l_accts, account) == NULL) | |
313 l_accts = g_list_append(l_accts, account); | |
314 } while (gtk_tree_model_iter_next(model, &iter)); | |
315 | |
316 /* remove all rows */ | |
317 l_del_iter = l_del; | |
318 while (l_del_iter != NULL) { | |
319 GtkTreeRowReference* del_row = l_del_iter->data; | |
320 GtkTreePath *path = gtk_tree_row_reference_get_path(del_row); | |
321 if (gtk_tree_model_get_iter(model, &iter, path)) | |
322 gtk_list_store_remove(GTK_LIST_STORE(model), &iter); | |
323 gtk_tree_path_free(path); | |
324 gtk_tree_row_reference_free(del_row); | |
325 l_del_iter = l_del_iter->next; | |
326 } | |
327 g_list_free(l_del); | |
328 | |
329 /* reconnect disconnected accounts */ | |
330 l_accts_iter = l_accts; | |
331 while (l_accts_iter != NULL) { | |
332 account = l_accts_iter->data; | |
333 gaim_account_connect(account); | |
334 l_accts_iter = l_accts_iter->next; | |
335 } | |
336 g_list_free(l_accts); | |
337 | |
338 /* | |
339 * if we don't have any rows left, | |
340 * meaning that nothing was disconnected during our reconnections, | |
341 * hide the dialog | |
342 */ | |
343 if (!gtk_tree_model_get_iter_first(model, &iter)) | |
344 disconnect_window_hide(); | |
345 else { | |
346 gtk_tree_selection_select_iter(sel, &iter); | |
347 if (!gtk_tree_model_iter_next(model, &iter)) { | |
348 gtk_widget_hide_all(disconnect_window->sw); | |
349 } | |
350 } | |
351 } | |
352 | |
353 break; | |
354 case GTK_RESPONSE_ACCEPT: //Reconnect Selected | |
7483 | 355 model = gtk_tree_view_get_model(GTK_TREE_VIEW(disconnect_window->treeview)); |
356 /* | |
357 * If we have more than one account disconnection displayed, then | |
358 * the scroll window is visible and we should use the selected | |
359 * account to reconnect. | |
360 */ | |
361 if (GTK_WIDGET_VISIBLE(disconnect_window->sw)) { | |
362 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(disconnect_window->treeview)); | |
363 if (!gtk_tree_selection_get_selected(sel, &model, &iter)) | |
364 return; | |
365 } else { | |
366 /* There is only one account disconnection, so reconnect to it. */ | |
367 if (!gtk_tree_model_get_iter_first(model, &iter)) | |
368 return; | |
369 } | |
7808 | 370 gtk_tree_model_get(model, &iter, 4, &account, -1); |
7643 | 371 /* remove all disconnections of the account to be reconnected */ |
7637 | 372 if (gtk_tree_model_get_iter_first(model, &iter)) { |
7808 | 373 GList *l_del = NULL, *l_del_iter = NULL; |
7637 | 374 GaimAccount *account2 = NULL; |
375 do { | |
7808 | 376 gtk_tree_model_get(model, &iter, 4, &account2, -1); |
7637 | 377 if (account2 == account) { |
7643 | 378 GtkTreePath *path = gtk_tree_model_get_path(model, &iter); |
379 GtkTreeRowReference* del_row = gtk_tree_row_reference_new(model, path); | |
380 l_del = g_list_append(l_del, del_row); | |
7808 | 381 gtk_tree_path_free(path); |
7637 | 382 } |
7643 | 383 } while (gtk_tree_model_iter_next(model, &iter)); |
384 | |
7808 | 385 l_del_iter = l_del; |
386 while (l_del_iter != NULL) { | |
387 GtkTreeRowReference* del_row = l_del_iter->data; | |
7643 | 388 GtkTreePath *path = gtk_tree_row_reference_get_path(del_row); |
389 if (gtk_tree_model_get_iter(model, &iter, path)) | |
390 gtk_list_store_remove(GTK_LIST_STORE(model), &iter); | |
7808 | 391 gtk_tree_path_free(path); |
392 gtk_tree_row_reference_free(del_row); | |
393 l_del_iter = l_del_iter->next; | |
7643 | 394 } |
7808 | 395 g_list_free(l_del); |
7637 | 396 } |
397 | |
7643 | 398 gaim_account_connect(account); |
399 | |
7552 | 400 if (!gtk_tree_model_get_iter_first(model, &iter)) |
401 disconnect_window_hide(); | |
402 else { | |
403 gtk_tree_selection_select_iter(sel, &iter); | |
404 if (!gtk_tree_model_iter_next(model, &iter)) | |
405 gtk_widget_hide_all(disconnect_window->sw); | |
7493 | 406 } |
7399 | 407 break; |
408 } | |
409 } | |
410 | |
411 static void disconnect_tree_cb(GtkTreeSelection *sel, GtkTreeModel *model) | |
412 { | |
413 GtkTreeIter iter; | |
414 | |
7808 | 415 if (gtk_tree_selection_get_selected (sel, &model, &iter)) { |
416 const char *label_text; | |
417 GaimAccount *account = NULL; | |
418 gtk_tree_model_get(model, &iter, | |
419 3, &label_text, | |
420 4, &account, -1); | |
421 gtk_button_set_label( | |
422 GTK_BUTTON(disconnect_window->reconnect_btn), | |
423 gaim_account_is_connected(account) | |
424 ? _("_Remove") | |
425 : _("_Reconnect")); | |
426 gtk_label_set_markup(GTK_LABEL(disconnect_window->label), label_text); | |
427 gtk_dialog_set_response_sensitive(GTK_DIALOG(disconnect_window->window), GTK_RESPONSE_ACCEPT, TRUE); | |
428 } else | |
7637 | 429 gtk_dialog_set_response_sensitive(GTK_DIALOG(disconnect_window->window), GTK_RESPONSE_ACCEPT, FALSE); |
7399 | 430 } |
431 | |
7808 | 432 static void disconnect_connection_change_cb(GaimConnection *gc, void *data) { |
7625 | 433 if (disconnect_window) { |
7808 | 434 GaimAccount *account = gaim_connection_get_account(gc); |
435 gboolean signed_off = !gaim_account_is_connected(account); | |
436 GtkTreeIter iter; | |
7625 | 437 GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(disconnect_window->treeview)); |
7637 | 438 GdkPixbuf *icon = create_prpl_icon(account); |
439 GdkPixbuf *scale = gdk_pixbuf_scale_simple(icon, 16, 16, GDK_INTERP_BILINEAR); | |
7808 | 440 /* mark all disconnections w/ the account type disconnected /w grey icon */ |
441 if (signed_off) | |
442 gdk_pixbuf_saturate_and_pixelate(scale, scale, 0.0, FALSE); | |
7625 | 443 if (gtk_tree_model_get_iter_first(model, &iter)) { |
7808 | 444 GList *l_disc_accts = NULL; |
445 GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(disconnect_window->treeview)); | |
446 GtkTreeIter iter_selected; | |
447 GtkTreePath *sel_path = NULL; | |
448 if (gtk_tree_selection_get_selected(sel, &model, &iter_selected)) | |
449 sel_path = gtk_tree_model_get_path(model, &iter_selected); | |
7625 | 450 do { |
7808 | 451 GaimAccount *account2 = NULL; |
452 gtk_tree_model_get(model, &iter, 4, &account2, -1); | |
7637 | 453 if (account2 == account) { |
7808 | 454 GtkTreePath *path = gtk_tree_model_get_path(model, &iter); |
7637 | 455 gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, scale, -1); |
7808 | 456 /* update the reconnect button if appropriate */ |
457 if (sel_path != NULL && gtk_tree_path_compare(path, sel_path) == 0) | |
458 gtk_button_set_label( | |
459 GTK_BUTTON(disconnect_window->reconnect_btn), | |
460 signed_off ? _("_Reconnect") : _("_Remove")); | |
461 gtk_tree_path_free(path); | |
7625 | 462 } |
7808 | 463 if (!gaim_account_is_connected(account2) |
464 && g_list_find(l_disc_accts, account2) == NULL) | |
465 l_disc_accts = g_list_append(l_disc_accts, account2); | |
7625 | 466 } while (gtk_tree_model_iter_next(model, &iter)); |
7808 | 467 |
468 gtk_tree_path_free(sel_path); | |
469 | |
470 gtk_dialog_set_response_sensitive( | |
471 GTK_DIALOG(disconnect_window->window), | |
472 GTK_RESPONSE_APPLY, | |
473 g_list_length(l_disc_accts) > 1); | |
474 g_list_free(l_disc_accts); | |
7625 | 475 } |
7637 | 476 if (icon != NULL) g_object_unref(G_OBJECT(icon)); |
477 if (scale != NULL) g_object_unref(G_OBJECT(scale)); | |
7625 | 478 } |
479 } | |
7399 | 480 |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
481 static void |
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
482 gaim_gtk_connection_report_disconnect(GaimConnection *gc, const char *text) |
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
483 { |
7399 | 484 char *label_text = NULL; |
7506 | 485 GtkTreeIter new_row_iter, iter; |
486 GtkListStore *list_store; | |
487 GtkTreeViewColumn *col; | |
488 GtkTreeSelection *sel = NULL; | |
7399 | 489 |
7648 | 490 label_text = g_strdup_printf(_("<span weight=\"bold\" size=\"larger\">%s has been disconnected.</span>\n\n%s\n%s"), |
7399 | 491 gaim_account_get_username(gaim_connection_get_account(gc)), gaim_date_full(), |
492 text ? text : _("Reason Unknown.")); | |
7496 | 493 |
7506 | 494 /* Build the window if it isn't there yet */ |
495 if (!disconnect_window) { | |
7399 | 496 GtkWidget *hbox, *vbox, *img; |
497 GtkCellRenderer *rend, *rend2; | |
7496 | 498 |
7407 | 499 disconnect_window = g_new0(struct disconnect_window, 1); |
7678 | 500 disconnect_window->window = gtk_dialog_new_with_buttons(GAIM_ALERT_TITLE, NULL, GTK_DIALOG_NO_SEPARATOR, |
7399 | 501 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); |
502 g_signal_connect(G_OBJECT(disconnect_window->window), "response", G_CALLBACK(disconnect_response_cb), disconnect_window); | |
503 | |
504 gtk_container_set_border_width(GTK_CONTAINER(disconnect_window->window), 6); | |
505 gtk_window_set_resizable(GTK_WINDOW(disconnect_window->window), FALSE); | |
506 gtk_dialog_set_has_separator(GTK_DIALOG(disconnect_window->window), FALSE); | |
507 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(disconnect_window->window)->vbox), 12); | |
508 gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(disconnect_window->window)->vbox), 6); | |
509 | |
510 hbox = gtk_hbox_new(FALSE, 12); | |
511 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(disconnect_window->window)->vbox), hbox); | |
512 img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_DIALOG); | |
513 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); | |
514 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); | |
7496 | 515 |
7399 | 516 vbox = gtk_vbox_new(FALSE, 12); |
517 gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); | |
518 | |
7506 | 519 disconnect_window->label = gtk_label_new(label_text); |
7496 | 520 |
7399 | 521 gtk_label_set_line_wrap(GTK_LABEL(disconnect_window->label), TRUE); |
522 gtk_misc_set_alignment(GTK_MISC(disconnect_window->label), 0, 0); | |
523 gtk_box_pack_start(GTK_BOX(vbox), disconnect_window->label, FALSE, FALSE, 0); | |
524 | |
7808 | 525 disconnect_window->reconnect_btn = gtk_dialog_add_button( |
526 GTK_DIALOG(disconnect_window->window), | |
527 _("_Reconnect"), | |
528 GTK_RESPONSE_ACCEPT); | |
529 | |
530 gtk_dialog_add_button( | |
531 GTK_DIALOG(disconnect_window->window), | |
532 _("Reconnect _All"), | |
533 GTK_RESPONSE_APPLY); | |
534 | |
7399 | 535 gtk_widget_show_all(disconnect_window->window); |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
536 |
7808 | 537 |
7399 | 538 /* Tree View */ |
539 disconnect_window->sw = gtk_scrolled_window_new(NULL,NULL); | |
540 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(disconnect_window->sw), GTK_SHADOW_IN); | |
541 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(disconnect_window->sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); | |
542 gtk_box_pack_start(GTK_BOX(vbox), disconnect_window->sw, TRUE, TRUE, 0); | |
7496 | 543 |
7506 | 544 list_store = gtk_list_store_new (5, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); |
7399 | 545 disconnect_window->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL(list_store)); |
7496 | 546 |
7399 | 547 rend = gtk_cell_renderer_pixbuf_new(); |
548 rend2 = gtk_cell_renderer_text_new(); | |
549 col = gtk_tree_view_column_new(); | |
550 gtk_tree_view_column_set_title(col, _("Account")); | |
551 gtk_tree_view_column_pack_start(col, rend, FALSE); | |
552 gtk_tree_view_column_pack_start(col, rend2, FALSE); | |
553 gtk_tree_view_column_set_attributes(col, rend, "pixbuf", 0, NULL); | |
554 gtk_tree_view_column_set_attributes(col, rend2, "text", 1, NULL); | |
555 gtk_tree_view_append_column (GTK_TREE_VIEW(disconnect_window->treeview), col); | |
7496 | 556 |
7399 | 557 rend = gtk_cell_renderer_text_new(); |
558 col = gtk_tree_view_column_new_with_attributes (_("Time"), | |
559 rend, "text", 2, NULL); | |
560 gtk_tree_view_append_column (GTK_TREE_VIEW(disconnect_window->treeview), col); | |
7637 | 561 |
7399 | 562 g_object_unref(G_OBJECT(list_store)); |
563 gtk_container_add(GTK_CONTAINER(disconnect_window->sw), disconnect_window->treeview); | |
7496 | 564 |
7399 | 565 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (disconnect_window->treeview)); |
7409
2ea9bf5686ad
[gaim-migrate @ 8009]
Christian Hammond <chipx86@chipx86.com>
parents:
7407
diff
changeset
|
566 gtk_widget_set_size_request(disconnect_window->treeview, -1, 96); |
7399 | 567 g_signal_connect (G_OBJECT (sel), "changed", |
568 G_CALLBACK (disconnect_tree_cb), list_store); | |
7625 | 569 |
570 gaim_signal_connect(gaim_connections_get_handle(), "signed-on", | |
7808 | 571 disconnect_window, GAIM_CALLBACK(disconnect_connection_change_cb), NULL); |
572 | |
573 gaim_signal_connect(gaim_connections_get_handle(), "signed-off", | |
574 disconnect_window, GAIM_CALLBACK(disconnect_connection_change_cb), NULL); | |
7625 | 575 |
7506 | 576 } else |
577 list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(disconnect_window->treeview))); | |
578 | |
579 /* Add this account to our list of disconnected accounts */ | |
580 gtk_list_store_append(list_store, &new_row_iter); | |
581 gtk_list_store_set(list_store, &new_row_iter, | |
7808 | 582 0, NULL, |
7506 | 583 1, gaim_account_get_username(gaim_connection_get_account(gc)), |
584 2, gaim_date_full(), | |
585 3, label_text, | |
586 4, gaim_connection_get_account(gc), -1); | |
587 | |
588 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list_store), &iter)) | |
589 { | |
590 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(disconnect_window->treeview)); | |
591 gtk_tree_selection_select_iter(sel, &new_row_iter); | |
592 /* if we have more than one disconnected acct, display the treeview */ | |
593 if (gtk_tree_model_iter_next(GTK_TREE_MODEL(list_store), &iter)) | |
594 gtk_widget_show_all(disconnect_window->sw); | |
7399 | 595 } |
7496 | 596 |
7399 | 597 g_free(label_text); |
7493 | 598 gtk_window_present(GTK_WINDOW(disconnect_window->window)); |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
599 } |
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
600 |
5717 | 601 static GaimConnectionUiOps conn_ui_ops = |
602 { | |
603 gaim_gtk_connection_connect_progress, | |
604 gaim_gtk_connection_connected, | |
605 gaim_gtk_connection_disconnected, | |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
606 gaim_gtk_connection_notice, |
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
607 gaim_gtk_connection_report_disconnect |
5717 | 608 }; |
609 | |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
6460
diff
changeset
|
610 GaimConnectionUiOps * |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
6460
diff
changeset
|
611 gaim_gtk_connections_get_ui_ops(void) |
5717 | 612 { |
613 return &conn_ui_ops; | |
614 } | |
615 | |
6216 | 616 void away_on_login(const char *mesg) |
5717 | 617 { |
618 GSList *awy = away_messages; | |
619 struct away_message *a, *message = NULL; | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
620 GaimGtkBuddyList *gtkblist; |
5717 | 621 |
622 gtkblist = GAIM_GTK_BLIST(gaim_get_blist()); | |
623 | |
624 if (!gtkblist->window) { | |
625 return; | |
626 } | |
627 | |
6216 | 628 if (mesg == NULL) |
629 mesg = gaim_prefs_get_string("/core/away/default_message"); | |
630 while (awy) { | |
631 a = (struct away_message *)awy->data; | |
632 if (strcmp(a->name, mesg) == 0) { | |
633 message = a; | |
634 break; | |
5717 | 635 } |
6216 | 636 awy = awy->next; |
5717 | 637 } |
6216 | 638 if (message == NULL) { |
639 if(!away_messages) | |
640 return; | |
641 message = away_messages->data; | |
642 } | |
643 do_away_message(NULL, message); | |
5717 | 644 } |