diff options
-rw-r--r-- | AUTHORS | 4 | ||||
-rw-r--r-- | ChangeLog | 50 | ||||
-rw-r--r-- | src/glade-choice.c | 18 | ||||
-rw-r--r-- | src/glade-clipboard-view.c | 13 | ||||
-rw-r--r-- | src/glade-clipboard-view.h | 6 | ||||
-rw-r--r-- | src/glade-clipboard.c | 3 | ||||
-rw-r--r-- | src/glade-clipboard.h | 4 | ||||
-rw-r--r-- | src/glade-gtk.c | 76 | ||||
-rw-r--r-- | src/glade-placeholder.c | 27 | ||||
-rw-r--r-- | src/glade-placeholder.h | 1 | ||||
-rw-r--r-- | src/glade-popup.c | 96 | ||||
-rw-r--r-- | src/glade-popup.h | 1 | ||||
-rw-r--r-- | src/glade-project-view.c | 5 | ||||
-rw-r--r-- | src/glade-project-window.c | 2 | ||||
-rw-r--r-- | src/glade-property-class.c | 36 | ||||
-rw-r--r-- | src/glade-property-class.h | 2 | ||||
-rw-r--r-- | src/glade-property.c | 3 | ||||
-rw-r--r-- | src/glade-widget.c | 146 | ||||
-rw-r--r-- | src/glade-widget.h | 5 | ||||
-rw-r--r-- | widgets/gtkbutton.xml | 2 |
20 files changed, 319 insertions, 181 deletions
@@ -2,5 +2,5 @@ Chema Celorio <chema@ximian.com> Thanks to : Michal Palczewski <mpalczew@u.washington.edu> - Widget tree window -Archit Baweja <bighead@crosswinds.net> - New widgets, _get_type -Shane Butler <shane_b@operamail.com> - Glade Widget signals editor
\ No newline at end of file +Archit Baweja <bighead@users.sourceforge.net> - New widgets, _get_type +Shane Butler <shane_b@operamail.com> - Glade Widget signals editor @@ -1,3 +1,53 @@ +2002-03-12 Archit Baweja <bighead@users.sourceforge.net> + + * src/glade-clipboard-view.c (glade_clipboard_view_remove): check for + return value of gtk_tree_selection_get_selected. Fixed nasty bug. + +2002-03-04 Joaquín Cuenca Abela <cuenca@pacaterie.u-psud.fr> + + * glade-placeholder.c: includes to fix warnings, and implementation + of the popup menu of the placeholder. + * glade-popup.[ch]: popup menu for the placeholder plus a little + reorganisation of the code to share implementation of the general + popup menu and the placeholder one. + * glade-property.c: silent g_print. + * glade-widget.c: defined g_debug to g_print if DEBUG is defined, + defined to void otherwise. I was tracking the "can not select GtkLabels" + bug when I did this change, and now I'm not able to reproduce anymore + the bug. Dunno what's going on... + +2002-03-02 Joaquín Cuenca Abela <cuenca@pacaterie.u-psud.fr> + + * glade-choice.c (glade_choice_list_new_from_node): Now you don't need + to tweak glade_enum_from_string just to be able to use a new item + in an enum. Glade will automatically assign a new value to each item. + * glade-choice.c (glade_enum_from_string): Commented out the cases glade-none, + gtk-ok & gtk-cancel, not needed any more due to the precedent fix. + * glade-property-class.c (glade_property_class_update_from_node): Fixed + the Enum properties that used a custom set or get function (the custom + set function was never being used). It fixes, for instance, the gtk-button + stock property. + * gtkbutton.xml: Added access to two other stock buttons (apply & close). + +2002-02-28 Joaquín Cuenca Abela <cuenca@pacaterie.u-psud.fr> + + * glade-widget.c (glade_widget_key_press): Fixed segfault when + deleting two or more object in a row. + +2002-02-28 Joaquín Cuenca Abela <cuenca@pacaterie.u-psud.fr> + + * glade-widget.c: Delete key deletes selected widgets. I've also + fixed the selection in Selectors (File/Font/Color/...). + * glade-widget.c (glade_widget_create_gtk_widget): Commentted out + the timeouts in this function. With 1.3.12 everything is drawed ok, + and these timeouts where producing a segfault if you tried to delete + an item before 1 sec has ellapsed since the creation of the widget. + * glade-gtk.c: Removed redundancies in the "functions" array. + * glade-placeholder.c: Added missing include. + * glade-project-view.c (glade_project_view_selection_changed_cb): + Fixed segfault when deleting a window that was also selected in + the glade-project-view. + 2002-01-29 Carlos Perelló Marín <carlos@gnome-db.org> * Makefile.am: Install .desktop file into the proper location for diff --git a/src/glade-choice.c b/src/glade-choice.c index 8921f7b6..6a164c93 100644 --- a/src/glade-choice.c +++ b/src/glade-choice.c @@ -72,15 +72,7 @@ glade_enum_from_string (const gchar *string) return GTK_RELIEF_HALF; if (strcmp (string, "GTK_RELIEF_NONE") == 0) return GTK_RELIEF_NONE; - if (strcmp (string, "glade-none") == 0) - return 0; - if (strcmp (string, "gtk-ok") == 0) - return 1; - if (strcmp (string, "gtk-cancel") == 0) - return 2; - - g_print ("Could not get Enum from string %s\n", string); - + return -1; } @@ -166,7 +158,8 @@ glade_choice_list_new_from_node (GladeXmlNode *node) GladeXmlNode *child; GladeChoice *choice; GList *list; - + int def_value = 0; + if (!glade_xml_node_verify (node, GLADE_TAG_ENUMS)) return NULL; @@ -179,7 +172,12 @@ glade_choice_list_new_from_node (GladeXmlNode *node) choice = glade_choice_new_from_node (child); if (choice == NULL) return NULL; + /* if enum_from_string is not able to find a value for this enum, + we will use as value the position of the item in the enum list */ + if (choice->value == -1) + choice->value = def_value; list = g_list_prepend (list, choice); + ++def_value; } list = g_list_reverse (list); diff --git a/src/glade-clipboard-view.c b/src/glade-clipboard-view.c index a0be1ab8..a0cb5362 100644 --- a/src/glade-clipboard-view.c +++ b/src/glade-clipboard-view.c @@ -38,9 +38,10 @@ glade_clipboard_view_selection_changed_cb (GtkTreeSelection * sel, GtkTreeIter iter; GladeWidget *widget; GtkTreeModel *model; - + model = GTK_TREE_MODEL (view->model); - gtk_tree_selection_get_selected (sel, &model, &iter); + if (!gtk_tree_selection_get_selected (sel, &model, &iter)) + return; gtk_tree_model_get (model, &iter, 0, &widget, -1); if (widget) @@ -124,7 +125,7 @@ glade_clipboard_view_create_tree_view (GladeClipboardView * view) sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (view->widget)); g_signal_connect_data (G_OBJECT (sel), "changed", - glade_clipboard_view_selection_changed_cb, + G_CALLBACK (glade_clipboard_view_selection_changed_cb), view, NULL, 0); gtk_widget_set_usize (view->widget, 272, 130); @@ -241,8 +242,8 @@ glade_clipboard_view_remove (GladeClipboardView * view, g_return_if_fail (GLADE_IS_CLIPBOARD_VIEW (view)); g_return_if_fail (GLADE_IS_WIDGET (widget)); - model = gtk_tree_view_get_model (GTK_TREE_VIEW (view->widget)); + model = GTK_TREE_MODEL (view->model); sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (view->widget)); - gtk_tree_selection_get_selected (sel, &model, &iter); - gtk_tree_store_remove (GTK_TREE_STORE (model), &iter); + if (gtk_tree_selection_get_selected (sel, &model, &iter)) + gtk_tree_store_remove (GTK_TREE_STORE (model), &iter); } diff --git a/src/glade-clipboard-view.h b/src/glade-clipboard-view.h index de053911..1f985b62 100644 --- a/src/glade-clipboard-view.h +++ b/src/glade-clipboard-view.h @@ -11,9 +11,9 @@ typedef struct _GladeClipboardViewClass GladeClipboardViewClass; struct _GladeClipboardView { GtkWindow __parent__; - GtkWidget *widget; /* The GtkTreeView widget */ - GtkTreeStore *model; /* The GtkTreeStore model for the View */ - GladeClipboard *clipboard; /* The Clipboard for which this is a view */ + GtkWidget *widget; /* The GtkTreeView widget */ + GtkTreeStore *model; /* The GtkTreeStore model for the View */ + GladeClipboard *clipboard; /* The Clipboard for which this is a view */ }; struct _GladeClipboardViewClass { diff --git a/src/glade-clipboard.c b/src/glade-clipboard.c index a4ef9cf6..2921066e 100644 --- a/src/glade-clipboard.c +++ b/src/glade-clipboard.c @@ -33,6 +33,7 @@ #include "glade-widget-class.h" #include "glade-placeholder.h" #include "glade-project.h" +#include "glade-packing.h" static void glade_clipboard_class_init (GladeClipboardClass * klass) @@ -110,7 +111,6 @@ glade_clipboard_add (GladeClipboard * clipboard, GladeWidget * widget) * latest addition, to currently selected widget in the clipboard. */ clipboard->widgets = g_list_prepend (clipboard->widgets, widget); - clipboard->curr = widget; /* * If there is view present, update it. @@ -130,6 +130,7 @@ static void glade_clipboard_remove (GladeClipboard * clipboard, GladeWidget * widget) { clipboard->widgets = g_list_remove (clipboard->widgets, widget); + clipboard->curr = NULL; /* * If there is a view present, update it. diff --git a/src/glade-clipboard.h b/src/glade-clipboard.h index a520660d..b16c8330 100644 --- a/src/glade-clipboard.h +++ b/src/glade-clipboard.h @@ -25,10 +25,6 @@ struct _GladeClipboardClass { GType glade_clipboard_get_type (); GladeClipboard *glade_clipboard_new (); -void glade_clipboard_add (GladeClipboard * clipboard, - GladeWidget * widget); -void glade_clipboard_remove (GladeClipboard * clipboard, - GladeWidget * widget); void glade_clipboard_cut (GladeClipboard * clipboard, GladeWidget * widget); void glade_clipboard_copy (GladeClipboard * clipboard, diff --git a/src/glade-gtk.c b/src/glade-gtk.c index 16377580..9200ea00 100644 --- a/src/glade-gtk.c +++ b/src/glade-gtk.c @@ -31,15 +31,6 @@ #include "glade-property-class.h" #include "glade-choice.h" -static gint -glade_widget_ugly_hack (gpointer data) -{ - GtkWidget *widget = data; - - gtk_widget_queue_resize (widget); - - return FALSE; -} static void glade_gtk_entry_set_text (GObject *object, GValue *value) @@ -251,9 +242,6 @@ glade_gtk_box_set_size (GObject *object, GValue *value) } /* else the size is == */ glade_placeholder_fill_empty (GTK_WIDGET (box)); - - /* see glade-widget.c#ugly_hack for an explanation */ - gtk_timeout_add ( 100, glade_widget_ugly_hack, box); } #if 0 @@ -342,9 +330,6 @@ glade_gtk_table_set_n_common (GObject *object, GValue *value, gboolean for_rows) } glade_placeholder_fill_empty (GTK_WIDGET (table)); - - /* see glade-widget.c#ugly_hack for an explanation */ - gtk_timeout_add ( 100, glade_widget_ugly_hack, table); } static void @@ -500,7 +485,6 @@ glade_gtk_table_post_create (GObject *object, GValue *value) } } - /* ================ Temp hack =================== */ /* We have this table, but what we should do is use gmodule for this, * however this requires that we link with libtool cause right now @@ -513,40 +497,46 @@ struct _GladeGtkFunction { void (* function) (GObject *object, GValue *value); }; +#define GLADE_NEW_FUNCTION(name) {#name, name} +#define GLADE_NEW_EMPTY_FUNCTION(name) {#name, empty} + GladeGtkFunction functions [] = { - {"glade_gtk_entry_get_text", glade_gtk_entry_get_text}, - {"glade_gtk_box_get_size", glade_gtk_box_get_size}, - {"glade_gtk_widget_get_tooltip", empty}, + GLADE_NEW_FUNCTION(glade_gtk_entry_get_text), + GLADE_NEW_FUNCTION(glade_gtk_box_get_size), + GLADE_NEW_EMPTY_FUNCTION(glade_gtk_widget_get_tooltip), - {"glade_gtk_button_set_stock", glade_gtk_button_set_stock}, + GLADE_NEW_FUNCTION(glade_gtk_button_set_stock), #if 0 - {"glade_gtk_table_get_n_rows", glade_gtk_table_get_n_rows}, - {"glade_gtk_table_get_n_columns", glade_gtk_table_get_n_columns}, + GLADE_NEW_FUNCTION(glade_gtk_table_get_n_rows), + GLADE_NEW_FUNCTION(glade_gtk_table_get_n_columns), #endif - {"glade_gtk_table_set_n_rows", glade_gtk_table_set_n_rows}, - {"glade_gtk_table_set_n_columns", glade_gtk_table_set_n_columns}, - - {"glade_gtk_entry_set_text", glade_gtk_entry_set_text}, - {"glade_gtk_option_menu_set_items", glade_gtk_option_menu_set_items}, - {"glade_gtk_progress_bar_set_format", glade_gtk_progress_bar_set_format}, - {"glade_gtk_box_set_size", glade_gtk_box_set_size}, - {"glade_gtk_widget_set_tooltip", empty}, - {"ignore", empty}, /* For example for gtkwindow::modal, we want to ignore the set */ - - {"glade_gtk_adjustment_set_max", glade_gtk_adjustment_set_max}, - {"glade_gtk_adjustment_set_min", glade_gtk_adjustment_set_min}, - {"glade_gtk_adjustment_set_step_increment", glade_gtk_adjustment_set_step_increment}, - {"glade_gtk_adjustment_set_page_increment", glade_gtk_adjustment_set_page_increment}, - {"glade_gtk_adjustment_set_page_size", glade_gtk_adjustment_set_page_size}, - - {"glade_gtk_check_button_post_create", glade_gtk_check_button_post_create}, - {"glade_gtk_window_post_create", glade_gtk_window_post_create}, - {"glade_gtk_dialog_post_create", glade_gtk_dialog_post_create}, - {"glade_gtk_message_dialog_post_create", glade_gtk_message_dialog_post_create}, - {"glade_gtk_table_post_create", glade_gtk_table_post_create}, + GLADE_NEW_FUNCTION(glade_gtk_table_set_n_rows), + GLADE_NEW_FUNCTION(glade_gtk_table_set_n_columns), + + GLADE_NEW_FUNCTION(glade_gtk_entry_set_text), + GLADE_NEW_FUNCTION(glade_gtk_option_menu_set_items), + GLADE_NEW_FUNCTION(glade_gtk_progress_bar_set_format), + GLADE_NEW_FUNCTION(glade_gtk_box_set_size), + GLADE_NEW_EMPTY_FUNCTION(glade_gtk_widget_set_tooltip), + GLADE_NEW_EMPTY_FUNCTION(ignore), /* For example for gtkwindow::modal, we want to ignore the set */ + + GLADE_NEW_FUNCTION(glade_gtk_adjustment_set_max), + GLADE_NEW_FUNCTION(glade_gtk_adjustment_set_min), + GLADE_NEW_FUNCTION(glade_gtk_adjustment_set_step_increment), + GLADE_NEW_FUNCTION(glade_gtk_adjustment_set_page_increment), + GLADE_NEW_FUNCTION(glade_gtk_adjustment_set_page_size), + + GLADE_NEW_FUNCTION(glade_gtk_check_button_post_create), + GLADE_NEW_FUNCTION(glade_gtk_window_post_create), + GLADE_NEW_FUNCTION(glade_gtk_dialog_post_create), + GLADE_NEW_FUNCTION(glade_gtk_message_dialog_post_create), + GLADE_NEW_FUNCTION(glade_gtk_table_post_create) }; +#undef GLADE_NEW_FUNCTION +#undef GLADE_NEW_EMPTY_FUNCTION + gpointer glade_gtk_get_function (const gchar *name) { diff --git a/src/glade-placeholder.c b/src/glade-placeholder.c index 0aa36abc..757da3cf 100644 --- a/src/glade-placeholder.c +++ b/src/glade-placeholder.c @@ -34,6 +34,8 @@ #include "glade-project.h" #include "glade-project-window.h" #include "glade-packing.h" +#include "glade-clipboard.h" +#include "glade-popup.h" #define GLADE_PLACEHOLDER_ROW_STRING "GladePlaceholderRow" #define GLADE_PLACEHOLDER_COL_STRING "GladePlaceholderColumn" @@ -236,17 +238,7 @@ glade_placeholder_on_button_press_event (GladePlaceholder *placeholder, GdkEvent glade_placeholder_replace_widget (placeholder, gpw->add_class, project); glade_project_window_set_add_class (gpw, NULL); } else if (event->button == 3) { - /* - * If a right-click, do a PASTE from the clipboard. - * FIXME: should show a menu. - */ - GladeProjectWindow *gpw; - GladeClipboard *clipboard; - - gpw = glade_project_window_get (); - clipboard = gpw->clipboard; - - glade_clipboard_paste (clipboard, placeholder); + glade_popup_placeholder_pop (placeholder, event); } } @@ -698,3 +690,16 @@ glade_placeholder_fill_empty (GtkWidget *widget) glade_implement_me (); } } + +void +glade_placeholder_paste_cb (GtkWidget *button, gpointer data) +{ + GladePlaceholder *placeholder = GTK_WIDGET (data); + GladeProjectWindow *gpw; + GladeClipboard *clipboard; + + gpw = glade_project_window_get (); + clipboard = gpw->clipboard; + + glade_clipboard_paste (clipboard, placeholder); +} diff --git a/src/glade-placeholder.h b/src/glade-placeholder.h index 81f3e413..af394f6c 100644 --- a/src/glade-placeholder.h +++ b/src/glade-placeholder.h @@ -30,6 +30,7 @@ gboolean glade_placeholder_is (GtkWidget *widget); void glade_placeholder_remove_all (GtkWidget *widget); void glade_placeholder_fill_empty (GtkWidget *widget); +void glade_placeholder_paste_cb (GtkWidget *button, gpointer data); G_END_DECLS diff --git a/src/glade-popup.c b/src/glade-popup.c index a8dd9104..68e55012 100644 --- a/src/glade-popup.c +++ b/src/glade-popup.c @@ -29,6 +29,7 @@ #include "glade.h" #include "glade-widget.h" #include "glade-popup.h" +#include "glade-placeholder.h" static void glade_popup_menu_detach (GtkWidget *attach_widget, @@ -74,7 +75,36 @@ glade_popup_append_item (GtkWidget *popup_menu, } static GtkWidget * -glade_popup_create_menu (GladeWidget *widget, gboolean add_childs) +glade_popup_create_menu (GladeWidget *widget, gboolean add_childs); + +static void +glade_popup_populate_childs(GtkWidget* popup_menu, GladeWidget* parent) +{ + while (parent) { + GtkWidget *child; + GtkWidget *child_menu; + GtkWidget *separator; + + separator = gtk_menu_item_new (); + gtk_widget_show (separator); + gtk_menu_shell_append (GTK_MENU_SHELL (popup_menu), + separator); + + child = gtk_menu_item_new_with_label (parent->name); + child_menu = glade_popup_create_menu (parent, FALSE); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (child), + child_menu); + gtk_widget_show (child); + gtk_menu_shell_append (GTK_MENU_SHELL (popup_menu), + child); + + + parent = parent->parent; + } +} + +static GtkWidget * +glade_popup_create_menu (GladeWidget *widget, gboolean add_childs) { GtkWidget *popup_menu; @@ -92,31 +122,34 @@ glade_popup_create_menu (GladeWidget *widget, gboolean add_childs) glade_popup_append_item (popup_menu, widget, _("Delete"), glade_widget_delete, TRUE); - if (add_childs && widget->parent) { - GladeWidget *parent = widget->parent; + if (add_childs && widget->parent) + glade_popup_populate_childs(popup_menu, widget->parent); - while (parent) { - GtkWidget *child; - GtkWidget *child_menu; - GtkWidget *separator; + return popup_menu; +} - separator = gtk_menu_item_new (); - gtk_widget_show (separator); - gtk_menu_shell_append (GTK_MENU_SHELL (popup_menu), - separator); - - child = gtk_menu_item_new_with_label (parent->name); - child_menu = glade_popup_create_menu (parent, FALSE); - gtk_menu_item_set_submenu (GTK_MENU_ITEM (child), - child_menu); - gtk_widget_show (child); - gtk_menu_shell_append (GTK_MENU_SHELL (popup_menu), - child); +static GtkWidget * +glade_popup_create_placeholder_menu (GladePlaceholder *placeholder) +{ + GtkWidget *popup_menu; + GtkWidget *menu_item; + GladeWidget *parent; + + popup_menu = gtk_menu_new (); - - parent = parent->parent; - } - } + menu_item = gtk_menu_item_new_with_label (_("Paste")); + + gtk_signal_connect (GTK_OBJECT (menu_item), "activate", + GTK_SIGNAL_FUNC (glade_placeholder_paste_cb), + placeholder); + + gtk_widget_set_sensitive (menu_item, TRUE); + gtk_widget_show (menu_item); + gtk_menu_shell_append (GTK_MENU_SHELL (popup_menu), + menu_item); + + if ((parent = glade_placeholder_get_parent(placeholder)) != NULL) + glade_popup_populate_childs(popup_menu, parent); return popup_menu; } @@ -137,3 +170,20 @@ glade_popup_pop (GladeWidget *widget, GdkEventButton *event) event->button, event->time); } + +void +glade_popup_placeholder_pop (GladePlaceholder *placeholder, GdkEventButton *event) +{ + GtkWidget *popup_menu; + + popup_menu = glade_popup_create_placeholder_menu (placeholder); + + gtk_menu_attach_to_widget (GTK_MENU (popup_menu), + GTK_WIDGET (placeholder), + glade_popup_menu_detach); + + gtk_menu_popup (GTK_MENU (popup_menu), NULL, NULL, + NULL, NULL, + event->button, event->time); +} + diff --git a/src/glade-popup.h b/src/glade-popup.h index 80b12805..1ca67cd1 100644 --- a/src/glade-popup.h +++ b/src/glade-popup.h @@ -5,6 +5,7 @@ G_BEGIN_DECLS void glade_popup_pop (GladeWidget *widget, GdkEventButton *event); +void glade_popup_placeholder_pop (GladePlaceholder *placeholder, GdkEventButton *event); G_END_DECLS diff --git a/src/glade-project-view.c b/src/glade-project-view.c index d5d6e456..2734be9b 100644 --- a/src/glade-project-view.c +++ b/src/glade-project-view.c @@ -373,7 +373,6 @@ glade_project_view_cell_function (GtkTreeViewColumn *tree_column, g_object_set (G_OBJECT (cell), "text", widget->name, -/* "pixbuf", widget->class->pixbuf, */ NULL); } @@ -399,7 +398,9 @@ glade_project_view_selection_changed_cb (GtkTreeSelection *selection, g_return_val_if_fail (GTK_IS_TREE_SELECTION (selection), FALSE); g_return_val_if_fail (GTK_IS_TREE_MODEL (model), FALSE); - gtk_tree_selection_get_selected (selection, &model, &iter); + /* There are no cells selected */ + if (!gtk_tree_selection_get_selected (selection, &model, &iter)) + return TRUE; gtk_tree_model_get (model, &iter, WIDGET_COLUMN, &widget, -1); diff --git a/src/glade-project-window.c b/src/glade-project-window.c index bebca4a7..7b3a8238 100644 --- a/src/glade-project-window.c +++ b/src/glade-project-window.c @@ -527,7 +527,7 @@ glade_project_append_query (GtkWidget *table, GladePropertyClass *property_class query = property_class->query; if (property_class->type != GLADE_PROPERTY_TYPE_INTEGER) { - g_warning ("We can only query integer types for now. FIXME please ;-)"); + g_warning ("We can only query integer types for now. Trying to query %d. FIXME please ;-)", property_class->type); return NULL; } diff --git a/src/glade-property-class.c b/src/glade-property-class.c index 1bcede01..cf8c49b9 100644 --- a/src/glade-property-class.c +++ b/src/glade-property-class.c @@ -199,6 +199,8 @@ glade_property_class_get_type_from_spec (GParamSpec *spec) g_warning ("uchar not implemented\n"); } else if (G_IS_PARAM_SPEC_OBJECT (spec)) { return GLADE_PROPERTY_TYPE_OBJECT; + /* } else if (G_IS_PARAM_SPEC_BOXED (spec)) { + return GLADE_PROPERTY_TYPE_BOXED; */ } else { /*FIXME: We should implement the "events" property */ if (g_ascii_strcasecmp ( spec->name, "user-data") && @@ -729,8 +731,9 @@ glade_property_class_update_from_node (GladeXmlNode *node, */ if ( !glade_xml_get_property_boolean (node, GLADE_TAG_PARAM_SPEC, TRUE) || pproperty_class == NULL) { name = glade_xml_get_property_string_required (node, GLADE_TAG_NAME, widget_class->name); - if (name == NULL) + if (name == NULL) { return; + } pproperty_class = glade_property_class_new (); @@ -794,25 +797,24 @@ glade_property_class_update_from_node (GladeXmlNode *node, pproperty_class->def = gvalue; glade_widget_property_class_free (*property_class); *property_class = pproperty_class; - return; } - - /* If the property is an object Load it */ - if (pproperty_class->type == GLADE_PROPERTY_TYPE_OBJECT) { - child = glade_xml_search_child_required (node, GLADE_TAG_GLADE_WIDGET_CLASS); - if (child == NULL) { - glade_widget_property_class_free (pproperty_class); - pproperty_class = NULL; - return; - } + else { + /* If the property is an object Load it */ + if (pproperty_class->type == GLADE_PROPERTY_TYPE_OBJECT) { + child = glade_xml_search_child_required (node, GLADE_TAG_GLADE_WIDGET_CLASS); + if (child == NULL) { + glade_widget_property_class_free (pproperty_class); + pproperty_class = NULL; + return; + } - pproperty_class->child = glade_widget_class_new_from_node (child); - g_print ("Loaded %s\n", pproperty_class->child->name); - } + pproperty_class->child = glade_widget_class_new_from_node (child); + } - pproperty_class->def = glade_property_class_get_default (node, pproperty_class); - glade_widget_property_class_free (*property_class); - *property_class = pproperty_class; + pproperty_class->def = glade_property_class_get_default (node, pproperty_class); + glade_widget_property_class_free (*property_class); + *property_class = pproperty_class; + } } else { GValue *tmp; diff --git a/src/glade-property-class.h b/src/glade-property-class.h index 69387a19..51624235 100644 --- a/src/glade-property-class.h +++ b/src/glade-property-class.h @@ -127,7 +127,7 @@ struct _GladePropertyClass { * for a type == CHOICE */ GList *choices; /* list of GladeChoice items. This is only used - * for propeties of type GLADE_PROPERYT_TYPE_CHOICE + * for propeties of type GLADE_PROPERTY_TYPE_CHOICE * and is NULL for other poperties. * [See glade-choice.h] */ diff --git a/src/glade-property.c b/src/glade-property.c index dc813981..a7e9a77f 100644 --- a/src/glade-property.c +++ b/src/glade-property.c @@ -357,7 +357,9 @@ glade_property_set_boolean (GladeProperty *property, gboolean val) property->loading = TRUE; if (property->class->set_function == NULL) { if (GTK_IS_TABLE (property->widget->widget)) { +#if 0 g_print ("Is table \n"); +#endif gtk_widget_queue_resize (GTK_WIDGET (property->widget->widget)); #if 0 gtk_table_set_homogeneous (property->widget->widget, val); @@ -395,6 +397,7 @@ glade_property_set_enum (GladeProperty *property, GladeChoice *choice) else (*property->class->set_function) (G_OBJECT (property->widget->widget), property->value); + property->loading = FALSE; glade_property_emit_changed (property); diff --git a/src/glade-widget.c b/src/glade-widget.c index e9a77c27..ac60d621 100644 --- a/src/glade-widget.c +++ b/src/glade-widget.c @@ -36,6 +36,7 @@ #include "glade-gtk.h" #include "glade-packing.h" #include "glade-clipboard.h" +#include <gdk/gdkkeysyms.h> #define GLADE_WIDGET_SELECTION_NODE_SIZE 7 @@ -123,32 +124,40 @@ typedef struct }GladeFindInContainerData; -/* #define DEBUG */ +#undef DEBUG + +#ifdef DEBUG +#define g_debug(st) g_print st +#else +#define g_debug(st) +#endif + static void glade_widget_find_inside_container (GtkWidget *widget, gpointer data_in) { GladeFindInContainerData *data = data_in; -#ifdef DEBUG - g_debug ("In find_child_at: %s X:%i Y:%i W:%i H:%i\n" + g_debug(("In find_child_at: %s X:%i Y:%i W:%i H:%i\n" " so this means that if we are in the %d-%d , %d-%d range. We are ok\n", gtk_widget_get_name (widget), widget->allocation.x, widget->allocation.y, widget->allocation.width, widget->allocation.height, widget->allocation.x, widget->allocation.x + widget->allocation.width, - widget->allocation.y, widget->allocation.y + widget->allocation.height); -#endif + widget->allocation.y, widget->allocation.y + widget->allocation.height)); /* Notebook pages are visible but not mapped if they are not showing. */ + /* We should not consider objects that doesn't have the GLADE_WIDGET_DATA_TAG, + that way we would only take in account widgets modifiables by the user + (for instance, the widgets that are inside a font dialog are not modifiables + by the user) */ if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_MAPPED (widget) && (widget->allocation.x <= data->x) && (widget->allocation.y <= data->y) && (widget->allocation.x + widget->allocation.width >= data->x) - && (widget->allocation.y + widget->allocation.height >= data->y)) + && (widget->allocation.y + widget->allocation.height >= data->y) + && gtk_object_get_data(GTK_OBJECT (widget), GLADE_WIDGET_DATA_TAG)) { -#ifdef DEBUG - g_debug ("Found it!\n"); -#endif + g_debug(("Found it!\n")); data->found_child = widget; } } @@ -183,23 +192,20 @@ glade_widget_get_from_event_widget (GtkWidget *event_widget, GdkEventButton *eve x = event->x; y = event->y; gdk_window_get_position (event_widget->window, &win_x, &win_y); -#ifdef DEBUG - g_debug ("Window [%d,%d]\n", win_x, win_y); - g_debug ("\n\nWe want to find the real widget that was clicked at %d,%d\n", x, y); - g_debug ("The widget that received the event was \"%s\" a \"%s\" [%d]\n", + + g_debug(("Window [%d,%d]\n", win_x, win_y)); + g_debug(("\n\nWe want to find the real widget that was clicked at %d,%d\n", x, y)); + g_debug(("The widget that received the event was \"%s\" a \"%s\" [%d]\n", NULL, gtk_widget_get_name (event_widget), - GPOINTER_TO_INT (event_widget)); -#endif + GPOINTER_TO_INT (event_widget))); parent_window = event_widget->parent ? event_widget->parent->window : event_widget->window; while (window && window != parent_window) { gdk_window_get_position (window, &win_x, &win_y); -#ifdef DEBUG - g_debug (" adding X:%d Y:%d - We now have : %d %d\n", - win_x, win_y, x + win_x, y + win_y); -#endif + g_debug((" adding X:%d Y:%d - We now have : %d %d\n", + win_x, win_y, x + win_x, y + win_y)); x += win_x; y += win_y; window = gdk_window_get_parent (window); @@ -212,10 +218,8 @@ glade_widget_get_from_event_widget (GtkWidget *event_widget, GdkEventButton *eve found = glade_widget_get_from_gtk_widget (event_widget); while (GTK_IS_CONTAINER (temp)) { -#ifdef DEBUG - g_debug ("\"%s\" is a container, check inside each child\n", - gtk_widget_get_name (temp)); -#endif + g_debug(("\"%s\" is a container, check inside each child\n", + gtk_widget_get_name (temp))); data.found_child = NULL; gtk_container_forall (GTK_CONTAINER (temp), (GtkCallback) glade_widget_find_inside_container, &data); @@ -225,10 +229,8 @@ glade_widget_get_from_event_widget (GtkWidget *event_widget, GdkEventButton *eve found = glade_widget_get_from_gtk_widget (temp); g_assert (found->widget == data.found_child); } else { -#ifdef DEBUG - g_debug ("Temp was not a GladeWidget, it was a %s\n", - gtk_widget_get_name (temp)); -#endif + g_debug(("Temp was not a GladeWidget, it was a %s\n", + gtk_widget_get_name (temp))); } } else { /* The user clicked on the container itself */ @@ -250,10 +252,8 @@ glade_widget_get_from_event_widget (GtkWidget *event_widget, GdkEventButton *eve g_return_val_if_fail (found != NULL, NULL); #endif -#ifdef DEBUG - g_debug ("We found a \"%s\", child at %d,%d\n", - gtk_widget_get_name (found->widget), data.x, data.y); -#endif + g_debug(("We found a \"%s\", child at %d,%d\n", + gtk_widget_get_name (found->widget), data.x, data.y)); return found; } @@ -274,17 +274,14 @@ glade_widget_button_press (GtkWidget *event_widget, GdkEventButton *event, gpoin glade_widget = glade_widget_get_from_event_widget (event_widget, event); -#ifdef DEBUG - g_debug ("button press for a %s\n", glade_widget->class->name); -#endif + g_debug(("button press for a %s\n", glade_widget->class->name)); + if (!glade_widget) { g_warning ("Button press event but the gladewidget was not found\n"); return FALSE; } -#ifdef DEBUG - g_debug ("Event button %d\n", event->button); -#endif + g_debug(("Event button %d\n", event->button)); if (event->button == 1) { /* If this is a selection set, don't change the state of the widget @@ -296,25 +293,18 @@ glade_widget_button_press (GtkWidget *event_widget, GdkEventButton *event, gpoin glade_project_selection_set (glade_widget, TRUE); } else if (event->button == 3) glade_popup_pop (glade_widget, event); -#ifdef DEBUG else - g_debug ("Button press not handled yet.\n"); -#endif + g_debug(("Button press not handled yet.\n")); -#ifdef DEBUG - g_debug ("The widget found was a %s\n", glade_widget->class->name); -#endif + g_debug(("The widget found was a %s\n", glade_widget->class->name)); return FALSE; } -#undef DEBUG static gboolean glade_widget_button_release (GtkWidget *widget, GdkEventButton *event, gpointer not_used) { -#ifdef DEBUG - g_debug ("button release\n"); -#endif + g_debug(("button release\n")); return FALSE; } @@ -540,6 +530,49 @@ glade_widget_connect_mouse_signals (GladeWidget *glade_widget) GTK_SIGNAL_FUNC (glade_widget_button_release), NULL); } +static gboolean +glade_widget_key_press(GtkWidget *event_widget, GdkEventKey *event, gpointer user_data) +{ + GladeWidget *glade_widget = GLADE_WIDGET (user_data); + GladeProject *project; + GList *selection; + + g_return_val_if_fail (GTK_IS_WIDGET (event_widget), FALSE); + g_return_val_if_fail (glade_widget->widget == event_widget, FALSE); + + if (event->keyval == GDK_Delete) { + /* We will delete all the selected items */ + project = glade_widget->project; + g_return_val_if_fail (GLADE_IS_PROJECT (project), FALSE); + + /* The selection value changes when we do glade_widget_delete, + so if we just try to follow selection->next after the + glade_widget_delete, we are going directly to a segfault (if lucky) */ + while ((selection = glade_project_selection_get(project)) != NULL) { + g_return_val_if_fail (selection->data != NULL, FALSE); + + glade_widget = GLADE_WIDGET (selection->data); + /* g_print ("Widget %s deleted.\n", glade_widget->name); */ + glade_widget_delete (glade_widget); + } + } + + return TRUE; +} + +static void +glade_widget_connect_keyboard_signals (GladeWidget *glade_widget) +{ + GtkWidget *widget = glade_widget->widget; + + if (!GTK_WIDGET_NO_WINDOW(widget)) { + gtk_widget_set_events (widget, gtk_widget_get_events (widget) + | GDK_KEY_PRESS_MASK); + } + + gtk_signal_connect (GTK_OBJECT (widget), "key_press_event", + GTK_SIGNAL_FUNC (glade_widget_key_press), glade_widget); +} /** * glade_widget_set_contents: @@ -642,7 +675,7 @@ glade_widget_connect_other_signals (GladeWidget *widget) } } -#if 1 +#if 0 /* Sigh. * Fix, Fix, fix. Turn this off to see why this is here. * Add a gtkwindow and a gtkvbox to reproduce @@ -698,6 +731,11 @@ glade_widget_create_gtk_widget (GladeWidget *glade_widget) * and then a gtkvbox inside it. It will not draw correctly. * Chema */ + /* This hack makes glade segfault if you delete glade_widget before 1 sec has ellapsed + * since its creation (glade_widget will point to garbage). With gtk 1.3.12 everything + * seems to be ok without the timeouts, so I will leave them commentted out by now. + * Cuenca + */ if (class->post_create_function) { void (*pcf) (GObject *object); pcf = glade_gtk_get_function (class->post_create_function); @@ -707,12 +745,7 @@ glade_widget_create_gtk_widget (GladeWidget *glade_widget) pcf (G_OBJECT (glade_widget->widget)); } - - if (g_type_is_a (type, GTK_TYPE_WIDGET)) { - gtk_timeout_add ( 100, glade_widget_ugly_hack, glade_widget); - gtk_timeout_add ( 400, glade_widget_ugly_hack, glade_widget); - gtk_timeout_add (1000, glade_widget_ugly_hack, glade_widget); - } + return TRUE; } @@ -725,6 +758,7 @@ glade_widget_connect_signals (GladeWidget *widget) return; glade_widget_connect_mouse_signals (widget); + glade_widget_connect_keyboard_signals (widget); glade_widget_connect_draw_signals (widget); glade_widget_connect_edit_signals (widget); glade_widget_connect_other_signals (widget); @@ -1038,7 +1072,7 @@ glade_widget_delete (GladeWidget *widget) placeholder = glade_placeholder_new (widget->parent); if (widget->parent->class->placeholder_replace) widget->parent->class->placeholder_replace (widget->widget, GTK_WIDGET (placeholder), widget->parent->widget); - +b /* Remove it from the parent's child list */ parent->children = g_list_remove (parent->children, widget); @@ -1184,8 +1218,6 @@ glade_widget_write (GladeXmlContext *context, GladeWidget *widget) glade_xml_node_append_child (packing, packing_property); } glade_xml_node_append_child (child_tag, packing); - /* */ - } diff --git a/src/glade-widget.h b/src/glade-widget.h index a76db4fe..bfe871f3 100644 --- a/src/glade-widget.h +++ b/src/glade-widget.h @@ -62,6 +62,11 @@ struct _GladeWidgetSignal { }; +gchar * glade_widget_new_name (GladeProject *project, GladeWidgetClass *class); +gboolean glade_widget_create_gtk_widget (GladeWidget *glade_widget); +void glade_widget_set_contents (GladeWidget *widget); +void glade_widget_connect_signals (GladeWidget *widget); + GladeWidget * glade_widget_new_toplevel (GladeProject *project, GladeWidgetClass *class); GladeWidget * glade_widget_new_from_class (GladeWidgetClass *class, diff --git a/widgets/gtkbutton.xml b/widgets/gtkbutton.xml index 866f1446..9099430e 100644 --- a/widgets/gtkbutton.xml +++ b/widgets/gtkbutton.xml @@ -13,6 +13,8 @@ <Enum Id="glade-none" Name="None"/> <Enum Id="gtk-ok" Name="Ok"/> <Enum Id="gtk-cancel" Name="Cancel"/> + <Enum Id="gtk-apply" Name="Apply"/> + <Enum Id="gtk-close" Name="Close"/> </Enums> <SetFunction>glade_gtk_button_set_stock</SetFunction> </Property> |