comparison src/away.c @ 4412:8067614e49e4

[gaim-migrate @ 4685] Gtk2ification. Thanks, Ari. committer: Tailor Script <tailor@pidgin.im>
author Sean Egan <seanegan@gmail.com>
date Sat, 25 Jan 2003 23:00:32 +0000
parents 5fb47ec9bfe4
children 62c1e5e656d0
comparison
equal deleted inserted replaced
4411:2ad81729c049 4412:8067614e49e4
34 #include "pixmaps/join.xpm" 34 #include "pixmaps/join.xpm"
35 35
36 GtkWidget *imaway = NULL; 36 GtkWidget *imaway = NULL;
37 37
38 GtkWidget *awaymenu = NULL; 38 GtkWidget *awaymenu = NULL;
39 GtkWidget *clistqueue = NULL; 39 GtkWidget *awayqueue = NULL;
40 GtkWidget *clistqueuesw; 40 GtkListStore *awayqueuestore = NULL;
41 GtkWidget *awayqueuesw;
41 42
42 struct away_message *awaymessage = NULL; 43 struct away_message *awaymessage = NULL;
43 struct away_message *default_away; 44 struct away_message *default_away;
44 int auto_away; 45 int auto_away;
45 46
46 static void destroy_im_away() 47 static void destroy_im_away()
47 { 48 {
48 if (imaway) 49 if (imaway)
49 gtk_widget_destroy(imaway); 50 gtk_widget_destroy(imaway);
50 51
51 clistqueue = NULL; 52 awayqueue = NULL;
52 clistqueuesw = NULL; 53 g_object_unref(G_OBJECT(awayqueuestore));
54 awayqueuestore = NULL;
55 awayqueuesw = NULL;
53 imaway = NULL; 56 imaway = NULL;
54 } 57 }
55 58
56 void purge_away_queue(GSList **queue) 59 static void dequeue_message(GtkTreeIter *iter)
57 { 60 {
58 GSList *q = *queue; 61 gchar *name;
59 struct queued_message *qm;
60 struct gaim_conversation *cnv;
61
62 while (q) {
63 qm = q->data;
64
65 cnv = gaim_find_conversation(qm->name);
66
67 if (!cnv)
68 cnv = gaim_conversation_new(GAIM_CONV_IM, qm->name);
69
70 if (g_slist_index(connections, qm->gc) >= 0)
71 gaim_conversation_set_user(cnv, qm->gc->user);
72
73 gaim_im_write(GAIM_IM(cnv), NULL, qm->message, -1, qm->flags, qm->tm);
74
75 g_free(qm->message);
76 g_free(qm);
77
78 q->data = NULL;
79 q = q->next;
80 }
81
82 g_slist_free(*queue);
83 *queue = NULL;
84 }
85
86 void dequeue_by_buddy(GtkWidget *clist, gint row, gint column, GdkEventButton *event, gpointer data) {
87 char *temp;
88 char *name;
89 GSList *templist; 62 GSList *templist;
90 struct gaim_conversation *cnv; 63 struct gaim_conversation *cnv;
64
65 gtk_tree_model_get(GTK_TREE_MODEL(awayqueuestore), iter, 0, &name, -1);
91 66
92 if(!(event->type == GDK_2BUTTON_PRESS && event->button == 1)) 67 debug_printf("Unqueueing messages from %s.\n", name);
93 return; /* Double clicking on the clist will unqueue that users messages. */
94 68
95 gtk_clist_get_text(GTK_CLIST(clist), row, 0, &temp);
96 name = g_strdup(temp);
97
98 if (!name)
99 return;
100 debug_printf("Unqueueing messages from %s.\n", name);
101 templist = message_queue; 69 templist = message_queue;
70
102 while (templist) { 71 while (templist) {
103 struct queued_message *qm = templist->data; 72 struct queued_message *qm = templist->data;
104 if (templist->data) { 73 if (templist->data) {
105 if (!g_strcasecmp(qm->name, name)) { 74 if (!g_strcasecmp(qm->name, name)) {
106 cnv = gaim_find_conversation(name); 75 cnv = gaim_find_conversation(name);
109 cnv = gaim_conversation_new(GAIM_CONV_IM, qm->name); 78 cnv = gaim_conversation_new(GAIM_CONV_IM, qm->name);
110 79
111 if (g_slist_index(connections, qm->gc) >= 0) 80 if (g_slist_index(connections, qm->gc) >= 0)
112 gaim_conversation_set_user(cnv, qm->gc->user); 81 gaim_conversation_set_user(cnv, qm->gc->user);
113 82
114 gaim_conversation_write(cnv, NULL, qm->message, qm->len, 83 gaim_im_write(GAIM_IM(cnv), NULL, qm->message, qm->len,
115 qm->flags, qm->tm); 84 qm->flags, qm->tm);
116 g_free(qm->message); 85 g_free(qm->message);
117 g_free(qm); 86 g_free(qm);
118 templist = message_queue = g_slist_remove(message_queue, qm); 87 templist = message_queue = g_slist_remove(message_queue, qm);
119 88
120 } else { 89 } else {
121 templist = templist->next; 90 templist = templist->next;
122 } 91 }
123 } 92 }
124 } 93 }
94
125 g_free(name); 95 g_free(name);
126 gtk_clist_remove(GTK_CLIST(clist), row); 96 /* In GTK 2.2, _store_remove actually returns whether iter is valid or not
127 97 * after the remove, but in GTK 2.0 it is a void function. */
128 } 98 gtk_list_store_remove(awayqueuestore, iter);
99 }
100
101 void purge_away_queue(GSList **queue)
102 {
103 GSList *q = *queue;
104 struct queued_message *qm;
105 struct gaim_conversation *cnv;
106
107 while (q) {
108 qm = q->data;
109
110 cnv = gaim_find_conversation(qm->name);
111
112 if (!cnv)
113 cnv = gaim_conversation_new(GAIM_CONV_IM, qm->name);
114
115 if (g_slist_index(connections, qm->gc) >= 0)
116 gaim_conversation_set_user(cnv, qm->gc->user);
117
118 gaim_im_write(GAIM_IM(cnv), NULL, qm->message, -1, qm->flags, qm->tm);
119
120 g_free(qm->message);
121 g_free(qm);
122
123 q->data = NULL;
124 q = q->next;
125 }
126
127 g_slist_free(*queue);
128 *queue = NULL;
129 }
130
131 gint dequeue_cb(GtkWidget *treeview, GdkEventButton *event, gpointer data) {
132 GtkTreeIter iter;
133 GtkTreeSelection *select;
129 134
135 if(!(event->type == GDK_2BUTTON_PRESS && event->button == 1))
136 return FALSE; /* Double clicking on the list will unqueue that user's messages. */
130 137
138 select = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
139 if(gtk_tree_selection_get_selected(select, NULL, &iter))
140 dequeue_message(&iter);
141
142 return FALSE;
143 }
144
131 145
132 146
133 void toggle_away_queue() 147 void toggle_away_queue()
134 { 148 {
135 if (!clistqueue || !clistqueuesw) 149 if (!awayqueue || !awayqueuesw)
136 return; 150 return;
137 151
138 if (away_options & OPT_AWAY_QUEUE) { 152 if (away_options & OPT_AWAY_QUEUE) {
139 gtk_widget_show(clistqueue); 153 gtk_widget_show(awayqueue);
140 gtk_widget_show(clistqueuesw); 154 gtk_widget_show(awayqueuesw);
141 } else { 155 } else {
142 gtk_widget_hide(clistqueue); 156 gtk_widget_hide(awayqueue);
143 gtk_widget_hide(clistqueuesw); 157 gtk_widget_hide(awayqueuesw);
144 gtk_clist_clear(GTK_CLIST(clistqueue));
145 purge_away_queue(&message_queue); 158 purge_away_queue(&message_queue);
146 } 159 }
147 } 160 }
148 161
149 void do_im_back(GtkWidget *w, GtkWidget *x) 162 void do_im_back(GtkWidget *w, GtkWidget *x)
150 { 163 {
151 if (imaway) { 164 if (imaway) {
152 GtkWidget *tmp = imaway; 165 GtkWidget *tmp = imaway;
153 166
154 gtk_clist_freeze(GTK_CLIST(clistqueue));
155 gtk_clist_clear(GTK_CLIST(clistqueue));
156
157 purge_away_queue(&message_queue); 167 purge_away_queue(&message_queue);
158
159 gtk_clist_thaw(GTK_CLIST(clistqueue));
160 168
161 imaway = NULL; 169 imaway = NULL;
162 gtk_widget_destroy(tmp); 170 gtk_widget_destroy(tmp);
163 if (w != tmp) 171 if (w != tmp)
164 return; 172 return;
169 away_time_queue = g_slist_remove(away_time_queue, qar); 177 away_time_queue = g_slist_remove(away_time_queue, qar);
170 g_free(qar); 178 g_free(qar);
171 } 179 }
172 180
173 awaymessage = NULL; 181 awaymessage = NULL;
174 clistqueue = NULL; 182 awayqueue = NULL;
175 clistqueuesw = NULL; 183 awayqueuesw = NULL;
184 g_object_unref(G_OBJECT(awayqueuestore));
185 awayqueuestore = NULL;
176 serv_set_away_all(NULL); 186 serv_set_away_all(NULL);
177 } 187 }
178 188
179 189
180 void do_away_message(GtkWidget *w, struct away_message *a) 190 void do_away_message(GtkWidget *w, struct away_message *a)
181 { 191 {
182 GtkWidget *back; 192 GtkWidget *back;
183 GtkWidget *awaytext; 193 GtkWidget *awaytext;
184 GtkWidget *sw; 194 GtkWidget *sw;
185 GtkWidget *vbox; 195 GtkWidget *vbox;
196 GtkTreeViewColumn *column;
197 GtkCellRenderer *renderer;
186 char *buf2; 198 char *buf2;
187 char *buf; 199 char *buf;
188 200
189 if (!blist) 201 if (!blist)
190 return; 202 return;
225 GTK_IMHTML_NO_COMMENTS | GTK_IMHTML_NO_SCROLL); 237 GTK_IMHTML_NO_COMMENTS | GTK_IMHTML_NO_SCROLL);
226 g_free(buf); 238 g_free(buf);
227 gtk_imhtml_append_text(GTK_IMHTML(awaytext), "<BR>", -1, GTK_IMHTML_NO_TITLE | 239 gtk_imhtml_append_text(GTK_IMHTML(awaytext), "<BR>", -1, GTK_IMHTML_NO_TITLE |
228 GTK_IMHTML_NO_COMMENTS | GTK_IMHTML_NO_SCROLL); 240 GTK_IMHTML_NO_COMMENTS | GTK_IMHTML_NO_SCROLL);
229 241
230 clistqueuesw = gtk_scrolled_window_new(NULL, NULL); 242 awayqueuesw = gtk_scrolled_window_new(NULL, NULL);
231 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(clistqueuesw), GTK_POLICY_NEVER, 243 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(awayqueuesw), GTK_POLICY_NEVER,
232 GTK_POLICY_AUTOMATIC); 244 GTK_POLICY_AUTOMATIC);
233 gtk_box_pack_start(GTK_BOX(vbox), clistqueuesw, TRUE, TRUE, 0); 245 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(awayqueuesw),
234 246 GTK_SHADOW_IN);
235 clistqueue = gtk_clist_new(2); 247 gtk_box_pack_start(GTK_BOX(vbox), awayqueuesw, TRUE, TRUE, 0);
236 gtk_clist_set_column_width(GTK_CLIST(clistqueue), 0, 100); 248
237 gtk_widget_set_usize(GTK_WIDGET(clistqueue), -1, 50); 249 awayqueuestore = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
238 gtk_container_add(GTK_CONTAINER(clistqueuesw), clistqueue); 250 awayqueue = gtk_tree_view_new_with_model(GTK_TREE_MODEL(awayqueuestore));
239 gtk_signal_connect(GTK_OBJECT(clistqueue), "select_row", GTK_SIGNAL_FUNC(dequeue_by_buddy), NULL); 251 renderer = gtk_cell_renderer_text_new();
240 252
253 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(awayqueue), FALSE);
254 column = gtk_tree_view_column_new_with_attributes (NULL, renderer,
255 "text", 0,
256 NULL);
257 gtk_tree_view_append_column(GTK_TREE_VIEW(awayqueue), column);
258 column = gtk_tree_view_column_new_with_attributes(NULL, renderer,
259 "text", 1,
260 NULL);
261 gtk_tree_view_append_column(GTK_TREE_VIEW(awayqueue), column);
262
263 gtk_container_add(GTK_CONTAINER(awayqueuesw), awayqueue);
264
265 g_signal_connect(G_OBJECT(awayqueue), "button_press_event", G_CALLBACK(dequeue_cb), NULL);
241 266
242 267
243 if (away_options & OPT_AWAY_QUEUE) { 268 if (away_options & OPT_AWAY_QUEUE) {
244 gtk_widget_show(clistqueuesw); 269 gtk_widget_show(awayqueuesw);
245 gtk_widget_show(clistqueue); 270 gtk_widget_show(awayqueue);
246 } 271 }
247 272
248 back = picture_button(imaway, _("I'm Back!"), join_xpm); 273 back = picture_button(imaway, _("I'm Back!"), join_xpm);
249 gtk_box_pack_start(GTK_BOX(vbox), back, FALSE, FALSE, 0); 274 gtk_box_pack_start(GTK_BOX(vbox), back, FALSE, FALSE, 0);
250 g_signal_connect(GTK_OBJECT(back), "clicked", G_CALLBACK(do_im_back), imaway); 275 g_signal_connect(GTK_OBJECT(back), "clicked", G_CALLBACK(do_im_back), imaway);
603 } 628 }
604 gtk_widget_hide(GTK_WIDGET(prefs_away_menu)); 629 gtk_widget_hide(GTK_WIDGET(prefs_away_menu));
605 default_away_menu_init(GTK_WIDGET(prefs_away_menu)); 630 default_away_menu_init(GTK_WIDGET(prefs_away_menu));
606 gtk_widget_show(prefs_away_menu); 631 gtk_widget_show(prefs_away_menu);
607 } 632 }
608 633 }
609 }