Mercurial > pidgin
comparison src/dialogs.c @ 7330:5500f20a4331
[gaim-migrate @ 7918]
I made the "clear log" button use gaim_request_whatever. This fixes
bug 824285, which is:
Gaim crashes if you
1) Open log viewer
2) Click on "Clear""
3) Close log viewer
4) Click on "Ok"
A side effect of this is that I removed some gtk code from dialogs.c
I hope I didn't step on Sean's toe's too much...
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sat, 25 Oct 2003 21:08:57 +0000 |
parents | 1930e3d00ecd |
children | d81406d44e0d |
comparison
equal
deleted
inserted
replaced
7329:e3b88394d1b0 | 7330:5500f20a4331 |
---|---|
179 int options; | 179 int options; |
180 char *name; | 180 char *name; |
181 GtkWidget *bbox; | 181 GtkWidget *bbox; |
182 GtkWidget *window; | 182 GtkWidget *window; |
183 GtkWidget *layout; | 183 GtkWidget *layout; |
184 void *clear_handle; | |
184 }; | 185 }; |
185 | 186 |
186 /* Wrapper to get all the text from a GtkTextView */ | 187 /* Wrapper to get all the text from a GtkTextView */ |
187 gchar* gtk_text_view_get_text(GtkTextView *text, gboolean include_hidden_chars) | 188 gchar* gtk_text_view_get_text(GtkTextView *text, gboolean include_hidden_chars) |
188 { | 189 { |
1949 gtk_widget_show(filesel); | 1950 gtk_widget_show(filesel); |
1950 | 1951 |
1951 return; | 1952 return; |
1952 } | 1953 } |
1953 | 1954 |
1954 static void do_clear_log_file(GtkWidget *w, gchar *name) | 1955 static void do_clear_log_file(struct view_log *view) |
1955 { | 1956 { |
1956 gchar buf[256]; | 1957 gchar *filename, *buf; |
1957 gchar filename[256]; | |
1958 GtkWidget *window; | |
1959 char *tmp; | 1958 char *tmp; |
1960 | 1959 |
1961 tmp = gaim_user_dir(); | 1960 tmp = gaim_user_dir(); |
1962 g_snprintf(filename, 256, "%s" G_DIR_SEPARATOR_S "logs" G_DIR_SEPARATOR_S "%s%s", tmp, | 1961 filename = g_strdup_printf("%s" G_DIR_SEPARATOR_S "logs" G_DIR_SEPARATOR_S "%s%s", tmp, |
1963 name ? gaim_normalize(NULL, name) : "system", name ? ".log" : ""); | 1962 view ? gaim_normalize(NULL, view->name) : "system", view ? ".log" : ""); |
1964 | 1963 |
1965 if ((remove(filename)) == -1) { | 1964 if ((remove(filename)) == -1) { |
1966 g_snprintf(buf, 256, _("Couldn't remove file %s." ), filename); | 1965 buf = g_strdup_printf(_("Couldn't remove file %s." ), filename); |
1967 gaim_notify_error(NULL, NULL, buf, strerror(errno)); | 1966 gaim_notify_error(NULL, NULL, buf, strerror(errno)); |
1968 } | 1967 g_free(buf); |
1969 | 1968 } |
1970 window = g_object_get_data(G_OBJECT(w), "log_window"); | 1969 |
1971 destroy_dialog(NULL, window); | 1970 g_free(filename); |
1972 } | 1971 |
1973 | 1972 gtk_widget_destroy(view->window); |
1974 static void show_clear_log(GtkWidget *w, gchar *name) | 1973 } |
1975 { | 1974 |
1976 GtkWidget *window; | 1975 static void show_clear_log(GtkWidget *w, struct view_log *view) |
1977 GtkWidget *box; | 1976 { |
1978 GtkWidget *hbox; | 1977 char *text; |
1979 GtkWidget *button; | 1978 |
1980 GtkWidget *label; | 1979 if (view->clear_handle != NULL) |
1981 GtkWidget *hsep; | 1980 return; |
1982 | 1981 |
1983 GAIM_DIALOG(window); | 1982 text = g_strdup_printf(_("You are about to remove the log file for %s. Do you want to continue?"), |
1984 gtk_window_set_role(GTK_WINDOW(window), "dialog"); | 1983 view->name); |
1985 gtk_window_set_title(GTK_WINDOW(window), _("Clear Log")); | 1984 view->clear_handle = gaim_request_action(NULL, NULL, _("Remove Log"), |
1986 gtk_container_set_border_width(GTK_CONTAINER(window), 10); | 1985 text, -1, view, 2, |
1987 gtk_window_set_resizable(GTK_WINDOW(window), TRUE); | 1986 _("Remove Log"), |
1988 g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(destroy_dialog), window); | 1987 G_CALLBACK(do_clear_log_file), |
1989 gtk_widget_realize(window); | 1988 _("Cancel"), NULL); |
1990 | 1989 g_free(text); |
1991 box = gtk_vbox_new(FALSE, 5); | |
1992 gtk_container_add(GTK_CONTAINER(window), box); | |
1993 | |
1994 label = gtk_label_new(_("Really clear log?")); | |
1995 gtk_box_pack_start(GTK_BOX(box), label, TRUE, TRUE, 15); | |
1996 | |
1997 hsep = gtk_hseparator_new(); | |
1998 gtk_box_pack_start(GTK_BOX(box), hsep, FALSE, FALSE, 0); | |
1999 | |
2000 hbox = gtk_hbox_new(FALSE, 0); | |
2001 gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0); | |
2002 | |
2003 button = gaim_pixbuf_button_from_stock(_("OK"), GTK_STOCK_OK, GAIM_BUTTON_HORIZONTAL); | |
2004 g_object_set_data(G_OBJECT(button), "log_window", g_object_get_data(G_OBJECT(w), | |
2005 "log_window")); | |
2006 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(do_clear_log_file), name); | |
2007 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(destroy_dialog), window); | |
2008 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 5); | |
2009 | |
2010 button = gaim_pixbuf_button_from_stock(_("Cancel"), GTK_STOCK_CANCEL, GAIM_BUTTON_HORIZONTAL); | |
2011 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(destroy_dialog), window); | |
2012 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 5); | |
2013 | |
2014 gtk_widget_show_all(window); | |
2015 | |
2016 return; | |
2017 } | 1990 } |
2018 | 1991 |
2019 static void log_show_convo(struct view_log *view) | 1992 static void log_show_convo(struct view_log *view) |
2020 { | 1993 { |
2021 gchar buf[BUF_LONG]; | 1994 gchar buf[BUF_LONG]; |
2104 | 2077 |
2105 static void des_view_item(GtkObject *obj, struct view_log *view) | 2078 static void des_view_item(GtkObject *obj, struct view_log *view) |
2106 { | 2079 { |
2107 if (view->name) | 2080 if (view->name) |
2108 g_free(view->name); | 2081 g_free(view->name); |
2082 if (view->clear_handle) | |
2083 gaim_request_close(GAIM_REQUEST_ACTION, view->clear_handle); | |
2109 g_free(view); | 2084 g_free(view); |
2110 } | 2085 } |
2111 | 2086 |
2112 static void des_log_win(GObject *win, gpointer data) | 2087 static void des_log_win(GObject *win, gpointer data) |
2113 { | 2088 { |
2158 GtkTreeSelection *sel = NULL; | 2133 GtkTreeSelection *sel = NULL; |
2159 GtkTreePath *path; | 2134 GtkTreePath *path; |
2160 GtkWidget *item = NULL; | 2135 GtkWidget *item = NULL; |
2161 GtkWidget *last = NULL; | 2136 GtkWidget *last = NULL; |
2162 GtkWidget *frame; | 2137 GtkWidget *frame; |
2163 struct view_log *view; | 2138 struct view_log *view = NULL; |
2164 char *name = nm ? g_strdup(nm) : NULL; | 2139 char *name = nm ? g_strdup(nm) : NULL; |
2165 | 2140 |
2166 int options; | 2141 int options; |
2167 guint block; | 2142 guint block; |
2168 char convo_start[32]; | 2143 char convo_start[32]; |
2309 g_signal_connect(G_OBJECT(close_button), "clicked", G_CALLBACK(destroy_dialog), window); | 2284 g_signal_connect(G_OBJECT(close_button), "clicked", G_CALLBACK(destroy_dialog), window); |
2310 | 2285 |
2311 clear_button = gaim_pixbuf_button_from_stock(_("Clear"), GTK_STOCK_CLEAR, GAIM_BUTTON_HORIZONTAL); | 2286 clear_button = gaim_pixbuf_button_from_stock(_("Clear"), GTK_STOCK_CLEAR, GAIM_BUTTON_HORIZONTAL); |
2312 g_object_set_data(G_OBJECT(clear_button), "log_window", window); | 2287 g_object_set_data(G_OBJECT(clear_button), "log_window", window); |
2313 gtk_box_pack_end(GTK_BOX(bbox), clear_button, FALSE, FALSE, 5); | 2288 gtk_box_pack_end(GTK_BOX(bbox), clear_button, FALSE, FALSE, 5); |
2314 g_signal_connect(G_OBJECT(clear_button), "clicked", G_CALLBACK(show_clear_log), name); | 2289 g_signal_connect(G_OBJECT(clear_button), "clicked", G_CALLBACK(show_clear_log), view); |
2315 | 2290 |
2316 save_button = gaim_pixbuf_button_from_stock(_("Save"), GTK_STOCK_SAVE, GAIM_BUTTON_HORIZONTAL); | 2291 save_button = gaim_pixbuf_button_from_stock(_("Save"), GTK_STOCK_SAVE, GAIM_BUTTON_HORIZONTAL); |
2317 gtk_box_pack_end(GTK_BOX(bbox), save_button, FALSE, FALSE, 5); | 2292 gtk_box_pack_end(GTK_BOX(bbox), save_button, FALSE, FALSE, 5); |
2318 g_signal_connect(G_OBJECT(save_button), "clicked", G_CALLBACK(show_save_log), name); | 2293 g_signal_connect(G_OBJECT(save_button), "clicked", G_CALLBACK(show_save_log), name); |
2319 | 2294 |