Mercurial > pidgin.yaz
annotate src/gtkconn.c @ 7506:240aca6344b6
[gaim-migrate @ 8119]
I'm going climbing soon, but I'll be around later to make Mandrake
9.1 RPMs. 9.2 ISOs haven't been released to the public yet, AFAIK.
This is some more disconnection dialog stuff from Daniel Atallah.
It fixes a memleak (that I think I introduced), makes the most
recently disconnected account the selected account, and makes the
window manager close work correctly.
datallah: The fix for the window-manager-close-button is the
"case GTK_RESPONSE_DELETE_EVENT:" line.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Thu, 13 Nov 2003 23:57:45 +0000 |
parents | 39185ff57842 |
children | 83453431d722 |
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; | |
275 }; | |
276 struct disconnect_window *disconnect_window = NULL; | |
277 | |
7493 | 278 static void disconnect_window_hide() |
279 { | |
280 gtk_widget_destroy(disconnect_window->window); | |
281 g_free(disconnect_window); | |
282 disconnect_window = NULL; | |
283 } | |
284 | |
7399 | 285 static void disconnect_response_cb(GtkDialog *dialog, gint id, GtkWidget *widget) |
286 { | |
7483 | 287 GtkTreeIter iter; |
288 GValue val = { 0, }; | |
289 GtkTreeSelection *sel = NULL; | |
290 GtkTreeModel *model = NULL; | |
7431 | 291 GaimAccount *account = NULL; |
7493 | 292 GaimConnection *gc = NULL; |
7431 | 293 |
7399 | 294 switch(id) { |
7506 | 295 case GTK_RESPONSE_DELETE_EVENT: |
7399 | 296 case GTK_RESPONSE_CLOSE: |
7493 | 297 disconnect_window_hide(); |
7399 | 298 break; |
299 case GTK_RESPONSE_ACCEPT: | |
7483 | 300 model = gtk_tree_view_get_model(GTK_TREE_VIEW(disconnect_window->treeview)); |
301 /* | |
302 * If we have more than one account disconnection displayed, then | |
303 * the scroll window is visible and we should use the selected | |
304 * account to reconnect. | |
305 */ | |
306 if (GTK_WIDGET_VISIBLE(disconnect_window->sw)) { | |
307 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(disconnect_window->treeview)); | |
308 if (!gtk_tree_selection_get_selected(sel, &model, &iter)) | |
309 return; | |
310 } else { | |
311 /* There is only one account disconnection, so reconnect to it. */ | |
312 if (!gtk_tree_model_get_iter_first(model, &iter)) | |
313 return; | |
314 } | |
7493 | 315 gtk_tree_model_get_value(model, &iter, 4, &val); |
7483 | 316 account = g_value_get_pointer(&val); |
7493 | 317 gc = gaim_account_connect(account); |
7483 | 318 g_value_unset(&val); |
7493 | 319 if (gaim_connection_get_state(gc) != GAIM_DISCONNECTED) { |
320 gtk_list_store_remove(GTK_LIST_STORE(model), &iter); | |
321 if (!gtk_tree_model_get_iter_first(model, &iter)) | |
322 disconnect_window_hide(); | |
323 else { | |
324 gtk_tree_selection_select_iter(sel, &iter); | |
325 if (!gtk_tree_model_iter_next(model, &iter)) | |
326 gtk_widget_hide_all(disconnect_window->sw); | |
327 } | |
328 } | |
7399 | 329 break; |
330 } | |
331 } | |
332 | |
333 static void disconnect_tree_cb(GtkTreeSelection *sel, GtkTreeModel *model) | |
334 { | |
335 GtkTreeIter iter; | |
336 GValue val = { 0, }; | |
337 const char *label_text; | |
338 | |
339 if (! gtk_tree_selection_get_selected (sel, &model, &iter)) | |
340 return; | |
341 gtk_tree_model_get_value (model, &iter, 3, &val); | |
342 label_text = g_value_get_string(&val); | |
343 gtk_label_set_markup(GTK_LABEL(disconnect_window->label), label_text); | |
344 g_value_unset(&val); | |
345 } | |
346 | |
347 | |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
348 static void |
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
349 gaim_gtk_connection_report_disconnect(GaimConnection *gc, const char *text) |
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
350 { |
7399 | 351 char *label_text = NULL; |
352 GdkPixbuf *scale, *icon; | |
7506 | 353 GtkTreeIter new_row_iter, iter; |
7483 | 354 GValue val = { 0, }; |
355 GaimAccount *account = NULL; | |
7506 | 356 GtkListStore *list_store; |
357 GtkTreeViewColumn *col; | |
358 GtkTreeSelection *sel = NULL; | |
7399 | 359 |
7409
2ea9bf5686ad
[gaim-migrate @ 8009]
Christian Hammond <chipx86@chipx86.com>
parents:
7407
diff
changeset
|
360 label_text = g_strdup_printf("<span weight=\"bold\" size=\"larger\">%s has been disconnected.</span>\n\n%s\n%s", |
7399 | 361 gaim_account_get_username(gaim_connection_get_account(gc)), gaim_date_full(), |
362 text ? text : _("Reason Unknown.")); | |
7496 | 363 |
7506 | 364 /* Build the window if it isn't there yet */ |
365 if (!disconnect_window) { | |
7399 | 366 GtkWidget *hbox, *vbox, *img; |
367 GtkCellRenderer *rend, *rend2; | |
7496 | 368 |
7407 | 369 disconnect_window = g_new0(struct disconnect_window, 1); |
7399 | 370 disconnect_window->window = gtk_dialog_new_with_buttons("", NULL, GTK_DIALOG_NO_SEPARATOR, |
371 _("Reconnect"), GTK_RESPONSE_ACCEPT, | |
372 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); | |
373 g_signal_connect(G_OBJECT(disconnect_window->window), "response", G_CALLBACK(disconnect_response_cb), disconnect_window); | |
374 | |
375 gtk_container_set_border_width(GTK_CONTAINER(disconnect_window->window), 6); | |
376 gtk_window_set_resizable(GTK_WINDOW(disconnect_window->window), FALSE); | |
377 gtk_dialog_set_has_separator(GTK_DIALOG(disconnect_window->window), FALSE); | |
378 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(disconnect_window->window)->vbox), 12); | |
379 gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(disconnect_window->window)->vbox), 6); | |
380 | |
381 hbox = gtk_hbox_new(FALSE, 12); | |
382 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(disconnect_window->window)->vbox), hbox); | |
383 img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_DIALOG); | |
384 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); | |
385 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); | |
7496 | 386 |
7399 | 387 vbox = gtk_vbox_new(FALSE, 12); |
388 gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); | |
389 | |
7506 | 390 disconnect_window->label = gtk_label_new(label_text); |
7496 | 391 |
7399 | 392 gtk_label_set_line_wrap(GTK_LABEL(disconnect_window->label), TRUE); |
393 gtk_misc_set_alignment(GTK_MISC(disconnect_window->label), 0, 0); | |
394 gtk_box_pack_start(GTK_BOX(vbox), disconnect_window->label, FALSE, FALSE, 0); | |
395 | |
396 gtk_widget_show_all(disconnect_window->window); | |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
397 |
7399 | 398 /* Tree View */ |
399 disconnect_window->sw = gtk_scrolled_window_new(NULL,NULL); | |
400 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(disconnect_window->sw), GTK_SHADOW_IN); | |
401 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(disconnect_window->sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); | |
402 gtk_box_pack_start(GTK_BOX(vbox), disconnect_window->sw, TRUE, TRUE, 0); | |
7496 | 403 |
7506 | 404 list_store = gtk_list_store_new (5, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); |
7399 | 405 disconnect_window->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL(list_store)); |
7496 | 406 |
7399 | 407 rend = gtk_cell_renderer_pixbuf_new(); |
408 rend2 = gtk_cell_renderer_text_new(); | |
409 col = gtk_tree_view_column_new(); | |
410 gtk_tree_view_column_set_title(col, _("Account")); | |
411 gtk_tree_view_column_pack_start(col, rend, FALSE); | |
412 gtk_tree_view_column_pack_start(col, rend2, FALSE); | |
413 gtk_tree_view_column_set_attributes(col, rend, "pixbuf", 0, NULL); | |
414 gtk_tree_view_column_set_attributes(col, rend2, "text", 1, NULL); | |
415 gtk_tree_view_append_column (GTK_TREE_VIEW(disconnect_window->treeview), col); | |
7496 | 416 |
7399 | 417 rend = gtk_cell_renderer_text_new(); |
418 col = gtk_tree_view_column_new_with_attributes (_("Time"), | |
419 rend, "text", 2, NULL); | |
420 gtk_tree_view_append_column (GTK_TREE_VIEW(disconnect_window->treeview), col); | |
421 | |
422 g_object_unref(G_OBJECT(list_store)); | |
423 gtk_container_add(GTK_CONTAINER(disconnect_window->sw), disconnect_window->treeview); | |
7496 | 424 |
7399 | 425 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
|
426 gtk_widget_set_size_request(disconnect_window->treeview, -1, 96); |
7399 | 427 g_signal_connect (G_OBJECT (sel), "changed", |
428 G_CALLBACK (disconnect_tree_cb), list_store); | |
7506 | 429 } else |
430 list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(disconnect_window->treeview))); | |
431 | |
432 /* If this account is already in our list then remove it */ | |
433 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list_store), &iter)) { | |
434 do { | |
435 gtk_tree_model_get_value(GTK_TREE_MODEL(list_store), &iter, 4, &val); | |
436 account = g_value_get_pointer(&val); | |
437 g_value_unset(&val); | |
438 if (account == gaim_connection_get_account(gc)) { | |
439 gtk_list_store_remove(list_store, &iter); | |
440 break; | |
441 } | |
442 } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(list_store), &iter)); | |
443 } | |
444 | |
445 /* Add this account to our list of disconnected accounts */ | |
446 icon = create_prpl_icon(gaim_connection_get_account(gc)); | |
447 scale = gdk_pixbuf_scale_simple(icon, 16, 16, GDK_INTERP_BILINEAR); | |
448 gtk_list_store_append(list_store, &new_row_iter); | |
449 gtk_list_store_set(list_store, &new_row_iter, | |
450 0, scale, | |
451 1, gaim_account_get_username(gaim_connection_get_account(gc)), | |
452 2, gaim_date_full(), | |
453 3, label_text, | |
454 4, gaim_connection_get_account(gc), -1); | |
455 g_object_unref(G_OBJECT(icon)); | |
456 g_object_unref(G_OBJECT(scale)); | |
457 | |
458 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list_store), &iter)) | |
459 { | |
460 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(disconnect_window->treeview)); | |
461 gtk_tree_selection_select_iter(sel, &new_row_iter); | |
462 /* if we have more than one disconnected acct, display the treeview */ | |
463 if (gtk_tree_model_iter_next(GTK_TREE_MODEL(list_store), &iter)) | |
464 gtk_widget_show_all(disconnect_window->sw); | |
7399 | 465 } |
7496 | 466 |
7399 | 467 g_free(label_text); |
7493 | 468 gtk_window_present(GTK_WINDOW(disconnect_window->window)); |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
469 } |
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
470 |
5717 | 471 static GaimConnectionUiOps conn_ui_ops = |
472 { | |
473 gaim_gtk_connection_connect_progress, | |
474 gaim_gtk_connection_connected, | |
475 gaim_gtk_connection_disconnected, | |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
476 gaim_gtk_connection_notice, |
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
477 gaim_gtk_connection_report_disconnect |
5717 | 478 }; |
479 | |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
6460
diff
changeset
|
480 GaimConnectionUiOps * |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
6460
diff
changeset
|
481 gaim_gtk_connections_get_ui_ops(void) |
5717 | 482 { |
483 return &conn_ui_ops; | |
484 } | |
485 | |
6216 | 486 void away_on_login(const char *mesg) |
5717 | 487 { |
488 GSList *awy = away_messages; | |
489 struct away_message *a, *message = NULL; | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
490 GaimGtkBuddyList *gtkblist; |
5717 | 491 |
492 gtkblist = GAIM_GTK_BLIST(gaim_get_blist()); | |
493 | |
494 if (!gtkblist->window) { | |
495 return; | |
496 } | |
497 | |
6216 | 498 if (mesg == NULL) |
499 mesg = gaim_prefs_get_string("/core/away/default_message"); | |
500 while (awy) { | |
501 a = (struct away_message *)awy->data; | |
502 if (strcmp(a->name, mesg) == 0) { | |
503 message = a; | |
504 break; | |
5717 | 505 } |
6216 | 506 awy = awy->next; |
5717 | 507 } |
6216 | 508 if (message == NULL) { |
509 if(!away_messages) | |
510 return; | |
511 message = away_messages->data; | |
512 } | |
513 do_away_message(NULL, message); | |
5717 | 514 } |