diff options
Diffstat (limited to 'tools/glade/examples/editor/src')
-rw-r--r-- | tools/glade/examples/editor/src/Makefile.am | 17 | ||||
-rw-r--r-- | tools/glade/examples/editor/src/callbacks.c | 670 | ||||
-rw-r--r-- | tools/glade/examples/editor/src/callbacks.h | 116 | ||||
-rw-r--r-- | tools/glade/examples/editor/src/interface.c | 456 | ||||
-rw-r--r-- | tools/glade/examples/editor/src/interface.h | 9 | ||||
-rw-r--r-- | tools/glade/examples/editor/src/main.c | 56 | ||||
-rw-r--r-- | tools/glade/examples/editor/src/support.c | 144 | ||||
-rw-r--r-- | tools/glade/examples/editor/src/support.h | 67 |
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); + |