Mercurial > pidgin
annotate src/gtklog.c @ 10458:ad9258716144
[gaim-migrate @ 11727]
This should fix sf bug #1093455
Basically it's possible for people to kick you from an AIM chat room, and
I don't think there's anything we can do about this. When this happens
you can't rejoin, and I don't think there's anything we can do about
that, either.
But now, at least oscar will tell the core you're no longer in the chat
room when you've been kicked. i.e. it changes the chat title from
"My Lame Chat" to "(My Lame Chat)"
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Fri, 31 Dec 2004 05:42:26 +0000 |
parents | 5b33637b69fd |
children | 77ef3f2f0df8 |
rev | line source |
---|---|
7432 | 1 /** |
2 * @file gtklog.c GTK+ Log viewer | |
3 * @ingroup gtkui | |
4 * | |
5 * gaim | |
6 * | |
8046 | 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. | |
7537
083427fd8ba8
[gaim-migrate @ 8150]
Christian Hammond <chipx86@chipx86.com>
parents:
7535
diff
changeset
|
10 * |
7432 | 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 */ | |
9791 | 25 #include "internal.h" |
26 #include "gtkgaim.h" | |
7432 | 27 |
28 #include "account.h" | |
29 #include "util.h" | |
30 #include "gtkblist.h" | |
31 #include "gtkimhtml.h" | |
32 #include "gtklog.h" | |
33 #include "gtkutils.h" | |
34 #include "log.h" | |
35 | |
36 static GHashTable *log_viewers = NULL; | |
7535 | 37 static void populate_log_tree(GaimGtkLogViewer *lv); |
8573 | 38 static GaimGtkLogViewer *syslog_viewer = NULL; |
7432 | 39 |
40 struct log_viewer_hash_t { | |
41 char *screenname; | |
42 GaimAccount *account; | |
43 }; | |
44 | |
7440 | 45 static guint log_viewer_hash(gconstpointer data) |
7432 | 46 { |
7440 | 47 const struct log_viewer_hash_t *viewer = data; |
7432 | 48 return g_str_hash(viewer->screenname) + g_str_hash(gaim_account_get_username(viewer->account)); |
7440 | 49 |
7432 | 50 } |
51 | |
7440 | 52 static gint log_viewer_equal(gconstpointer y, gconstpointer z) |
7432 | 53 { |
7440 | 54 const struct log_viewer_hash_t *a, *b; |
7432 | 55 int ret; |
7440 | 56 char *normal; |
57 | |
58 a = y; | |
59 b = z; | |
60 | |
61 normal = g_strdup(gaim_normalize(a->account, a->screenname)); | |
62 ret = (a->account == b->account) && | |
63 !strcmp(normal, gaim_normalize(b->account, b->screenname)); | |
7432 | 64 g_free(normal); |
65 return ret; | |
66 } | |
67 | |
7535 | 68 static void search_cb(GtkWidget *button, GaimGtkLogViewer *lv) |
69 { | |
70 const char *search_term = gtk_entry_get_text(GTK_ENTRY(lv->entry)); | |
71 GList *logs; | |
72 GdkCursor *cursor = gdk_cursor_new(GDK_WATCH); | |
10175 | 73 |
7535 | 74 if (lv->search) |
75 g_free(lv->search); | |
10175 | 76 |
7535 | 77 gtk_tree_store_clear(lv->treestore); |
78 if (strlen(search_term) == 0) {/* reset the tree */ | |
79 populate_log_tree(lv); | |
80 lv->search = NULL; | |
7537
083427fd8ba8
[gaim-migrate @ 8150]
Christian Hammond <chipx86@chipx86.com>
parents:
7535
diff
changeset
|
81 gtk_imhtml_search_clear(GTK_IMHTML(lv->imhtml)); |
7535 | 82 return; |
83 } | |
10175 | 84 |
7535 | 85 lv->search = g_strdup(search_term); |
10175 | 86 |
7535 | 87 gdk_window_set_cursor(lv->window->window, cursor); |
88 while (gtk_events_pending()) | |
89 gtk_main_iteration(); | |
90 gdk_cursor_unref(cursor); | |
10175 | 91 |
7535 | 92 for (logs = lv->logs; logs != NULL; logs = logs->next) { |
93 char *read = gaim_log_read((GaimLog*)logs->data, NULL); | |
94 if (gaim_strcasestr(read, search_term)) { | |
95 GtkTreeIter iter; | |
96 GaimLog *log = logs->data; | |
97 char title[64]; | |
7676 | 98 char *title_utf8; /* temporary variable for utf8 conversion */ |
7535 | 99 strftime(title, sizeof(title), "%c", localtime(&log->time)); |
7676 | 100 title_utf8 = gaim_utf8_try_convert(title); |
101 strncpy(title, title_utf8, sizeof(title)); | |
102 g_free(title_utf8); | |
7535 | 103 gtk_tree_store_append (lv->treestore, &iter, NULL); |
104 gtk_tree_store_set(lv->treestore, &iter, | |
105 0, title, | |
10175 | 106 1, log, -1); |
7535 | 107 } |
108 } | |
10175 | 109 |
110 | |
7535 | 111 cursor = gdk_cursor_new(GDK_LEFT_PTR); |
112 gdk_window_set_cursor(lv->window->window, cursor); | |
113 gdk_cursor_unref(cursor); | |
114 } | |
115 | |
7454 | 116 static gboolean destroy_cb(GtkWidget *w, gint resp, struct log_viewer_hash_t *ht) { |
8573 | 117 GaimGtkLogViewer *lv = syslog_viewer; |
7454 | 118 |
8573 | 119 if(ht != NULL){ |
120 lv = g_hash_table_lookup(log_viewers, ht); | |
121 g_hash_table_remove(log_viewers, ht); | |
122 g_free(ht->screenname); | |
123 g_free(ht); | |
124 } else | |
125 syslog_viewer = NULL; | |
126 | |
7535 | 127 while (lv->logs) { |
7533 | 128 GaimLog *log = lv->logs->data; |
7535 | 129 GList *logs2; |
7685 | 130 gaim_log_free(log); |
7535 | 131 logs2 = lv->logs->next; |
132 g_list_free_1(lv->logs); | |
133 lv->logs = logs2; | |
7533 | 134 } |
7535 | 135 if (lv->search) |
136 g_free(lv->search); | |
8573 | 137 g_free(lv); |
7454 | 138 gtk_widget_destroy(w); |
139 | |
140 return TRUE; | |
141 } | |
8573 | 142 #if 0 |
143 static gboolean destroy_syslog_cb(GtkWidget *w, gint resp, void *cb) | |
144 { | |
145 while (syslog_viewer->logs) { | |
146 GaimLog *log = syslog_viewer->logs->data; | |
147 GList *logs2; | |
148 gaim_log_free(log); | |
149 logs2 = syslog_viewer->logs->next; | |
150 g_list_free_1(syslog_viewer->logs); | |
151 syslog_viewer->logs = logs2; | |
152 } | |
153 if (syslog_viewer->search) | |
154 g_free(syslog_viewer->search); | |
155 g_free(syslog_viewer); | |
156 syslog_viewer = NULL; | |
157 gtk_widget_destroy(w); | |
7454 | 158 |
8573 | 159 return TRUE; |
160 } | |
161 #endif | |
7454 | 162 static void log_select_cb(GtkTreeSelection *sel, GaimGtkLogViewer *viewer) { |
7432 | 163 GtkTreeIter iter; |
164 GValue val = { 0, }; | |
165 GtkTreeModel *model = GTK_TREE_MODEL(viewer->treestore); | |
166 GaimLog *log = NULL; | |
167 GaimLogReadFlags flags; | |
168 char *read = NULL; | |
169 char time[64]; | |
170 | |
171 char *title; | |
7676 | 172 char *title_utf8; /* temporary variable for utf8 conversion */ |
7432 | 173 |
174 if (! gtk_tree_selection_get_selected (sel, &model, &iter)) | |
175 return; | |
176 gtk_tree_model_get_value (model, &iter, 1, &val); | |
177 log = g_value_get_pointer(&val); | |
178 g_value_unset(&val); | |
179 | |
180 if (!log) | |
181 return; | |
182 | |
183 read = gaim_log_read(log, &flags); | |
184 viewer->flags = flags; | |
185 strftime(time, sizeof(time), "%c", localtime(&log->time)); | |
186 title = g_strdup_printf("%s - %s", log->name, time); | |
7676 | 187 title_utf8 = gaim_utf8_try_convert(title); |
188 g_free(title); | |
189 title = title_utf8; | |
7432 | 190 gtk_window_set_title(GTK_WINDOW(viewer->window), title); |
191 gtk_imhtml_clear(GTK_IMHTML(viewer->imhtml)); | |
10175 | 192 gtk_imhtml_append_text(GTK_IMHTML(viewer->imhtml), read, |
193 GTK_IMHTML_NO_COMMENTS | GTK_IMHTML_NO_TITLE | GTK_IMHTML_NO_SCROLL | | |
7432 | 194 ((flags & GAIM_LOG_READ_NO_NEWLINE) ? GTK_IMHTML_NO_NEWLINE : 0)); |
7535 | 195 |
196 if (viewer->search) | |
7537
083427fd8ba8
[gaim-migrate @ 8150]
Christian Hammond <chipx86@chipx86.com>
parents:
7535
diff
changeset
|
197 gtk_imhtml_search_find(GTK_IMHTML(viewer->imhtml), viewer->search); |
10175 | 198 |
7432 | 199 g_free(read); |
200 g_free(title); | |
201 } | |
202 | |
203 /* I want to make this smarter, but haven't come up with a cool algorithm to do so, yet. | |
204 * I want the tree to be divided into groups like "Today," "Yesterday," "Last week," | |
205 * "August," "2002," etc. based on how many conversation took place in each subdivision. | |
206 * | |
207 * For now, I'll just make it a flat list. | |
208 */ | |
209 static void populate_log_tree(GaimGtkLogViewer *lv) | |
210 /* Logs are made from trees in real life. | |
211 This is a tree made from logs */ | |
212 { | |
9435 | 213 char month[30]; |
7440 | 214 char title[64]; |
9435 | 215 char prev_top_month[30]; |
216 char *utf8_tmp; /* temporary variable for utf8 conversion */ | |
217 GtkTreeIter toplevel, child; | |
7432 | 218 GList *logs = lv->logs; |
219 while (logs) { | |
220 GaimLog *log = logs->data; | |
10175 | 221 |
9435 | 222 strftime(month, sizeof(month), "%B %Y", localtime(&log->time)); |
7432 | 223 strftime(title, sizeof(title), "%c", localtime(&log->time)); |
10175 | 224 |
9435 | 225 /* do utf8 conversions */ |
226 utf8_tmp = gaim_utf8_try_convert(month); | |
227 strncpy(month, utf8_tmp, sizeof(month)); | |
228 utf8_tmp = gaim_utf8_try_convert(title); | |
229 strncpy(title, utf8_tmp, sizeof(title)); | |
230 g_free(utf8_tmp); | |
10175 | 231 |
9435 | 232 if (strncmp(month, prev_top_month, sizeof(month)) != 0) { |
233 /* top level */ | |
234 gtk_tree_store_append(lv->treestore, &toplevel, NULL); | |
235 gtk_tree_store_set(lv->treestore, &toplevel, 0, month, 1, NULL, -1); | |
10175 | 236 |
9435 | 237 /* sub */ |
238 gtk_tree_store_append(lv->treestore, &child, &toplevel); | |
239 gtk_tree_store_set(lv->treestore, &child, 0, title, 1, log, -1); | |
10175 | 240 |
9435 | 241 strncpy(prev_top_month, month, sizeof(prev_top_month)); |
242 } else { | |
243 gtk_tree_store_append(lv->treestore, &child, &toplevel); | |
244 gtk_tree_store_set(lv->treestore, &child, 0, title, 1, log, -1); | |
245 } | |
10175 | 246 |
7432 | 247 logs = logs->next; |
248 } | |
249 } | |
250 | |
9917 | 251 void gaim_gtk_log_show(GaimLogType type, const char *screenname, GaimAccount *account) { |
7432 | 252 /* if (log_viewers && g_hash_table */ |
253 GtkWidget *hbox, *vbox; | |
254 GdkPixbuf *pixbuf, *scale; | |
255 GtkCellRenderer *rend; | |
256 GtkTreeViewColumn *col; | |
257 GaimGtkLogViewer *lv = NULL; | |
258 GtkTreeSelection *sel; | |
10181 | 259 GtkWidget *icon, *label, *pane, *sw, *button, *frame; |
7432 | 260 GList *logs; |
9624 | 261 char *text ,*ttext; |
7436 | 262 struct log_viewer_hash_t *ht = g_new0(struct log_viewer_hash_t, 1); |
263 | |
7432 | 264 ht->screenname = g_strdup(screenname); |
265 ht->account = account; | |
266 | |
267 if (!log_viewers) { | |
268 log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal); | |
269 } else if ((lv = g_hash_table_lookup(log_viewers, ht))) { | |
270 gtk_window_present(GTK_WINDOW(lv->window)); | |
10181 | 271 g_free(ht); |
7432 | 272 return; |
273 } | |
274 | |
275 lv = g_new0(GaimGtkLogViewer, 1); | |
9917 | 276 lv->logs = logs = gaim_log_get_logs(type, screenname, account); |
7432 | 277 g_hash_table_insert(log_viewers, ht, lv); |
278 | |
279 /* Window ***********/ | |
10175 | 280 lv->window = gtk_dialog_new_with_buttons(screenname, NULL, 0, |
7432 | 281 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); |
282 gtk_container_set_border_width (GTK_CONTAINER(lv->window), 6); | |
283 gtk_dialog_set_has_separator(GTK_DIALOG(lv->window), FALSE); | |
284 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(lv->window)->vbox), 0); | |
10175 | 285 g_signal_connect(G_OBJECT(lv->window), "response", |
7454 | 286 G_CALLBACK(destroy_cb), ht); |
287 | |
7432 | 288 hbox = gtk_hbox_new(FALSE, 6); |
289 gtk_container_set_border_width(GTK_CONTAINER(hbox), 6); | |
290 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(lv->window)->vbox), hbox, FALSE, FALSE, 0); | |
291 | |
292 /* Icon *************/ | |
293 pixbuf = create_prpl_icon(account); | |
294 scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, GDK_INTERP_BILINEAR); | |
295 icon = gtk_image_new_from_pixbuf(scale); | |
296 gtk_box_pack_start(GTK_BOX(hbox), icon, FALSE, FALSE, 0); | |
297 g_object_unref(G_OBJECT(pixbuf)); | |
298 g_object_unref(G_OBJECT(scale)); | |
299 | |
300 /* Label ************/ | |
301 label = gtk_label_new(NULL); | |
9624 | 302 |
303 ttext = g_strdup_printf(_("Conversations with %s"), screenname); | |
304 text = g_strdup_printf("<span size='larger' weight='bold'>%s</span>",ttext); | |
305 g_free(ttext); | |
306 | |
7432 | 307 gtk_label_set_markup(GTK_LABEL(label), text); |
308 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
309 g_free(text); | |
310 | |
311 /* Pane *************/ | |
312 pane = gtk_hpaned_new(); | |
313 gtk_container_set_border_width(GTK_CONTAINER(pane), 6); | |
314 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(lv->window)->vbox), pane, TRUE, TRUE, 0); | |
10175 | 315 |
7432 | 316 /* List *************/ |
317 sw = gtk_scrolled_window_new (NULL, NULL); | |
318 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN); | |
319 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); | |
320 gtk_paned_add1(GTK_PANED(pane), sw); | |
321 lv->treestore = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); | |
322 lv->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (lv->treestore)); | |
323 rend = gtk_cell_renderer_text_new(); | |
324 col = gtk_tree_view_column_new_with_attributes ("time", rend, "markup", 0, NULL); | |
325 gtk_tree_view_append_column (GTK_TREE_VIEW(lv->treeview), col); | |
326 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (lv->treeview), FALSE); | |
327 gtk_container_add (GTK_CONTAINER (sw), lv->treeview); | |
328 populate_log_tree(lv); | |
329 | |
330 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (lv->treeview)); | |
331 g_signal_connect (G_OBJECT (sel), "changed", | |
7454 | 332 G_CALLBACK (log_select_cb), |
7432 | 333 lv); |
10181 | 334 gaim_set_accessible_label(lv->treeview, label); |
8577 | 335 |
10181 | 336 /* A fancy little box ************/ |
7432 | 337 vbox = gtk_vbox_new(FALSE, 6); |
338 gtk_paned_add2(GTK_PANED(pane), vbox); | |
10181 | 339 |
340 /* Viewer ************/ | |
341 frame = gaim_gtk_create_imhtml(FALSE, &lv->imhtml, NULL); | |
9005 | 342 gtk_widget_set_name(lv->imhtml, "gaim_gtklog_imhtml"); |
7432 | 343 gtk_widget_set_size_request(lv->imhtml, 320, 200); |
10181 | 344 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); |
345 gtk_widget_show(frame); | |
10175 | 346 |
7432 | 347 /* Search box **********/ |
348 hbox = gtk_hbox_new(FALSE, 6); | |
349 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
350 lv->entry = gtk_entry_new(); | |
351 gtk_box_pack_start(GTK_BOX(hbox), lv->entry, TRUE, TRUE, 0); | |
352 button = gtk_button_new_from_stock(GTK_STOCK_FIND); | |
353 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
10181 | 354 g_signal_connect(GTK_ENTRY(lv->entry), "activate", G_CALLBACK(search_cb), lv); |
355 g_signal_connect(GTK_BUTTON(button), "activate", G_CALLBACK(search_cb), lv); | |
356 g_signal_connect(GTK_BUTTON(button), "clicked", G_CALLBACK(search_cb), lv); | |
7432 | 357 |
358 gtk_widget_show_all(lv->window); | |
359 } | |
8573 | 360 |
361 void gaim_gtk_syslog_show() | |
362 { | |
363 GtkWidget *hbox, *vbox; | |
364 GtkCellRenderer *rend; | |
365 GtkTreeViewColumn *col; | |
366 GtkTreeSelection *sel; | |
10181 | 367 GtkWidget *label, *pane, *sw, *button, *frame; |
8573 | 368 char *text; |
369 GList *accounts = NULL; | |
370 | |
10181 | 371 if (syslog_viewer != NULL) { |
8573 | 372 gtk_window_present(GTK_WINDOW(syslog_viewer->window)); |
373 return; | |
374 } | |
375 | |
376 syslog_viewer = g_new0(GaimGtkLogViewer, 1); | |
377 | |
378 for(accounts = gaim_accounts_get_all(); accounts != NULL; | |
379 accounts = accounts->next) { | |
380 GList *logs; | |
381 GaimAccount *account = (GaimAccount *)accounts->data; | |
382 if(!gaim_find_prpl(gaim_account_get_protocol_id(account))) | |
383 continue; | |
384 | |
385 logs = gaim_log_get_system_logs(account); | |
386 syslog_viewer->logs = g_list_concat(syslog_viewer->logs, logs); | |
387 } | |
388 syslog_viewer->logs = g_list_sort(syslog_viewer->logs, gaim_log_compare); | |
389 | |
390 /* Window ***********/ | |
10175 | 391 syslog_viewer->window = gtk_dialog_new_with_buttons(_("System Log"), NULL, 0, |
8573 | 392 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); |
393 gtk_container_set_border_width (GTK_CONTAINER(syslog_viewer->window), 6); | |
394 gtk_dialog_set_has_separator(GTK_DIALOG(syslog_viewer->window), FALSE); | |
395 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(syslog_viewer->window)->vbox), 0); | |
10175 | 396 g_signal_connect(G_OBJECT(syslog_viewer->window), "response", |
8573 | 397 G_CALLBACK(destroy_cb), NULL); |
398 | |
399 hbox = gtk_hbox_new(FALSE, 6); | |
400 gtk_container_set_border_width(GTK_CONTAINER(hbox), 6); | |
401 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(syslog_viewer->window)->vbox), hbox, | |
402 FALSE, FALSE, 0); | |
403 | |
404 /* Label ************/ | |
405 label = gtk_label_new(NULL); | |
406 text = g_strdup_printf("<span size='larger' weight='bold'>%s</span>", | |
407 _("System Log")); | |
408 gtk_label_set_markup(GTK_LABEL(label), text); | |
409 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
410 g_free(text); | |
411 | |
412 /* Pane *************/ | |
413 pane = gtk_hpaned_new(); | |
414 gtk_container_set_border_width(GTK_CONTAINER(pane), 6); | |
415 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(syslog_viewer->window)->vbox), pane, | |
416 TRUE, TRUE, 0); | |
10175 | 417 |
8573 | 418 /* List *************/ |
419 sw = gtk_scrolled_window_new (NULL, NULL); | |
420 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN); | |
421 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); | |
422 gtk_paned_add1(GTK_PANED(pane), sw); | |
423 syslog_viewer->treestore = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); | |
424 syslog_viewer->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (syslog_viewer->treestore)); | |
425 rend = gtk_cell_renderer_text_new(); | |
426 col = gtk_tree_view_column_new_with_attributes ("time", rend, "markup", 0, NULL); | |
427 gtk_tree_view_append_column (GTK_TREE_VIEW(syslog_viewer->treeview), col); | |
428 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (syslog_viewer->treeview), FALSE); | |
429 gtk_container_add (GTK_CONTAINER (sw), syslog_viewer->treeview); | |
430 | |
431 gtk_widget_set_size_request(syslog_viewer->treeview, 170, 200); | |
432 populate_log_tree(syslog_viewer); | |
433 | |
434 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (syslog_viewer->treeview)); | |
435 g_signal_connect (G_OBJECT (sel), "changed", | |
436 G_CALLBACK (log_select_cb), | |
437 syslog_viewer); | |
9005 | 438 |
10181 | 439 /* A fancy little box ************/ |
8573 | 440 vbox = gtk_vbox_new(FALSE, 6); |
441 gtk_paned_add2(GTK_PANED(pane), vbox); | |
10181 | 442 |
443 /* Viewer ************/ | |
444 frame = gaim_gtk_create_imhtml(FALSE, &syslog_viewer->imhtml, NULL); | |
9005 | 445 gtk_widget_set_name(syslog_viewer->imhtml, "gaim_gtklog_imhtml"); |
8573 | 446 gtk_widget_set_size_request(syslog_viewer->imhtml, 400, 200); |
10181 | 447 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); |
448 gtk_widget_show(frame); | |
9005 | 449 |
8573 | 450 /* Search box **********/ |
451 hbox = gtk_hbox_new(FALSE, 6); | |
452 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
453 syslog_viewer->entry = gtk_entry_new(); | |
454 gtk_box_pack_start(GTK_BOX(hbox), syslog_viewer->entry, TRUE, TRUE, 0); | |
455 button = gtk_button_new_from_stock(GTK_STOCK_FIND); | |
456 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
10181 | 457 g_signal_connect(GTK_ENTRY(syslog_viewer->entry), "activate", |
458 G_CALLBACK(search_cb), syslog_viewer); | |
459 g_signal_connect(GTK_BUTTON(button), "activate", | |
460 G_CALLBACK(search_cb), syslog_viewer); | |
461 g_signal_connect(GTK_BUTTON(button), "clicked", | |
462 G_CALLBACK(search_cb), syslog_viewer); | |
8573 | 463 |
10175 | 464 gtk_widget_show_all(syslog_viewer->window); |
8573 | 465 } |