summaryrefslogtreecommitdiff
path: root/tools/glade/examples/editor/src
diff options
context:
space:
mode:
Diffstat (limited to 'tools/glade/examples/editor/src')
-rw-r--r--tools/glade/examples/editor/src/Makefile.am17
-rw-r--r--tools/glade/examples/editor/src/callbacks.c670
-rw-r--r--tools/glade/examples/editor/src/callbacks.h116
-rw-r--r--tools/glade/examples/editor/src/interface.c456
-rw-r--r--tools/glade/examples/editor/src/interface.h9
-rw-r--r--tools/glade/examples/editor/src/main.c56
-rw-r--r--tools/glade/examples/editor/src/support.c144
-rw-r--r--tools/glade/examples/editor/src/support.h67
8 files changed, 1535 insertions, 0 deletions
diff --git a/tools/glade/examples/editor/src/Makefile.am b/tools/glade/examples/editor/src/Makefile.am
new file mode 100644
index 00000000..d9ab60b1
--- /dev/null
+++ b/tools/glade/examples/editor/src/Makefile.am
@@ -0,0 +1,17 @@
+## Process this file with automake to produce Makefile.in
+
+INCLUDES = \
+ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \
+ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \
+ @PACKAGE_CFLAGS@
+
+bin_PROGRAMS = glade-editor
+
+glade_editor_SOURCES = \
+ main.c \
+ support.c support.h \
+ interface.c interface.h \
+ callbacks.c callbacks.h
+
+glade_editor_LDADD = @PACKAGE_LIBS@ $(INTLLIBS)
+
diff --git a/tools/glade/examples/editor/src/callbacks.c b/tools/glade/examples/editor/src/callbacks.c
new file mode 100644
index 00000000..bb653be2
--- /dev/null
+++ b/tools/glade/examples/editor/src/callbacks.c
@@ -0,0 +1,670 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <gtk/gtk.h>
+
+#include "callbacks.h"
+#include "interface.h"
+#include "support.h"
+
+
+/* We create the dialog boxes once and keep pointers to them in static
+ variables so we can reuse them. */
+static GtkWidget *open_filesel = NULL;
+static GtkWidget *save_filesel = NULL;
+static GtkWidget *fontsel = NULL;
+
+/* This is the filename of the file currently being edited, in on-disk
+ encoding (which may be UTF-8 or the locale's encoding). */
+static gchar *current_filename = NULL;
+
+/* This flag is set to TRUE if the file has been changed. We don't actually
+ use it here, but the program could be extended to prompt to save changes. */
+static gboolean file_changed = FALSE;
+
+/* A key used to store pointers to the main window. */
+static const gchar *MainWindowKey = "MainWindowKey";
+
+/* The size of chunks to read in when opening files. */
+#define BUFFER_SIZE 8192
+
+
+/* Static functions. */
+static void new_file (GtkWidget *main_window);
+static void open_file (GtkWidget *main_window);
+static void save_as (GtkWidget *main_window);
+
+static void real_open_file (GtkWidget *main_window,
+ const gchar *filename);
+static void real_save_file (GtkWidget *main_window,
+ const gchar *filename);
+
+
+/***************************************************************************
+ * Main Window Signals.
+ ***************************************************************************/
+
+/* This is called when the main window gets a "delete_event" signal, which
+ typically happens when the user clicks on the close icon on the window's
+ title bar. If we didn't handle this, the window would be destroyed but
+ our application would not exit. */
+gboolean
+on_main_window_delete_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data)
+{
+ exit (0);
+
+ /* Shouldn't reach here, but we add it to stop compiler warnings. */
+ return FALSE;
+}
+
+
+/***************************************************************************
+ * File Menu Commands.
+ ***************************************************************************/
+void
+on_New_activate (GtkMenuItem *menuitem,
+ gpointer user_data)
+{
+ GtkWidget *main_window;
+
+ /* We use the Glade utility function lookup_widget() to get a pointer to the
+ main window. The first argument is any widget in the window/dialog and
+ the second argument is the name of the widget you want to get. */
+ main_window = lookup_widget (GTK_WIDGET (menuitem), "main_window");
+ new_file (main_window);
+}
+
+
+void
+on_Open_activate (GtkMenuItem *menuitem,
+ gpointer user_data)
+{
+ GtkWidget *main_window;
+
+ main_window = lookup_widget (GTK_WIDGET (menuitem), "main_window");
+ open_file (main_window);
+}
+
+
+void
+on_Save_activate (GtkMenuItem *menuitem,
+ gpointer user_data)
+{
+ GtkWidget *main_window;
+
+ main_window = lookup_widget (GTK_WIDGET (menuitem), "main_window");
+
+ /* If the current document doesn't have a filename yet, we call save_as
+ to show the file selection dialog. */
+ if (current_filename == NULL)
+ save_as (main_window);
+ else
+ real_save_file (main_window, current_filename);
+}
+
+
+void
+on_Save_As_activate (GtkMenuItem *menuitem,
+ gpointer user_data)
+{
+ GtkWidget *main_window;
+
+ main_window = lookup_widget (GTK_WIDGET (menuitem), "main_window");
+ save_as (main_window);
+}
+
+
+void
+on_Exit_activate (GtkMenuItem *menuitem,
+ gpointer user_data)
+{
+ gtk_exit (0);
+}
+
+
+/***************************************************************************
+ * Edit Menu Commands.
+ * The GtkTextView class makes this very easy for us by providing action
+ * signals that perform clipboard functions.
+ ***************************************************************************/
+
+void
+on_Cut_activate (GtkMenuItem *menuitem,
+ gpointer user_data)
+{
+ GtkWidget *text, *statusbar;
+
+ text = lookup_widget (GTK_WIDGET (menuitem), "text1");
+ g_signal_emit_by_name (G_OBJECT (text), "cut_clipboard", NULL);
+
+ statusbar = lookup_widget (GTK_WIDGET (menuitem), "statusbar1");
+ gtk_statusbar_pop (GTK_STATUSBAR (statusbar), 1);
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), 1, "Text cut to clipboard.");
+}
+
+
+void
+on_Copy_activate (GtkMenuItem *menuitem,
+ gpointer user_data)
+{
+ GtkWidget *text, *statusbar;
+
+ text = lookup_widget (GTK_WIDGET (menuitem), "text1");
+ g_signal_emit_by_name (G_OBJECT (text), "copy_clipboard", NULL);
+
+ statusbar = lookup_widget (GTK_WIDGET (menuitem), "statusbar1");
+ gtk_statusbar_pop (GTK_STATUSBAR (statusbar), 1);
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), 1, "Text copied.");
+}
+
+
+void
+on_Paste_activate (GtkMenuItem *menuitem,
+ gpointer user_data)
+{
+ GtkWidget *text, *statusbar;
+
+ text = lookup_widget (GTK_WIDGET (menuitem), "text1");
+ g_signal_emit_by_name (G_OBJECT (text), "paste_clipboard", NULL);
+
+ statusbar = lookup_widget (GTK_WIDGET (menuitem), "statusbar1");
+ gtk_statusbar_pop (GTK_STATUSBAR (statusbar), 1);
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), 1, "Text pasted.");
+}
+
+
+void
+on_Clear_activate (GtkMenuItem *menuitem,
+ gpointer user_data)
+{
+ GtkWidget *text, *statusbar;
+ GtkTextBuffer *buffer;
+
+ text = lookup_widget (GTK_WIDGET (menuitem), "text1");
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
+ gtk_text_buffer_delete_selection (buffer, TRUE, TRUE);
+
+ statusbar = lookup_widget (GTK_WIDGET (menuitem), "statusbar1");
+ gtk_statusbar_pop (GTK_STATUSBAR (statusbar), 1);
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), 1, "Text deleted.");
+}
+
+
+/***************************************************************************
+ * Toolbar Buttons.
+ ***************************************************************************/
+
+void
+on_new_button_clicked (GtkButton *button,
+ gpointer user_data)
+{
+ GtkWidget *main_window;
+
+ main_window = lookup_widget (GTK_WIDGET (button), "main_window");
+ new_file (main_window);
+}
+
+
+void
+on_open_button_clicked (GtkButton *button,
+ gpointer user_data)
+{
+ GtkWidget *main_window;
+
+ main_window = lookup_widget (GTK_WIDGET (button), "main_window");
+ open_file (main_window);
+}
+
+
+void
+on_save_button_clicked (GtkButton *button,
+ gpointer user_data)
+{
+ GtkWidget *main_window;
+
+ main_window = lookup_widget (GTK_WIDGET (button), "main_window");
+
+ if (current_filename == NULL)
+ save_as (main_window);
+ else
+ real_save_file (main_window, current_filename);
+}
+
+
+/***************************************************************************
+ * Font Selection Dialog.
+ ***************************************************************************/
+
+/* This is called when the 'Change Font' command is used. We just need to
+ show the font selection dialog. */
+void
+on_Font_activate (GtkMenuItem *menuitem,
+ gpointer user_data)
+{
+ GtkWidget *main_window;
+
+ main_window = lookup_widget (GTK_WIDGET (menuitem), "main_window");
+ if (!fontsel)
+ {
+ fontsel = create_font_selection ();
+ gtk_object_set_data (GTK_OBJECT (fontsel), MainWindowKey, main_window);
+
+ /* Make sure the dialog doesn't disappear behind the main window. */
+ gtk_window_set_transient_for (GTK_WINDOW (fontsel),
+ GTK_WINDOW (main_window));
+ }
+ gtk_widget_show (fontsel);
+
+ /* We make sure the dialog is visible. */
+ gtk_window_present (GTK_WINDOW (fontsel));
+}
+
+
+gboolean
+on_fontsel_delete_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data)
+{
+ gtk_widget_hide (gtk_widget_get_toplevel (widget));
+ return TRUE;
+}
+
+
+void
+on_fontsel_ok_button_clicked (GtkButton *button,
+ gpointer user_data)
+{
+ GtkWidget *fontsel;
+
+ /* We do the same thing as apply, but we close the dialog after. */
+ on_fontsel_apply_button_clicked (button, NULL);
+ fontsel = gtk_widget_get_toplevel (GTK_WIDGET (button));
+ gtk_widget_hide (fontsel);
+}
+
+
+void
+on_fontsel_cancel_button_clicked (GtkButton *button,
+ gpointer user_data)
+{
+ gtk_widget_hide (gtk_widget_get_toplevel (GTK_WIDGET (button)));
+}
+
+
+void
+on_fontsel_apply_button_clicked (GtkButton *button,
+ gpointer user_data)
+{
+ GtkWidget *fontsel, *main_window, *text, *statusbar;
+ gchar *font_name;
+ PangoFontDescription *font_desc;
+
+ fontsel = gtk_widget_get_toplevel (GTK_WIDGET (button));
+ main_window = gtk_object_get_data (GTK_OBJECT (fontsel), MainWindowKey);
+ text = lookup_widget (main_window, "text1");
+ statusbar = lookup_widget (main_window, "statusbar1");
+
+ font_name = gtk_font_selection_dialog_get_font_name (GTK_FONT_SELECTION_DIALOG (fontsel));
+ font_desc = pango_font_description_from_string (font_name);
+ g_free (font_name);
+
+ /* We copy the current style, and update the font. */
+ gtk_widget_modify_font (text, font_desc);
+ pango_font_description_free (font_desc);
+
+ gtk_statusbar_pop (GTK_STATUSBAR (statusbar), 1);
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), 1, "Font updated.");
+}
+
+
+/***************************************************************************
+ * Open File Selection Dialog.
+ ***************************************************************************/
+
+void
+on_open_filesel_ok_button_clicked (GtkButton *button,
+ gpointer user_data)
+{
+ GtkWidget *filesel, *main_window;
+ const gchar *filename;
+
+ filesel = gtk_widget_get_toplevel (GTK_WIDGET (button));
+ main_window = gtk_object_get_data (GTK_OBJECT (filesel), MainWindowKey);
+ gtk_widget_hide (filesel);
+ filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION (filesel));
+ real_open_file (main_window, filename);
+}
+
+
+void
+on_open_filesel_cancel_button_clicked (GtkButton *button,
+ gpointer user_data)
+{
+ gtk_widget_hide (gtk_widget_get_toplevel (GTK_WIDGET (button)));
+}
+
+
+gboolean
+on_open_filesel_delete_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data)
+{
+ gtk_widget_hide (gtk_widget_get_toplevel (widget));
+ return TRUE;
+}
+
+
+/***************************************************************************
+ * Save File Selection Dialog.
+ ***************************************************************************/
+
+void
+on_save_filesel_ok_button_clicked (GtkButton *button,
+ gpointer user_data)
+{
+ GtkWidget *filesel, *main_window;
+ const gchar *filename;
+
+ filesel = gtk_widget_get_toplevel (GTK_WIDGET (button));
+ main_window = gtk_object_get_data (GTK_OBJECT (filesel), MainWindowKey);
+ gtk_widget_hide (filesel);
+ filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION (filesel));
+ real_save_file (main_window, filename);
+}
+
+
+void
+on_save_filesel_cancel_button_clicked (GtkButton *button,
+ gpointer user_data)
+{
+ gtk_widget_hide (gtk_widget_get_toplevel (GTK_WIDGET (button)));
+}
+
+
+gboolean
+on_save_filesel_delete_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data)
+{
+ gtk_widget_hide (gtk_widget_get_toplevel (widget));
+ return TRUE;
+}
+
+
+/***************************************************************************
+ * About Dialog.
+ ***************************************************************************/
+
+void
+on_About_activate (GtkMenuItem *menuitem,
+ gpointer user_data)
+{
+ static GtkWidget *about = NULL;
+
+ if (about == NULL)
+ {
+ GtkWidget *main_window;
+
+ about = create_about_dialog ();
+ /* set the widget pointer to NULL when the widget is destroyed */
+ g_signal_connect (G_OBJECT (about),
+ "destroy",
+ G_CALLBACK (gtk_widget_destroyed),
+ &about);
+
+ main_window = lookup_widget (GTK_WIDGET (menuitem), "main_window");
+ /* Make sure the dialog doesn't disappear behind the main window. */
+ gtk_window_set_transient_for (GTK_WINDOW (about),
+ GTK_WINDOW (main_window));
+ /* Do not allow user to resize the dialog */
+ gtk_window_set_resizable (GTK_WINDOW (about), FALSE);
+ }
+
+ /* Make sure the dialog is visible. */
+ gtk_window_present (GTK_WINDOW (about));
+}
+
+
+void
+on_about_ok_clicked (GtkButton *button,
+ gpointer user_data)
+{
+ gtk_widget_destroy (gtk_widget_get_toplevel (GTK_WIDGET (button)));
+}
+
+
+/***************************************************************************
+ * Text Widget signals.
+ ***************************************************************************/
+
+/*
+ * Text changed callback. This signal is emitted whenever the text in the
+ * GtkTextView changes. We don't use this at present, but it could be used to
+ * prompt to save changes before opening new files or quitting.
+ */
+void
+on_text_changed (GtkTextBuffer *buffer,
+ gpointer user_data)
+{
+ file_changed = TRUE;
+}
+
+
+/***************************************************************************
+ * Private functions.
+ ***************************************************************************/
+
+/* This sets the window title according to the current filename. */
+void
+set_window_title (GtkWidget *main_window)
+{
+ gchar *title, *filename_utf8 = NULL;
+
+ /* We need to convert the filename to UTF-8. */
+ if (current_filename)
+ filename_utf8 = g_filename_to_utf8 (current_filename, -1, NULL, NULL,
+ NULL);
+
+ title = g_strdup_printf ("Editor: %s\n",
+ filename_utf8 ? g_basename (filename_utf8)
+ : "untitled");
+
+ gtk_window_set_title (GTK_WINDOW (main_window), title);
+ g_free (title);
+ g_free (filename_utf8);
+}
+
+
+/* This creates a new document, by clearing the text widget and setting the
+ current filename to NULL. */
+static void
+new_file (GtkWidget *main_window)
+{
+ GtkWidget *text, *statusbar;
+ GtkTextBuffer *buffer;
+ GtkTextIter start, end;
+
+ text = lookup_widget (GTK_WIDGET (main_window), "text1");
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
+ gtk_text_buffer_get_bounds (buffer, &start, &end);
+ gtk_text_buffer_delete (buffer, &start, &end);
+
+ g_free (current_filename);
+ current_filename = NULL;
+ file_changed = FALSE;
+ set_window_title (main_window);
+
+ statusbar = lookup_widget (main_window, "statusbar1");
+ gtk_statusbar_pop (GTK_STATUSBAR (statusbar), 1);
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), 1, "New file.");
+}
+
+
+/* This shows the file selection dialog to open a file. */
+static void
+open_file (GtkWidget *main_window)
+{
+ /* We use the same file selection widget each time, so first
+ of all we create it if it hasn't already been created. */
+ if (open_filesel == NULL)
+ {
+ open_filesel = create_open_file_selection ();
+ /* Make sure the dialog doesn't disappear behind the main window. */
+ gtk_window_set_transient_for (GTK_WINDOW (open_filesel),
+ GTK_WINDOW (main_window));
+ }
+
+ /* We save a pointer to the main window inside the file selection's
+ data list, so we can get it easily in the callbacks. */
+ gtk_object_set_data (GTK_OBJECT (open_filesel), MainWindowKey, main_window);
+
+ /* We make sure the dialog is visible. */
+ gtk_window_present (GTK_WINDOW (open_filesel));
+}
+
+
+/* This shows the file selection dialog to save a file. */
+static void
+save_as (GtkWidget *main_window)
+{
+ if (save_filesel == NULL)
+ {
+ save_filesel = create_save_file_selection ();
+ /* Make sure the dialog doesn't disappear behind the main window. */
+ gtk_window_set_transient_for (GTK_WINDOW (save_filesel),
+ GTK_WINDOW (main_window));
+ }
+
+ gtk_object_set_data (GTK_OBJECT (save_filesel), MainWindowKey, main_window);
+
+ /* If the current document has a filename we use that as the default. */
+ if (current_filename)
+ gtk_file_selection_set_filename (GTK_FILE_SELECTION (save_filesel),
+ current_filename);
+
+ /* We make sure the dialog is visible. */
+ gtk_window_present (GTK_WINDOW (save_filesel));
+}
+
+
+/* This loads the given file, which is in on-disk encoding (which may not
+ be UTF-8). */
+static void
+real_open_file (GtkWidget *main_window, const gchar *filename)
+{
+ GtkWidget *text, *statusbar;
+ GtkTextBuffer *text_buffer;
+ GtkTextIter start, end;
+ FILE *fp;
+ gchar buffer[BUFFER_SIZE];
+ gint bytes_read;
+
+ text = lookup_widget (main_window, "text1");
+ text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
+ statusbar = lookup_widget (main_window, "statusbar1");
+ gtk_statusbar_pop (GTK_STATUSBAR (statusbar), 1);
+ gtk_text_buffer_get_bounds (text_buffer, &start, &end);
+ gtk_text_buffer_delete (text_buffer, &start, &end);
+ g_free (current_filename);
+ current_filename = NULL;
+ file_changed = FALSE;
+
+ fp = fopen (filename, "r");
+ if (fp == NULL)
+ {
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), 1, "Couldn't open file.");
+ return;
+ }
+
+ for (;;)
+ {
+ bytes_read = fread (buffer, sizeof (gchar), BUFFER_SIZE, fp);
+
+ if (bytes_read > 0)
+ {
+ gtk_text_buffer_get_end_iter (text_buffer, &end);
+ gtk_text_buffer_insert (text_buffer, &end, buffer, bytes_read);
+ }
+
+ if (bytes_read != BUFFER_SIZE && (feof (fp) || ferror (fp)))
+ break;
+ }
+
+ /* If there is an error while loading, we reset everything to a good state.
+ */
+ if (ferror (fp))
+ {
+ fclose (fp);
+ gtk_text_buffer_get_bounds (text_buffer, &start, &end);
+ gtk_text_buffer_delete (text_buffer, &start, &end);
+ set_window_title (main_window);
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), 1, "Error loading file.");
+ return;
+ }
+
+ fclose (fp);
+
+ current_filename = g_strdup (filename);
+ set_window_title (main_window);
+ gtk_statusbar_pop (GTK_STATUSBAR (statusbar), 1);
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), 1, "File opened.");
+}
+
+
+/* This saves the file, which is in on-disk encoding (which may not
+ be UTF-8). */
+static void
+real_save_file (GtkWidget *main_window, const gchar *filename)
+{
+ GtkWidget *text, *statusbar;
+ GtkTextBuffer *text_buffer;
+ GtkTextIter start, end;
+ gchar *data;
+ FILE *fp;
+ gint bytes_written, len;
+
+ if (current_filename == NULL || strcmp (current_filename, filename))
+ {
+ g_free (current_filename);
+ current_filename = g_strdup (filename);
+ set_window_title (main_window);
+ }
+
+ text = lookup_widget (GTK_WIDGET (main_window), "text1");
+ text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
+ statusbar = lookup_widget (main_window, "statusbar1");
+
+ gtk_text_buffer_get_bounds (text_buffer, &start, &end);
+ data = gtk_text_buffer_get_text (text_buffer, &start, &end, TRUE);
+
+ fp = fopen (filename, "w");
+ if (fp == NULL)
+ {
+ g_free (data);
+ return;
+ }
+
+ len = strlen (data);
+ bytes_written = fwrite (data, sizeof (gchar), len, fp);
+ fclose (fp);
+
+ g_free (data);
+
+ gtk_statusbar_pop (GTK_STATUSBAR (statusbar), 1);
+ if (len != bytes_written)
+ {
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), 1, "Error saving file.");
+ return;
+ }
+
+ file_changed = FALSE;
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), 1, "File saved.");
+}
+
diff --git a/tools/glade/examples/editor/src/callbacks.h b/tools/glade/examples/editor/src/callbacks.h
new file mode 100644
index 00000000..9418a3e2
--- /dev/null
+++ b/tools/glade/examples/editor/src/callbacks.h
@@ -0,0 +1,116 @@
+#include <gtk/gtk.h>
+
+
+gboolean
+on_main_window_delete_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data);
+
+void
+on_New_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void
+on_Open_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void
+on_Save_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void
+on_Save_As_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void
+on_Exit_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void
+on_Cut_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void
+on_Copy_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void
+on_Paste_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void
+on_Clear_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void
+on_Font_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void
+on_About_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void
+on_new_button_clicked (GtkButton *button,
+ gpointer user_data);
+
+void
+on_open_button_clicked (GtkButton *button,
+ gpointer user_data);
+
+void
+on_save_button_clicked (GtkButton *button,
+ gpointer user_data);
+
+gboolean
+on_open_filesel_delete_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data);
+
+void
+on_open_filesel_ok_button_clicked (GtkButton *button,
+ gpointer user_data);
+
+void
+on_open_filesel_cancel_button_clicked (GtkButton *button,
+ gpointer user_data);
+
+gboolean
+on_fontsel_delete_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data);
+
+void
+on_fontsel_ok_button_clicked (GtkButton *button,
+ gpointer user_data);
+
+void
+on_fontsel_cancel_button_clicked (GtkButton *button,
+ gpointer user_data);
+
+void
+on_fontsel_apply_button_clicked (GtkButton *button,
+ gpointer user_data);
+
+void
+on_about_ok_clicked (GtkButton *button,
+ gpointer user_data);
+
+gboolean
+on_save_filesel_delete_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data);
+
+void
+on_save_filesel_ok_button_clicked (GtkButton *button,
+ gpointer user_data);
+
+void
+on_save_filesel_cancel_button_clicked (GtkButton *button,
+ gpointer user_data);
+
+void set_window_title (GtkWidget *main_window);
+
+void
+on_text_changed (GtkTextBuffer *buffer,
+ gpointer user_data);
diff --git a/tools/glade/examples/editor/src/interface.c b/tools/glade/examples/editor/src/interface.c
new file mode 100644
index 00000000..c9b50a30
--- /dev/null
+++ b/tools/glade/examples/editor/src/interface.c
@@ -0,0 +1,456 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+
+#include "callbacks.h"
+#include "interface.h"
+#include "support.h"
+
+#define GLADE_HOOKUP_OBJECT(component,widget,name) \
+ g_object_set_data_full (G_OBJECT (component), name, \
+ gtk_widget_ref (widget), (GDestroyNotify) gtk_widget_unref)
+
+#define GLADE_HOOKUP_OBJECT_NO_REF(component,widget,name) \
+ g_object_set_data (G_OBJECT (component), name, widget)
+
+GtkWidget*
+create_main_window (void)
+{
+ GtkWidget *main_window;
+ GtkWidget *vbox1;
+ GtkWidget *handlebox2;
+ GtkWidget *menubar1;
+ GtkWidget *File;
+ GtkWidget *File_menu;
+ GtkWidget *New;
+ GtkWidget *Open;
+ GtkWidget *Save;
+ GtkWidget *Save_As;
+ GtkWidget *separator1;
+ GtkWidget *Exit;
+ GtkWidget *Edit;
+ GtkWidget *Edit_menu;
+ GtkWidget *Cut;
+ GtkWidget *Copy;
+ GtkWidget *Paste;
+ GtkWidget *Clear;
+ GtkWidget *View;
+ GtkWidget *View_menu;
+ GtkWidget *Font;
+ GtkWidget *Help;
+ GtkWidget *Help_menu;
+ GtkWidget *About;
+ GtkWidget *handlebox1;
+ GtkWidget *toolbar1;
+ GtkWidget *button1;
+ GtkWidget *button2;
+ GtkWidget *button3;
+ GtkWidget *scrolledwindow1;
+ GtkWidget *text1;
+ GtkWidget *statusbar1;
+ GtkAccelGroup *accel_group;
+
+ accel_group = gtk_accel_group_new ();
+
+ main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (main_window), _("Glade Text Editor"));
+ gtk_window_set_default_size (GTK_WINDOW (main_window), 600, 450);
+
+ vbox1 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (vbox1);
+ gtk_container_add (GTK_CONTAINER (main_window), vbox1);
+
+ handlebox2 = gtk_handle_box_new ();
+ gtk_widget_show (handlebox2);
+ gtk_box_pack_start (GTK_BOX (vbox1), handlebox2, FALSE, TRUE, 0);
+
+ menubar1 = gtk_menu_bar_new ();
+ gtk_widget_show (menubar1);
+ gtk_container_add (GTK_CONTAINER (handlebox2), menubar1);
+
+ File = gtk_menu_item_new_with_mnemonic (_("_File"));
+ gtk_widget_show (File);
+ gtk_container_add (GTK_CONTAINER (menubar1), File);
+
+ File_menu = gtk_menu_new ();
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (File), File_menu);
+
+ New = gtk_image_menu_item_new_from_stock ("gtk-new", accel_group);
+ gtk_widget_show (New);
+ gtk_container_add (GTK_CONTAINER (File_menu), New);
+
+ Open = gtk_image_menu_item_new_from_stock ("gtk-open", accel_group);
+ gtk_widget_show (Open);
+ gtk_container_add (GTK_CONTAINER (File_menu), Open);
+
+ Save = gtk_image_menu_item_new_from_stock ("gtk-save", accel_group);
+ gtk_widget_show (Save);
+ gtk_container_add (GTK_CONTAINER (File_menu), Save);
+
+ Save_As = gtk_image_menu_item_new_from_stock ("gtk-save-as", accel_group);
+ gtk_widget_show (Save_As);
+ gtk_container_add (GTK_CONTAINER (File_menu), Save_As);
+
+ separator1 = gtk_menu_item_new ();
+ gtk_widget_show (separator1);
+ gtk_container_add (GTK_CONTAINER (File_menu), separator1);
+ gtk_widget_set_sensitive (separator1, FALSE);
+
+ Exit = gtk_image_menu_item_new_from_stock ("gtk-quit", accel_group);
+ gtk_widget_show (Exit);
+ gtk_container_add (GTK_CONTAINER (File_menu), Exit);
+
+ Edit = gtk_menu_item_new_with_mnemonic (_("_Edit"));
+ gtk_widget_show (Edit);
+ gtk_container_add (GTK_CONTAINER (menubar1), Edit);
+
+ Edit_menu = gtk_menu_new ();
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (Edit), Edit_menu);
+
+ Cut = gtk_image_menu_item_new_from_stock ("gtk-cut", accel_group);
+ gtk_widget_show (Cut);
+ gtk_container_add (GTK_CONTAINER (Edit_menu), Cut);
+
+ Copy = gtk_image_menu_item_new_from_stock ("gtk-copy", accel_group);
+ gtk_widget_show (Copy);
+ gtk_container_add (GTK_CONTAINER (Edit_menu), Copy);
+
+ Paste = gtk_image_menu_item_new_from_stock ("gtk-paste", accel_group);
+ gtk_widget_show (Paste);
+ gtk_container_add (GTK_CONTAINER (Edit_menu), Paste);
+
+ Clear = gtk_image_menu_item_new_from_stock ("gtk-delete", accel_group);
+ gtk_widget_show (Clear);
+ gtk_container_add (GTK_CONTAINER (Edit_menu), Clear);
+
+ View = gtk_menu_item_new_with_mnemonic (_("_View"));
+ gtk_widget_show (View);
+ gtk_container_add (GTK_CONTAINER (menubar1), View);
+
+ View_menu = gtk_menu_new ();
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (View), View_menu);
+
+ Font = gtk_menu_item_new_with_mnemonic (_("Change _Font..."));
+ gtk_widget_show (Font);
+ gtk_container_add (GTK_CONTAINER (View_menu), Font);
+
+ Help = gtk_menu_item_new_with_mnemonic (_("_Help"));
+ gtk_widget_show (Help);
+ gtk_container_add (GTK_CONTAINER (menubar1), Help);
+
+ Help_menu = gtk_menu_new ();
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (Help), Help_menu);
+
+ About = gtk_menu_item_new_with_mnemonic (_("_About..."));
+ gtk_widget_show (About);
+ gtk_container_add (GTK_CONTAINER (Help_menu), About);
+
+ handlebox1 = gtk_handle_box_new ();
+ gtk_widget_show (handlebox1);
+ gtk_box_pack_start (GTK_BOX (vbox1), handlebox1, FALSE, TRUE, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (handlebox1), 2);
+
+ toolbar1 = gtk_toolbar_new ();
+ gtk_widget_show (toolbar1);
+ gtk_container_add (GTK_CONTAINER (handlebox1), toolbar1);
+ gtk_toolbar_set_style (GTK_TOOLBAR (toolbar1), GTK_TOOLBAR_BOTH);
+
+ button1 = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar1),
+ "gtk-new",
+ NULL,
+ NULL, NULL, NULL, -1);
+ gtk_widget_show (button1);
+
+ button2 = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar1),
+ "gtk-open",
+ NULL,
+ NULL, NULL, NULL, -1);
+ gtk_widget_show (button2);
+
+ button3 = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar1),
+ "gtk-save",
+ NULL,
+ NULL, NULL, NULL, -1);
+ gtk_widget_show (button3);
+
+ scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
+ gtk_widget_show (scrolledwindow1);
+ gtk_box_pack_start (GTK_BOX (vbox1), scrolledwindow1, TRUE, TRUE, 0);
+ GTK_WIDGET_UNSET_FLAGS (scrolledwindow1, GTK_CAN_FOCUS);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_SHADOW_IN);
+
+ text1 = gtk_text_view_new ();
+ gtk_widget_show (text1);
+ gtk_container_add (GTK_CONTAINER (scrolledwindow1), text1);
+ gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (text1), GTK_WRAP_WORD);
+
+ statusbar1 = gtk_statusbar_new ();
+ gtk_widget_show (statusbar1);
+ gtk_box_pack_start (GTK_BOX (vbox1), statusbar1, FALSE, TRUE, 0);
+
+ g_signal_connect ((gpointer) main_window, "delete_event",
+ G_CALLBACK (on_main_window_delete_event),
+ NULL);
+ g_signal_connect ((gpointer) New, "activate",
+ G_CALLBACK (on_New_activate),
+ NULL);
+ g_signal_connect ((gpointer) Open, "activate",
+ G_CALLBACK (on_Open_activate),
+ NULL);
+ g_signal_connect ((gpointer) Save, "activate",
+ G_CALLBACK (on_Save_activate),
+ NULL);
+ g_signal_connect ((gpointer) Save_As, "activate",
+ G_CALLBACK (on_Save_As_activate),
+ NULL);
+ g_signal_connect ((gpointer) Exit, "activate",
+ G_CALLBACK (on_Exit_activate),
+ NULL);
+ g_signal_connect ((gpointer) Cut, "activate",
+ G_CALLBACK (on_Cut_activate),
+ NULL);
+ g_signal_connect ((gpointer) Copy, "activate",
+ G_CALLBACK (on_Copy_activate),
+ NULL);
+ g_signal_connect ((gpointer) Paste, "activate",
+ G_CALLBACK (on_Paste_activate),
+ NULL);
+ g_signal_connect ((gpointer) Clear, "activate",
+ G_CALLBACK (on_Clear_activate),
+ NULL);
+ g_signal_connect ((gpointer) Font, "activate",
+ G_CALLBACK (on_Font_activate),
+ NULL);
+ g_signal_connect ((gpointer) About, "activate",
+ G_CALLBACK (on_About_activate),
+ NULL);
+ g_signal_connect ((gpointer) button1, "clicked",
+ G_CALLBACK (on_new_button_clicked),
+ NULL);
+ g_signal_connect ((gpointer) button2, "clicked",
+ G_CALLBACK (on_open_button_clicked),
+ NULL);
+ g_signal_connect ((gpointer) button3, "clicked",
+ G_CALLBACK (on_save_button_clicked),
+ NULL);
+
+ /* Store pointers to all widgets, for use by lookup_widget(). */
+ GLADE_HOOKUP_OBJECT_NO_REF (main_window, main_window, "main_window");
+ GLADE_HOOKUP_OBJECT (main_window, vbox1, "vbox1");
+ GLADE_HOOKUP_OBJECT (main_window, handlebox2, "handlebox2");
+ GLADE_HOOKUP_OBJECT (main_window, menubar1, "menubar1");
+ GLADE_HOOKUP_OBJECT (main_window, File, "File");
+ GLADE_HOOKUP_OBJECT (main_window, File_menu, "File_menu");
+ GLADE_HOOKUP_OBJECT (main_window, New, "New");
+ GLADE_HOOKUP_OBJECT (main_window, Open, "Open");
+ GLADE_HOOKUP_OBJECT (main_window, Save, "Save");
+ GLADE_HOOKUP_OBJECT (main_window, Save_As, "Save_As");
+ GLADE_HOOKUP_OBJECT (main_window, separator1, "separator1");
+ GLADE_HOOKUP_OBJECT (main_window, Exit, "Exit");
+ GLADE_HOOKUP_OBJECT (main_window, Edit, "Edit");
+ GLADE_HOOKUP_OBJECT (main_window, Edit_menu, "Edit_menu");
+ GLADE_HOOKUP_OBJECT (main_window, Cut, "Cut");
+ GLADE_HOOKUP_OBJECT (main_window, Copy, "Copy");
+ GLADE_HOOKUP_OBJECT (main_window, Paste, "Paste");
+ GLADE_HOOKUP_OBJECT (main_window, Clear, "Clear");
+ GLADE_HOOKUP_OBJECT (main_window, View, "View");
+ GLADE_HOOKUP_OBJECT (main_window, View_menu, "View_menu");
+ GLADE_HOOKUP_OBJECT (main_window, Font, "Font");
+ GLADE_HOOKUP_OBJECT (main_window, Help, "Help");
+ GLADE_HOOKUP_OBJECT (main_window, Help_menu, "Help_menu");
+ GLADE_HOOKUP_OBJECT (main_window, About, "About");
+ GLADE_HOOKUP_OBJECT (main_window, handlebox1, "handlebox1");
+ GLADE_HOOKUP_OBJECT (main_window, toolbar1, "toolbar1");
+ GLADE_HOOKUP_OBJECT (main_window, button1, "button1");
+ GLADE_HOOKUP_OBJECT (main_window, button2, "button2");
+ GLADE_HOOKUP_OBJECT (main_window, button3, "button3");
+ GLADE_HOOKUP_OBJECT (main_window, scrolledwindow1, "scrolledwindow1");
+ GLADE_HOOKUP_OBJECT (main_window, text1, "text1");
+ GLADE_HOOKUP_OBJECT (main_window, statusbar1, "statusbar1");
+
+ gtk_window_add_accel_group (GTK_WINDOW (main_window), accel_group);
+
+ return main_window;
+}
+
+GtkWidget*
+create_open_file_selection (void)
+{
+ GtkWidget *open_file_selection;
+ GtkWidget *ok_button1;
+ GtkWidget *cancel_button1;
+
+ open_file_selection = gtk_file_selection_new (_("Open File"));
+ gtk_container_set_border_width (GTK_CONTAINER (open_file_selection), 10);
+
+ ok_button1 = GTK_FILE_SELECTION (open_file_selection)->ok_button;
+ gtk_widget_show (ok_button1);
+ GTK_WIDGET_SET_FLAGS (ok_button1, GTK_CAN_DEFAULT);
+
+ cancel_button1 = GTK_FILE_SELECTION (open_file_selection)->cancel_button;
+ gtk_widget_show (cancel_button1);
+ GTK_WIDGET_SET_FLAGS (cancel_button1, GTK_CAN_DEFAULT);
+
+ g_signal_connect ((gpointer) open_file_selection, "delete_event",
+ G_CALLBACK (on_open_filesel_delete_event),
+ NULL);
+ g_signal_connect ((gpointer) ok_button1, "clicked",
+ G_CALLBACK (on_open_filesel_ok_button_clicked),
+ NULL);
+ g_signal_connect ((gpointer) cancel_button1, "clicked",
+ G_CALLBACK (on_open_filesel_cancel_button_clicked),
+ NULL);
+
+ /* Store pointers to all widgets, for use by lookup_widget(). */
+ GLADE_HOOKUP_OBJECT_NO_REF (open_file_selection, open_file_selection, "open_file_selection");
+ GLADE_HOOKUP_OBJECT_NO_REF (open_file_selection, ok_button1, "ok_button1");
+ GLADE_HOOKUP_OBJECT_NO_REF (open_file_selection, cancel_button1, "cancel_button1");
+
+ return open_file_selection;
+}
+
+GtkWidget*
+create_font_selection (void)
+{
+ GtkWidget *font_selection;
+ GtkWidget *ok_button2;
+ GtkWidget *cancel_button2;
+ GtkWidget *apply_button1;
+ GtkWidget *fontselection1;
+
+ font_selection = gtk_font_selection_dialog_new (_("Select Font"));
+ gtk_container_set_border_width (GTK_CONTAINER (font_selection), 4);
+
+ ok_button2 = GTK_FONT_SELECTION_DIALOG (font_selection)->ok_button;
+ gtk_widget_show (ok_button2);
+ GTK_WIDGET_SET_FLAGS (ok_button2, GTK_CAN_DEFAULT);
+
+ cancel_button2 = GTK_FONT_SELECTION_DIALOG (font_selection)->cancel_button;
+ gtk_widget_show (cancel_button2);
+ GTK_WIDGET_SET_FLAGS (cancel_button2, GTK_CAN_DEFAULT);
+
+ apply_button1 = GTK_FONT_SELECTION_DIALOG (font_selection)->apply_button;
+ gtk_widget_show (apply_button1);
+ GTK_WIDGET_SET_FLAGS (apply_button1, GTK_CAN_DEFAULT);
+
+ fontselection1 = GTK_FONT_SELECTION_DIALOG (font_selection)->fontsel;
+ gtk_widget_show (fontselection1);
+ gtk_container_set_border_width (GTK_CONTAINER (fontselection1), 4);
+
+ g_signal_connect ((gpointer) font_selection, "delete_event",
+ G_CALLBACK (on_fontsel_delete_event),
+ NULL);
+ g_signal_connect ((gpointer) ok_button2, "clicked",
+ G_CALLBACK (on_fontsel_ok_button_clicked),
+ NULL);
+ g_signal_connect ((gpointer) cancel_button2, "clicked",
+ G_CALLBACK (on_fontsel_cancel_button_clicked),
+ NULL);
+ g_signal_connect ((gpointer) apply_button1, "clicked",
+ G_CALLBACK (on_fontsel_apply_button_clicked),
+ NULL);
+
+ /* Store pointers to all widgets, for use by lookup_widget(). */
+ GLADE_HOOKUP_OBJECT_NO_REF (font_selection, font_selection, "font_selection");
+ GLADE_HOOKUP_OBJECT_NO_REF (font_selection, ok_button2, "ok_button2");
+ GLADE_HOOKUP_OBJECT_NO_REF (font_selection, cancel_button2, "cancel_button2");
+ GLADE_HOOKUP_OBJECT_NO_REF (font_selection, apply_button1, "apply_button1");
+ GLADE_HOOKUP_OBJECT_NO_REF (font_selection, fontselection1, "fontselection1");
+
+ return font_selection;
+}
+
+GtkWidget*
+create_about_dialog (void)
+{
+ GtkWidget *about_dialog;
+ GtkWidget *dialog_vbox2;
+ GtkWidget *label2;
+ GtkWidget *dialog_action_area2;
+ GtkWidget *button7;
+
+ about_dialog = gtk_dialog_new ();
+ gtk_window_set_title (GTK_WINDOW (about_dialog), _("About The Glade Text Editor"));
+
+ dialog_vbox2 = GTK_DIALOG (about_dialog)->vbox;
+ gtk_widget_show (dialog_vbox2);
+
+ label2 = gtk_label_new (_("The Glade Text Editor\n\nv 1.0\n\n(Example program for Glade)"));
+ gtk_widget_show (label2);
+ gtk_box_pack_start (GTK_BOX (dialog_vbox2), label2, TRUE, TRUE, 10);
+ gtk_misc_set_padding (GTK_MISC (label2), 12, 0);
+
+ dialog_action_area2 = GTK_DIALOG (about_dialog)->action_area;
+ gtk_widget_show (dialog_action_area2);
+ gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area2), GTK_BUTTONBOX_END);
+
+ button7 = gtk_button_new_with_mnemonic (_(" OK "));
+ gtk_widget_show (button7);
+ gtk_dialog_add_action_widget (GTK_DIALOG (about_dialog), button7, 0);
+ GTK_WIDGET_SET_FLAGS (button7, GTK_CAN_DEFAULT);
+
+ g_signal_connect ((gpointer) button7, "clicked",
+ G_CALLBACK (on_about_ok_clicked),
+ NULL);
+
+ /* Store pointers to all widgets, for use by lookup_widget(). */
+ GLADE_HOOKUP_OBJECT_NO_REF (about_dialog, about_dialog, "about_dialog");
+ GLADE_HOOKUP_OBJECT_NO_REF (about_dialog, dialog_vbox2, "dialog_vbox2");
+ GLADE_HOOKUP_OBJECT (about_dialog, label2, "label2");
+ GLADE_HOOKUP_OBJECT_NO_REF (about_dialog, dialog_action_area2, "dialog_action_area2");
+ GLADE_HOOKUP_OBJECT (about_dialog, button7, "button7");
+
+ gtk_widget_grab_default (button7);
+ return about_dialog;
+}
+
+GtkWidget*
+create_save_file_selection (void)
+{
+ GtkWidget *save_file_selection;
+ GtkWidget *ok_button3;
+ GtkWidget *cancel_button3;
+
+ save_file_selection = gtk_file_selection_new (_("Save File"));
+ gtk_container_set_border_width (GTK_CONTAINER (save_file_selection), 10);
+
+ ok_button3 = GTK_FILE_SELECTION (save_file_selection)->ok_button;
+ gtk_widget_show (ok_button3);
+ GTK_WIDGET_SET_FLAGS (ok_button3, GTK_CAN_DEFAULT);
+
+ cancel_button3 = GTK_FILE_SELECTION (save_file_selection)->cancel_button;
+ gtk_widget_show (cancel_button3);
+ GTK_WIDGET_SET_FLAGS (cancel_button3, GTK_CAN_DEFAULT);
+
+ g_signal_connect ((gpointer) save_file_selection, "delete_event",
+ G_CALLBACK (on_save_filesel_delete_event),
+ NULL);
+ g_signal_connect ((gpointer) ok_button3, "clicked",
+ G_CALLBACK (on_save_filesel_ok_button_clicked),
+ NULL);
+ g_signal_connect ((gpointer) cancel_button3, "clicked",
+ G_CALLBACK (on_save_filesel_cancel_button_clicked),
+ NULL);
+
+ /* Store pointers to all widgets, for use by lookup_widget(). */
+ GLADE_HOOKUP_OBJECT_NO_REF (save_file_selection, save_file_selection, "save_file_selection");
+ GLADE_HOOKUP_OBJECT_NO_REF (save_file_selection, ok_button3, "ok_button3");
+ GLADE_HOOKUP_OBJECT_NO_REF (save_file_selection, cancel_button3, "cancel_button3");
+
+ return save_file_selection;
+}
+
diff --git a/tools/glade/examples/editor/src/interface.h b/tools/glade/examples/editor/src/interface.h
new file mode 100644
index 00000000..2b323163
--- /dev/null
+++ b/tools/glade/examples/editor/src/interface.h
@@ -0,0 +1,9 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+GtkWidget* create_main_window (void);
+GtkWidget* create_open_file_selection (void);
+GtkWidget* create_font_selection (void);
+GtkWidget* create_about_dialog (void);
+GtkWidget* create_save_file_selection (void);
diff --git a/tools/glade/examples/editor/src/main.c b/tools/glade/examples/editor/src/main.c
new file mode 100644
index 00000000..d18e0a89
--- /dev/null
+++ b/tools/glade/examples/editor/src/main.c
@@ -0,0 +1,56 @@
+/*
+ * Initial main.c file generated by Glade. Edit as required.
+ * Glade will not overwrite this file.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+
+#include "callbacks.h"
+#include "interface.h"
+#include "support.h"
+
+int
+main (int argc, char *argv[])
+{
+ GtkWidget *main_window, *statusbar, *text;
+ GtkTextBuffer *buffer;
+
+#ifdef ENABLE_NLS
+ bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+ textdomain (GETTEXT_PACKAGE);
+#endif
+
+ gtk_set_locale ();
+ gtk_init (&argc, &argv);
+
+ add_pixmap_directory (PACKAGE_DATA_DIR "/" PACKAGE "/pixmaps");
+
+ main_window = create_main_window ();
+ set_window_title (main_window);
+ gtk_widget_show (main_window);
+
+ /* We use the support function lookup_widget(), which is provided by Glade
+ so you can get a pointer to any widget in a component, simply by passing
+ any widget in the component, and the name of the widget you want.
+ Here we pass the toplevel widget in the component, main_window, and
+ we want to get the status bar widget which is called "statusbar1". */
+ statusbar = lookup_widget (main_window, "statusbar1");
+ gtk_statusbar_push (GTK_STATUSBAR (statusbar), 1,
+ "Welcome to the Glade Text Editor.");
+
+ /* We also need to connect a signal to the GtkTextBuffer, to know when the
+ text has changed. We can't connect the signal in Glade as GtkTextBuffer
+ is not a widget. */
+ text = lookup_widget (main_window, "text1");
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
+ g_signal_connect (buffer, "changed", G_CALLBACK (on_text_changed), NULL);
+
+ gtk_main ();
+ return 0;
+}
+
diff --git a/tools/glade/examples/editor/src/support.c b/tools/glade/examples/editor/src/support.c
new file mode 100644
index 00000000..3f5998d9
--- /dev/null
+++ b/tools/glade/examples/editor/src/support.c
@@ -0,0 +1,144 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <gtk/gtk.h>
+
+#include "support.h"
+
+GtkWidget*
+lookup_widget (GtkWidget *widget,
+ const gchar *widget_name)
+{
+ GtkWidget *parent, *found_widget;
+
+ for (;;)
+ {
+ if (GTK_IS_MENU (widget))
+ parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
+ else
+ parent = widget->parent;
+ if (!parent)
+ parent = g_object_get_data (G_OBJECT (widget), "GladeParentKey");
+ if (parent == NULL)
+ break;
+ widget = parent;
+ }
+
+ found_widget = (GtkWidget*) g_object_get_data (G_OBJECT (widget),
+ widget_name);
+ if (!found_widget)
+ g_warning ("Widget not found: %s", widget_name);
+ return found_widget;
+}
+
+static GList *pixmaps_directories = NULL;
+
+/* Use this function to set the directory containing installed pixmaps. */
+void
+add_pixmap_directory (const gchar *directory)
+{
+ pixmaps_directories = g_list_prepend (pixmaps_directories,
+ g_strdup (directory));
+}
+
+/* This is an internally used function to find pixmap files. */
+static gchar*
+find_pixmap_file (const gchar *filename)
+{
+ GList *elem;
+
+ /* We step through each of the pixmaps directory to find it. */
+ elem = pixmaps_directories;
+ while (elem)
+ {
+ gchar *pathname = g_strdup_printf ("%s%s%s", (gchar*)elem->data,
+ G_DIR_SEPARATOR_S, filename);
+ if (g_file_test (pathname, G_FILE_TEST_EXISTS))
+ return pathname;
+ g_free (pathname);
+ elem = elem->next;
+ }
+ return NULL;
+}
+
+/* This is an internally used function to create pixmaps. */
+GtkWidget*
+create_pixmap (GtkWidget *widget,
+ const gchar *filename)
+{
+ gchar *pathname = NULL;
+ GtkWidget *pixmap;
+
+ if (!filename || !filename[0])
+ return gtk_image_new ();
+
+ pathname = find_pixmap_file (filename);
+
+ if (!pathname)
+ {
+ g_warning (_("Couldn't find pixmap file: %s"), filename);
+ return gtk_image_new ();
+ }
+
+ pixmap = gtk_image_new_from_file (pathname);
+ g_free (pathname);
+ return pixmap;
+}
+
+/* This is an internally used function to create pixmaps. */
+GdkPixbuf*
+create_pixbuf (const gchar *filename)
+{
+ gchar *pathname = NULL;
+ GdkPixbuf *pixbuf;
+ GError *error = NULL;
+
+ if (!filename || !filename[0])
+ return NULL;
+
+ pathname = find_pixmap_file (filename);
+
+ if (!pathname)
+ {
+ g_warning (_("Couldn't find pixmap file: %s"), filename);
+ return NULL;
+ }
+
+ pixbuf = gdk_pixbuf_new_from_file (pathname, &error);
+ if (!pixbuf)
+ {
+ fprintf (stderr, "Failed to load pixbuf file: %s: %s\n",
+ pathname, error->message);
+ g_error_free (error);
+ }
+ g_free (pathname);
+ return pixbuf;
+}
+
+/* This is used to set ATK action descriptions. */
+void
+glade_set_atk_action_description (AtkAction *action,
+ const gchar *action_name,
+ const gchar *description)
+{
+ gint n_actions, i;
+
+ n_actions = atk_action_get_n_actions (action);
+ for (i = 0; i < n_actions; i++)
+ {
+ if (!strcmp (atk_action_get_name (action, i), action_name))
+ atk_action_set_description (action, i, description);
+ }
+}
+
diff --git a/tools/glade/examples/editor/src/support.h b/tools/glade/examples/editor/src/support.h
new file mode 100644
index 00000000..92201b97
--- /dev/null
+++ b/tools/glade/examples/editor/src/support.h
@@ -0,0 +1,67 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+
+/*
+ * Standard gettext macros.
+ */
+#ifdef ENABLE_NLS
+# include <libintl.h>
+# undef _
+# define _(String) dgettext (PACKAGE, String)
+# ifdef gettext_noop
+# define N_(String) gettext_noop (String)
+# else
+# define N_(String) (String)
+# endif
+#else
+# define textdomain(String) (String)
+# define gettext(String) (String)
+# define dgettext(Domain,Message) (Message)
+# define dcgettext(Domain,Message,Type) (Message)
+# define bindtextdomain(Domain,Directory) (Domain)
+# define _(String) (String)
+# define N_(String) (String)
+#endif
+
+
+/*
+ * Public Functions.
+ */
+
+/*
+ * This function returns a widget in a component created by Glade.
+ * Call it with the toplevel widget in the component (i.e. a window/dialog),
+ * or alternatively any widget in the component, and the name of the widget
+ * you want returned.
+ */
+GtkWidget* lookup_widget (GtkWidget *widget,
+ const gchar *widget_name);
+
+
+/* Use this function to set the directory containing installed pixmaps. */
+void add_pixmap_directory (const gchar *directory);
+
+
+/*
+ * Private Functions.
+ */
+
+/* This is used to create the pixmaps used in the interface. */
+GtkWidget* create_pixmap (GtkWidget *widget,
+ const gchar *filename);
+
+/* This is used to create the pixbufs used in the interface. */
+GdkPixbuf* create_pixbuf (const gchar *filename);
+
+/* This is used to set ATK action descriptions. */
+void glade_set_atk_action_description (AtkAction *action,
+ const gchar *action_name,
+ const gchar *description);
+