Re: libglade custom properties
- From: James Henstridge <james daa com au>
- To: jacob berkman <jacob ximian com>
- Cc: gnome-2-0 <gnome-2-0-list gnome org>
- Subject: Re: libglade custom properties
- Date: Tue, 27 Nov 2001 23:29:42 +0800
jacob berkman wrote:
On Thu, 2001-11-22 at 22:57, James Henstridge wrote:
Hi Jacob,
Sorry for not getting round to going over your patch earlier. I ended
up with a slightly different API to your suggestion. The API in CVS now is:
typedef void (* GladeApplyCustomPropFunc)(GladeXML *xml,
GtkWidget *widget,
const gchar *propname,
const gchar *value);
As an example of its use, I added the following code to glade-gtk.c, so
that tooltips work in libglade again:
static void
set_tooltip(GladeXML *xml, GtkWidget *widget,
const gchar *prop_name, const gchar *prop_value)
{
gtk_tooltips_set_tip(xml->priv->tooltips, widget, prop_value, NULL);
}
this is fairly evil, as it uses glade-private.h. libglade support in
other libraries cannot touch this, so it's not really fair to allow
glade-gtk.c to.
Does this API cover what you needed? Again, sorry for being a bit
unresponsive about your patch.
for gtk, yes, although the calendar stuff is a bit poor. i'll be
getting to the other libraries shortly.
anyway, here is my patch to fixup gtk support in glade. it also adds
Custom widget support - did you have other plans for implementing it?
also i'm throwing in my current libglade-convert diff.
i also have some other changes to the check programs, but you need a
patch against gtk for it to pass, so i'll leave that out for now.
jacob
------------------------------------------------------------------------
? glade-xml.c.mine
? group
Index: glade-gtk.c
===================================================================
RCS file: /cvs/gnome/libglade/glade/glade-gtk.c,v
retrieving revision 1.76
diff -u -r1.76 glade-gtk.c
--- glade-gtk.c 2001/11/23 03:45:05 1.76
+++ glade-gtk.c 2001/11/26 23:13:33
@@ -22,7 +22,6 @@
#include <string.h>
#include <stdlib.h>
-#include <ctype.h>
#include <glade/glade.h>
#include <glade/glade-build.h>
#include <glade/glade-private.h>
@@ -40,6 +39,222 @@
gtk_tooltips_set_tip(xml->priv->tooltips, widget, prop_value, NULL);
}
+static void
+pixmap_set_build_insensitive (GladeXML *xml, GtkWidget *w,
+ const char *name, const char *value)
+{
+ gtk_pixmap_set_build_insensitive (GTK_PIXMAP (w),
+ *value == 'T' || *value == 'y');
+}
+
+static void
+pixmap_set_filename (GladeXML *xml, GtkWidget *w,
+ const char *name, const char *value)
+{
+ GdkPixbuf *pb;
+ char *file;
+ GdkPixmap *pixmap = NULL;
+ GdkBitmap *bitmap = NULL;
+
+ file = glade_xml_relative_file (xml, value);
+ pb = gdk_pixbuf_new_from_file (file, NULL);
+ g_free (file);
+
+ if (!pb)
+ return;
+
+ gdk_pixbuf_render_pixmap_and_mask (pb, &pixmap, &bitmap, 127);
+ gtk_pixmap_set (GTK_PIXMAP (w), pixmap, bitmap);
+
+ if (pixmap) gdk_pixmap_unref (pixmap);
+ if (bitmap) gdk_bitmap_unref (bitmap);
+
+ gdk_pixbuf_unref (pb);
+}
This bit looks fine. GtkPixmap is a deprecated widget, so using the
custom properties code is no big deal here.
+
+static void
+progress_set_format (GladeXML *xml, GtkWidget *w,
+ const char *name, const char *value)
+{
+ gtk_progress_set_format_string (GTK_PROGRESS (w), value);
+}
looks fine.
+
+static void
+option_menu_set_history (GladeXML *xml, GtkWidget *w,
+ const char *name, const char *value)
+{
+ gtk_option_menu_set_history (GTK_OPTION_MENU (w),
+ strtol (value, NULL, 10));
+}
no problem here.
+
+static void
+text_view_set_text (GladeXML *xml, GtkWidget *w,
+ const char *name, const char *value)
+{
+ GtkTextBuffer *buffy;
+
+ buffy = gtk_text_buffer_new (NULL);
+ gtk_text_buffer_set_text (buffy, value, strlen (value));
+ gtk_text_view_set_buffer (GTK_TEXT_VIEW (w), buffy);
+ g_object_unref (G_OBJECT (buffy));
+}
looks fine. Possibly call the variable buffer though; use your
discretion :)
+
+static void
+calendar_display_options (GladeXML *xml, GtkWidget *w,
+ const char *name, const char *value)
+{
+ GtkCalendarDisplayOptions options;
+ GtkCalendarDisplayOptions new_options;
+
+ if (!strcmp (name, "show_heading")) {
+ options = GTK_CALENDAR_SHOW_HEADING;
+ } else if (!strcmp (name, "show_day_names")) {
+ options = GTK_CALENDAR_SHOW_DAY_NAMES;
+ } else if (!strcmp (name, "no_month_change")) {
+ options = GTK_CALENDAR_NO_MONTH_CHANGE;
+ } else if (!strcmp (name, "show_week_numbers")) {
+ options = GTK_CALENDAR_SHOW_WEEK_NUMBERS;
+ } else if (!strcmp (name, "week_start_monday")) {
+ options = GTK_CALENDAR_WEEK_START_MONDAY;
+ } else {
+ g_warning ("Unknown calendar option \"%s\".", name);
+ return;
+ }
+
+ new_options = GTK_CALENDAR (w)->display_flags;
+
+ if (*value == 'T' || *value == 'y')
+ new_options |= options;
+ else
+ new_options &= ~options;
+
+ gtk_calendar_display_options (GTK_CALENDAR (w), new_options);
+}
I would probably modify this to coalesce the above properties into a
signle property in libglade-convert. Then the glade_flags_from_string()
function could be used to parse the string. The property would need to
be of the form "show-heading|week-starts-monday" (or use symbols like
GTK_CALENDAR_SHOW_HEADING -- both should get parsed correctly).
+
+static void
+clist_set_column_widths (GladeXML *xml, GtkWidget *w,
+ const char *name, const char *value)
+{
+ char *pos = (char *)value;
+ int cols = 0;
+ while (pos && *pos) {
+ int width = strtol (pos, &pos, 10);
+ if (*pos == ',') pos++;
+ gtk_clist_set_column_width (GTK_CLIST (w), cols++, width);
+ }
+}
+
+static void
+clist_set_selection_mode (GladeXML *xml, GtkWidget *w,
+ const char *name, const char *value)
+{
+ gtk_clist_set_selection_mode (
+ GTK_CLIST (w),
+ glade_enum_from_string (GTK_TYPE_SELECTION_MODE,
+ value));
+}
+
+static void
+clist_set_shadow_type (GladeXML *xml, GtkWidget *w,
+ const char *name, const char *value)
+{
+ gtk_clist_set_shadow_type (
+ GTK_CLIST (w),
+ glade_enum_from_string (GTK_TYPE_SHADOW_TYPE,
+ value));
+}
+
+static void
+clist_set_show_titles (GladeXML *xml, GtkWidget *w,
+ const char *name, const char *value)
+{
+ if (*value == 'T' || *value == 'y')
+ gtk_clist_column_titles_show (GTK_CLIST (w));
+ else
+ gtk_clist_column_titles_hide (GTK_CLIST (w));
+}
+
+static void
+tree_set_selection_mode (GladeXML *xml, GtkWidget *w,
+ const char *name, const char *value)
+{
+ gtk_tree_set_selection_mode (
+ GTK_TREE (w),
+ glade_enum_from_string (GTK_TYPE_SELECTION_MODE, value));
+}
+
+static void
+tree_set_view_mode (GladeXML *xml, GtkWidget *w,
+ const char *name, const char *value)
+{
+ gtk_tree_set_view_mode (
+ GTK_TREE (w),
+ glade_enum_from_string (GTK_TYPE_TREE_VIEW_MODE, value));
+}
+
+static void
+tree_set_view_line (GladeXML *xml, GtkWidget *w,
+ const char *name, const char *value)
+{
+ gtk_tree_set_view_lines (GTK_TREE (w), *value == 'T' || *value == 'y');
+}
+
+static void
+list_set_selection_mode (GladeXML *xml, GtkWidget *w,
+ const char *name, const char *value)
+{
+ gtk_list_set_selection_mode (
+ GTK_LIST (w),
+ glade_enum_from_string (GTK_TYPE_SELECTION_MODE, value));
+}
These are deprecated widgets, so are not as important. The functions
look fine.
+
+static void
+check_menu_item_set_always_show_toggle (GladeXML *xml, GtkWidget *w,
+ const char *name, const char *value)
+{
+ gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (w),
+ *value == 'T' || *value == 'y');
+}
This looks like another missing property. I need to do up a list of
missing properties and see if some/all can be added to gtk+ before 2.0
(some of them like the radio menu item group would be very very useful
as real properties).
+
+static void
+text_set_text (GladeXML *xml, GtkWidget *w,
+ const char *name, const char *value)
+{
+ int pos = 0;
+
+ gtk_editable_insert_text (GTK_EDITABLE (w), value, -1, &pos);
+}
+
+static void
+radio_menu_item_set_group (GladeXML *xml, GtkWidget *w,
+ const char *name, const char *value)
+{
+ GtkWidget *group;
+
+ group = glade_xml_get_widget (xml, value);
+ if (!group) {
+ g_warning ("Radio button group %s could not be found", value);
+ return;
+ }
+
+ if (group == w) {
+ g_message ("Group is self, skipping.");
+ return;
+ }
+
+ gtk_radio_menu_item_set_group (
+ GTK_RADIO_MENU_ITEM (w),
+ gtk_radio_menu_item_get_group (
+ GTK_RADIO_MENU_ITEM (group)));
+}
This is the one that would work a lot better with a real property (that
way we would get forward references for free). May as well go in until
that is fixed in gtk+.
+
+static void
+toolbar_set_tooltips (GladeXML *xml, GtkWidget *w,
+ const char *name, const char *value)
+{
+ gtk_toolbar_set_tooltips (GTK_TOOLBAR (w), *value == 'T' || *value == 'y');
+}
+
no problem here.
static GtkWidget *
build_window(GladeXML *xml, GType widget_type, GladeWidgetInfo *info)
{
@@ -154,148 +369,30 @@
}
static GtkWidget *
-build_progress (GladeXML *xml, GType widget_type,
- GladeWidgetInfo *info)
+build_preview (GladeXML *xml, GType widget_type,
+ GladeWidgetInfo *info)
{
- GtkWidget *pbar;
- char *format = NULL;
- int i;
+ GtkWidget *preview;
- for (i = 0; i < info->n_properties; i++) {
- if (!strcmp (info->properties[i].name, "format")) {
- format = info->properties[i].value;
- break;
- }
- }
-
- g_message ("ignore warnings about the following: format");
-
- pbar = glade_standard_build_widget (xml, widget_type, info);
-
- if (format && *format)
- gtk_progress_set_format_string (GTK_PROGRESS (pbar), format);
-
- return pbar;
-}
+ GtkPreviewType type = GTK_PREVIEW_COLOR;
+ gboolean expand = TRUE;
-static GtkWidget *
-build_option_menu (GladeXML *xml, GType widget_type,
- GladeWidgetInfo *info)
-{
- GtkWidget *option_menu;
- int i, history = 0;
-
- for (i = 0; i < info->n_properties; i++) {
- if (!strcmp (info->properties[i].name, "history")) {
- history = strtol (info->properties[i].value, NULL, 10);
- break;
- }
- }
-
- g_message ("ignore warnings about the following: history");
-
- option_menu = glade_standard_build_widget (xml, widget_type, info);
-
- if (history)
- gtk_option_menu_set_history (GTK_OPTION_MENU (option_menu), history);
-
- return option_menu;
-}
-
-static GtkWidget *
-build_text_view (GladeXML *xml, GType widget_type,
- GladeWidgetInfo *info)
-{
- GtkWidget *text_view;
- char *text = NULL;
int i;
for (i = 0; i < info->n_properties; i++) {
- if (!strcmp (info->properties[i].name, "text")) {
- text = info->properties[i].value;
- break;
- }
- }
+ const char *name = info->properties[i].name;
+ const char *value = info->properties[i].value;
- g_message ("ignore warnings about the following: text");
-
- text_view = glade_standard_build_widget (xml, widget_type, info);
-
- if (text && *text) {
- GtkTextBuffer *buffy;
-
- buffy = gtk_text_buffer_new (NULL);
- gtk_text_buffer_set_text (buffy, text, strlen (text));
- gtk_text_view_set_buffer (GTK_TEXT_VIEW (text_view), buffy);
- g_object_unref (G_OBJECT (buffy));
- }
-
- return text_view;
-}
-
-static GtkWidget *
-build_clist (GladeXML *xml, GType widget_type,
- GladeWidgetInfo *info)
-{
- GtkWidget *clist;
- int cols = 1;
- int i;
-
- const char *name, *value;
-
- /* "fake" properties */
- char *column_widths = NULL;
- GtkSelectionMode selection_mode = GTK_SELECTION_SINGLE;
- GtkShadowType shadow_type = GTK_SHADOW_IN;
- gboolean show_titles = TRUE;
-
- /* collect our custom properties */
- for (i = 0; i < info->n_properties; i++) {
- name = info->properties[i].name;
- value = info->properties[i].value;
-
- if (!strcmp (name, "column_widths"))
- column_widths = g_strdup (value);
-
- else if (!strcmp (name, "columns"))
- cols = strtol (value, NULL, 0);
-
- else if (!strcmp (name, "selection_mode"))
- selection_mode = glade_enum_from_string (
- GTK_TYPE_SELECTION_MODE, value);
-
- else if (!strcmp (name, "shadow_type"))
- shadow_type = glade_enum_from_string (
- GTK_TYPE_SHADOW_TYPE, value);
-
- else if (!strcmp (name, "show_titles"))
- show_titles =
- (tolower(value[0]) == 't' || tolower(value[0]) == 'y' || atoi(value));
+ if (!strcmp (name, "expand"))
+ expand = (*value == 'T' || *value == 'y');
+ else if (!strcmp (name, "type"))
+ type = glade_enum_from_string (GTK_TYPE_PREVIEW_TYPE, value);
}
-
- g_message ("ignore warnings about the following: column_widths, columns, selection_mode, shadow_type, show_titles");
- clist = glade_standard_build_widget (xml, widget_type, info);
-
- if (column_widths) {
- char *pos = column_widths;
- while (pos && *pos) {
- int width = strtol (pos, &pos, 0);
- if (*pos == ',') pos++;
- gtk_clist_set_column_width (GTK_CLIST (clist), cols++, width);
- }
- g_free (column_widths);
- }
+ preview = gtk_preview_new (type);
+ gtk_preview_set_expand (GTK_PREVIEW (preview), expand);
- gtk_clist_set_selection_mode (GTK_CLIST (clist), selection_mode);
- gtk_clist_set_shadow_type (GTK_CLIST (clist), shadow_type);
-
- if (show_titles)
- gtk_clist_column_titles_show (GTK_CLIST (clist));
- else
- gtk_clist_column_titles_hide (GTK_CLIST (clist));
-
- return clist;
+ return preview;
}
static void
@@ -320,6 +417,8 @@
if (!strcmp (childinfo->properties[j].name, "label")) {
label = childinfo->properties[j].value;
break;
+ } else {
+ g_warning ("Unknown CList child property: %s", childinfo->properties[j].name);
}
}
@@ -341,6 +440,154 @@
g_object_unref (G_OBJECT (parent));
}
+static void
+toolbar_build_children (GladeXML *xml, GtkWidget *parent,
+ GladeWidgetInfo *info)
+{
+ int i;
+
+ g_object_ref (G_OBJECT (parent));
+
+ for (i = 0; i < info->n_children; i++) {
+ GladeChildInfo *childinfo;
+ GtkWidget *child = NULL;
+
+ childinfo = &info->children[i];
+
+ if (!strcmp (childinfo->child->class, "toggle") ||
+ !strcmp (childinfo->child->class, "radio") ||
+ !strcmp (childinfo->child->class, "button")) {
+ const char *label = NULL, *stock = NULL, *group_name = NULL;
+ char *icon = NULL;
+ gboolean active = FALSE, new_group = FALSE;
+ GtkWidget *iconw = NULL;
+ int j;
+
+ for (j = 0; j < childinfo->child->n_properties; j++) {
+ const char *name = childinfo->child->properties[j].name;
+ const char *value = childinfo->child->properties[j].value;
+
+ if (!strcmp (name, "label")) {
+ label = value;
+ } else if (!strcmp (name, "icon")) {
+ g_free (icon);
+ stock = NULL;
+ icon = glade_xml_relative_file (xml, value);
+ } else if (!strcmp (name, "stock_pixmap")) {
+ g_free (icon);
+ icon = NULL;
+ stock = value;
+ } else if (!strcmp (name, "active")) {
+ active = (*value == 'T' || *value == 'y');
+ } else if (!strcmp (name, "group")) {
+ group_name = value;
+ } else if (!strcmp (name, "new_group")) {
+ new_group = (*value == 'T' || *value == 'y');
+ } else if (!strcmp (name, "visible")) {
+ /* ignore for now */
+ } else {
+ g_warning ("Unknown GtkToolbar child property: %s", name);
+ }
+ }
+
+ if (stock) {
+ iconw = gtk_image_new_from_stock (
+ stock, GTK_TOOLBAR (parent)->icon_size);
+ if (!iconw)
+ g_warning ("Could not create stock item: %s", stock);
+ } else if (icon) {
+ iconw = gtk_image_new_from_file (icon);
+ }
+
+ if (iconw)
+ gtk_widget_show (iconw);
+
+ if (new_group)
+ gtk_toolbar_append_space (GTK_TOOLBAR (parent));
+
+ /* FIXME: these should be translated */
+ if (!strcmp (childinfo->child->class, "toggle")) {
+ child = gtk_toolbar_append_element (
+ GTK_TOOLBAR (parent),
+ GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
+ label, NULL, NULL, iconw, NULL, NULL);
+ gtk_toggle_button_set_active(
+ GTK_TOGGLE_BUTTON (child), active);
+ } else if (!strcmp (childinfo->child->class, "radio")) {
+ child = gtk_toolbar_append_element (
+ GTK_TOOLBAR (parent),
+ GTK_TOOLBAR_CHILD_RADIOBUTTON, NULL,
+ label, NULL, NULL, iconw, NULL, NULL);
+
+ if (group_name) {
+ g_object_set (G_OBJECT (child),
+ "group", glade_xml_get_widget (xml, group_name),
+ NULL);
+ }
+ } else
+ child = gtk_toolbar_append_item (
+ GTK_TOOLBAR (parent),
+ label, NULL, NULL, iconw, NULL, NULL);
+
+ glade_xml_set_common_params (xml, child, childinfo->child);
+ } else {
+ child = glade_xml_build_widget (xml, childinfo->child);
+ gtk_toolbar_append_widget (GTK_TOOLBAR (parent), child, NULL, NULL);
+ }
+ }
+}
+
+static void
+paned_build_children (GladeXML *xml, GtkWidget *w, GladeWidgetInfo *info)
+{
+ int i;
+ GtkWidget *child;
+ gboolean resize, shrink;
+ GladeChildInfo *cinfo;
+
+ if (info->n_children == 0)
+ return;
+
+ cinfo = &info->children[0];
+ child = glade_xml_build_widget (xml, cinfo->child);
+
+ resize = FALSE; shrink = TRUE;
+ for (i = 0; i < cinfo->n_properties; i++) {
+ const char *name = cinfo->properties[i].name;
+ const char *value = cinfo->properties[i].value;
+
+ if (!strcmp (name, "resize"))
+ resize = (*value == 'T' || *value == 'y');
+ else if (!strcmp (name, "shrink"))
+ shrink = (*value == 'T' || *value == 'y');
+ else
+ g_warning ("Unknown GtkPaned child property: %s", name);
+ }
+
+ gtk_paned_pack1 (GTK_PANED(w), child, resize, shrink);
+
+ if (info->n_children == 1)
+ return;
+
+ cinfo = &info->children[1];
+ child = glade_xml_build_widget (xml, cinfo->child);
+ resize = TRUE; shrink = TRUE;
+
+ for (i = 0; i < cinfo->n_properties; i++) {
+ const char *name = cinfo->properties[i].name;
+ const char *value = cinfo->properties[i].value;
+
+ if (!strcmp (name, "resize"))
+ resize = (*value == 'T' || *value == 'y');
+ else if (!strcmp (name, "shrink"))
+ shrink = (*value == 'T' || *value == 'y');
+ else
+ g_warning ("Unknown GtkPaned child property: %s", name);
+ }
+
+ gtk_paned_pack2 (GTK_PANED(w), child, resize, shrink);
+}
+
static GtkWidget *
build_button(GladeXML *xml, GType widget_type,
GladeWidgetInfo *info)
@@ -483,7 +730,7 @@
return GTK_COMBO(parent)->button;
if (!strcmp(childname, "popup"))
return GTK_COMBO(parent)->popup;
- if (!strcmp(childname, "pupwin"))
+ if (!strcmp(childname, "popwin"))
return GTK_COMBO(parent)->popwin;
if (!strcmp(childname, "list"))
return GTK_COMBO(parent)->list;
@@ -494,6 +741,30 @@
_glade_init_gtk_widgets(void)
{
glade_register_custom_prop (GTK_TYPE_WIDGET, "tooltip", set_tooltip);
+ glade_register_custom_prop (GTK_TYPE_PIXMAP, "build_insensitive", pixmap_set_build_insensitive);
+ glade_register_custom_prop (GTK_TYPE_PIXMAP, "filename", pixmap_set_filename);
+ glade_register_custom_prop (GTK_TYPE_PROGRESS, "format", progress_set_format);
+ glade_register_custom_prop (GTK_TYPE_OPTION_MENU, "history", option_menu_set_history);
+ glade_register_custom_prop (GTK_TYPE_TEXT_VIEW, "text", text_view_set_text);
+ glade_register_custom_prop (GTK_TYPE_CALENDAR, "show_heading", calendar_display_options);
+ glade_register_custom_prop (GTK_TYPE_CALENDAR, "show_day_names", calendar_display_options);
+ glade_register_custom_prop (GTK_TYPE_CALENDAR, "no_month_change", calendar_display_options);
+ glade_register_custom_prop (GTK_TYPE_CALENDAR, "show_week_numbers", calendar_display_options);
+ glade_register_custom_prop (GTK_TYPE_CALENDAR, "week_start_monday", calendar_display_options);
+ glade_register_custom_prop (GTK_TYPE_CLIST, "column_widths", clist_set_column_widths);
+ glade_register_custom_prop (GTK_TYPE_CLIST, "selection_mode", clist_set_selection_mode);
+ glade_register_custom_prop (GTK_TYPE_CLIST, "shadow_type", clist_set_shadow_type);
+ glade_register_custom_prop (GTK_TYPE_CLIST, "show_titles", clist_set_show_titles);
+ glade_register_custom_prop (GTK_TYPE_TREE, "selection_mode", tree_set_selection_mode);
+ glade_register_custom_prop (GTK_TYPE_TREE, "view_mode", tree_set_view_mode);
+ glade_register_custom_prop (GTK_TYPE_TREE, "view_line", tree_set_view_line);
+ glade_register_custom_prop (GTK_TYPE_LIST, "selection_mode", list_set_selection_mode);
+ glade_register_custom_prop (GTK_TYPE_CHECK_MENU_ITEM, "always_show_toggle",
+ check_menu_item_set_always_show_toggle);
+ glade_register_custom_prop (GTK_TYPE_TEXT, "text", text_set_text);
+ glade_register_custom_prop (GTK_TYPE_RADIO_MENU_ITEM, "group",
+ radio_menu_item_set_group);
+ glade_register_custom_prop (GTK_TYPE_TOOLBAR, "tooltips", toolbar_set_tooltips);
glade_register_widget (GTK_TYPE_ACCEL_LABEL, glade_standard_build_widget,
NULL, NULL);
@@ -511,7 +782,7 @@
glade_standard_build_children, NULL);
glade_register_widget (GTK_TYPE_CHECK_MENU_ITEM, glade_standard_build_widget,
menuitem_build_children, NULL);
- glade_register_widget (GTK_TYPE_CLIST, build_clist,
+ glade_register_widget (GTK_TYPE_CLIST, glade_standard_build_widget,
clist_build_children, NULL);
glade_register_widget (GTK_TYPE_COLOR_SELECTION, glade_standard_build_widget,
NULL, NULL);
@@ -519,7 +790,7 @@
glade_standard_build_children, colorseldlg_find_internal_child);
glade_register_widget (GTK_TYPE_COMBO, glade_standard_build_widget,
glade_standard_build_children, combo_find_internal_child);
- glade_register_widget (GTK_TYPE_CTREE, build_clist,
+ glade_register_widget (GTK_TYPE_CTREE, glade_standard_build_widget,
clist_build_children, NULL);
glade_register_widget (GTK_TYPE_CURVE, glade_standard_build_widget,
NULL, NULL);
@@ -550,7 +821,7 @@
glade_register_widget (GTK_TYPE_HBOX, glade_standard_build_widget,
glade_standard_build_children, NULL);
glade_register_widget (GTK_TYPE_HPANED, glade_standard_build_widget,
- glade_standard_build_children, NULL);
+ paned_build_children, NULL);
glade_register_widget (GTK_TYPE_HRULER, glade_standard_build_widget,
NULL, NULL);
glade_register_widget (GTK_TYPE_HSCALE, glade_standard_build_widget,
@@ -583,16 +854,18 @@
glade_standard_build_children, NULL);
glade_register_widget (GTK_TYPE_NOTEBOOK, glade_standard_build_widget,
notebook_build_children, NULL);
- glade_register_widget (GTK_TYPE_OPTION_MENU, build_option_menu,
+ glade_register_widget (GTK_TYPE_OPTION_MENU, glade_standard_build_widget,
glade_standard_build_children, option_menu_find_internal_child);
glade_register_widget (GTK_TYPE_PIXMAP, glade_standard_build_widget,
NULL, NULL);
glade_register_widget (GTK_TYPE_PLUG, build_window,
NULL, NULL);
- glade_register_widget (GTK_TYPE_PROGRESS, build_progress,
+ glade_register_widget (GTK_TYPE_PREVIEW, build_preview,
NULL, NULL);
- glade_register_widget (GTK_TYPE_PROGRESS_BAR, build_progress,
+ glade_register_widget (GTK_TYPE_PROGRESS, glade_standard_build_widget,
NULL, NULL);
+ glade_register_widget (GTK_TYPE_PROGRESS_BAR, glade_standard_build_widget,
+ NULL, NULL);
glade_register_widget (GTK_TYPE_RADIO_BUTTON, glade_standard_build_widget,
glade_standard_build_children, NULL);
glade_register_widget (GTK_TYPE_RADIO_MENU_ITEM, glade_standard_build_widget,
@@ -612,14 +885,14 @@
NULL, NULL);
glade_register_widget (GTK_TYPE_TEXT, glade_standard_build_widget,
NULL, NULL);
- glade_register_widget (GTK_TYPE_TEXT_VIEW, build_text_view,
+ glade_register_widget (GTK_TYPE_TEXT_VIEW, glade_standard_build_widget,
NULL, NULL);
glade_register_widget (GTK_TYPE_TIPS_QUERY, glade_standard_build_widget,
NULL, NULL);
glade_register_widget (GTK_TYPE_TOGGLE_BUTTON, glade_standard_build_widget,
glade_standard_build_children, NULL);
glade_register_widget (GTK_TYPE_TOOLBAR, glade_standard_build_widget,
- glade_standard_build_children, NULL);
+ toolbar_build_children, NULL);
glade_register_widget (GTK_TYPE_TREE, glade_standard_build_widget,
NULL, NULL);
glade_register_widget (GTK_TYPE_TREE_VIEW, glade_standard_build_widget,
@@ -629,7 +902,7 @@
glade_register_widget (GTK_TYPE_VBOX, glade_standard_build_widget,
glade_standard_build_children, NULL);
glade_register_widget (GTK_TYPE_VPANED, glade_standard_build_widget,
- glade_standard_build_children, NULL);
+ paned_build_children, NULL);
glade_register_widget (GTK_TYPE_VRULER, glade_standard_build_widget,
NULL, NULL);
glade_register_widget (GTK_TYPE_VSCALE, glade_standard_build_widget,
Index: glade-xml.c
===================================================================
RCS file: /cvs/gnome/libglade/glade/glade-xml.c,v
retrieving revision 1.82
diff -u -r1.82 glade-xml.c
--- glade-xml.c 2001/11/23 03:45:05 1.82
+++ glade-xml.c 2001/11/26 23:13:33
@@ -1067,6 +1067,37 @@
int1, int2, custom_user_data);
}
+static GtkWidget *
+custom_new (GladeXML *xml, GladeWidgetInfo *info)
+{
+ GtkWidget *wid = NULL;
+ gchar *func_name = NULL, *string1 = NULL, *string2 = NULL;
+ gint int1 = 0, int2 = 0;
+ int i;
+
+ for (i = 0; i < info->n_properties; i++) {
+ char *name = info->properties[i].name;
+ char *value = info->properties[i].value;
+
+ if (!strcmp(name, "creation_function"))
+ func_name = value;
+ else if (!strcmp(name, "string1"))
+ string1 = value;
+ else if (!strcmp(name, "string2"))
+ string2 = value;
+ else if (!strcmp(name, "int1"))
+ int1 = strtol(value, NULL, 0);
+ else if (!strcmp(name, "int2"))
+ int2 = strtol(value, NULL, 0);
+ }
+ wid = glade_create_custom(xml, func_name, info->name, string1,
+ string2, int1, int2);
+ /* fallback to prevent segfault */
+ if (wid == NULL)
+ wid = gtk_label_new("[custom widget creation failed]");
+ return wid;
+}
+
This addition looks good (it makes more sense to have it here rather
than in glade-gtk.c, as it is in the stable branch).
/**
* glade_enum_from_string
* @type: the GType for this enum type.
@@ -1823,6 +1854,8 @@
ret = gtk_label_new("[placeholder]");
gtk_widget_show(ret);
return ret;
+ } else if (!strcmp (info->class, "Custom")) {
+ return custom_new (self, info);
}
type = g_type_from_name(info->class);
if (type == G_TYPE_INVALID) {
------------------------------------------------------------------------
Index: libglade-convert.in
===================================================================
RCS file: /cvs/gnome/libglade/libglade-convert.in,v
retrieving revision 1.1
diff -u -r1.1 libglade-convert.in
--- libglade-convert.in 2001/11/21 12:29:14 1.1
+++ libglade-convert.in 2001/11/26 23:17:40
@@ -286,10 +286,15 @@
'GtkVRuler': [ 'metric' ],
'GnomeFileEntry' : [ 'max_saved' ],
'GnomeEntry' : [ 'max_saved' ],
+ 'GtkMenuBar' : [ 'shadow_type' ],
+ 'GtkToolbar' : [ 'space_size', 'space_style', 'relief', 'tooltips' ],
+ 'GtkImage' : [ 'image_width', 'image_height', 'image_visual', 'image_type'],
+ 'GtkColorSelection' : [ 'policy' ],
+ 'GtkColorSelectionDialog' : [ 'policy' ],
}
renamed_props = {
- 'GtkWindow': [ ('position', 'window-position') ],
+ 'GtkWindow': [ ('position', 'window-position') ],
'GtkEntry': [ ('text_max_length', 'max-length'),
('text_visible', 'visibility') ],
'GtkFrame': [ ('shadow_type', 'shadow') ],
@@ -304,7 +309,11 @@
'GnomeFileEntry' : [ ( 'directory', 'directory_entry' ) ],
'GtkLabel' : [ ('default_focus_target', 'mnemonic_widget') ],
'GtkCList' : [ ('columns', 'n_columns') ],
- 'GtkCTree' : [ ('columns', 'n_columns') ]
+ 'GtkCTree' : [ ('columns', 'n_columns') ],
+ 'GtkToolbar': [ ('type', 'toolbar-style') ],
+ 'GtkOptionMenu' : [ ('initial_choice', 'history') ],
+ 'GtkLayout' : [ ('area_width', 'width'), ('area_height', 'height') ],
+ 'GtkFileSelection' : [ ('show_file_op_buttons', 'show-fileops') ],
}
# child properties to change on specific widgets
@@ -365,10 +374,14 @@
'GtkCheckMenuItem' : 'GtkMenuItem',
'GtkRadioMenuItem' : 'GtkMenuItem',
'GtkImageMenuItem' : 'GtkMenuItem',
+ 'GtkFileSelection' : 'GtkDialog',
'GtkFontSelectionDialog' : 'GtkDialog',
'GnomeColorPicker' : 'GtkButton',
'GtkToggleButton' : 'GtkButton',
'GtkCheckButton' : 'GtkToggleButton',
+ 'GtkColorSelectionDialog': 'GtkDialog',
+ 'GtkFontSelectionDialog': 'GtkDialog',
+
}
global_group_map = { }
@@ -398,7 +411,7 @@
label['xalign'] = '0.0'
if class_type == 'GtkAccelLabel':
- label['accel-object'] = accel_object
+ label['accel-widget'] = accel_object
label['use-underline'] = 'yes'
return label
@@ -490,6 +503,15 @@
else:
return old_name
+def stock_pixmap_translate(old_name):
+ if re.match ('GNOME_STOCK_PIXMAP_.*', old_name):
+ name = re.sub('GNOME_STOCK_PIXMAP_', '', old_name)
+ try:
+ return stock_pixmaps[name]
+ except KeyError:
+ name = re.sub('_', '-', name)
+ return 'gtk-' + name.lower ()
+
def fixup_as_type(widget, type):
# table based property removals/renames
@@ -571,9 +593,33 @@
del childdef.widget['child_name']
childdef['type'] = 'tab';
else:
- print >> sys.stderr , 'Unknown child_name', \
+ print >> sys.stderr , 'Unknown child_name ' \
childdef.widget['child_name']
what does this little change do? It looks like a syntax error.
+ if type == 'GtkFileSelection':
+ for childdef in widget.children:
+ if childdef.widget.has_prop ('child_name'):
+ if re.match ('FileSel:.*', childdef.widget['child_name']):
+ name = re.sub ('FileSel:', '', childdef.widget['child_name'])
+ del childdef.widget['child_name']
+ childdef.internal_child = name
+
+ if type == 'GtkColorSelectionDialog':
+ for childdef in widget.children:
+ if childdef.widget.has_prop ('child_name'):
+ if re.match ('ColorSel:.*', childdef.widget['child_name']):
+ name = re.sub ('ColorSel:', '', childdef.widget['child_name'])
+ del childdef.widget['child_name']
+ childdef.internal_child = name
+
+ if type == 'GtkFontSelectionDialog':
+ for childdef in widget.children:
+ if childdef.widget.has_prop ('child_name'):
+ if re.match ('FontSel:.*', childdef.widget['child_name']):
+ name = re.sub ('FontSel:', '', childdef.widget['child_name'])
+ del childdef.widget['child_name']
+ childdef.internal_child = name
+
# fix up adjustment properties
if type in ('GtkHScale', 'GtkHScrollbar',
'GtkVScale', 'GtkVScrollbar',
@@ -614,17 +660,18 @@
if type == 'GtkDialog':
childdef = widget.children[0]
- childdef.internal_child = 'vbox'
- del childdef.widget['child_name']
+ if childdef.widget.has_prop ('child_name'):
+ childdef.internal_child = 'vbox'
+ del childdef.widget['child_name']
- try:
- childdef = filter(lambda x: x.widget.has_prop('child_name'),
- childdef.widget.children)[0]
- except IndexError:
- return 0
- childdef.widget['class'] = 'GtkHButtonBox'
- childdef.internal_child = 'action_area'
- del childdef.widget['child_name']
+ try:
+ childdef = filter(lambda x: x.widget.has_prop('child_name'),
+ childdef.widget.children)[0]
+ except IndexError:
+ return 0
+ childdef.widget['class'] = 'GtkHButtonBox'
+ childdef.internal_child = 'action_area'
+ del childdef.widget['child_name']
if type == 'GtkOptionMenu':
if widget.has_prop('items'):
@@ -644,9 +691,7 @@
new_label ('GtkMenuItem', \
item, widget['name']))
del widget['items']
- if widget.has_prop('initial_choice'):
- widget['history'] = widget['initial_choice']
- del widget['initial_choice']
+
if type == 'GtkScrolledWindow':
if widget.has_prop ('hupdate_policy'):
@@ -686,7 +731,7 @@
if type in ('GtkCList', 'GtkCTree'):
for childdef in widget.children:
- childdef.internal_child = 'title'
+ childdef.internal_child = childdef.widget['child_name']
del childdef.widget['child_name']
These shouldn't be marked as "internal children", as they are real
children. I don't think a clist/ctree has any child widgets other than
its column header labels anyway.
if type == 'GtkLabel' or type == 'GtkButton':
@@ -721,6 +766,22 @@
global_group_map[widget['group']] = widget['name']
del widget['group']
+ if type == 'GtkToolbar':
+ for childdef in widget.children:
+ if childdef.widget.has_prop('child_name'):
+ if childdef.widget['child_name'] == 'Toolbar:button':
+ if childdef.widget['class'] == 'GtkButton':
+ childdef.widget['class'] = 'button'
+ elif childdef.widget['class'] == 'GtkToggleButton':
+ childdef.widget['class'] = 'toggle'
+ elif childdef.widget['class'] == 'GtkRadioButton':
+ childdef.widget['class'] = 'radio'
+ del childdef.widget['child_name']
This looks like a good compromise to detect buttons that should be
treated specially by when packing (this is one of the things I hate
about GtkToolbar ...).
+ if childdef.widget.has_prop('stock_pixmap'):
+ name = stock_pixmap_translate (childdef.widget['stock_pixmap'])
+ childdef.widget['stock_pixmap'] = name
+
+
return 0
# upgrade widgets to their gtk/gnome 2.0 equivalents
@@ -749,7 +810,7 @@
if parent['class'] == 'GtkScrolledWindow':
parent['shadow_type'] = 'GTK_SHADOW_IN'
- elif widget['class'] in ('GtkCList', 'GtkCTree'):
+ elif widget['class'] in ('GtkCList', 'GtkCTree', 'GtkList', 'GtkTree'):
widget['class'] = 'GtkTreeView'
parent = widget['parent']
if parent['class'] == 'GtkScrolledWindow':
@@ -759,6 +820,8 @@
widget.remove_prop('columns')
widget.remove_prop('column_widths')
widget.remove_prop('selection_mode')
+ widget.remove_prop('view_mode')
+ widget.remove_prop('view_line')
if do_children:
for childdef in widget.children:
@@ -775,7 +838,8 @@
'GtkPixmap': 'deprecated',
'GnomePixmap': 'deprecated',
'GnomeFontPicker': 'removed',
- 'GtkPixmapMenuItem': 'removed'
+ 'GtkPixmapMenuItem': 'removed',
+ 'GtkPacker': 'removed',
}
def check_widget(widget, requirelist=[]):
try:
With the above small changes, go ahead and check in.
James.
--
Email: james daa com au
WWW: http://www.daa.com.au/~james/
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]