This patch fixes bug 347850 definitely (grab_focus() thing) 
also has some improvement to GtkEntry and GtkTextView.

greets

Juan Pablo

PD: I didnt commit directly because i had changed
glade_command_set_property prototype.
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/glade3/ChangeLog,v
retrieving revision 1.617
diff -u -u -p -r1.617 ChangeLog
--- ChangeLog	26 Jul 2006 03:34:30 -0000	1.617
+++ ChangeLog	26 Jul 2006 22:09:53 -0000
@@ -1,3 +1,18 @@
+2006-07-26  Juan Pablo Ugarte <[EMAIL PROTECTED]>
+
+	* src/glade-base-editor.c, src/glade-editor-property.c:
+	  adapted to the new glade_command_set_property() prototype.
+
+	* src/glade-command.[ch]: changed prototype of
+	  glade_command_set_property(), added glade_command_set_property_value()
+
+	* src/glade-fixed.c: do not call gtk_widget_grab_focus() in
+	  glade_fixed_event() it makes widgets fight for the focus on some
+	  situations.
+
+	* src/glade-gtk.c: GtkEntry and GtkTextView support improved.
+	  Now text property can be edited from the instance itself.
+
 2006-07-25  Vincent Geddes <[EMAIL PROTECTED]>
 
 	* po/*.po: converted translations to utf8: da es ms nn pl pt ru sv ta tr
Index: src/glade-base-editor.c
===================================================================
RCS file: /cvs/gnome/glade3/src/glade-base-editor.c,v
retrieving revision 1.2
diff -u -u -p -r1.2 glade-base-editor.c
--- src/glade-base-editor.c	26 Jul 2006 03:09:02 -0000	1.2
+++ src/glade-base-editor.c	26 Jul 2006 22:09:59 -0000
@@ -575,23 +575,19 @@ glade_base_editor_reorder_children (Glad
 	GladeWidget   *gchild;
 	GladeProperty *property;
 	GtkTreeIter parent, iter;
-        GValue val = {0, };
 	gint position = 0;
 
 	if (gtk_tree_model_iter_parent (model, &parent, child))
 		gtk_tree_model_iter_children (model, &iter, &parent);
 	else
 		gtk_tree_model_get_iter_first (model, &iter);
-	
-        g_value_init (&val, G_TYPE_INT);
 
 	do
 	{
 		gtk_tree_model_get (model, &iter, GLADE_BASE_EDITOR_MENU_GWIDGET, &gchild, -1);
-                g_value_set_int (&val, position++);
-
+		position++;
 		if ((property = glade_widget_get_property (gchild, "position")) != NULL)
-			glade_command_set_property (property, &val);
+			glade_command_set_property (property, position);
 	} while (gtk_tree_model_iter_next (model, &iter));
 }
 
Index: src/glade-command.c
===================================================================
RCS file: /cvs/gnome/glade3/src/glade-command.c,v
retrieving revision 1.81
diff -u -u -p -r1.81 glade-command.c
--- src/glade-command.c	26 Jul 2006 03:09:02 -0000	1.81
+++ src/glade-command.c	26 Jul 2006 22:10:02 -0000
@@ -645,7 +645,7 @@ glade_command_set_properties (GladePrope
 }
 
 void
-glade_command_set_property (GladeProperty *property, const GValue* pvalue)
+glade_command_set_property_value (GladeProperty *property, const GValue* pvalue)
 {
 
 	/* Dont generate undo/redo items for unchanging property values.
@@ -654,6 +654,21 @@ glade_command_set_property (GladePropert
 		return;
 
 	glade_command_set_properties (property, property->value, pvalue, NULL);
+}
+
+void
+glade_command_set_property (GladeProperty *property, ...)
+{
+	GValue *value;
+	va_list args;
+	
+	g_return_if_fail (GLADE_IS_PROPERTY (property));
+
+	va_start (args, property);
+	value = glade_property_class_make_gvalue_from_vl (property->class, args);
+	va_end (args);
+	
+	glade_command_set_property_value (property, value);
 }
 
 /**************************************************/
Index: src/glade-command.h
===================================================================
RCS file: /cvs/gnome/glade3/src/glade-command.h,v
retrieving revision 1.20
diff -u -u -p -r1.20 glade-command.h
--- src/glade-command.h	26 Jul 2006 03:09:02 -0000	1.20
+++ src/glade-command.h	26 Jul 2006 22:10:02 -0000
@@ -75,16 +75,19 @@ void           glade_command_collapse   
 
 /************************** properties *********************************/
 LIBGLADEUI_API
-void           glade_command_set_property  (GladeProperty     *property,     
-					    const GValue      *value);
+void           glade_command_set_property        (GladeProperty *property,     
+					          ...);
 LIBGLADEUI_API
-void           glade_command_set_properties(GladeProperty     *property, 
-					    const GValue      *old_value, 
-					    const GValue      *new_value, ...);
-
+void           glade_command_set_property_value  (GladeProperty *property,     
+						  const GValue  *value);
 LIBGLADEUI_API
-void           glade_command_set_properties_list (GladeProject *project, 
-						  GList        *props); // list of GCSetPropData
+void           glade_command_set_properties      (GladeProperty *property, 
+					          const GValue  *old_value, 
+					          const GValue  *new_value,
+						  ...);
+LIBGLADEUI_API
+void           glade_command_set_properties_list (GladeProject  *project, 
+						  GList         *props); // list of GCSetPropData
 
 /************************** name ******************************/
 LIBGLADEUI_API
Index: src/glade-editor-property.c
===================================================================
RCS file: /cvs/gnome/glade3/src/glade-editor-property.c,v
retrieving revision 1.43
diff -u -u -p -r1.43 glade-editor-property.c
--- src/glade-editor-property.c	19 Jul 2006 18:42:15 -0000	1.43
+++ src/glade-editor-property.c	26 Jul 2006 22:10:11 -0000
@@ -135,7 +135,7 @@ glade_editor_property_commit (GladeEdito
 	if (eprop->use_command == FALSE)
 		glade_property_set_value (eprop->property, value);
 	else
-		glade_command_set_property (eprop->property, value);
+		glade_command_set_property_value (eprop->property, value);
 
 	/* If the value was denied by a verify function, we'll have to
 	 * reload the real value.
Index: src/glade-fixed.c
===================================================================
RCS file: /cvs/gnome/glade3/src/glade-fixed.c,v
retrieving revision 1.21
diff -u -u -p -r1.21 glade-fixed.c
--- src/glade-fixed.c	26 Jul 2006 03:09:02 -0000	1.21
+++ src/glade-fixed.c	26 Jul 2006 22:10:12 -0000
@@ -768,10 +768,6 @@ glade_fixed_event (GtkWidget   *widget, 
 
 	}
 
-	/* make sure to grab focus, since we may stop default handlers */
-	if (GTK_WIDGET_CAN_FOCUS (widget) && !GTK_WIDGET_HAS_FOCUS (widget))
-		gtk_widget_grab_focus (widget);
-
 	switch (event->type)
 	{
 
Index: src/glade-gtk.c
===================================================================
RCS file: /cvs/gnome/glade3/src/glade-gtk.c,v
retrieving revision 1.150
diff -u -u -p -r1.150 glade-gtk.c
--- src/glade-gtk.c	26 Jul 2006 03:09:02 -0000	1.150
+++ src/glade-gtk.c	26 Jul 2006 22:10:21 -0000
@@ -2131,10 +2131,32 @@ glade_gtk_expander_add_child (GObject *o
 }
 
 /* -------------------------------- GtkEntry -------------------------------- */
+static void
+glade_gtk_entry_changed (GtkEditable *editable, GladeWidget *gentry)
+{
+	const gchar *text, *text_prop;
+	GladeProperty *prop;
+	
+	text = gtk_entry_get_text (GTK_ENTRY (editable));
+	
+	glade_widget_property_get (gentry, "text", &text_prop);
+	
+	if (strcmp (text, text_prop))
+		if ((prop = glade_widget_get_property (gentry, "text")))
+			glade_command_set_property (prop, text);
+}
+
 void GLADEGTK_API
 glade_gtk_entry_post_create (GObject *object, GladeCreateReason reason)
 {
-	gtk_entry_set_editable (GTK_ENTRY (object), FALSE);
+	GladeWidget *gentry;
+	
+	g_return_if_fail (GTK_IS_ENTRY (object));
+	gentry = glade_widget_get_from_gobject (object);
+	g_return_if_fail (GLADE_IS_WIDGET (gentry));
+	
+	g_signal_connect (object, "changed",
+			  G_CALLBACK (glade_gtk_entry_changed), gentry);
 }
 
 /* ----------------------------- GtkFixed/GtkLayout ------------------------------ */
@@ -2420,18 +2442,11 @@ glade_gtk_font_button_refresh_font_name 
 					 GladeWidget    *gbutton)
 {
 	GladeProperty *property;
-	GValue         value = { 0, };
 	
 	if ((property =
 	     glade_widget_get_property (gbutton, "font-name")) != NULL)
-	{
-		g_value_init (&value, G_TYPE_STRING);
-		g_value_set_string (&value, 
-				    gtk_font_button_get_font_name (button));
-		
-		glade_command_set_property  (property, &value);
-		g_value_unset (&value);
-	}
+		glade_command_set_property  (property,
+					     gtk_font_button_get_font_name (button));
 }
 
 
@@ -2442,19 +2457,9 @@ glade_gtk_color_button_refresh_color (Gt
 {
 	GladeProperty *property;
 	GdkColor       color = { 0, };
-	GValue         value = { 0, };
 	
-	if ((property =
-	     glade_widget_get_property (gbutton, "color")) != NULL)
-	{
-		g_value_init (&value, GDK_TYPE_COLOR);
-
-		gtk_color_button_get_color (button, &color);
-		g_value_set_boxed (&value, &color);
-		
-		glade_command_set_property  (property, &value);
-		g_value_unset (&value);
-	}
+	if ((property = glade_widget_get_property (gbutton, "color")) != NULL)
+		glade_command_set_property (property, &color);
 }
 
 /* ----------------------------- GtkButton ------------------------------ */
@@ -4183,21 +4188,60 @@ glade_gtk_label_set_label (GObject *obje
 }
 
 /* ----------------------------- GtkTextView ------------------------------ */
+static void
+glade_gtk_text_view_changed (GtkTextBuffer *buffer, GladeWidget *gtext)
+{
+	const gchar *text_prop;
+	GladeProperty *prop;
+	gchar *text;
+	
+	g_object_get (buffer, "text", &text, NULL);
+	
+	glade_widget_property_get (gtext, "text", &text_prop);
+	
+	if (strcmp (text, text_prop))
+		if ((prop = glade_widget_get_property (gtext, "text")))
+			glade_command_set_property (prop, text);
+	
+	g_free (text);
+}
+
+void GLADEGTK_API
+glade_gtk_text_view_post_create (GObject *object, GladeCreateReason reason)
+{
+	GtkTextBuffer *buffy = gtk_text_buffer_new (NULL);
+	GladeWidget *gtext;
+	
+	g_return_if_fail (GTK_IS_TEXT_VIEW (object));
+	gtext = glade_widget_get_from_gobject (object);
+	g_return_if_fail (GLADE_IS_WIDGET (gtext));
+	
+	gtk_text_view_set_buffer (GTK_TEXT_VIEW (object), buffy);
+	g_signal_connect (buffy, "changed",
+			  G_CALLBACK (glade_gtk_text_view_changed),
+			  gtext);
+	
+	g_object_unref (G_OBJECT (buffy));
+}
+
 void GLADEGTK_API
 glade_gtk_text_view_set_text (GObject *object, GValue *value)
 {
-    GtkTextBuffer *buffy;
-    const gchar   *string;
+	GtkTextBuffer *buffy;
+	GladeWidget *gtext;
+	const gchar *text;
+
+	g_return_if_fail (GTK_IS_TEXT_VIEW (object));
+	gtext = glade_widget_get_from_gobject (object);
+	g_return_if_fail (GLADE_IS_WIDGET (gtext));
+	
+	buffy = gtk_text_view_get_buffer (GTK_TEXT_VIEW (object));
+	
+	if ((text = g_value_get_string (value)) == NULL) return;
 
-    if ((buffy = gtk_text_view_get_buffer (GTK_TEXT_VIEW (object))) == NULL)
-    {
-	    buffy = gtk_text_buffer_new (NULL);
-	    gtk_text_view_set_buffer (GTK_TEXT_VIEW (object), buffy);
-	    g_object_unref (G_OBJECT (buffy));
-    }
-    
-    string = g_value_get_string (value);
-    gtk_text_buffer_set_text (buffy, string, strlen (string));
+	g_signal_handlers_block_by_func (buffy, glade_gtk_text_view_changed, gtext);
+	gtk_text_buffer_set_text (buffy, text, -1);
+	g_signal_handlers_unblock_by_func (buffy, glade_gtk_text_view_changed, gtext);
 }
 
 
Index: widgets/gtk+.xml.in
===================================================================
RCS file: /cvs/gnome/glade3/widgets/gtk+.xml.in,v
retrieving revision 1.62
diff -u -u -p -r1.62 gtk+.xml.in
--- widgets/gtk+.xml.in	25 Jul 2006 17:12:44 -0000	1.62
+++ widgets/gtk+.xml.in	26 Jul 2006 22:10:24 -0000
@@ -457,12 +457,11 @@
 	  <spec>glade_standard_string_spec</spec>
 	  <visible-lines>2</visible-lines>
 	</property>
-	<property id="editable" ignore="True"/>
       </properties>
     </glade-widget-class>
 
     <glade-widget-class name="GtkTextView" generic-name="textview" _title="Text View">
-      <post-create-function>empty</post-create-function>
+      <post-create-function>glade_gtk_text_view_post_create</post-create-function>
       <properties>
 	<!-- Text of the textview -->
 	<property id="text" _name="Text" translatable="True">
@@ -571,6 +570,7 @@
     </glade-widget-class>
 
     <glade-widget-class name="GtkSpinButton" generic-name="spinbutton" _title="Spin Button">
+      <post-create-function>empty</post-create-function>
       <properties>
         <property id="text" disabled="True"/>
         <property id="value" disabled="True"/>
_______________________________________________
Glade-devel maillist  -  Glade-devel@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/glade-devel

Reply via email to