Mercurial > pidgin
annotate src/gtklog.c @ 8573:7dcd6f26e4a7
[gaim-migrate @ 9321]
" This patch reimplements the system log. It writes
system log to
~/.gaim/logs/<protocol>/<username>/.system/<timestamp>.(txt|html),
where <timestamp> is the time that the account
<username> with <protocol> signs on. Nathan (faceprint)
and LSchiere suggested this logging scheme. No code is
currently written to read the old system logs.
Note that if you change the logging format, you need to
re-login the accounts for the change to take effect."
--Ka-Hing (javabsp) Cheung
who continues:
"Now this one applies, also contains a rider patch that, if
you enable sound for "Someone says your name in chat", it
will not play a sound if the message is a system message,
like if jabber chat tells you that "*** becomes available"
and *** is you, it won't play a sound."
committer: Tailor Script <tailor@pidgin.im>
| author | Luke Schierer <lschiere@pidgin.im> |
|---|---|
| date | Sat, 03 Apr 2004 18:34:29 +0000 |
| parents | 4971193f761d |
| children | 599d6ac9bbfe |
| 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); | |
| 7485 | 255 lv->logs = logs = gaim_log_get_logs(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 | |
| 305 gtk_widget_set_size_request(lv->treeview, 170, 200); | |
| 306 populate_log_tree(lv); | |
| 307 | |
| 308 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (lv->treeview)); | |
| 309 g_signal_connect (G_OBJECT (sel), "changed", | |
| 7454 | 310 G_CALLBACK (log_select_cb), |
| 7432 | 311 lv); |
| 312 | |
| 313 /* Viewer ************/ | |
| 314 vbox = gtk_vbox_new(FALSE, 6); | |
| 315 gtk_paned_add2(GTK_PANED(pane), vbox); | |
| 316 sw = gtk_scrolled_window_new(NULL, NULL); | |
| 317 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); | |
| 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 lv->imhtml = gtk_imhtml_new(NULL, NULL); | |
| 321 gtk_container_add(GTK_CONTAINER(sw), lv->imhtml); | |
| 322 gaim_setup_imhtml(lv->imhtml); | |
| 323 gtk_widget_set_size_request(lv->imhtml, 320, 200); | |
| 324 | |
| 325 /* Search box **********/ | |
| 326 hbox = gtk_hbox_new(FALSE, 6); | |
| 327 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
| 328 lv->entry = gtk_entry_new(); | |
| 329 gtk_box_pack_start(GTK_BOX(hbox), lv->entry, TRUE, TRUE, 0); | |
| 330 button = gtk_button_new_from_stock(GTK_STOCK_FIND); | |
| 7535 | 331 g_signal_connect (G_OBJECT (button), "pressed", |
| 332 G_CALLBACK (search_cb), | |
| 333 lv); | |
| 7432 | 334 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); |
| 8137 | 335 gaim_set_accessible_label (lv->treeview, label); |
| 7432 | 336 |
| 337 gtk_widget_show_all(lv->window); | |
| 338 } | |
| 8573 | 339 |
| 340 void gaim_gtk_syslog_show() | |
| 341 { | |
| 342 GtkWidget *hbox, *vbox; | |
| 343 GtkCellRenderer *rend; | |
| 344 GtkTreeViewColumn *col; | |
| 345 GtkTreeSelection *sel; | |
| 346 GtkWidget *label, *pane, *sw, *button; | |
| 347 char *text; | |
| 348 GList *accounts = NULL; | |
| 349 | |
| 350 if(syslog_viewer){ | |
| 351 gtk_window_present(GTK_WINDOW(syslog_viewer->window)); | |
| 352 return; | |
| 353 } | |
| 354 | |
| 355 syslog_viewer = g_new0(GaimGtkLogViewer, 1); | |
| 356 | |
| 357 for(accounts = gaim_accounts_get_all(); accounts != NULL; | |
| 358 accounts = accounts->next) { | |
| 359 GList *logs; | |
| 360 GaimAccount *account = (GaimAccount *)accounts->data; | |
| 361 if(!gaim_find_prpl(gaim_account_get_protocol_id(account))) | |
| 362 continue; | |
| 363 | |
| 364 logs = gaim_log_get_system_logs(account); | |
| 365 syslog_viewer->logs = g_list_concat(syslog_viewer->logs, logs); | |
| 366 } | |
| 367 syslog_viewer->logs = g_list_sort(syslog_viewer->logs, gaim_log_compare); | |
| 368 | |
| 369 /* Window ***********/ | |
| 370 syslog_viewer->window = gtk_dialog_new_with_buttons(_("System Log"), NULL, 0, | |
| 371 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); | |
| 372 gtk_container_set_border_width (GTK_CONTAINER(syslog_viewer->window), 6); | |
| 373 gtk_dialog_set_has_separator(GTK_DIALOG(syslog_viewer->window), FALSE); | |
| 374 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(syslog_viewer->window)->vbox), 0); | |
| 375 g_signal_connect(G_OBJECT(syslog_viewer->window), "response", | |
| 376 G_CALLBACK(destroy_cb), NULL); | |
| 377 | |
| 378 hbox = gtk_hbox_new(FALSE, 6); | |
| 379 gtk_container_set_border_width(GTK_CONTAINER(hbox), 6); | |
| 380 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(syslog_viewer->window)->vbox), hbox, | |
| 381 FALSE, FALSE, 0); | |
| 382 | |
| 383 /* Label ************/ | |
| 384 label = gtk_label_new(NULL); | |
| 385 text = g_strdup_printf("<span size='larger' weight='bold'>%s</span>", | |
| 386 _("System Log")); | |
| 387 gtk_label_set_markup(GTK_LABEL(label), text); | |
| 388 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
| 389 g_free(text); | |
| 390 | |
| 391 /* Pane *************/ | |
| 392 pane = gtk_hpaned_new(); | |
| 393 gtk_container_set_border_width(GTK_CONTAINER(pane), 6); | |
| 394 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(syslog_viewer->window)->vbox), pane, | |
| 395 TRUE, TRUE, 0); | |
| 396 | |
| 397 /* List *************/ | |
| 398 sw = gtk_scrolled_window_new (NULL, NULL); | |
| 399 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN); | |
| 400 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); | |
| 401 gtk_paned_add1(GTK_PANED(pane), sw); | |
| 402 syslog_viewer->treestore = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); | |
| 403 syslog_viewer->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (syslog_viewer->treestore)); | |
| 404 rend = gtk_cell_renderer_text_new(); | |
| 405 col = gtk_tree_view_column_new_with_attributes ("time", rend, "markup", 0, NULL); | |
| 406 gtk_tree_view_append_column (GTK_TREE_VIEW(syslog_viewer->treeview), col); | |
| 407 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (syslog_viewer->treeview), FALSE); | |
| 408 gtk_container_add (GTK_CONTAINER (sw), syslog_viewer->treeview); | |
| 409 | |
| 410 gtk_widget_set_size_request(syslog_viewer->treeview, 170, 200); | |
| 411 populate_log_tree(syslog_viewer); | |
| 412 | |
| 413 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (syslog_viewer->treeview)); | |
| 414 g_signal_connect (G_OBJECT (sel), "changed", | |
| 415 G_CALLBACK (log_select_cb), | |
| 416 syslog_viewer); | |
| 417 | |
| 418 /* Viewer ************/ | |
| 419 vbox = gtk_vbox_new(FALSE, 6); | |
| 420 gtk_paned_add2(GTK_PANED(pane), vbox); | |
| 421 sw = gtk_scrolled_window_new(NULL, NULL); | |
| 422 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); | |
| 423 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); | |
| 424 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); | |
| 425 syslog_viewer->imhtml = gtk_imhtml_new(NULL, NULL); | |
| 426 gtk_container_add(GTK_CONTAINER(sw), syslog_viewer->imhtml); | |
| 427 gaim_setup_imhtml(syslog_viewer->imhtml); | |
| 428 gtk_widget_set_size_request(syslog_viewer->imhtml, 400, 200); | |
| 429 | |
| 430 /* Search box **********/ | |
| 431 hbox = gtk_hbox_new(FALSE, 6); | |
| 432 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
| 433 syslog_viewer->entry = gtk_entry_new(); | |
| 434 gtk_box_pack_start(GTK_BOX(hbox), syslog_viewer->entry, TRUE, TRUE, 0); | |
| 435 button = gtk_button_new_from_stock(GTK_STOCK_FIND); | |
| 436 g_signal_connect (G_OBJECT (button), "pressed", | |
| 437 G_CALLBACK (search_cb), | |
| 438 syslog_viewer); | |
| 439 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
| 440 | |
| 441 gtk_widget_show_all(syslog_viewer->window); | |
| 442 } | |
| 443 |
