diff console/libgnt/gntwidget.c @ 13930:3dbcbc5e57e1

[gaim-migrate @ 16457] Enable resizing (Alt+r, then the arrow keys, then enter/escape to end). It 'works', but needs fine-tuning. But I am going to put it off for a later date. Some other minor decoration tweaks. committer: Tailor Script <tailor@pidgin.im>
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Sat, 08 Jul 2006 02:11:11 +0000
parents 9309d27d780c
children cd2da4b079cf
line wrap: on
line diff
--- a/console/libgnt/gntwidget.c	Fri Jul 07 21:57:15 2006 +0000
+++ b/console/libgnt/gntwidget.c	Sat Jul 08 02:11:11 2006 +0000
@@ -4,6 +4,8 @@
 #include "gntutils.h"
 #include "gnt.h"
 
+#define MIN_SIZE 5
+
 enum
 {
 	SIG_DESTROY,
@@ -15,6 +17,7 @@
 	SIG_ACTIVATE,
 	SIG_EXPOSE,
 	SIG_SIZE_REQUEST,
+	SIG_CONFIRM_SIZE,
 	SIG_POSITION,
 	SIGS
 };
@@ -22,6 +25,8 @@
 static GObjectClass *parent_class = NULL;
 static guint signals[SIGS] = { 0 };
 
+static void init_widget(GntWidget *widget);
+
 static void
 gnt_widget_init(GTypeInstance *instance, gpointer class)
 {
@@ -63,6 +68,18 @@
 		gnt_widget_draw(widget);
 }
 
+static gboolean
+gnt_widget_dummy_confirm_size(GntWidget *widget, int width, int height)
+{
+	if (width < MIN_SIZE || height < MIN_SIZE)
+		return FALSE;
+	if (widget->priv.width != width && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_GROW_X))
+		return FALSE;
+	if (widget->priv.height != height && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_GROW_Y))
+		return FALSE;
+	return TRUE;
+}
+
 static void
 gnt_widget_class_init(GntWidgetClass *klass)
 {
@@ -79,6 +96,7 @@
 	klass->map = gnt_widget_map;
 	klass->lost_focus = gnt_widget_focus_change;
 	klass->gained_focus = gnt_widget_focus_change;
+	klass->confirm_size = gnt_widget_dummy_confirm_size;
 	
 	klass->key_pressed = NULL;
 	klass->activate = NULL;
@@ -155,6 +173,14 @@
 					 NULL, NULL,
 					 g_cclosure_marshal_VOID__VOID,
 					 G_TYPE_NONE, 0);
+	signals[SIG_CONFIRM_SIZE] = 
+		g_signal_new("confirm_size",
+					 G_TYPE_FROM_CLASS(klass),
+					 G_SIGNAL_RUN_LAST,
+					 G_STRUCT_OFFSET(GntWidgetClass, confirm_size),
+					 NULL, NULL,
+					 gnt_closure_marshal_BOOLEAN__INT_INT,
+					 G_TYPE_BOOLEAN, 2, G_TYPE_INT, G_TYPE_INT);
 	signals[SIG_KEY_PRESSED] = 
 		g_signal_new("key_pressed",
 					 G_TYPE_FROM_CLASS(klass),
@@ -270,23 +296,8 @@
 		
 		widget->window = newwin(widget->priv.height + shadow, widget->priv.width + shadow,
 						widget->priv.y, widget->priv.x);
-		wbkgd(widget->window, COLOR_PAIR(GNT_COLOR_NORMAL));
 
-		if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_NO_BORDER))
-		{
-			WINDOW *tmp = derwin(widget->window, widget->priv.height, widget->priv.width, 0, 0);
-			box(tmp, 0, 0);
-			delwin(tmp);
-		}
-		else
-			werase(widget->window);
-
-		if (shadow)
-		{
-			wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_SHADOW));
-			mvwvline(widget->window, 1, widget->priv.width, ' ', widget->priv.height);
-			mvwhline(widget->window, widget->priv.height, 1, ' ', widget->priv.width);
-		}
+		init_widget(widget);
 	}
 
 	g_signal_emit(widget, signals[SIG_DRAW], 0);
@@ -362,12 +373,65 @@
 	
 }
 
-void
+static void
+init_widget(GntWidget *widget)
+{
+	gboolean shadow = TRUE;
+
+	if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW))
+		shadow = FALSE;
+
+	wbkgd(widget->window, COLOR_PAIR(GNT_COLOR_NORMAL));
+	werase(widget->window);
+
+	if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_NO_BORDER))
+	{
+		WINDOW *tmp = derwin(widget->window, widget->priv.height, widget->priv.width, 0, 0);
+		box(tmp, 0, 0);
+		delwin(tmp);
+	}
+
+	if (shadow)
+	{
+		wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_SHADOW));
+		mvwvline(widget->window, 1, widget->priv.width, ' ', widget->priv.height);
+		mvwhline(widget->window, widget->priv.height, 1, ' ', widget->priv.width);
+	}
+}
+
+gboolean
 gnt_widget_set_size(GntWidget *widget, int width, int height)
 {
-	widget->priv.width = width;
-	widget->priv.height = height;
-	GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_MAPPED);
+	gboolean ret = TRUE;
+
+	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);
+	}
+
+	if (ret)
+	{
+		gboolean shadow = TRUE;
+
+		if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW))
+			shadow = FALSE;
+
+		widget->priv.width = width;
+		widget->priv.height = height;
+		if (widget->window)
+			wresize(widget->window, height + shadow, width + shadow);
+		if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED))
+			init_widget(widget);
+		else
+			GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_MAPPED);
+	}
+
+	return ret;
 }
 
 gboolean