Update of /cvsroot/gaim/gaim/src
In directory usw-pr-cvs1:/tmp/cvs-serv3543
Modified Files:
dialogs.c gtkimhtml.c
Log Message:
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.
Index: dialogs.c
===================================================================
RCS file: /cvsroot/gaim/gaim/src/dialogs.c,v
retrieving revision 1.275
retrieving revision 1.276
diff -u -d -r1.275 -r1.276
--- dialogs.c 2001/10/25 20:24:00 1.275
+++ dialogs.c 2001/10/26 22:58:16 1.276
@@ -223,6 +223,15 @@
struct gaim_connection *gc;
};
+struct view_log {
+ long offset;
+ int options;
+ char *name;
+ GtkWidget *bbox;
+ GtkWidget *window;
+ GtkWidget *layout;
+};
+
/*------------------------------------------------------------------------*/
/* Destroys */
/*------------------------------------------------------------------------*/
@@ -308,15 +317,8 @@
void destroy_all_dialogs()
{
- GList *d = dialogwindows;
-
- while (d) {
- destroy_dialog(NULL, d->data);
- d = d->next;
- }
-
- g_list_free(dialogwindows);
- dialogwindows = NULL;
+ while (dialogwindows)
+ destroy_dialog(NULL, dialogwindows->data);
if (awaymessage)
do_im_back(NULL, NULL);
@@ -3287,7 +3289,6 @@
fclose(fp_old);
fclose(fp_new);
- dialogwindows = g_list_remove(dialogwindows, filesel);
gtk_widget_destroy(filesel);
return;
@@ -3302,7 +3303,6 @@
name ? normalize(name) : "system", name ? ".log" : "");
filesel = gtk_file_selection_new(_("Gaim - Save Log File"));
- dialogwindows = g_list_prepend(dialogwindows, filesel);
gtk_signal_connect(GTK_OBJECT(filesel), "delete_event",
GTK_SIGNAL_FUNC(destroy_dialog), filesel);
@@ -3352,7 +3352,6 @@
GtkWidget *hsep;
window = gtk_window_new(GTK_WINDOW_DIALOG);
- dialogwindows = g_list_prepend(dialogwindows, window);
gtk_window_set_wmclass(GTK_WINDOW(window), "dialog", "Gaim");
gtk_container_set_border_width(GTK_CONTAINER(window), 10);
gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, TRUE);
@@ -3390,30 +3389,20 @@
return;
}
-static void log_show_convo(GtkWidget *w, GtkWidget *layout)
+static void log_show_convo(GtkWidget *w, struct view_log *view)
{
gchar buf[BUF_LONG];
- long offset;
- int options;
- gchar *name;
- GtkWidget *bbox;
- GtkWidget *window;
FILE *fp;
char filename[256];
int i=0;
GString *string;
guint block;
- offset = (long)gtk_object_get_user_data(GTK_OBJECT(w));
- options = (int)gtk_object_get_data(GTK_OBJECT(w), "options");
- name = gtk_object_get_data(GTK_OBJECT(w), "name");
- bbox = gtk_object_get_data(GTK_OBJECT(w), "box");
- window = gtk_object_get_data(GTK_OBJECT(w), "window");
string = g_string_new("");
- if (name) {
+ if (view->name) {
char *tmp = gaim_user_dir();
- g_snprintf(filename, 256, "%s/logs/%s.log", tmp, normalize(name));
+ g_snprintf(filename, 256, "%s/logs/%s.log", tmp, normalize(view->name));
g_free(tmp);
} else {
char *tmp = gaim_user_dir();
@@ -3426,15 +3415,18 @@
return;
}
- gtk_widget_set_sensitive(bbox, FALSE);
- gtk_signal_disconnect_by_func(GTK_OBJECT(window), GTK_SIGNAL_FUNC(destroy_dialog), window);
- block = gtk_signal_connect(GTK_OBJECT(window), "delete_event",
- GTK_SIGNAL_FUNC(dont_destroy), window);
+ gtk_widget_set_sensitive(view->bbox, FALSE);
+ gtk_signal_disconnect_by_func(GTK_OBJECT(view->window),
+ GTK_SIGNAL_FUNC(destroy_dialog), view->window);
+ block = gtk_signal_connect(GTK_OBJECT(view->window), "delete_event",
+ GTK_SIGNAL_FUNC(dont_destroy), view->window);
- fseek(fp, offset, SEEK_SET);
- gtk_imhtml_clear(GTK_IMHTML(layout));
+ fseek(fp, view->offset, SEEK_SET);
+ gtk_imhtml_clear(GTK_IMHTML(view->layout));
+ /*
while (gtk_events_pending())
gtk_main_iteration();
+ */
while (fgets(buf, BUF_LONG, fp) && !strstr(buf, "---- New C")) {
i++;
@@ -3443,27 +3435,38 @@
buf[strlen(buf) - 1] = '\0';
if (i == 30) {
- gtk_imhtml_append_text(GTK_IMHTML(layout), string->str, options);
+ gtk_imhtml_append_text(GTK_IMHTML(view->layout), string->str, view->options);
g_string_free(string, TRUE);
string = g_string_new("");
+ /* you can't have these anymore. if someone clicks on another item while one is
+ * drawing, it will try to move to that item, and that causes problems here.
while (gtk_events_pending())
gtk_main_iteration();
+ */
i = 0;
} else {
g_string_append(string, buf);
}
}
- gtk_imhtml_append_text(GTK_IMHTML(layout), string->str, options);
- gtk_imhtml_append_text(GTK_IMHTML(layout), "<BR>", options);
+ gtk_imhtml_append_text(GTK_IMHTML(view->layout), string->str, view->options);
+ gtk_imhtml_append_text(GTK_IMHTML(view->layout), "<BR>", view->options);
- gtk_widget_set_sensitive(bbox, TRUE);
- gtk_signal_disconnect(GTK_OBJECT(window), block);
- gtk_signal_connect(GTK_OBJECT(window), "delete_event", GTK_SIGNAL_FUNC(destroy_dialog), window);
+ gtk_widget_set_sensitive(view->bbox, TRUE);
+ gtk_signal_disconnect(GTK_OBJECT(view->window), block);
+ gtk_signal_connect(GTK_OBJECT(view->window), "delete_event",
+ GTK_SIGNAL_FUNC(destroy_dialog), view->window);
g_string_free(string, TRUE);
fclose(fp);
}
+static void des_view_item(GtkObject *obj, struct view_log *view)
+{
+ if (view->name)
+ g_free(view->name);
+ g_free(view);
+}
+
void show_log(char *name)
{
gchar filename[256];
@@ -3483,6 +3486,7 @@
GtkWidget *item = NULL;
GtkWidget *last = NULL;
GtkWidget *frame;
+ struct view_log *view;
int options;
guint block;
@@ -3499,7 +3503,6 @@
options ^= GTK_IMHTML_NO_SIZES;
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- dialogwindows = g_list_prepend(dialogwindows, window);
gtk_window_set_wmclass(GTK_WINDOW(window), "log", "Gaim");
if (name)
g_snprintf(buf, BUF_LONG, "Gaim - Conversations with %s", name);
@@ -3568,13 +3571,17 @@
offset = ftell(fp);
g_snprintf(convo_start, length, "%s", temp);
item = gtk_list_item_new_with_label(convo_start);
- gtk_object_set_user_data(GTK_OBJECT(item), (gpointer)offset);
- gtk_object_set_data(GTK_OBJECT(item), "options", (gpointer)options);
- gtk_object_set_data(GTK_OBJECT(item), "name", (gpointer)name);
- gtk_object_set_data(GTK_OBJECT(item), "box", (gpointer)bbox);
- gtk_object_set_data(GTK_OBJECT(item), "window", (gpointer)window);
+ view = g_new0(struct view_log, 1);
+ view->options = options;
+ view->offset = offset;
+ view->name = g_strdup(name);
+ view->bbox = bbox;
+ view->window = window;
+ view->layout = layout;
gtk_signal_connect(GTK_OBJECT(item), "select",
- GTK_SIGNAL_FUNC(log_show_convo), layout);
+ GTK_SIGNAL_FUNC(log_show_convo), view);
+ gtk_signal_connect(GTK_OBJECT(item), "destroy",
+ GTK_SIGNAL_FUNC(des_view_item), view);
last = item;
item_list = g_list_append(item_list, item);
@@ -3626,12 +3633,14 @@
gtk_widget_show_all(window);
if (!name) {
- gtk_object_set_user_data(GTK_OBJECT(layout), (gpointer)0);
- gtk_object_set_data(GTK_OBJECT(layout), "options", (gpointer)options);
- gtk_object_set_data(GTK_OBJECT(layout), "name", (gpointer)NULL);
- gtk_object_set_data(GTK_OBJECT(layout), "box", (gpointer)bbox);
- gtk_object_set_data(GTK_OBJECT(layout), "window", (gpointer)window);
- log_show_convo(layout, layout);
+ view = g_new0(struct view_log, 1);
+ view->options = options;
+ view->name = NULL;
+ view->bbox = bbox;
+ view->window = window;
+ view->layout = layout;
+ log_show_convo(layout, view);
+ gtk_signal_connect(GTK_OBJECT(layout), "destroy", GTK_SIGNAL_FUNC(des_view_item), view);
} else {
gtk_list_select_item(GTK_LIST(list), 0);
}
Index: gtkimhtml.c
===================================================================
RCS file: /cvsroot/gaim/gaim/src/gtkimhtml.c,v
retrieving revision 1.61
retrieving revision 1.62
diff -u -d -r1.61 -r1.62
--- gtkimhtml.c 2001/10/25 22:16:16 1.61
+++ gtkimhtml.c 2001/10/26 22:58:17 1.62
@@ -353,6 +353,9 @@
g_free (bit);
}
+ if (imhtml->line)
+ g_list_free (imhtml->line);
+
while (imhtml->urls) {
g_free (imhtml->urls->data);
imhtml->urls = g_list_remove (imhtml->urls, imhtml->urls->data);
@@ -3448,9 +3451,13 @@
void
gtk_imhtml_clear (GtkIMHtml *imhtml)
{
+ GtkLayout *layout;
+
g_return_if_fail (imhtml != NULL);
g_return_if_fail (GTK_IS_IMHTML (imhtml));
+ layout = GTK_LAYOUT (imhtml);
+
while (imhtml->bits) {
GtkIMHtmlBit *bit = imhtml->bits->data;
imhtml->bits = g_list_remove (imhtml->bits, bit);
@@ -3490,6 +3497,12 @@
imhtml->selected_text = g_string_new ("");
}
+ imhtml->sel_startx = 0;
+ imhtml->sel_starty = 0;
+ imhtml->sel_endx = 0;
+ imhtml->sel_endx = 0;
+ imhtml->sel_endchunk = NULL;
+
if (imhtml->tip_timer) {
gtk_timeout_remove (imhtml->tip_timer);
imhtml->tip_timer = 0;
@@ -3500,13 +3513,36 @@
}
imhtml->tip_bit = NULL;
+ if (imhtml->scroll_timer) {
+ gtk_timeout_remove (imhtml->scroll_timer);
+ imhtml->scroll_timer = 0;
+ }
+
gdk_window_set_cursor (GTK_LAYOUT (imhtml)->bin_window, imhtml->arrow_cursor);
imhtml->x = 0;
imhtml->y = TOP_BORDER;
+ imhtml->xsize = 0;
imhtml->llheight = 0;
imhtml->llascent = 0;
+ if (imhtml->line)
+ g_list_free (imhtml->line);
imhtml->line = NULL;
+
+ layout->hadjustment->page_size = 0;
+ layout->hadjustment->page_increment = 0;
+ layout->hadjustment->lower = 0;
+ layout->hadjustment->upper = imhtml->x;
+ gtk_adjustment_set_value (layout->hadjustment, 0);
+
+ layout->vadjustment->page_size = 0;
+ layout->vadjustment->page_increment = 0;
+ layout->vadjustment->lower = 0;
+ layout->vadjustment->upper = imhtml->y;
+ gtk_adjustment_set_value (layout->vadjustment, 0);
+
+ gtk_signal_emit_by_name (GTK_OBJECT (layout->hadjustment), "changed");
+ gtk_signal_emit_by_name (GTK_OBJECT (layout->vadjustment), "changed");
if (GTK_WIDGET_REALIZED (GTK_WIDGET (imhtml)))
gdk_window_clear (GTK_LAYOUT (imhtml)->bin_window);
|