diff options
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | ChangeLog.pre-2-0 | 13 | ||||
-rw-r--r-- | ChangeLog.pre-2-10 | 13 | ||||
-rw-r--r-- | ChangeLog.pre-2-2 | 13 | ||||
-rw-r--r-- | ChangeLog.pre-2-4 | 13 | ||||
-rw-r--r-- | ChangeLog.pre-2-6 | 13 | ||||
-rw-r--r-- | ChangeLog.pre-2-8 | 13 | ||||
-rw-r--r-- | gtk/gtkentry.c | 5 | ||||
-rw-r--r-- | tests/Makefile.am | 9 | ||||
-rw-r--r-- | tests/testgtk.c | 117 | ||||
-rw-r--r-- | tests/testtreeview.c | 482 |
11 files changed, 144 insertions, 560 deletions
@@ -1,3 +1,16 @@ +Wed May 2 20:36:38 2001 Owen Taylor <otaylor@redhat.com> + + * gtk/gtkentry.c (gtk_entry_real_insert_text): Reduce + new_text_length appropriately when we run into the + size limit for the entry. (#53445, reported by Jeff Franks) + + * tests/testgtk.c (create_entry): Remove most of the + property toggle buttons. Replace with a "Props" button + that brings up a property editor. + + * tests/prop-editor.[ch] test/testtreeview.c tests/Makefile.am: + Split the property editor code out for reuse, improve. + Wed May 2 17:26:22 2001 Owen Taylor <otaylor@redhat.com> * gdk/x11/gdkevents-x11.c gdk/x11/gdkwindow-x11.c: Always diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index d6a044fc0d..75eefe700c 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,16 @@ +Wed May 2 20:36:38 2001 Owen Taylor <otaylor@redhat.com> + + * gtk/gtkentry.c (gtk_entry_real_insert_text): Reduce + new_text_length appropriately when we run into the + size limit for the entry. (#53445, reported by Jeff Franks) + + * tests/testgtk.c (create_entry): Remove most of the + property toggle buttons. Replace with a "Props" button + that brings up a property editor. + + * tests/prop-editor.[ch] test/testtreeview.c tests/Makefile.am: + Split the property editor code out for reuse, improve. + Wed May 2 17:26:22 2001 Owen Taylor <otaylor@redhat.com> * gdk/x11/gdkevents-x11.c gdk/x11/gdkwindow-x11.c: Always diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index d6a044fc0d..75eefe700c 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,16 @@ +Wed May 2 20:36:38 2001 Owen Taylor <otaylor@redhat.com> + + * gtk/gtkentry.c (gtk_entry_real_insert_text): Reduce + new_text_length appropriately when we run into the + size limit for the entry. (#53445, reported by Jeff Franks) + + * tests/testgtk.c (create_entry): Remove most of the + property toggle buttons. Replace with a "Props" button + that brings up a property editor. + + * tests/prop-editor.[ch] test/testtreeview.c tests/Makefile.am: + Split the property editor code out for reuse, improve. + Wed May 2 17:26:22 2001 Owen Taylor <otaylor@redhat.com> * gdk/x11/gdkevents-x11.c gdk/x11/gdkwindow-x11.c: Always diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index d6a044fc0d..75eefe700c 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,16 @@ +Wed May 2 20:36:38 2001 Owen Taylor <otaylor@redhat.com> + + * gtk/gtkentry.c (gtk_entry_real_insert_text): Reduce + new_text_length appropriately when we run into the + size limit for the entry. (#53445, reported by Jeff Franks) + + * tests/testgtk.c (create_entry): Remove most of the + property toggle buttons. Replace with a "Props" button + that brings up a property editor. + + * tests/prop-editor.[ch] test/testtreeview.c tests/Makefile.am: + Split the property editor code out for reuse, improve. + Wed May 2 17:26:22 2001 Owen Taylor <otaylor@redhat.com> * gdk/x11/gdkevents-x11.c gdk/x11/gdkwindow-x11.c: Always diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index d6a044fc0d..75eefe700c 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,16 @@ +Wed May 2 20:36:38 2001 Owen Taylor <otaylor@redhat.com> + + * gtk/gtkentry.c (gtk_entry_real_insert_text): Reduce + new_text_length appropriately when we run into the + size limit for the entry. (#53445, reported by Jeff Franks) + + * tests/testgtk.c (create_entry): Remove most of the + property toggle buttons. Replace with a "Props" button + that brings up a property editor. + + * tests/prop-editor.[ch] test/testtreeview.c tests/Makefile.am: + Split the property editor code out for reuse, improve. + Wed May 2 17:26:22 2001 Owen Taylor <otaylor@redhat.com> * gdk/x11/gdkevents-x11.c gdk/x11/gdkwindow-x11.c: Always diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index d6a044fc0d..75eefe700c 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,16 @@ +Wed May 2 20:36:38 2001 Owen Taylor <otaylor@redhat.com> + + * gtk/gtkentry.c (gtk_entry_real_insert_text): Reduce + new_text_length appropriately when we run into the + size limit for the entry. (#53445, reported by Jeff Franks) + + * tests/testgtk.c (create_entry): Remove most of the + property toggle buttons. Replace with a "Props" button + that brings up a property editor. + + * tests/prop-editor.[ch] test/testtreeview.c tests/Makefile.am: + Split the property editor code out for reuse, improve. + Wed May 2 17:26:22 2001 Owen Taylor <otaylor@redhat.com> * gdk/x11/gdkevents-x11.c gdk/x11/gdkwindow-x11.c: Always diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index d6a044fc0d..75eefe700c 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,16 @@ +Wed May 2 20:36:38 2001 Owen Taylor <otaylor@redhat.com> + + * gtk/gtkentry.c (gtk_entry_real_insert_text): Reduce + new_text_length appropriately when we run into the + size limit for the entry. (#53445, reported by Jeff Franks) + + * tests/testgtk.c (create_entry): Remove most of the + property toggle buttons. Replace with a "Props" button + that brings up a property editor. + + * tests/prop-editor.[ch] test/testtreeview.c tests/Makefile.am: + Split the property editor code out for reuse, improve. + Wed May 2 17:26:22 2001 Owen Taylor <otaylor@redhat.com> * gdk/x11/gdkevents-x11.c gdk/x11/gdkwindow-x11.c: Always diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c index d7ac305671..9591896f36 100644 --- a/gtk/gtkentry.c +++ b/gtk/gtkentry.c @@ -754,7 +754,7 @@ gtk_entry_set_property (GObject *object, break; case PROP_INVISIBLE_CHAR: - gtk_entry_set_invisible_char (entry, g_value_get_int (value)); + gtk_entry_set_invisible_char (entry, g_value_get_uint (value)); break; case PROP_ACTIVATES_DEFAULT: @@ -796,7 +796,7 @@ gtk_entry_get_property (GObject *object, g_value_set_boolean (value, entry->visible); break; case PROP_INVISIBLE_CHAR: - g_value_set_int (value, entry->invisible_char); + g_value_set_uint (value, entry->invisible_char); break; case PROP_ACTIVATES_DEFAULT: g_value_set_boolean (value, entry->activates_default); @@ -1752,6 +1752,7 @@ gtk_entry_real_insert_text (GtkEntry *entry, { gdk_beep (); n_chars = entry->text_max_length - entry->text_length; + new_text_length = g_utf8_offset_to_pointer (new_text, n_chars) - new_text; } if (new_text_length + entry->n_bytes + 1 > entry->text_size) diff --git a/tests/Makefile.am b/tests/Makefile.am index 2079d9ae89..2e7d20778f 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -85,7 +85,16 @@ testtreesort_LDADD = $(LDADDS) testtext_LDADD = $(LDADDS) treestoretest_LDADD = $(LDADDS) +testgtk_SOURCES = \ + prop-editor.c \ + testgtk.c + +testtreeview_SOURCES = \ + prop-editor.c \ + testtreeview.c + EXTRA_DIST += @STRIP_BEGIN@ \ + prop-editor.h \ testgtk.1 \ testgtkrc \ testgtkrc2 \ diff --git a/tests/testgtk.c b/tests/testgtk.c index 5e6cdb105f..5cd9117aa6 100644 --- a/tests/testgtk.c +++ b/tests/testgtk.c @@ -47,6 +47,8 @@ #define sleep(n) _sleep(n) #endif +#include "prop-editor.h" + #include "circles.xbm" #include "test.xpm" @@ -3518,14 +3520,6 @@ entry_toggle_frame (GtkWidget *checkbutton, } static void -entry_toggle_editable (GtkWidget *checkbutton, - GtkWidget *entry) -{ - gtk_entry_set_editable(GTK_ENTRY(entry), - GTK_TOGGLE_BUTTON(checkbutton)->active); -} - -static void entry_toggle_sensitive (GtkWidget *checkbutton, GtkWidget *entry) { @@ -3533,30 +3527,12 @@ entry_toggle_sensitive (GtkWidget *checkbutton, } static void -entry_toggle_visibility (GtkWidget *checkbutton, - GtkWidget *entry) -{ - gtk_entry_set_visibility (GTK_ENTRY (entry), - GTK_TOGGLE_BUTTON (checkbutton)->active); -} - -static void -entry_toggle_invisible_char (GtkWidget *checkbutton, - GtkWidget *entry) +entry_props_clicked (GtkWidget *button, + GObject *entry) { - if (GTK_TOGGLE_BUTTON (checkbutton)->active) - gtk_entry_set_invisible_char (GTK_ENTRY (entry), 0); - else - gtk_entry_set_invisible_char (GTK_ENTRY (entry), '*'); -} + GtkWidget *window = create_prop_editor (entry); - -static void -entry_toggle_activate_default (GtkWidget *checkbutton, - GtkWidget *entry) -{ - gtk_entry_set_activates_default (GTK_ENTRY (entry), - GTK_TOGGLE_BUTTON (checkbutton)->active); + gtk_window_set_title (GTK_WINDOW (window), "Entry Properties"); } static void @@ -3565,10 +3541,9 @@ create_entry (void) static GtkWidget *window = NULL; GtkWidget *box1; GtkWidget *box2; - GtkWidget *editable_check; + GtkWidget *hbox; + GtkWidget *has_frame_check; GtkWidget *sensitive_check; - GtkWidget *invisible_char_check; - GtkWidget *activate_check; GtkWidget *entry, *cb; GtkWidget *button; GtkWidget *separator; @@ -3599,19 +3574,25 @@ create_entry (void) box1 = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (window), box1); - gtk_widget_show (box1); box2 = gtk_vbox_new (FALSE, 10); gtk_container_set_border_width (GTK_CONTAINER (box2), 10); gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0); - gtk_widget_show (box2); + hbox = gtk_hbox_new (FALSE, 5); + gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0); + entry = gtk_entry_new (); gtk_entry_set_text (GTK_ENTRY (entry), "hello world السلام عليكم"); gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5); - gtk_box_pack_start (GTK_BOX (box2), entry, TRUE, TRUE, 0); - gtk_widget_show (entry); + gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0); + + button = gtk_button_new_with_mnemonic ("_Props"); + gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); + gtk_signal_connect (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC (entry_props_clicked), + entry); cb = gtk_combo_new (); gtk_combo_set_popdown_strings (GTK_COMBO (cb), cbitems); @@ -3619,58 +3600,25 @@ create_entry (void) gtk_editable_select_region (GTK_EDITABLE (GTK_COMBO(cb)->entry), 0, -1); gtk_box_pack_start (GTK_BOX (box2), cb, TRUE, TRUE, 0); - gtk_widget_show (cb); - - editable_check = gtk_check_button_new_with_label("Editable"); - gtk_box_pack_start (GTK_BOX (box2), editable_check, FALSE, TRUE, 0); - gtk_signal_connect (GTK_OBJECT(editable_check), "toggled", - GTK_SIGNAL_FUNC(entry_toggle_editable), entry); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(editable_check), TRUE); - gtk_widget_show (editable_check); - - editable_check = gtk_check_button_new_with_label("Visible"); - gtk_box_pack_start (GTK_BOX (box2), editable_check, FALSE, TRUE, 0); - gtk_signal_connect (GTK_OBJECT(editable_check), "toggled", - GTK_SIGNAL_FUNC(entry_toggle_visibility), entry); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(editable_check), TRUE); - gtk_widget_show (editable_check); sensitive_check = gtk_check_button_new_with_label("Sensitive"); gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0); gtk_signal_connect (GTK_OBJECT(sensitive_check), "toggled", GTK_SIGNAL_FUNC(entry_toggle_sensitive), entry); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sensitive_check), TRUE); - gtk_widget_show (sensitive_check); - - activate_check = gtk_check_button_new_with_label ("Activates default"); - gtk_box_pack_start (GTK_BOX (box2), activate_check, FALSE, TRUE, 0); - gtk_signal_connect (GTK_OBJECT (activate_check), "toggled", - GTK_SIGNAL_FUNC (entry_toggle_activate_default), entry); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (activate_check), FALSE); - gtk_widget_show (activate_check); - - invisible_char_check = gtk_check_button_new_with_label("invisible_char = 0"); - gtk_box_pack_start (GTK_BOX (box2), invisible_char_check, FALSE, TRUE, 0); - gtk_signal_connect (GTK_OBJECT(invisible_char_check), "toggled", - GTK_SIGNAL_FUNC(entry_toggle_invisible_char), entry); - gtk_widget_show (invisible_char_check); - - editable_check = gtk_check_button_new_with_label("Has Frame"); - gtk_box_pack_start (GTK_BOX (box2), editable_check, FALSE, TRUE, 0); - gtk_signal_connect (GTK_OBJECT(editable_check), "toggled", + + has_frame_check = gtk_check_button_new_with_label("Has Frame"); + gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0); + gtk_signal_connect (GTK_OBJECT(has_frame_check), "toggled", GTK_SIGNAL_FUNC(entry_toggle_frame), entry); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(editable_check), TRUE); - gtk_widget_show (editable_check); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(has_frame_check), TRUE); separator = gtk_hseparator_new (); gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0); - gtk_widget_show (separator); box2 = gtk_vbox_new (FALSE, 10); gtk_container_set_border_width (GTK_CONTAINER (box2), 10); gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0); - gtk_widget_show (box2); - button = gtk_button_new_with_label ("close"); gtk_signal_connect_object (GTK_OBJECT (button), "clicked", @@ -3679,11 +3627,10 @@ create_entry (void) gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0); GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); gtk_widget_grab_default (button); - gtk_widget_show (button); } if (!GTK_WIDGET_VISIBLE (window)) - gtk_widget_show (window); + gtk_widget_show_all (window); else gtk_widget_destroy (window); } @@ -8381,35 +8328,35 @@ window_controls (GtkWidget *window) g_object_set_data (G_OBJECT (control_window), "spin2", spin); button = gtk_button_new_with_label ("Queue resize"); - gtk_signal_connect_object (GTK_WIDGET (button), + gtk_signal_connect_object (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (gtk_widget_queue_resize), GTK_OBJECT (control_window)); gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0); button = gtk_button_new_with_label ("Set size"); - gtk_signal_connect (GTK_WIDGET (button), + gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (set_size_callback), GTK_OBJECT (control_window)); gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0); button = gtk_button_new_with_label ("Set default size"); - gtk_signal_connect (GTK_WIDGET (button), + gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (set_default_size_callback), GTK_OBJECT (control_window)); gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0); button = gtk_button_new_with_label ("Set usize"); - gtk_signal_connect (GTK_WIDGET (button), + gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (set_usize_callback), GTK_OBJECT (control_window)); gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0); button = gtk_button_new_with_label ("Set location"); - gtk_signal_connect (GTK_WIDGET (button), + gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (set_location_callback), GTK_OBJECT (control_window)); @@ -8417,7 +8364,7 @@ window_controls (GtkWidget *window) button = gtk_check_button_new_with_label ("Allow shrink"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE); - gtk_signal_connect (GTK_WIDGET (button), + gtk_signal_connect (GTK_OBJECT (button), "toggled", GTK_SIGNAL_FUNC (allow_shrink_callback), GTK_OBJECT (control_window)); @@ -8425,7 +8372,7 @@ window_controls (GtkWidget *window) button = gtk_check_button_new_with_label ("Allow grow"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE); - gtk_signal_connect (GTK_WIDGET (button), + gtk_signal_connect (GTK_OBJECT (button), "toggled", GTK_SIGNAL_FUNC (allow_grow_callback), GTK_OBJECT (control_window)); @@ -8433,7 +8380,7 @@ window_controls (GtkWidget *window) button = gtk_check_button_new_with_label ("Auto shrink"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE); - gtk_signal_connect (GTK_WIDGET (button), + gtk_signal_connect (GTK_OBJECT (button), "toggled", GTK_SIGNAL_FUNC (auto_shrink_callback), GTK_OBJECT (control_window)); diff --git a/tests/testtreeview.c b/tests/testtreeview.c index 7a61d1633a..edf623ce3a 100644 --- a/tests/testtreeview.c +++ b/tests/testtreeview.c @@ -1,6 +1,6 @@ - -#include <gtk/gtk.h> #include <string.h> +#include "prop-editor.h" +#include <gtk/gtk.h> /* Don't copy this bad example; inline RGB data is always a better @@ -32,7 +32,6 @@ static char *book_closed_xpm[] = { " " }; -static GtkWidget* create_prop_editor (GObject *object); static void run_automated_tests (void); /* This custom model is to test custom model use. */ @@ -303,7 +302,7 @@ set_columns_type (GtkTreeView *tree_view, ColumnsType type) rend = gtk_cell_renderer_toggle_new (); g_signal_connect_data (G_OBJECT (rend), "toggled", - toggled_callback, tree_view, + GTK_SIGNAL_FUNC (toggled_callback), tree_view, NULL, FALSE, FALSE); col = gtk_tree_view_column_new_with_attributes ("Column 3", @@ -315,7 +314,7 @@ set_columns_type (GtkTreeView *tree_view, ColumnsType type) gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), col); - pixbuf = gdk_pixbuf_new_from_xpm_data (book_closed_xpm); + pixbuf = gdk_pixbuf_new_from_xpm_data ((char **)book_closed_xpm); image = gtk_image_new_from_pixbuf (pixbuf); @@ -336,7 +335,7 @@ set_columns_type (GtkTreeView *tree_view, ColumnsType type) g_object_set (G_OBJECT (rend), "radio", TRUE, NULL); g_signal_connect_data (G_OBJECT (rend), "toggled", - toggled_callback, tree_view, + G_CALLBACK (toggled_callback), tree_view, NULL, FALSE, FALSE); col = gtk_tree_view_column_new_with_attributes ("Column 4", @@ -910,7 +909,7 @@ gtk_tree_model_types_class_init (GtkTreeModelTypesClass *class) GTK_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST, GTK_SIGNAL_OFFSET (GtkTreeModelTypesClass, changed), - NULL, + NULL, NULL, gtk_marshal_VOID__BOXED_BOXED, G_TYPE_NONE, 2, G_TYPE_POINTER, @@ -920,7 +919,7 @@ gtk_tree_model_types_class_init (GtkTreeModelTypesClass *class) GTK_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST, GTK_SIGNAL_OFFSET (GtkTreeModelTypesClass, inserted), - NULL, + NULL, NULL, gtk_marshal_VOID__BOXED_BOXED, G_TYPE_NONE, 2, G_TYPE_POINTER, @@ -930,7 +929,7 @@ gtk_tree_model_types_class_init (GtkTreeModelTypesClass *class) GTK_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST, GTK_SIGNAL_OFFSET (GtkTreeModelTypesClass, child_toggled), - NULL, + NULL, NULL, gtk_marshal_VOID__BOXED_BOXED, G_TYPE_NONE, 2, G_TYPE_POINTER, @@ -940,7 +939,7 @@ gtk_tree_model_types_class_init (GtkTreeModelTypesClass *class) GTK_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST, GTK_SIGNAL_OFFSET (GtkTreeModelTypesClass, deleted), - NULL, + NULL, NULL, gtk_marshal_VOID__BOXED, G_TYPE_NONE, 1, G_TYPE_POINTER); @@ -1271,469 +1270,6 @@ gtk_real_model_types_iter_parent (GtkTreeModel *tree_model, } /* - * Property editor thingy - */ - -static void -get_param_specs (GObject *object, - GParamSpec ***specs, - gint *n_specs) -{ - /* Use private interface for now, fix later */ - *specs = G_OBJECT_GET_CLASS (object)->property_specs; - *n_specs = G_OBJECT_GET_CLASS (object)->n_property_specs; -} - -typedef struct -{ - gpointer instance; - guint id; -} DisconnectData; - -static void -disconnect_func (gpointer data) -{ - DisconnectData *dd = data; - - g_signal_handler_disconnect (dd->instance, dd->id); - g_free (dd); -} - -static void -g_object_connect_property (GObject *object, - const gchar *prop_name, - GtkSignalFunc func, - gpointer data, - GObject *alive_object) -{ - gchar *with_detail = g_strconcat ("notify::", prop_name, NULL); - DisconnectData *dd; - - dd = g_new (DisconnectData, 1); - - dd->id = g_signal_connect_data (object, with_detail, - func, data, - NULL, FALSE, FALSE); - - dd->instance = object; - - g_object_set_data_full (G_OBJECT (alive_object), - "alive-object", - dd, - disconnect_func); - - g_free (with_detail); -} - -typedef struct -{ - GObject *obj; - gchar *prop; -} ObjectProperty; - -static void -free_object_property (ObjectProperty *p) -{ - g_free (p->prop); - g_free (p); -} - -static void -connect_controller (GObject *controller, - const gchar *signal, - GObject *model, - const gchar *prop_name, - GtkSignalFunc func) -{ - ObjectProperty *p; - - p = g_new (ObjectProperty, 1); - p->obj = model; - p->prop = g_strdup (prop_name); - - g_signal_connect_data (controller, signal, func, p, - (GClosureNotify)free_object_property, - FALSE, FALSE); -} - -static void -int_modified (GtkAdjustment *adj, gpointer data) -{ - ObjectProperty *p = data; - - g_object_set (p->obj, p->prop, (int) adj->value, NULL); -} - -static void -int_changed (GObject *object, GParamSpec *pspec, gpointer data) -{ - GtkAdjustment *adj = GTK_ADJUSTMENT (data); - GValue val = { 0, }; - - g_value_init (&val, G_TYPE_INT); - g_object_get_property (object, pspec->name, &val); - - if (g_value_get_int (&val) != (int)adj->value) - gtk_adjustment_set_value (adj, g_value_get_int (&val)); - - g_value_unset (&val); -} - -static void -float_modified (GtkAdjustment *adj, gpointer data) -{ - ObjectProperty *p = data; - - g_object_set (p->obj, p->prop, (float) adj->value, NULL); -} - -static void -float_changed (GObject *object, GParamSpec *pspec, gpointer data) -{ - GtkAdjustment *adj = GTK_ADJUSTMENT (data); - GValue val = { 0, }; - - g_value_init (&val, G_TYPE_FLOAT); - g_object_get_property (object, pspec->name, &val); - - if (g_value_get_float (&val) != (float) adj->value) - gtk_adjustment_set_value (adj, g_value_get_float (&val)); - - g_value_unset (&val); -} - -static void -string_modified (GtkEntry *entry, gpointer data) -{ - ObjectProperty *p = data; - gchar *text; - - text = gtk_entry_get_text (entry); - - g_object_set (p->obj, p->prop, text, NULL); -} - -static void -string_changed (GObject *object, GParamSpec *pspec, gpointer data) -{ - GtkEntry *entry = GTK_ENTRY (data); - GValue val = { 0, }; - gchar *str; - gchar *text; - - g_value_init (&val, G_TYPE_STRING); - g_object_get_property (object, pspec->name, &val); - - str = g_value_get_string (&val); - if (str == NULL) - str = ""; - text = gtk_entry_get_text (entry); - - if (strcmp (str, text) != 0) - gtk_entry_set_text (entry, str); - - g_value_unset (&val); -} - -static void -bool_modified (GtkToggleButton *tb, gpointer data) -{ - ObjectProperty *p = data; - - g_object_set (p->obj, p->prop, (int) tb->active, NULL); -} - -static void -bool_changed (GObject *object, GParamSpec *pspec, gpointer data) -{ - GtkToggleButton *tb = GTK_TOGGLE_BUTTON (data); - GValue val = { 0, }; - - g_value_init (&val, G_TYPE_BOOLEAN); - g_object_get_property (object, pspec->name, &val); - - if (g_value_get_boolean (&val) != tb->active) - gtk_toggle_button_set_active (tb, g_value_get_boolean (&val)); - - gtk_label_set_text (GTK_LABEL (GTK_BIN (tb)->child), g_value_get_boolean (&val) ? - "TRUE" : "FALSE"); - - g_value_unset (&val); -} - - -static void -enum_modified (GtkOptionMenu *om, gpointer data) -{ - ObjectProperty *p = data; - gint i; - GParamSpec *spec; - GEnumClass *eclass; - - spec = g_object_class_find_property (G_OBJECT_GET_CLASS (p->obj), - p->prop); - - eclass = G_ENUM_CLASS (g_type_class_peek (spec->value_type)); - - i = gtk_option_menu_get_history (om); - - g_object_set (p->obj, p->prop, eclass->values[i].value, NULL); -} - -static void -enum_changed (GObject *object, GParamSpec *pspec, gpointer data) -{ - GtkOptionMenu *om = GTK_OPTION_MENU (data); - GValue val = { 0, }; - GEnumClass *eclass; - gint i; - - eclass = G_ENUM_CLASS (g_type_class_peek (pspec->value_type)); - - g_value_init (&val, pspec->value_type); - g_object_get_property (object, pspec->name, &val); - - i = 0; - while (i < eclass->n_values) - { - if (eclass->values[i].value == g_value_get_enum (&val)) - break; - ++i; - } - - if (gtk_option_menu_get_history (om) != i) - gtk_option_menu_set_history (om, i); - - g_value_unset (&val); -} - -static GtkWidget* -create_prop_editor (GObject *object) -{ - GtkWidget *win; - GtkWidget *vbox; - GtkWidget *hbox; - GtkWidget *label; - GtkWidget *prop_edit; - GtkWidget *sw; - gint n_specs = 0; - GParamSpec **specs = NULL; - gint i; - GtkAdjustment *adj; - - win = gtk_window_new (GTK_WINDOW_TOPLEVEL); - - /* hold a strong ref to the object we're editing */ - g_object_ref (G_OBJECT (object)); - g_object_set_data_full (G_OBJECT (win), "model-object", - object, (GDestroyNotify)g_object_unref); - - vbox = gtk_vbox_new (TRUE, 2); - - sw = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - - gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw), vbox); - gtk_container_add (GTK_CONTAINER (win), sw); - - get_param_specs (object, &specs, &n_specs); - - i = 0; - while (i < n_specs) - { - GParamSpec *spec = specs[i]; - gboolean can_modify; - - prop_edit = NULL; - - can_modify = ((spec->flags & G_PARAM_WRITABLE) != 0 && - (spec->flags & G_PARAM_CONSTRUCT_ONLY) == 0); - - if ((spec->flags & G_PARAM_READABLE) == 0) - { - /* can't display unreadable properties */ - ++i; - continue; - } - - switch (spec->value_type) - { - case G_TYPE_INT: - hbox = gtk_hbox_new (FALSE, 10); - label = gtk_label_new (spec->nick); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - adj = GTK_ADJUSTMENT (gtk_adjustment_new (G_PARAM_SPEC_INT (spec)->default_value, - G_PARAM_SPEC_INT (spec)->minimum, - G_PARAM_SPEC_INT (spec)->maximum, - 1, - MAX ((G_PARAM_SPEC_INT (spec)->maximum - - G_PARAM_SPEC_INT (spec)->minimum) / 10, 1), - 0.0)); - - prop_edit = gtk_spin_button_new (adj, 1.0, 0); - gtk_box_pack_end (GTK_BOX (hbox), prop_edit, FALSE, FALSE, 0); - - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - - g_object_connect_property (object, spec->name, - GTK_SIGNAL_FUNC (int_changed), - adj, G_OBJECT (adj)); - - if (can_modify) - connect_controller (G_OBJECT (adj), "value_changed", - object, spec->name, (GtkSignalFunc) int_modified); - break; - - case G_TYPE_FLOAT: - hbox = gtk_hbox_new (FALSE, 10); - label = gtk_label_new (spec->nick); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - adj = GTK_ADJUSTMENT (gtk_adjustment_new (G_PARAM_SPEC_FLOAT (spec)->default_value, - G_PARAM_SPEC_FLOAT (spec)->minimum, - G_PARAM_SPEC_FLOAT (spec)->maximum, - 0.1, - MAX ((G_PARAM_SPEC_FLOAT (spec)->maximum - - G_PARAM_SPEC_FLOAT (spec)->minimum) / 10, 0.1), - 0.0)); - - prop_edit = gtk_spin_button_new (adj, 0.1, 2); - - gtk_box_pack_end (GTK_BOX (hbox), prop_edit, FALSE, FALSE, 0); - - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - - g_object_connect_property (object, spec->name, - GTK_SIGNAL_FUNC (float_changed), - adj, G_OBJECT (adj)); - - if (can_modify) - connect_controller (G_OBJECT (adj), "value_changed", - object, spec->name, (GtkSignalFunc) float_modified); - break; - - case G_TYPE_STRING: - hbox = gtk_hbox_new (FALSE, 10); - label = gtk_label_new (spec->nick); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - - prop_edit = gtk_entry_new (); - gtk_box_pack_end (GTK_BOX (hbox), prop_edit, FALSE, FALSE, 0); - - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - - g_object_connect_property (object, spec->name, - GTK_SIGNAL_FUNC (string_changed), - prop_edit, G_OBJECT (prop_edit)); - - if (can_modify) - connect_controller (G_OBJECT (prop_edit), "changed", - object, spec->name, (GtkSignalFunc) string_modified); - break; - - case G_TYPE_BOOLEAN: - hbox = gtk_hbox_new (FALSE, 10); - label = gtk_label_new (spec->nick); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - - prop_edit = gtk_toggle_button_new_with_label (""); - gtk_box_pack_end (GTK_BOX (hbox), prop_edit, FALSE, FALSE, 0); - - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - - g_object_connect_property (object, spec->name, - GTK_SIGNAL_FUNC (bool_changed), - prop_edit, G_OBJECT (prop_edit)); - - if (can_modify) - connect_controller (G_OBJECT (prop_edit), "toggled", - object, spec->name, (GtkSignalFunc) bool_modified); - break; - - default: - if (g_type_is_a (spec->value_type, G_TYPE_ENUM)) - { - GtkWidget *menu; - GEnumClass *eclass; - gint i; - - hbox = gtk_hbox_new (FALSE, 10); - label = gtk_label_new (spec->nick); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - - prop_edit = gtk_option_menu_new (); - - menu = gtk_menu_new (); - - eclass = G_ENUM_CLASS (g_type_class_peek (spec->value_type)); - - i = 0; - while (i < eclass->n_values) - { - GtkWidget *mi; - - mi = gtk_menu_item_new_with_label (eclass->values[i].value_name); - - gtk_widget_show (mi); - - gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); - - ++i; - } - - gtk_option_menu_set_menu (GTK_OPTION_MENU (prop_edit), menu); - - gtk_box_pack_end (GTK_BOX (hbox), prop_edit, FALSE, FALSE, 0); - - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - - g_object_connect_property (object, spec->name, - GTK_SIGNAL_FUNC (enum_changed), - prop_edit, G_OBJECT (prop_edit)); - - if (can_modify) - connect_controller (G_OBJECT (prop_edit), "changed", - object, spec->name, (GtkSignalFunc) enum_modified); - } - else - { - gchar *msg = g_strdup_printf ("%s: don't know how to edit type %s", - spec->nick, g_type_name (spec->value_type)); - hbox = gtk_hbox_new (FALSE, 10); - label = gtk_label_new (msg); - g_free (msg); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - } - break; - } - - if (prop_edit) - { - if (!can_modify) - gtk_widget_set_sensitive (prop_edit, FALSE); - - /* set initial value */ - g_object_notify (object, spec->name); - } - - ++i; - } - - gtk_window_set_default_size (GTK_WINDOW (win), 300, 500); - - gtk_widget_show_all (win); - - return win; -} - -/* * Automated testing */ |