Commit 50a9ba1f authored by Tim Janik's avatar Tim Janik Committed by Tim Janik

further additions to fit the gimp's code. additions to the dumping code to

Sun Jun  7 10:53:02 1998  Tim Janik  <timj@gtk.org>

        * gtk/gtkitemfactory.h:
        * gtk/gtkitemfactory.c: further additions to fit the gimp's code.
        additions to the dumping code to feature GtkPatternSpec.
        even found a bug to fix in the original code ;)
parent e47f60d7
......@@ -3,9 +3,15 @@
* gdk/gdk.h (gdk_color_copy, gdk_color_free): New prototypes.
* gdk/gdk.c (gdk_color_copy, gdk_color_free): New functions.
Sun Jun 7 09:36:04 1998 Tim Janik <timj@gtk.org>
Sun Jun 7 10:53:02 1998 Tim Janik <timj@gtk.org>
* gtk/gtkitemfactory.h:
* gtk/gtkitemfactory.c: further additions to fit the gimp's code.
additions to the dumping code to feature GtkPatternSpec.
even found a bug to fix in the original code ;)
Sun Jun 7 09:36:04 1998 Tim Janik <timj@gtk.org>
* gtk/gtkitemfactory.c: support different types of callbacks, to
maintain existing code.
......
......@@ -3,9 +3,15 @@
* gdk/gdk.h (gdk_color_copy, gdk_color_free): New prototypes.
* gdk/gdk.c (gdk_color_copy, gdk_color_free): New functions.
Sun Jun 7 09:36:04 1998 Tim Janik <timj@gtk.org>
Sun Jun 7 10:53:02 1998 Tim Janik <timj@gtk.org>
* gtk/gtkitemfactory.h:
* gtk/gtkitemfactory.c: further additions to fit the gimp's code.
additions to the dumping code to feature GtkPatternSpec.
even found a bug to fix in the original code ;)
Sun Jun 7 09:36:04 1998 Tim Janik <timj@gtk.org>
* gtk/gtkitemfactory.c: support different types of callbacks, to
maintain existing code.
......
......@@ -3,9 +3,15 @@
* gdk/gdk.h (gdk_color_copy, gdk_color_free): New prototypes.
* gdk/gdk.c (gdk_color_copy, gdk_color_free): New functions.
Sun Jun 7 09:36:04 1998 Tim Janik <timj@gtk.org>
Sun Jun 7 10:53:02 1998 Tim Janik <timj@gtk.org>
* gtk/gtkitemfactory.h:
* gtk/gtkitemfactory.c: further additions to fit the gimp's code.
additions to the dumping code to feature GtkPatternSpec.
even found a bug to fix in the original code ;)
Sun Jun 7 09:36:04 1998 Tim Janik <timj@gtk.org>
* gtk/gtkitemfactory.c: support different types of callbacks, to
maintain existing code.
......
......@@ -3,9 +3,15 @@
* gdk/gdk.h (gdk_color_copy, gdk_color_free): New prototypes.
* gdk/gdk.c (gdk_color_copy, gdk_color_free): New functions.
Sun Jun 7 09:36:04 1998 Tim Janik <timj@gtk.org>
Sun Jun 7 10:53:02 1998 Tim Janik <timj@gtk.org>
* gtk/gtkitemfactory.h:
* gtk/gtkitemfactory.c: further additions to fit the gimp's code.
additions to the dumping code to feature GtkPatternSpec.
even found a bug to fix in the original code ;)
Sun Jun 7 09:36:04 1998 Tim Janik <timj@gtk.org>
* gtk/gtkitemfactory.c: support different types of callbacks, to
maintain existing code.
......
......@@ -3,9 +3,15 @@
* gdk/gdk.h (gdk_color_copy, gdk_color_free): New prototypes.
* gdk/gdk.c (gdk_color_copy, gdk_color_free): New functions.
Sun Jun 7 09:36:04 1998 Tim Janik <timj@gtk.org>
Sun Jun 7 10:53:02 1998 Tim Janik <timj@gtk.org>
* gtk/gtkitemfactory.h:
* gtk/gtkitemfactory.c: further additions to fit the gimp's code.
additions to the dumping code to feature GtkPatternSpec.
even found a bug to fix in the original code ;)
Sun Jun 7 09:36:04 1998 Tim Janik <timj@gtk.org>
* gtk/gtkitemfactory.c: support different types of callbacks, to
maintain existing code.
......
......@@ -3,9 +3,15 @@
* gdk/gdk.h (gdk_color_copy, gdk_color_free): New prototypes.
* gdk/gdk.c (gdk_color_copy, gdk_color_free): New functions.
Sun Jun 7 09:36:04 1998 Tim Janik <timj@gtk.org>
Sun Jun 7 10:53:02 1998 Tim Janik <timj@gtk.org>
* gtk/gtkitemfactory.h:
* gtk/gtkitemfactory.c: further additions to fit the gimp's code.
additions to the dumping code to feature GtkPatternSpec.
even found a bug to fix in the original code ;)
Sun Jun 7 09:36:04 1998 Tim Janik <timj@gtk.org>
* gtk/gtkitemfactory.c: support different types of callbacks, to
maintain existing code.
......
......@@ -3,9 +3,15 @@
* gdk/gdk.h (gdk_color_copy, gdk_color_free): New prototypes.
* gdk/gdk.c (gdk_color_copy, gdk_color_free): New functions.
Sun Jun 7 09:36:04 1998 Tim Janik <timj@gtk.org>
Sun Jun 7 10:53:02 1998 Tim Janik <timj@gtk.org>
* gtk/gtkitemfactory.h:
* gtk/gtkitemfactory.c: further additions to fit the gimp's code.
additions to the dumping code to feature GtkPatternSpec.
even found a bug to fix in the original code ;)
Sun Jun 7 09:36:04 1998 Tim Janik <timj@gtk.org>
* gtk/gtkitemfactory.c: support different types of callbacks, to
maintain existing code.
......
......@@ -28,15 +28,16 @@
#include "gtk/gtkradiomenuitem.h"
#include "gtk/gtkcheckmenuitem.h"
#include "gtk/gtkaccellabel.h"
#include "gdk/gdkprivate.h" /* for gdk_progname */
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
/* --- defines --- */
#define PARENT_DELIMITER ('/')
#define ITEM_FACTORY_STRING ((gchar*) item_factory_string)
#define ITEM_BLOCK_SIZE (128)
......@@ -44,6 +45,7 @@
/* --- structures --- */
typedef struct _GtkIFCBData GtkIFCBData;
typedef struct _GtkIFActionLink GtkIFActionLink;
typedef struct _GtkIFDumpData GtkIFDumpData;
struct _GtkIFCBData
{
GtkItemFactoryCallback func;
......@@ -56,6 +58,13 @@ struct _GtkIFActionLink
GtkWidget *widget;
guint callback_action;
};
struct _GtkIFDumpData
{
GtkPrintFunc print_func;
gpointer func_data;
guint modified_only : 1;
GtkPatternSpec *pspec;
};
/* --- prototypes --- */
......@@ -227,7 +236,7 @@ gtk_item_factory_new (GtkType container_type,
g_return_val_if_fail (path != NULL, NULL);
ifactory = gtk_type_new (gtk_item_factory_get_type ());
ifactory = gtk_type_new (GTK_TYPE_ITEM_FACTORY);
gtk_item_factory_construct (ifactory, container_type, path, accel_group);
return ifactory;
......@@ -405,6 +414,7 @@ gtk_item_factory_add_item (GtkItemFactory *ifactory,
gchar *fpath;
g_return_if_fail (widget != NULL);
g_return_if_fail (item_type != NULL);
class = GTK_ITEM_FACTORY_CLASS (GTK_OBJECT (ifactory)->klass);
......@@ -579,6 +589,39 @@ gtk_item_factory_construct (GtkItemFactory *ifactory,
ifactory->widget);
}
GtkItemFactory*
gtk_item_factory_from_path (const gchar *path)
{
GtkItemFactoryClass *class;
GtkItemFactoryItem *item;
gchar *fname;
guint i;
g_return_val_if_fail (path != NULL, NULL);
g_return_val_if_fail (path[0] == '<', NULL);
class = gtk_type_class (GTK_TYPE_ITEM_FACTORY);
i = 0;
while (path[i] && path[i] != '>')
i++;
if (path[i] != '>')
{
g_warning ("gtk_item_factory_from_path(): invalid factory path \"%s\"",
path);
return NULL;
}
fname = g_new (gchar, i + 2);
g_memmove (fname, path, i + 1);
fname[i + 1] = 0;
item = g_hash_table_lookup (class->item_ht, fname);
if (item && item->widgets)
return gtk_item_factory_from_widget (item->widgets->data);
return NULL;
}
static void
gtk_item_factory_destroy (GtkObject *object)
{
......@@ -647,22 +690,13 @@ gtk_item_factory_path_from_widget (GtkWidget *widget)
return gtk_object_get_data_by_id (GTK_OBJECT (widget), key_id_item_factory_path);
}
typedef struct
{
GtkPrintFunc print_func;
gpointer func_data;
guint modified_only : 1;
guint path_length;
const gchar *path;
} DumpLimiterData;
static void
gtk_item_factory_foreach (gpointer hash_key,
gpointer value,
gpointer user_data)
{
GtkItemFactoryItem *item;
DumpLimiterData *data;
GtkIFDumpData *data;
gchar *string;
gchar *name;
gchar comment_prefix[2] = "\000\000";
......@@ -670,8 +704,7 @@ gtk_item_factory_foreach (gpointer hash_key,
item = value;
data = user_data;
if ((data->path && strncmp (item->path, data->path, data->path_length)) ||
(data->modified_only && !item->modified))
if (data->pspec && !gtk_pattern_match_string (data->pspec, item->path))
return;
comment_prefix[0] = gtk_item_factory_class->cpair_comment_single[0];
......@@ -692,12 +725,12 @@ gtk_item_factory_foreach (gpointer hash_key,
}
void
gtk_item_factory_dump_rc (const gchar *ifactory_path,
gboolean modified_only,
GtkPrintFunc print_func,
gpointer func_data)
gtk_item_factory_dump_items (GtkPatternSpec *path_pspec,
gboolean modified_only,
GtkPrintFunc print_func,
gpointer func_data)
{
DumpLimiterData data;
GtkIFDumpData data;
g_return_if_fail (print_func != NULL);
......@@ -707,12 +740,52 @@ gtk_item_factory_dump_rc (const gchar *ifactory_path,
data.print_func = print_func;
data.func_data = func_data;
data.modified_only = (modified_only != FALSE);
data.path_length = ifactory_path ? strlen (ifactory_path) : 0;
data.path = ifactory_path;
data.pspec = path_pspec;
g_hash_table_foreach (gtk_item_factory_class->item_ht, gtk_item_factory_foreach, &data);
}
void
gtk_item_factory_print_func (gpointer FILE_pointer,
gchar *string)
{
FILE *f_out = FILE_pointer;
g_return_if_fail (FILE_pointer != NULL);
g_return_if_fail (string != NULL);
fputs (string, f_out);
fputc ('\n', f_out);
}
void
gtk_item_factory_dump_rc (const gchar *file_name,
GtkPatternSpec *path_pspec,
gboolean modified_only)
{
FILE *f_out;
g_return_if_fail (file_name != NULL);
f_out = fopen (file_name, "w");
if (!f_out)
return;
fputs ("; ", f_out);
if (gdk_progname)
fputs (gdk_progname, f_out);
fputs (" GtkItemFactory rc-file -*- scheme -*-\n", f_out);
fputs ("; this file is an automated menu-path dump\n", f_out);
fputs (";\n", f_out);
gtk_item_factory_dump_items (path_pspec,
modified_only,
gtk_item_factory_print_func,
f_out);
fclose (f_out);
}
void
gtk_item_factory_create_items (GtkItemFactory *ifactory,
guint n_entries,
......@@ -750,7 +823,6 @@ gtk_item_factory_get_widget (GtkItemFactory *ifactory,
{
GtkItemFactoryClass *class;
GtkItemFactoryItem *item;
gchar *fpath;
g_return_val_if_fail (ifactory != NULL, NULL);
g_return_val_if_fail (GTK_IS_ITEM_FACTORY (ifactory), NULL);
......@@ -758,9 +830,16 @@ gtk_item_factory_get_widget (GtkItemFactory *ifactory,
class = GTK_ITEM_FACTORY_CLASS (GTK_OBJECT (ifactory)->klass);
fpath = g_strconcat (ifactory->path, path, NULL);
item = g_hash_table_lookup (class->item_ht, fpath);
g_free (fpath);
if (path[0] == '<')
item = g_hash_table_lookup (class->item_ht, (gpointer) path);
else
{
gchar *fpath;
fpath = g_strconcat (ifactory->path, path, NULL);
item = g_hash_table_lookup (class->item_ht, fpath);
g_free (fpath);
}
if (item)
{
......@@ -811,19 +890,26 @@ gtk_item_factory_create_item (GtkItemFactory *ifactory,
gchar *p;
guint type_id;
GtkType type;
gchar *item_type_path;
g_return_if_fail (ifactory != NULL);
g_return_if_fail (GTK_IS_ITEM_FACTORY (ifactory));
g_return_if_fail (entry != NULL);
g_return_if_fail (entry->path != NULL);
g_return_if_fail (entry->path[0] == PARENT_DELIMITER);
g_return_if_fail (entry->path[0] == '/');
g_return_if_fail (callback_type >= 1 && callback_type <= 2);
if (!entry->item_type ||
entry->item_type == 0)
type_id = key_id_type_item;
entry->item_type[0] == 0)
{
item_type_path = (gpointer) key_type_item;
type_id = key_id_type_item;
}
else
type_id = gtk_object_data_try_key (entry->item_type);
{
item_type_path = entry->item_type;
type_id = gtk_object_data_try_key (item_type_path);
}
radio_group = NULL;
if (type_id == key_id_type_item)
......@@ -846,7 +932,7 @@ gtk_item_factory_create_item (GtkItemFactory *ifactory,
{
GtkWidget *radio_link;
radio_link = gtk_item_factory_get_widget (ifactory, entry->item_type);
radio_link = gtk_item_factory_get_widget (ifactory, item_type_path);
if (radio_link && GTK_IS_RADIO_MENU_ITEM (radio_link))
{
type = gtk_radio_menu_item_get_type ();
......@@ -856,13 +942,13 @@ gtk_item_factory_create_item (GtkItemFactory *ifactory,
{
g_warning ("GtkItemFactory: entry path `%s' has invalid type `%s'",
entry->path,
entry->item_type);
item_type_path);
return;
}
}
parent_path = g_strdup (entry->path);
p = strrchr (parent_path, PARENT_DELIMITER);
p = strrchr (parent_path, '/');
if (!p)
{
g_warning ("GtkItemFactory: invalid entry path `%s'", entry->path);
......@@ -889,7 +975,7 @@ gtk_item_factory_create_item (GtkItemFactory *ifactory,
g_return_if_fail (parent != NULL);
p = strrchr (entry->path, PARENT_DELIMITER);
p = strrchr (entry->path, '/');
p++;
widget = gtk_widget_new (type,
......@@ -934,27 +1020,81 @@ gtk_item_factory_create_item (GtkItemFactory *ifactory,
entry->path, entry->accelerator,
entry->callback, entry->callback_action, callback_data,
callback_type,
entry->item_type,
item_type_path,
widget);
}
void
gtk_item_factory_path_delete (const gchar *ifactory_path,
const gchar *path)
gtk_item_factory_create_menu_entries (guint n_entries,
GtkMenuEntry *entries)
{
static GtkPatternSpec pspec = { 42, 0 };
guint i;
if (!n_entries)
return;
g_return_if_fail (entries != NULL);
if (pspec.pattern_length == 0)
gtk_pattern_spec_init (&pspec, "*<separator>*");
for (i = 0; i < n_entries; i++)
{
GtkItemFactory *ifactory;
GtkItemFactoryEntry entry;
gchar *path;
path = entries[i].path;
ifactory = gtk_item_factory_from_path (path);
if (!ifactory)
{
g_warning ("gtk_item_factory_create_menu_entries(): "
"entry[%u] refers to unknown item factory: \"%s\"",
i, entries[i].path);
continue;
}
while (*path != '>')
path++;
path++;
entry.path = path;
entry.accelerator = entries[i].accelerator;
entry.callback = entries[i].callback;
entry.callback_action = 0;
entry.item_type = (gtk_pattern_match_string (&pspec, path) ?
(gpointer) key_type_separator_item :
NULL);
gtk_item_factory_create_item (ifactory, &entry, entries[i].callback_data, 2);
entries[i].widget = gtk_item_factory_get_widget (ifactory, entries[i].path);
}
}
void
gtk_item_factories_path_delete (const gchar *ifactory_path,
const gchar *path)
{
GtkItemFactoryClass *class;
GtkItemFactoryItem *item;
gchar *fpath;
g_return_if_fail (ifactory_path != NULL);
g_return_if_fail (path != NULL);
class = gtk_type_class (GTK_TYPE_ITEM_FACTORY);
fpath = g_strconcat (ifactory_path, path, NULL);
item = g_hash_table_lookup (class->item_ht, fpath);
g_free (fpath);
if (path[0] == '<')
item = g_hash_table_lookup (class->item_ht, (gpointer) path);
else
{
gchar *fpath;
g_return_if_fail (ifactory_path != NULL);
fpath = g_strconcat (ifactory_path, path, NULL);
item = g_hash_table_lookup (class->item_ht, fpath);
g_free (fpath);
}
if (item)
{
GSList *widget_list;
......
......@@ -24,6 +24,9 @@
#include <gtk/gtkwidget.h>
#include <gtk/gtkmenufactory.h> /* for GtkMenuEntry */
#include <gtk/gtkbindings.h> /* for GtkPatternSpec */
#ifdef __cplusplus
extern "C" {
......@@ -136,13 +139,19 @@ GtkWidget* gtk_item_factory_get_widget (GtkItemFactory *ifactory,
GtkWidget* gtk_item_factory_get_widget_by_action (GtkItemFactory *ifactory,
guint action);
/* If `ifactory_path' is passed as `NULL', this function will iterate over
* all hash entries.
/* If `path_pspec' is passed as `NULL', this function will iterate over
* all hash entries. otherwise only those entries will be dumped for which
* the pattern matches, e.g. "<Image>*...".
*/
void gtk_item_factory_dump_rc (const gchar *ifactory_path,
void gtk_item_factory_dump_items (GtkPatternSpec *path_pspec,
gboolean modified_only,
GtkPrintFunc print_func,
gpointer func_data);
void gtk_item_factory_dump_rc (const gchar *file_name,
GtkPatternSpec *path_pspec,
gboolean modified_only);
void gtk_item_factory_print_func (gpointer FILE_pointer,
gchar *string);
void gtk_item_factory_create_item (GtkItemFactory *ifactory,
GtkItemFactoryEntry *entry,
gpointer callback_data,
......@@ -156,8 +165,6 @@ void gtk_item_factory_create_items_ac(GtkItemFactory *ifactory,
GtkItemFactoryEntry *entries,
gpointer callback_data,
guint callback_type);
void gtk_item_factory_path_delete (const gchar *ifactory_path,
const gchar *path);
void gtk_item_factory_delete_item (GtkItemFactory *ifactory,
const gchar *path);
void gtk_item_factory_delete_entry (GtkItemFactory *ifactory,
......@@ -179,8 +186,15 @@ void gtk_item_factory_popup_with_data(GtkItemFactory *ifactory,
guint32 time);
gpointer gtk_item_factory_popup_data (GtkItemFactory *ifactory);
gpointer gtk_item_factory_popup_data_from_widget (GtkWidget *widget);
/* Compatibility functions for ol GtkMenuFactory code
*/
GtkItemFactory* gtk_item_factory_from_path (const gchar *path);
void gtk_item_factory_create_menu_entries (guint n_entries,
GtkMenuEntry *entries);
void gtk_item_factories_path_delete (const gchar *ifactory_path,
const gchar *path);
......
......@@ -38,10 +38,10 @@ static gint gtk_menu_bar_expose (GtkWidget *widget,
GdkEventExpose *event);
guint
GtkType
gtk_menu_bar_get_type (void)
{
static guint menu_bar_type = 0;
static GtkType menu_bar_type = 0;
if (!menu_bar_type)
{
......
......@@ -26,12 +26,14 @@
#ifdef __cplusplus
extern "C" {
#pragma }
#endif /* __cplusplus */
#define GTK_MENU_BAR(obj) GTK_CHECK_CAST (obj, gtk_menu_bar_get_type (), GtkMenuBar)
#define GTK_MENU_BAR_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, gtk_menu_bar_get_type (), GtkMenuBarClass)
#define GTK_IS_MENU_BAR(obj) GTK_CHECK_TYPE (obj, gtk_menu_bar_get_type ())
#define GTK_TYPE_MENU_BAR (gtk_menu_bar_get_type ())
#define GTK_MENU_BAR(obj) (GTK_CHECK_CAST ((obj), GTK_TYPE_MENU_BAR, GtkMenuBar))
#define GTK_MENU_BAR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GTK_TYPE_MENU_BAR, GtkMenuBarClass))
#define GTK_IS_MENU_BAR(obj) (GTK_CHECK_TYPE ((obj), GTK_TYPE_MENU_BAR))
#define GTK_IS_MENU_BAR_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GTK_TYPE_MENU_BAR))
typedef struct _GtkMenuBar GtkMenuBar;
......@@ -48,7 +50,7 @@ struct _GtkMenuBarClass
};
guint gtk_menu_bar_get_type (void);
GtkType gtk_menu_bar_get_type (void);
GtkWidget* gtk_menu_bar_new (void);
void gtk_menu_bar_append (GtkMenuBar *menu_bar,
GtkWidget *child);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment