comparison src/dialogs.c @ 2621:f8b02cf4af94

[gaim-migrate @ 2634] i *really* wish i'd gotten to look this over before it got committed. i'm getting the 16-byte leaks too. i haven't tracked it down yet but I have a pretty good idea of where they're coming from. i wish i'd been able to look this over before it got committed. committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Fri, 26 Oct 2001 22:58:17 +0000
parents 6f7e1fc3e132
children 66164831c228
comparison
equal deleted inserted replaced
2620:a1b708ee93af 2621:f8b02cf4af94
219 GtkWidget *cancel; 219 GtkWidget *cancel;
220 GtkWidget *original; 220 GtkWidget *original;
221 GtkWidget *new1; 221 GtkWidget *new1;
222 GtkWidget *new2; 222 GtkWidget *new2;
223 struct gaim_connection *gc; 223 struct gaim_connection *gc;
224 };
225
226 struct view_log {
227 long offset;
228 int options;
229 char *name;
230 GtkWidget *bbox;
231 GtkWidget *window;
232 GtkWidget *layout;
224 }; 233 };
225 234
226 /*------------------------------------------------------------------------*/ 235 /*------------------------------------------------------------------------*/
227 /* Destroys */ 236 /* Destroys */
228 /*------------------------------------------------------------------------*/ 237 /*------------------------------------------------------------------------*/
306 } 315 }
307 316
308 317
309 void destroy_all_dialogs() 318 void destroy_all_dialogs()
310 { 319 {
311 GList *d = dialogwindows; 320 while (dialogwindows)
312 321 destroy_dialog(NULL, dialogwindows->data);
313 while (d) {
314 destroy_dialog(NULL, d->data);
315 d = d->next;
316 }
317
318 g_list_free(dialogwindows);
319 dialogwindows = NULL;
320 322
321 if (awaymessage) 323 if (awaymessage)
322 do_im_back(NULL, NULL); 324 do_im_back(NULL, NULL);
323 325
324 if (imdialog) { 326 if (imdialog) {
3285 while (fgets(buf, BUF_LONG, fp_old)) 3287 while (fgets(buf, BUF_LONG, fp_old))
3286 fputs(buf, fp_new); 3288 fputs(buf, fp_new);
3287 fclose(fp_old); 3289 fclose(fp_old);
3288 fclose(fp_new); 3290 fclose(fp_new);
3289 3291
3290 dialogwindows = g_list_remove(dialogwindows, filesel);
3291 gtk_widget_destroy(filesel); 3292 gtk_widget_destroy(filesel);
3292 3293
3293 return; 3294 return;
3294 } 3295 }
3295 3296
3300 3301
3301 g_snprintf(buf, BUF_LEN - 1, "%s/%s%s", getenv("HOME"), 3302 g_snprintf(buf, BUF_LEN - 1, "%s/%s%s", getenv("HOME"),
3302 name ? normalize(name) : "system", name ? ".log" : ""); 3303 name ? normalize(name) : "system", name ? ".log" : "");
3303 3304
3304 filesel = gtk_file_selection_new(_("Gaim - Save Log File")); 3305 filesel = gtk_file_selection_new(_("Gaim - Save Log File"));
3305 dialogwindows = g_list_prepend(dialogwindows, filesel);
3306 gtk_signal_connect(GTK_OBJECT(filesel), "delete_event", 3306 gtk_signal_connect(GTK_OBJECT(filesel), "delete_event",
3307 GTK_SIGNAL_FUNC(destroy_dialog), filesel); 3307 GTK_SIGNAL_FUNC(destroy_dialog), filesel);
3308 3308
3309 gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(filesel)); 3309 gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(filesel));
3310 gtk_file_selection_set_filename(GTK_FILE_SELECTION(filesel), buf); 3310 gtk_file_selection_set_filename(GTK_FILE_SELECTION(filesel), buf);
3350 GtkWidget *button; 3350 GtkWidget *button;
3351 GtkWidget *label; 3351 GtkWidget *label;
3352 GtkWidget *hsep; 3352 GtkWidget *hsep;
3353 3353
3354 window = gtk_window_new(GTK_WINDOW_DIALOG); 3354 window = gtk_window_new(GTK_WINDOW_DIALOG);
3355 dialogwindows = g_list_prepend(dialogwindows, window);
3356 gtk_window_set_wmclass(GTK_WINDOW(window), "dialog", "Gaim"); 3355 gtk_window_set_wmclass(GTK_WINDOW(window), "dialog", "Gaim");
3357 gtk_container_set_border_width(GTK_CONTAINER(window), 10); 3356 gtk_container_set_border_width(GTK_CONTAINER(window), 10);
3358 gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, TRUE); 3357 gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, TRUE);
3359 gtk_signal_connect(GTK_OBJECT(window), "delete_event", GTK_SIGNAL_FUNC(destroy_dialog), window); 3358 gtk_signal_connect(GTK_OBJECT(window), "delete_event", GTK_SIGNAL_FUNC(destroy_dialog), window);
3360 gtk_widget_realize(window); 3359 gtk_widget_realize(window);
3388 gtk_widget_show_all(window); 3387 gtk_widget_show_all(window);
3389 3388
3390 return; 3389 return;
3391 } 3390 }
3392 3391
3393 static void log_show_convo(GtkWidget *w, GtkWidget *layout) 3392 static void log_show_convo(GtkWidget *w, struct view_log *view)
3394 { 3393 {
3395 gchar buf[BUF_LONG]; 3394 gchar buf[BUF_LONG];
3396 long offset;
3397 int options;
3398 gchar *name;
3399 GtkWidget *bbox;
3400 GtkWidget *window;
3401 FILE *fp; 3395 FILE *fp;
3402 char filename[256]; 3396 char filename[256];
3403 int i=0; 3397 int i=0;
3404 GString *string; 3398 GString *string;
3405 guint block; 3399 guint block;
3406 3400
3407 offset = (long)gtk_object_get_user_data(GTK_OBJECT(w));
3408 options = (int)gtk_object_get_data(GTK_OBJECT(w), "options");
3409 name = gtk_object_get_data(GTK_OBJECT(w), "name");
3410 bbox = gtk_object_get_data(GTK_OBJECT(w), "box");
3411 window = gtk_object_get_data(GTK_OBJECT(w), "window");
3412 string = g_string_new(""); 3401 string = g_string_new("");
3413 3402
3414 if (name) { 3403 if (view->name) {
3415 char *tmp = gaim_user_dir(); 3404 char *tmp = gaim_user_dir();
3416 g_snprintf(filename, 256, "%s/logs/%s.log", tmp, normalize(name)); 3405 g_snprintf(filename, 256, "%s/logs/%s.log", tmp, normalize(view->name));
3417 g_free(tmp); 3406 g_free(tmp);
3418 } else { 3407 } else {
3419 char *tmp = gaim_user_dir(); 3408 char *tmp = gaim_user_dir();
3420 g_snprintf(filename, 256, "%s/logs/system", tmp); 3409 g_snprintf(filename, 256, "%s/logs/system", tmp);
3421 g_free(tmp); 3410 g_free(tmp);
3424 g_snprintf(buf, BUF_LONG, "Unable to open log file %s", filename); 3413 g_snprintf(buf, BUF_LONG, "Unable to open log file %s", filename);
3425 do_error_dialog(buf, "Error!"); 3414 do_error_dialog(buf, "Error!");
3426 return; 3415 return;
3427 } 3416 }
3428 3417
3429 gtk_widget_set_sensitive(bbox, FALSE); 3418 gtk_widget_set_sensitive(view->bbox, FALSE);
3430 gtk_signal_disconnect_by_func(GTK_OBJECT(window), GTK_SIGNAL_FUNC(destroy_dialog), window); 3419 gtk_signal_disconnect_by_func(GTK_OBJECT(view->window),
3431 block = gtk_signal_connect(GTK_OBJECT(window), "delete_event", 3420 GTK_SIGNAL_FUNC(destroy_dialog), view->window);
3432 GTK_SIGNAL_FUNC(dont_destroy), window); 3421 block = gtk_signal_connect(GTK_OBJECT(view->window), "delete_event",
3433 3422 GTK_SIGNAL_FUNC(dont_destroy), view->window);
3434 fseek(fp, offset, SEEK_SET); 3423
3435 gtk_imhtml_clear(GTK_IMHTML(layout)); 3424 fseek(fp, view->offset, SEEK_SET);
3425 gtk_imhtml_clear(GTK_IMHTML(view->layout));
3426 /*
3436 while (gtk_events_pending()) 3427 while (gtk_events_pending())
3437 gtk_main_iteration(); 3428 gtk_main_iteration();
3429 */
3438 3430
3439 while (fgets(buf, BUF_LONG, fp) && !strstr(buf, "---- New C")) { 3431 while (fgets(buf, BUF_LONG, fp) && !strstr(buf, "---- New C")) {
3440 i++; 3432 i++;
3441 if (strlen(buf) >= 5 && (!strncmp(buf + strlen(buf) - 5, "<BR>\n", 5))) 3433 if (strlen(buf) >= 5 && (!strncmp(buf + strlen(buf) - 5, "<BR>\n", 5)))
3442 /* take off the \n */ 3434 /* take off the \n */
3443 buf[strlen(buf) - 1] = '\0'; 3435 buf[strlen(buf) - 1] = '\0';
3444 3436
3445 if (i == 30) { 3437 if (i == 30) {
3446 gtk_imhtml_append_text(GTK_IMHTML(layout), string->str, options); 3438 gtk_imhtml_append_text(GTK_IMHTML(view->layout), string->str, view->options);
3447 g_string_free(string, TRUE); 3439 g_string_free(string, TRUE);
3448 string = g_string_new(""); 3440 string = g_string_new("");
3441 /* you can't have these anymore. if someone clicks on another item while one is
3442 * drawing, it will try to move to that item, and that causes problems here.
3449 while (gtk_events_pending()) 3443 while (gtk_events_pending())
3450 gtk_main_iteration(); 3444 gtk_main_iteration();
3445 */
3451 i = 0; 3446 i = 0;
3452 } else { 3447 } else {
3453 g_string_append(string, buf); 3448 g_string_append(string, buf);
3454 } 3449 }
3455 3450
3456 } 3451 }
3457 gtk_imhtml_append_text(GTK_IMHTML(layout), string->str, options); 3452 gtk_imhtml_append_text(GTK_IMHTML(view->layout), string->str, view->options);
3458 gtk_imhtml_append_text(GTK_IMHTML(layout), "<BR>", options); 3453 gtk_imhtml_append_text(GTK_IMHTML(view->layout), "<BR>", view->options);
3459 3454
3460 gtk_widget_set_sensitive(bbox, TRUE); 3455 gtk_widget_set_sensitive(view->bbox, TRUE);
3461 gtk_signal_disconnect(GTK_OBJECT(window), block); 3456 gtk_signal_disconnect(GTK_OBJECT(view->window), block);
3462 gtk_signal_connect(GTK_OBJECT(window), "delete_event", GTK_SIGNAL_FUNC(destroy_dialog), window); 3457 gtk_signal_connect(GTK_OBJECT(view->window), "delete_event",
3458 GTK_SIGNAL_FUNC(destroy_dialog), view->window);
3463 g_string_free(string, TRUE); 3459 g_string_free(string, TRUE);
3464 fclose(fp); 3460 fclose(fp);
3461 }
3462
3463 static void des_view_item(GtkObject *obj, struct view_log *view)
3464 {
3465 if (view->name)
3466 g_free(view->name);
3467 g_free(view);
3465 } 3468 }
3466 3469
3467 void show_log(char *name) 3470 void show_log(char *name)
3468 { 3471 {
3469 gchar filename[256]; 3472 gchar filename[256];
3481 GtkWidget *list = NULL; 3484 GtkWidget *list = NULL;
3482 GList *item_list = NULL; 3485 GList *item_list = NULL;
3483 GtkWidget *item = NULL; 3486 GtkWidget *item = NULL;
3484 GtkWidget *last = NULL; 3487 GtkWidget *last = NULL;
3485 GtkWidget *frame; 3488 GtkWidget *frame;
3489 struct view_log *view;
3486 3490
3487 int options; 3491 int options;
3488 guint block; 3492 guint block;
3489 char convo_start[32]; 3493 char convo_start[32];
3490 long offset = 0; 3494 long offset = 0;
3497 options ^= GTK_IMHTML_NO_FONTS; 3501 options ^= GTK_IMHTML_NO_FONTS;
3498 if (convo_options & OPT_CONVO_IGNORE_SIZES) 3502 if (convo_options & OPT_CONVO_IGNORE_SIZES)
3499 options ^= GTK_IMHTML_NO_SIZES; 3503 options ^= GTK_IMHTML_NO_SIZES;
3500 3504
3501 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 3505 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
3502 dialogwindows = g_list_prepend(dialogwindows, window);
3503 gtk_window_set_wmclass(GTK_WINDOW(window), "log", "Gaim"); 3506 gtk_window_set_wmclass(GTK_WINDOW(window), "log", "Gaim");
3504 if (name) 3507 if (name)
3505 g_snprintf(buf, BUF_LONG, "Gaim - Conversations with %s", name); 3508 g_snprintf(buf, BUF_LONG, "Gaim - Conversations with %s", name);
3506 else 3509 else
3507 g_snprintf(buf, BUF_LONG, "Gaim - System Log"); 3510 g_snprintf(buf, BUF_LONG, "Gaim - System Log");
3566 if (length > 31) length = 31; 3569 if (length > 31) length = 31;
3567 3570
3568 offset = ftell(fp); 3571 offset = ftell(fp);
3569 g_snprintf(convo_start, length, "%s", temp); 3572 g_snprintf(convo_start, length, "%s", temp);
3570 item = gtk_list_item_new_with_label(convo_start); 3573 item = gtk_list_item_new_with_label(convo_start);
3571 gtk_object_set_user_data(GTK_OBJECT(item), (gpointer)offset); 3574 view = g_new0(struct view_log, 1);
3572 gtk_object_set_data(GTK_OBJECT(item), "options", (gpointer)options); 3575 view->options = options;
3573 gtk_object_set_data(GTK_OBJECT(item), "name", (gpointer)name); 3576 view->offset = offset;
3574 gtk_object_set_data(GTK_OBJECT(item), "box", (gpointer)bbox); 3577 view->name = g_strdup(name);
3575 gtk_object_set_data(GTK_OBJECT(item), "window", (gpointer)window); 3578 view->bbox = bbox;
3579 view->window = window;
3580 view->layout = layout;
3576 gtk_signal_connect(GTK_OBJECT(item), "select", 3581 gtk_signal_connect(GTK_OBJECT(item), "select",
3577 GTK_SIGNAL_FUNC(log_show_convo), layout); 3582 GTK_SIGNAL_FUNC(log_show_convo), view);
3583 gtk_signal_connect(GTK_OBJECT(item), "destroy",
3584 GTK_SIGNAL_FUNC(des_view_item), view);
3578 last = item; 3585 last = item;
3579 item_list = g_list_append(item_list, item); 3586 item_list = g_list_append(item_list, item);
3580 3587
3581 gtk_widget_show(item); 3588 gtk_widget_show(item);
3582 } 3589 }
3624 gtk_signal_connect(GTK_OBJECT(save_button), "clicked", GTK_SIGNAL_FUNC(show_save_log), name); 3631 gtk_signal_connect(GTK_OBJECT(save_button), "clicked", GTK_SIGNAL_FUNC(show_save_log), name);
3625 3632
3626 gtk_widget_show_all(window); 3633 gtk_widget_show_all(window);
3627 3634
3628 if (!name) { 3635 if (!name) {
3629 gtk_object_set_user_data(GTK_OBJECT(layout), (gpointer)0); 3636 view = g_new0(struct view_log, 1);
3630 gtk_object_set_data(GTK_OBJECT(layout), "options", (gpointer)options); 3637 view->options = options;
3631 gtk_object_set_data(GTK_OBJECT(layout), "name", (gpointer)NULL); 3638 view->name = NULL;
3632 gtk_object_set_data(GTK_OBJECT(layout), "box", (gpointer)bbox); 3639 view->bbox = bbox;
3633 gtk_object_set_data(GTK_OBJECT(layout), "window", (gpointer)window); 3640 view->window = window;
3634 log_show_convo(layout, layout); 3641 view->layout = layout;
3642 log_show_convo(layout, view);
3643 gtk_signal_connect(GTK_OBJECT(layout), "destroy", GTK_SIGNAL_FUNC(des_view_item), view);
3635 } else { 3644 } else {
3636 gtk_list_select_item(GTK_LIST(list), 0); 3645 gtk_list_select_item(GTK_LIST(list), 0);
3637 } 3646 }
3638 3647
3639 gtk_widget_set_sensitive(bbox, TRUE); 3648 gtk_widget_set_sensitive(bbox, TRUE);