summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS4
-rw-r--r--ChangeLog50
-rw-r--r--src/glade-choice.c18
-rw-r--r--src/glade-clipboard-view.c13
-rw-r--r--src/glade-clipboard-view.h6
-rw-r--r--src/glade-clipboard.c3
-rw-r--r--src/glade-clipboard.h4
-rw-r--r--src/glade-gtk.c76
-rw-r--r--src/glade-placeholder.c27
-rw-r--r--src/glade-placeholder.h1
-rw-r--r--src/glade-popup.c96
-rw-r--r--src/glade-popup.h1
-rw-r--r--src/glade-project-view.c5
-rw-r--r--src/glade-project-window.c2
-rw-r--r--src/glade-property-class.c36
-rw-r--r--src/glade-property-class.h2
-rw-r--r--src/glade-property.c3
-rw-r--r--src/glade-widget.c146
-rw-r--r--src/glade-widget.h5
-rw-r--r--widgets/gtkbutton.xml2
20 files changed, 319 insertions, 181 deletions
diff --git a/AUTHORS b/AUTHORS
index e667852b..2be40d7d 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -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
diff --git a/ChangeLog b/ChangeLog
index b5b2dda5..98d43e64 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>