Mercurial > pidgin.yaz
annotate src/gtklog.c @ 8995:9caf796e74aa
[gaim-migrate @ 9770]
"Luke, if you get a chance, could you commit this? It should improve the
HTML escaping situation between Gaim and other AIM and ICQ clients. I haven't
actually applied it locally or tested it, but it looks ok to me. I would do
it myself, but there are other changes in my oscar.c that aren't ready to
commit, and I want to go to sleep so I can wake up tomorrow...
I'll probably be out of town climbing until Sunday night... "--Mark Doliner
"Below is an email I nearly sent you, before deciding to test & document the
failure cases I knew of.
http://www.nosnilmot.com/gaim/oscar-html.txt shows how current CVS behaves
sending the string "<foo>" between GaimICQ/GaimAIM/ICQLite/WinAIM in various
combinations After that testing I couldn't help trying to fix it :)
The attached patch, from my testing, resolves all those marked with "XX" so
that what is received matches what the user sent. The code might not be the
most efficient and may contain redundant bits but I've had enough of this
for now, 2 Windows crashes which caused VMWare to be weird and half break
my keyboard and require restarting X.
The patch might want a bit more testing, especially with iChat (I'm unable
to test with that). Maybe committing it to CVS might get it some more
testing though ;-)" --Stu Tomlinson
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Fri, 21 May 2004 11:55:08 +0000 |
parents | de87e510ff9a |
children | 230cf4032e3d |
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 */ | |
25 | |
26 #include "gtkinternal.h" | |
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); | |
73 | |
74 if (lv->search) | |
75 g_free(lv->search); | |
76 | |
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 } | |
84 | |
85 lv->search = g_strdup(search_term); | |
86 | |
87 gdk_window_set_cursor(lv->window->window, cursor); | |
88 while (gtk_events_pending()) | |
89 gtk_main_iteration(); | |
90 gdk_cursor_unref(cursor); | |
91 | |
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, | |
106 1, log, -1); | |
107 } | |
108 } | |
109 | |
110 | |
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)); | |
192 gtk_imhtml_append_text(GTK_IMHTML(viewer->imhtml), read, | |
193 GTK_IMHTML_NO_COMMENTS | GTK_IMHTML_NO_TITLE | GTK_IMHTML_NO_SCROLL | | |
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); |
7535 | 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 { | |
7440 | 213 char title[64]; |
7676 | 214 char *title_utf8; /* temporary variable for utf8 conversion */ |
7432 | 215 GtkTreeIter iter; |
216 GList *logs = lv->logs; | |
217 while (logs) { | |
218 GaimLog *log = logs->data; | |
219 strftime(title, sizeof(title), "%c", localtime(&log->time)); | |
7676 | 220 title_utf8 = gaim_utf8_try_convert(title); |
221 strncpy(title, title_utf8, sizeof(title)); | |
222 g_free(title_utf8); | |
7432 | 223 gtk_tree_store_append (lv->treestore, &iter, NULL); |
224 gtk_tree_store_set(lv->treestore, &iter, | |
225 0, title, | |
226 1, log, -1); | |
227 logs = logs->next; | |
228 } | |
229 } | |
230 | |
231 void gaim_gtk_log_show(const char *screenname, GaimAccount *account) { | |
232 /* if (log_viewers && g_hash_table */ | |
233 GtkWidget *hbox, *vbox; | |
234 GdkPixbuf *pixbuf, *scale; | |
235 GtkCellRenderer *rend; | |
236 GtkTreeViewColumn *col; | |
237 GaimGtkLogViewer *lv = NULL; | |
238 GtkTreeSelection *sel; | |
239 GtkWidget *icon, *label, *pane, *sw, *button; | |
240 GList *logs; | |
241 char *text; | |
7436 | 242 struct log_viewer_hash_t *ht = g_new0(struct log_viewer_hash_t, 1); |
243 | |
7432 | 244 ht->screenname = g_strdup(screenname); |
245 ht->account = account; | |
246 | |
247 if (!log_viewers) { | |
248 log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal); | |
249 } else if ((lv = g_hash_table_lookup(log_viewers, ht))) { | |
250 gtk_window_present(GTK_WINDOW(lv->window)); | |
251 return; | |
252 } | |
253 | |
254 lv = g_new0(GaimGtkLogViewer, 1); | |
8898 | 255 lv->logs = logs = gaim_log_get_logs(GAIM_LOG_IM, screenname, account); |
7432 | 256 g_hash_table_insert(log_viewers, ht, lv); |
257 | |
258 /* Window ***********/ | |
259 lv->window = gtk_dialog_new_with_buttons(screenname, NULL, 0, | |
260 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); | |
261 gtk_container_set_border_width (GTK_CONTAINER(lv->window), 6); | |
262 gtk_dialog_set_has_separator(GTK_DIALOG(lv->window), FALSE); | |
263 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(lv->window)->vbox), 0); | |
7454 | 264 g_signal_connect(G_OBJECT(lv->window), "response", |
265 G_CALLBACK(destroy_cb), ht); | |
266 | |
7432 | 267 hbox = gtk_hbox_new(FALSE, 6); |
268 gtk_container_set_border_width(GTK_CONTAINER(hbox), 6); | |
269 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(lv->window)->vbox), hbox, FALSE, FALSE, 0); | |
270 | |
271 /* Icon *************/ | |
272 pixbuf = create_prpl_icon(account); | |
273 scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, GDK_INTERP_BILINEAR); | |
274 icon = gtk_image_new_from_pixbuf(scale); | |
275 gtk_box_pack_start(GTK_BOX(hbox), icon, FALSE, FALSE, 0); | |
276 g_object_unref(G_OBJECT(pixbuf)); | |
277 g_object_unref(G_OBJECT(scale)); | |
278 | |
279 /* Label ************/ | |
280 label = gtk_label_new(NULL); | |
281 text = g_strdup_printf("<span size='larger' weight='bold'>%s %s</span>", | |
282 _("Conversations with"), screenname); | |
283 gtk_label_set_markup(GTK_LABEL(label), text); | |
284 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
285 g_free(text); | |
286 | |
287 /* Pane *************/ | |
288 pane = gtk_hpaned_new(); | |
289 gtk_container_set_border_width(GTK_CONTAINER(pane), 6); | |
290 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(lv->window)->vbox), pane, TRUE, TRUE, 0); | |
291 | |
292 /* List *************/ | |
293 sw = gtk_scrolled_window_new (NULL, NULL); | |
294 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN); | |
295 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); | |
296 gtk_paned_add1(GTK_PANED(pane), sw); | |
297 lv->treestore = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); | |
298 lv->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (lv->treestore)); | |
299 rend = gtk_cell_renderer_text_new(); | |
300 col = gtk_tree_view_column_new_with_attributes ("time", rend, "markup", 0, NULL); | |
301 gtk_tree_view_append_column (GTK_TREE_VIEW(lv->treeview), col); | |
302 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (lv->treeview), FALSE); | |
303 gtk_container_add (GTK_CONTAINER (sw), lv->treeview); | |
304 populate_log_tree(lv); | |
305 | |
306 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (lv->treeview)); | |
307 g_signal_connect (G_OBJECT (sel), "changed", | |
7454 | 308 G_CALLBACK (log_select_cb), |
7432 | 309 lv); |
8577 | 310 |
7432 | 311 /* Viewer ************/ |
312 vbox = gtk_vbox_new(FALSE, 6); | |
313 gtk_paned_add2(GTK_PANED(pane), vbox); | |
314 sw = gtk_scrolled_window_new(NULL, NULL); | |
315 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); | |
316 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); | |
317 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); | |
318 lv->imhtml = gtk_imhtml_new(NULL, NULL); | |
319 gtk_container_add(GTK_CONTAINER(sw), lv->imhtml); | |
320 gaim_setup_imhtml(lv->imhtml); | |
321 gtk_widget_set_size_request(lv->imhtml, 320, 200); | |
322 | |
323 /* Search box **********/ | |
324 hbox = gtk_hbox_new(FALSE, 6); | |
325 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
326 lv->entry = gtk_entry_new(); | |
327 gtk_box_pack_start(GTK_BOX(hbox), lv->entry, TRUE, TRUE, 0); | |
328 button = gtk_button_new_from_stock(GTK_STOCK_FIND); | |
7535 | 329 g_signal_connect (G_OBJECT (button), "pressed", |
330 G_CALLBACK (search_cb), | |
331 lv); | |
7432 | 332 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); |
8137 | 333 gaim_set_accessible_label (lv->treeview, label); |
7432 | 334 |
335 gtk_widget_show_all(lv->window); | |
336 } | |
8573 | 337 |
338 void gaim_gtk_syslog_show() | |
339 { | |
340 GtkWidget *hbox, *vbox; | |
341 GtkCellRenderer *rend; | |
342 GtkTreeViewColumn *col; | |
343 GtkTreeSelection *sel; | |
344 GtkWidget *label, *pane, *sw, *button; | |
345 char *text; | |
346 GList *accounts = NULL; | |
347 | |
348 if(syslog_viewer){ | |
349 gtk_window_present(GTK_WINDOW(syslog_viewer->window)); | |
350 return; | |
351 } | |
352 | |
353 syslog_viewer = g_new0(GaimGtkLogViewer, 1); | |
354 | |
355 for(accounts = gaim_accounts_get_all(); accounts != NULL; | |
356 accounts = accounts->next) { | |
357 GList *logs; | |
358 GaimAccount *account = (GaimAccount *)accounts->data; | |
359 if(!gaim_find_prpl(gaim_account_get_protocol_id(account))) | |
360 continue; | |
361 | |
362 logs = gaim_log_get_system_logs(account); | |
363 syslog_viewer->logs = g_list_concat(syslog_viewer->logs, logs); | |
364 } | |
365 syslog_viewer->logs = g_list_sort(syslog_viewer->logs, gaim_log_compare); | |
366 | |
367 /* Window ***********/ | |
368 syslog_viewer->window = gtk_dialog_new_with_buttons(_("System Log"), NULL, 0, | |
369 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); | |
370 gtk_container_set_border_width (GTK_CONTAINER(syslog_viewer->window), 6); | |
371 gtk_dialog_set_has_separator(GTK_DIALOG(syslog_viewer->window), FALSE); | |
372 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(syslog_viewer->window)->vbox), 0); | |
373 g_signal_connect(G_OBJECT(syslog_viewer->window), "response", | |
374 G_CALLBACK(destroy_cb), NULL); | |
375 | |
376 hbox = gtk_hbox_new(FALSE, 6); | |
377 gtk_container_set_border_width(GTK_CONTAINER(hbox), 6); | |
378 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(syslog_viewer->window)->vbox), hbox, | |
379 FALSE, FALSE, 0); | |
380 | |
381 /* Label ************/ | |
382 label = gtk_label_new(NULL); | |
383 text = g_strdup_printf("<span size='larger' weight='bold'>%s</span>", | |
384 _("System Log")); | |
385 gtk_label_set_markup(GTK_LABEL(label), text); | |
386 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
387 g_free(text); | |
388 | |
389 /* Pane *************/ | |
390 pane = gtk_hpaned_new(); | |
391 gtk_container_set_border_width(GTK_CONTAINER(pane), 6); | |
392 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(syslog_viewer->window)->vbox), pane, | |
393 TRUE, TRUE, 0); | |
394 | |
395 /* List *************/ | |
396 sw = gtk_scrolled_window_new (NULL, NULL); | |
397 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN); | |
398 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); | |
399 gtk_paned_add1(GTK_PANED(pane), sw); | |
400 syslog_viewer->treestore = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); | |
401 syslog_viewer->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (syslog_viewer->treestore)); | |
402 rend = gtk_cell_renderer_text_new(); | |
403 col = gtk_tree_view_column_new_with_attributes ("time", rend, "markup", 0, NULL); | |
404 gtk_tree_view_append_column (GTK_TREE_VIEW(syslog_viewer->treeview), col); | |
405 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (syslog_viewer->treeview), FALSE); | |
406 gtk_container_add (GTK_CONTAINER (sw), syslog_viewer->treeview); | |
407 | |
408 gtk_widget_set_size_request(syslog_viewer->treeview, 170, 200); | |
409 populate_log_tree(syslog_viewer); | |
410 | |
411 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (syslog_viewer->treeview)); | |
412 g_signal_connect (G_OBJECT (sel), "changed", | |
413 G_CALLBACK (log_select_cb), | |
414 syslog_viewer); | |
415 | |
416 /* Viewer ************/ | |
417 vbox = gtk_vbox_new(FALSE, 6); | |
418 gtk_paned_add2(GTK_PANED(pane), vbox); | |
419 sw = gtk_scrolled_window_new(NULL, NULL); | |
420 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); | |
421 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); | |
422 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); | |
423 syslog_viewer->imhtml = gtk_imhtml_new(NULL, NULL); | |
424 gtk_container_add(GTK_CONTAINER(sw), syslog_viewer->imhtml); | |
425 gaim_setup_imhtml(syslog_viewer->imhtml); | |
426 gtk_widget_set_size_request(syslog_viewer->imhtml, 400, 200); | |
427 | |
428 /* Search box **********/ | |
429 hbox = gtk_hbox_new(FALSE, 6); | |
430 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
431 syslog_viewer->entry = gtk_entry_new(); | |
432 gtk_box_pack_start(GTK_BOX(hbox), syslog_viewer->entry, TRUE, TRUE, 0); | |
433 button = gtk_button_new_from_stock(GTK_STOCK_FIND); | |
434 g_signal_connect (G_OBJECT (button), "pressed", | |
435 G_CALLBACK (search_cb), | |
436 syslog_viewer); | |
437 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
438 | |
439 gtk_widget_show_all(syslog_viewer->window); | |
440 } | |
441 |