I need to be able to act on labels texts, lists contents, buttons
states... on external events.  There is no way for now to access the
required widgets, so I added one.

The patch adds a "Visibility" C property which can either "static" or
"extern".  "static" is the good old way.  "extern" adds a
  extern GtkWidget *blah;

in the interface.h file, and a
  GtkWidget *blah;

in the interface.c file.

  OG.

diff -ru glade-0.5.7/glade/gbsource.c glade-new/glade/gbsource.c
--- glade-0.5.7/glade/gbsource.c        Sun Nov 14 18:01:40 1999
+++ glade-new/glade/gbsource.c  Thu Apr 27 02:20:57 2000
@@ -210,11 +210,15 @@
 
   /* FIXME: unfinished. public fields were to be added to the component struct.
      Private fields would just be declared within the creation function. */
-  if (wdata->public_field)
+  if (data->use_component_struct && wdata->public_field)
     source_add_decl (data, "  GtkWidget *%s;\n", data->real_wname);
-  else
+  else if(wdata->c_visibility == 0)
     source_add_decl (data, "  GtkWidget *%s;\n", data->real_wname);
-
+  else
+    {
+      source_add_src_globals (data, "GtkWidget *%s;\n", data->real_wname);
+      source_add_hdr_globals (data, "extern GtkWidget *%s;\n", data->real_wname);
+    }
   if (data->set_widget_names)
     source_add (data, "  gtk_widget_set_name (%s, \"%s\");\n", data->wname,
                data->real_wname);
diff -ru glade-0.5.7/glade/gbsource.h glade-new/glade/gbsource.h
--- glade-0.5.7/glade/gbsource.h        Sun Oct 10 16:24:06 1999
+++ glade-new/glade/gbsource.h  Thu Apr 27 02:14:50 2000
@@ -23,28 +23,27 @@
 #endif /* __cplusplus */
 
 
-/* These identify each of the source code buffers. New buffers can easily be
-   added by increasing GLADE_NUM_SOURCE_BUFFERS and adding an id here. */
-#define GLADE_NUM_SOURCE_BUFFERS 7
+/* These identify each of the source code buffers. New buffers can easily by
+   adding an id here. */
 typedef enum
 {
-  GLADE_UIINFO                = 0,     /* GnomeUIInfo structs, which are
-                                          output before the function as
-                                          static structs. */
-  GLADE_DECLARATIONS          = 1,     /* The declarations of the widgets
-                                          and temporary variables in the
-                                          function to create a component. */
-  GLADE_SOURCE                = 2,     /* The main code which creates the
-                                          widgets in a component. */
-  GLADE_SIGNAL_CONNECTIONS    = 3,     /* Code to connect signal handlers. */
-  GLADE_ACCELERATORS          = 4,     /* Code to setup accelerator keys, used
-                                          when the target widget is different
-                                          from the source (i.e. the label). */
+  GLADE_SOURCE_GLOBALS,                /* Global structs and declarations in the .c 
+file. */
+  GLADE_HEADER_GLOBALS,                /* Global structs and declarations in the .h 
+file. */
+  GLADE_DECLARATIONS,          /* The declarations of the widgets
+                                  and temporary variables in the
+                                  function to create a component. */
+  GLADE_SOURCE,                        /* The main code which creates the
+                                  widgets in a component. */
+  GLADE_SIGNAL_CONNECTIONS,    /* Code to connect signal handlers. */
+  GLADE_ACCELERATORS,          /* Code to setup accelerator keys, used
+                                  when the target widget is different
+                                  from the source (i.e. the label). */
 
-  GLADE_CALLBACK_DECLARATIONS = 5,     /* Declarations of signal handler
-                                          functions and callbacks. */
-  GLADE_CALLBACK_SOURCE       = 6      /* Source code of signal handlers or
-                                          callbacks. */
+  GLADE_CALLBACK_DECLARATIONS, /* Declarations of signal handler
+                                  functions and callbacks. */
+  GLADE_CALLBACK_SOURCE,       /* Source code of signal handlers or
+                                  callbacks. */
+  GLADE_NUM_SOURCE_BUFFERS
 } GladeSourceBuffer;
 
 
diff -ru glade-0.5.7/glade/gbwidget.c glade-new/glade/gbwidget.c
--- glade-0.5.7/glade/gbwidget.c        Thu Feb  3 07:41:44 2000
+++ glade-new/glade/gbwidget.c  Thu Apr 27 01:22:30 2000
@@ -463,6 +463,7 @@
   /* C options. */
   widget_data->source_file = NULL;
   widget_data->public_field = 1;
+  widget_data->c_visibility = 0;
 
   /* C++ options. */
   widget_data->cxx_separate_file = 0;
@@ -2986,6 +2987,13 @@
     gb_widget_output_filename (data, GbCSourceFile, wdata->source_file);
   if (action != GB_SAVING || wdata->public_field == 0)
     gb_widget_output_bool (data, GbCPublic, wdata->public_field);
+  if (action != GB_SAVING || wdata->c_visibility != 0)
+    for (i = 0; GbCVisibilityChoices[i]; i++)
+       {
+         if (GbCVisibilityValues[i] == wdata->c_visibility)
+           gb_widget_output_choice (data, GbCVisibility, i,
+                                    GbCVisibilitySymbols[i]);
+       }
   if (data->action == GB_SHOWING)
     {
       /* We only want the source file set for toplevel widgets. */
@@ -3019,6 +3027,7 @@
   GbWidgetData *wdata = data->widget_data;
   gchar *filename;
   gboolean public_field;
+  gchar *c_visibility;
   gboolean cxx_separate_file, cxx_use_heap, cxx_separate_class;
   gchar *cxx_visibility;
 
@@ -3032,6 +3041,19 @@
   public_field = gb_widget_input_bool (data, GbCPublic);
   if (data->apply)
     wdata->public_field = public_field ? 1 : 0;
+  c_visibility = gb_widget_input_choice (data, GbCVisibility);
+  if (data->apply)
+       { guint i;
+         for (i = 0; GbCVisibilityChoices[i]; i++)
+           {
+             if (!strcmp (c_visibility, GbCVisibilityChoices[i])
+                 || !strcmp (c_visibility, GbCVisibilitySymbols[i]))
+               {
+                 wdata->c_visibility = GbCVisibilityValues[i];
+                 break;
+               }
+           }
+       }
 
   /* C++ options. */
   cxx_separate_file = gb_widget_input_bool (data, GbCxxSeparateFile);
diff -ru glade-0.5.7/glade/gbwidget.h glade-new/glade/gbwidget.h
--- glade-0.5.7/glade/gbwidget.h        Sat Nov  6 08:16:16 1999
+++ glade-new/glade/gbwidget.h  Wed Apr 26 23:07:30 2000
@@ -96,6 +96,7 @@
   /* C options. */
   gchar                *source_file;
   guint                 public_field : 1;
+  guint                 c_visibility : 1;
 
   /* C++ options. */
   guint                 cxx_separate_file : 1;
diff -ru glade-0.5.7/glade/property.c glade-new/glade/property.c
--- glade-0.5.7/glade/property.c        Sun Jan 23 16:53:58 2000
+++ glade-new/glade/property.c  Thu Apr 27 01:17:22 2000
@@ -61,6 +61,19 @@
 /* C-specific properties. */
 const gchar *GbCSourceFile = "GtkWidget::c_source_file";
 const gchar *GbCPublic = "GtkWidget::c_public";
+const gchar *GbCVisibility = "GtkWidget::c_visibility";
+
+/* C visibility choices data */
+const gchar *GbCVisibilityChoices[] =
+{N_("static"), N_("extern"), NULL};
+const gint GbCVisibilityValues[] =
+{ 0, 1
+};
+const gchar *GbCVisibilitySymbols[] =
+{
+  "static",
+  "extern"
+};
 
 /* C++-specific properties. */
 const gchar *GbCxxSeparateFile = "GtkWidget::cxx_separate_file";
@@ -68,7 +81,7 @@
 const gchar *GbCxxSeparateClass = "GtkWidget::cxx_separate_class";
 const gchar *GbCxxVisibility = "GtkWidget::cxx_visibility";
 
-/* Visibility choices data */
+/* C++ visibility choices data */
 const gchar *GbCxxVisibilityChoices[] =
 {N_("private"), N_("protected"), N_("public"), NULL};
 const gint GbCxxVisibilityValues[] =
@@ -863,6 +876,9 @@
                         _("The file to write source code into"));
   property_add_bool (GbCPublic, _("Public:"),
                     _("If the widget is added to the component's data structure"));
+  property_add_choice (GbCVisibility, _("Visibility:"),
+                      _("Visibility of widgets. Extern widgets are accessible as 
+global variables."),
+                      GbCVisibilityChoices);
 
   /* Create table for C++-specific properties. */
   table = gtk_table_new (3, 3, FALSE);
@@ -969,7 +985,7 @@
       if (lang_specific_properties[i])
        {
          /* FIXME: show the C language properties when we support them. */
-         if (i == language && i != GLADE_LANGUAGE_C)
+         if (i == language)
            gtk_widget_show (lang_specific_properties[i]);
          else
            gtk_widget_hide (lang_specific_properties[i]);
Only in glade-new/glade: property.c~
diff -ru glade-0.5.7/glade/property.h glade-new/glade/property.h
--- glade-0.5.7/glade/property.h        Thu Sep 23 09:34:45 1999
+++ glade-new/glade/property.h  Wed Apr 26 23:12:37 2000
@@ -67,6 +67,11 @@
 /* C-specific properties. */
 extern const gchar*    GbCSourceFile;
 extern const gchar*    GbCPublic;
+extern const gchar*    GbCVisibility;
+
+extern const gchar*    GbCVisibilityChoices[];
+extern const gint      GbCVisibilityValues[];
+extern const gchar*    GbCVisibilitySymbols[];
 
 /* C++-specific properties. */
 extern const gchar*    GbCxxSeparateFile;
diff -ru glade-0.5.7/glade/source.c glade-new/glade/source.c
--- glade-0.5.7/glade/source.c  Sat Feb 19 10:28:51 2000
+++ glade-new/glade/source.c    Thu Apr 27 02:15:37 2000
@@ -488,6 +488,9 @@
    * Output interface.h
    */
 
+  /* Output any global structs/declarations. */
+  fprintf (interface_h_fp, "%s", data->source_buffers[GLADE_HEADER_GLOBALS]->str);
+
   /* Output the declaration of the function to create the component in the
      header file. */
   fprintf (interface_h_fp, "GtkWidget* create_%s (void);\n",
@@ -498,8 +501,8 @@
    * Output interface.c
    */
 
-  /* Output any GnomeUIInfo structs. */
-  fprintf (interface_c_fp, "%s", data->source_buffers[GLADE_UIINFO]->str);
+  /* Output any global structs/declarations. */
+  fprintf (interface_c_fp, "%s", data->source_buffers[GLADE_SOURCE_GLOBALS]->str);
 
   fprintf (interface_c_fp,
           "GtkWidget*\n"
@@ -2506,7 +2509,7 @@
 }
 
 
-/* Convenience functions to add to the 2 main source buffers, containing
+/* Convenience functions to add to the 3 main source buffers, containing
    the code which creates the widgets and the declarations of the widgets. */
 void
 source_add (GbWidgetWriteSourceData * data, const gchar * fmt, ...)
@@ -2526,6 +2529,28 @@
 
   va_start (args, fmt);
   source_add_to_buffer_v (data, GLADE_DECLARATIONS, fmt, args);
+  va_end (args);
+}
+
+
+void
+source_add_src_globals (GbWidgetWriteSourceData * data, const gchar * fmt, ...)
+{
+  va_list args;
+
+  va_start (args, fmt);
+  source_add_to_buffer_v (data, GLADE_SOURCE_GLOBALS, fmt, args);
+  va_end (args);
+}
+
+
+void
+source_add_hdr_globals (GbWidgetWriteSourceData * data, const gchar * fmt, ...)
+{
+  va_list args;
+
+  va_start (args, fmt);
+  source_add_to_buffer_v (data, GLADE_HEADER_GLOBALS, fmt, args);
   va_end (args);
 }
 
diff -ru glade-0.5.7/glade/source.h glade-new/glade/source.h
--- glade-0.5.7/glade/source.h  Wed Sep  1 09:50:34 1999
+++ glade-new/glade/source.h    Thu Apr 27 02:15:05 2000
@@ -45,12 +45,18 @@
                                         const gchar             *fmt,
                                         va_list                  args);
 
-/* Convenience functions to add to the 2 main source buffers, containing
+/* Convenience functions to add to the 4 main source buffers, containing
    the code which creates the widgets and the declarations of the widgets. */
 void           source_add              (GbWidgetWriteSourceData *data,
                                         const gchar             *fmt,
                                         ...) G_GNUC_PRINTF (2, 3);
 void           source_add_decl         (GbWidgetWriteSourceData *data,
+                                        const gchar             *fmt,
+                                        ...) G_GNUC_PRINTF (2, 3);
+void           source_add_src_globals  (GbWidgetWriteSourceData *data,
+                                        const gchar             *fmt,
+                                        ...) G_GNUC_PRINTF (2, 3);
+void           source_add_hdr_globals  (GbWidgetWriteSourceData *data,
                                         const gchar             *fmt,
                                         ...) G_GNUC_PRINTF (2, 3);
 

Reply via email to