diff console/libgnt/gntwidget.c @ 13943:25be562aaca8

[gaim-migrate @ 16480] New widget GntLine to use as a separator. A partial dialog for add-account callback. Updating the dialog as a result of selection-change in the prpl dropdown is way ickier than I had expected it to be. It 'works' now, but quite a bit quirky. I will try to smooth things up later, perhaps next week. committer: Tailor Script <tailor@pidgin.im>
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Mon, 10 Jul 2006 23:55:24 +0000
parents cd2da4b079cf
children a71678d2da16
line wrap: on
line diff
--- a/console/libgnt/gntwidget.c	Mon Jul 10 18:08:11 2006 +0000
+++ b/console/libgnt/gntwidget.c	Mon Jul 10 23:55:24 2006 +0000
@@ -4,8 +4,6 @@
 #include "gntmarshal.h"
 #include "gnt.h"
 
-#define MIN_SIZE 5
-
 enum
 {
 	SIG_DESTROY,
@@ -18,6 +16,7 @@
 	SIG_EXPOSE,
 	SIG_SIZE_REQUEST,
 	SIG_CONFIRM_SIZE,
+	SIG_SIZE_CHANGED,
 	SIG_POSITION,
 	SIGS
 };
@@ -71,7 +70,7 @@
 static gboolean
 gnt_widget_dummy_confirm_size(GntWidget *widget, int width, int height)
 {
-	if (width < MIN_SIZE || height < MIN_SIZE)
+	if (width < widget->priv.minw || height < widget->priv.minh)
 		return FALSE;
 	if (widget->priv.width != width && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_GROW_X))
 		return FALSE;
@@ -173,6 +172,14 @@
 					 NULL, NULL,
 					 g_cclosure_marshal_VOID__VOID,
 					 G_TYPE_NONE, 0);
+	signals[SIG_SIZE_CHANGED] = 
+		g_signal_new("size_changed",
+					 G_TYPE_FROM_CLASS(klass),
+					 G_SIGNAL_RUN_LAST,
+					 G_STRUCT_OFFSET(GntWidgetClass, size_changed),
+					 NULL, NULL,
+					 gnt_closure_marshal_VOID__INT_INT,
+					 G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);
 	signals[SIG_CONFIRM_SIZE] = 
 		g_signal_new("confirm_size",
 					 G_TYPE_FROM_CLASS(klass),
@@ -245,15 +252,8 @@
 void
 gnt_widget_destroy(GntWidget *obj)
 {
-	int id;
 	g_return_if_fail(GNT_IS_WIDGET(obj));
 
-	if ((id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(obj), "gnt:queue_update"))))
-	{
-		g_source_remove(id);
-		g_object_set_data(G_OBJECT(obj), "gnt:queue_update", NULL);
-	}
-
 	gnt_widget_hide(obj);
 	delwin(obj->window);
 	if(!(GNT_WIDGET_FLAGS(obj) & GNT_WIDGET_DESTROYING))
@@ -276,7 +276,6 @@
 gnt_widget_draw(GntWidget *widget)
 {
 	/* Draw the widget */
-	DEBUG;
 	if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_DRAWING))
 		return;
 
@@ -293,10 +292,9 @@
 
 		if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW))
 			shadow = FALSE;
-		
+
 		widget->window = newwin(widget->priv.height + shadow, widget->priv.width + shadow,
 						widget->priv.y, widget->priv.x);
-
 		init_widget(widget);
 	}
 
@@ -337,11 +335,10 @@
 void
 gnt_widget_set_position(GntWidget *wid, int x, int y)
 {
+	g_signal_emit(wid, signals[SIG_POSITION], 0, x, y);
 	/* XXX: Need to install properties for these and g_object_notify */
 	wid->priv.x = x;
 	wid->priv.y = y;
-	
-	g_signal_emit(wid, signals[SIG_POSITION], 0, x, y);
 }
 
 void
@@ -404,27 +401,38 @@
 {
 	gboolean ret = TRUE;
 
+	if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW))
+	{
+		width--;
+		height--;
+	}
+
 	if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED))
 	{
-		if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW))
-		{
-			width--;
-			height--;
-		}
-		g_signal_emit(widget, signals[SIG_CONFIRM_SIZE], 0, width, height, &ret);
+		ret = gnt_widget_confirm_size(widget, width, height);
 	}
 
 	if (ret)
 	{
 		gboolean shadow = TRUE;
+		int oldw, oldh;
 
 		if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW))
 			shadow = FALSE;
 
+		oldw = widget->priv.width;
+		oldh = widget->priv.height;
+
 		widget->priv.width = width;
 		widget->priv.height = height;
+
+		g_signal_emit(widget, signals[SIG_SIZE_CHANGED], 0, oldw, oldh);
+
 		if (widget->window)
+		{
 			wresize(widget->window, height + shadow, width + shadow);
+			init_widget(widget);
+		}
 		if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED))
 			init_widget(widget);
 		else
@@ -475,7 +483,7 @@
 	if (!g_object_get_data(G_OBJECT(widget), "gnt:queue_update"))
 		return FALSE;
 	gnt_screen_update(widget);
-	g_object_set_data(G_OBJECT(widget), "gnt:queue_update", GINT_TO_POINTER(FALSE));
+	g_object_set_data(G_OBJECT(widget), "gnt:queue_update", NULL);
 	return FALSE;
 }
 
@@ -487,7 +495,15 @@
 	if (!g_object_get_data(G_OBJECT(widget), "gnt:queue_update"))
 	{
 		int id = g_timeout_add(0, update_queue_callback, widget);
-		g_object_set_data(G_OBJECT(widget), "gnt:queue_update", GINT_TO_POINTER(id));
+		g_object_set_data_full(G_OBJECT(widget), "gnt:queue_update", GINT_TO_POINTER(id),
+				(GDestroyNotify)g_source_remove);
 	}
 }
 
+gboolean gnt_widget_confirm_size(GntWidget *widget, int width, int height)
+{
+	gboolean ret = FALSE;
+	g_signal_emit(widget, signals[SIG_CONFIRM_SIZE], 0, width, height, &ret);
+	return ret;
+}
+