GTK+ / Gnome Application Development | |||
---|---|---|---|
<<< Previous | Home | Next >>> |
This appendix contains complete sample code listings.
GnomeHello is used as an example in Part 2.
#include <config.h> #include <gnome.h> #include "app.h" static void session_die(GnomeClient* client, gpointer client_data); static gint save_session(GnomeClient *client, gint phase, GnomeSaveStyle save_style, gint is_shutdown, GnomeInteractStyle interact_style, gint is_fast, gpointer client_data); static int greet_mode = FALSE; static char* message = NULL; static char* geometry = NULL; struct poptOption options[] = { { "greet", 'g', POPT_ARG_NONE, &greet_mode, 0, N_("Say hello to specific people listed on the command line"), NULL }, { "message", 'm', POPT_ARG_STRING, &message, 0, N_("Specify a message other than \"Hello, World!\""), N_("MESSAGE") }, { "geometry", '\0', POPT_ARG_STRING, &geometry, 0, N_("Specify the geometry of the main window"), N_("GEOMETRY") }, { NULL, '\0', 0, NULL, 0, NULL, NULL } }; int main(int argc, char* argv[]) { GtkWidget* app; poptContext pctx; char** args; int i; GSList* greet = NULL; GnomeClient* client; bindtextdomain(PACKAGE, GNOMELOCALEDIR); textdomain(PACKAGE); gnome_init_with_popt_table(PACKAGE, VERSION, argc, argv, options, 0, &pctx); /* Argument parsing */ args = poptGetArgs(pctx); if (greet_mode && args) { i = 0; while (args[i] != NULL) { greet = g_slist_prepend(greet, args[i]); ++i; } /* Put them in order */ greet = g_slist_reverse(greet); } else if (greet_mode && args == NULL) { g_error(_("You must specify someone to greet.")); } else if (args != NULL) { g_error(_("Command line arguments are only allowed with --greet.")); } else { g_assert(!greet_mode && args == NULL); } poptFreeContext(pctx); /* Session Management */ client = gnome_master_client (); gtk_signal_connect (GTK_OBJECT (client), "save_yourself", GTK_SIGNAL_FUNC (save_session), argv[0]); gtk_signal_connect (GTK_OBJECT (client), "die", GTK_SIGNAL_FUNC (session_die), NULL); /* Main app */ app = hello_app_new(message, geometry, greet); g_slist_free(greet); gtk_widget_show_all(app); gtk_main(); return 0; } static gint save_session (GnomeClient *client, gint phase, GnomeSaveStyle save_style, gint is_shutdown, GnomeInteractStyle interact_style, gint is_fast, gpointer client_data) { gchar** argv; guint argc; /* allocate 0-filled, so it will be NULL-terminated */ argv = g_malloc0(sizeof(gchar*)*4); argc = 1; argv[0] = client_data; if (message) { argv[1] = "--message"; argv[2] = message; argc = 3; } gnome_client_set_clone_command (client, argc, argv); gnome_client_set_restart_command (client, argc, argv); return TRUE; } static void session_die(GnomeClient* client, gpointer client_data) { gtk_main_quit (); } |
#ifndef GNOMEHELLO_APP_H #define GNOMEHELLO_APP_H #include <gnome.h> GtkWidget* hello_app_new(const gchar* message, const gchar* geometry, GSList* greet); void hello_app_close(GtkWidget* app); #endif |
#include <config.h> #include "app.h" #include "menus.h" /* Keep a list of all open application windows */ static GSList* app_list = NULL; static gint delete_event_cb(GtkWidget* w, GdkEventAny* e, gpointer data); static void button_click_cb(GtkWidget* w, gpointer data); GtkWidget* hello_app_new(const gchar* message, const gchar* geometry, GSList* greet) { GtkWidget* app; GtkWidget* button; GtkWidget* label; GtkWidget* status; GtkWidget* frame; app = gnome_app_new(PACKAGE, _("Gnome Hello")); frame = gtk_frame_new(NULL); button = gtk_button_new(); label = gtk_label_new(message ? message : _("Hello, World!")); gtk_window_set_policy(GTK_WINDOW(app), FALSE, TRUE, FALSE); gtk_window_set_default_size(GTK_WINDOW(app), 250, 350); gtk_window_set_wmclass(GTK_WINDOW(app), "hello", "GnomeHello"); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); gtk_container_set_border_width(GTK_CONTAINER(button), 10); gtk_container_add(GTK_CONTAINER(button), label); gtk_container_add(GTK_CONTAINER(frame), button); gnome_app_set_contents(GNOME_APP(app), frame); status = gnome_appbar_new(FALSE, TRUE, GNOME_PREFERENCES_NEVER); gnome_app_set_statusbar(GNOME_APP(app), status); hello_install_menus_and_toolbar(app); gtk_signal_connect(GTK_OBJECT(app), "delete_event", GTK_SIGNAL_FUNC(delete_event_cb), NULL); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(button_click_cb), label); if (geometry != NULL) { gint x, y, w, h; if ( gnome_parse_geometry( geometry, &x, &y, &w, &h ) ) { if (x != -1) { gtk_widget_set_uposition(app, x, y); } if (w != -1) { gtk_window_set_default_size(GTK_WINDOW(app), w, h); } } else { g_error(_("Could not parse geometry string `%s'"), geometry); } } if (greet != NULL) { GtkWidget* dialog; gchar* greetings = g_strdup(_("Special Greetings to:\n")); GSList* tmp = greet; while (tmp != NULL) { gchar* old = greetings; greetings = g_strconcat(old, (gchar*) tmp->data, "\n", NULL); g_free(old); tmp = g_slist_next(tmp); } dialog = gnome_ok_dialog(greetings); g_free(greetings); gnome_dialog_set_parent(GNOME_DIALOG(dialog), GTK_WINDOW(app)); } app_list = g_slist_prepend(app_list, app); return app; } void hello_app_close(GtkWidget* app) { g_return_if_fail(GNOME_IS_APP(app)); app_list = g_slist_remove(app_list, app); gtk_widget_destroy(app); if (app_list == NULL) { /* No windows remaining */ gtk_main_quit(); } } static gint delete_event_cb(GtkWidget* window, GdkEventAny* e, gpointer data) { hello_app_close(window); /* Prevent the window's destruction, since we destroyed it * ourselves with hello_app_close() */ return TRUE; } static void button_click_cb(GtkWidget* w, gpointer data) { GtkWidget* label; gchar* text; gchar* tmp; label = GTK_WIDGET(data); gtk_label_get(GTK_LABEL(label), &text); tmp = g_strdup(text); g_strreverse(tmp); gtk_label_set_text(GTK_LABEL(label), tmp); g_free(tmp); } |
#ifndef GNOMEHELLO_MENUS_H #define GNOMEHELLO_MENUS_H #include <gnome.h> void hello_install_menus_and_toolbar(GtkWidget* app); #endif |
#include <config.h> #include "menus.h" #include "app.h" static void nothing_cb(GtkWidget* widget, gpointer data); static void new_app_cb(GtkWidget* widget, gpointer data); static void close_cb (GtkWidget* widget, gpointer data); static void exit_cb (GtkWidget* widget, gpointer data); static void about_cb (GtkWidget* widget, gpointer data); static GnomeUIInfo file_menu [] = { GNOMEUIINFO_MENU_NEW_ITEM(N_("_New Hello"), N_("Create a new hello"), new_app_cb, NULL), GNOMEUIINFO_MENU_OPEN_ITEM(nothing_cb, NULL), GNOMEUIINFO_MENU_SAVE_ITEM(nothing_cb, NULL), GNOMEUIINFO_MENU_SAVE_AS_ITEM(nothing_cb, NULL), GNOMEUIINFO_SEPARATOR, GNOMEUIINFO_MENU_CLOSE_ITEM(close_cb, NULL), GNOMEUIINFO_MENU_EXIT_ITEM(exit_cb, NULL), GNOMEUIINFO_END }; static GnomeUIInfo edit_menu [] = { GNOMEUIINFO_MENU_CUT_ITEM(nothing_cb, NULL), GNOMEUIINFO_MENU_COPY_ITEM(nothing_cb, NULL), GNOMEUIINFO_MENU_PASTE_ITEM(nothing_cb, NULL), GNOMEUIINFO_MENU_SELECT_ALL_ITEM(nothing_cb, NULL), GNOMEUIINFO_MENU_CLEAR_ITEM(nothing_cb, NULL), GNOMEUIINFO_MENU_UNDO_ITEM(nothing_cb, NULL), GNOMEUIINFO_MENU_REDO_ITEM(nothing_cb, NULL), GNOMEUIINFO_MENU_FIND_ITEM(nothing_cb, NULL), GNOMEUIINFO_MENU_FIND_AGAIN_ITEM(nothing_cb, NULL), GNOMEUIINFO_MENU_REPLACE_ITEM(nothing_cb, NULL), GNOMEUIINFO_MENU_PROPERTIES_ITEM(nothing_cb, NULL), GNOMEUIINFO_END }; static GnomeUIInfo help_menu [] = { GNOMEUIINFO_HELP ("gnome-hello"), GNOMEUIINFO_MENU_ABOUT_ITEM(about_cb, NULL), GNOMEUIINFO_END }; static GnomeUIInfo menu [] = { GNOMEUIINFO_MENU_FILE_TREE(file_menu), GNOMEUIINFO_MENU_EDIT_TREE(edit_menu), GNOMEUIINFO_MENU_HELP_TREE(help_menu), GNOMEUIINFO_END }; static GnomeUIInfo toolbar [] = { GNOMEUIINFO_ITEM_STOCK (N_("New"), N_("Create a new hello"), nothing_cb, GNOME_STOCK_PIXMAP_NEW), GNOMEUIINFO_SEPARATOR, GNOMEUIINFO_ITEM_STOCK (N_("Prev"), N_("Previous hello"), nothing_cb, GNOME_STOCK_PIXMAP_BACK), GNOMEUIINFO_ITEM_STOCK (N_("Next"), N_("Next hello"), nothing_cb, GNOME_STOCK_PIXMAP_FORWARD), GNOMEUIINFO_END }; void hello_install_menus_and_toolbar(GtkWidget* app) { gnome_app_create_toolbar_with_data(GNOME_APP(app), toolbar, app); gnome_app_create_menus_with_data(GNOME_APP(app), menu, app); gnome_app_install_menu_hints(GNOME_APP(app), menu); } static void nothing_cb(GtkWidget* widget, gpointer data) { GtkWidget* dialog; GtkWidget* app; app = (GtkWidget*) data; dialog = gnome_ok_dialog_parented( _("This does nothing; it is only a demonstration."), GTK_WINDOW(app)); } static void new_app_cb(GtkWidget* widget, gpointer data) { GtkWidget* app; app = hello_app_new(_("Hello, World!"), NULL, NULL); gtk_widget_show_all(app); } static void close_cb(GtkWidget* widget, gpointer data) { GtkWidget* app; app = (GtkWidget*) data; hello_app_close(app); } static void exit_cb(GtkWidget* widget, gpointer data) { gtk_main_quit(); } static void about_cb(GtkWidget* widget, gpointer data) { static GtkWidget* dialog = NULL; GtkWidget* app; app = (GtkWidget*) data; if (dialog != NULL) { g_assert(GTK_WIDGET_REALIZED(dialog)); gdk_window_show(dialog->window); gdk_window_raise(dialog->window); } else { const gchar *authors[] = { "Havoc Pennington <[email protected]>", NULL }; gchar* logo = gnome_pixmap_file("gnome-hello-logo.png"); dialog = gnome_about_new (_("GnomeHello"), VERSION, "(C) 1999 Havoc Pennington", authors, _("A sample GNOME application."), logo); g_free(logo); gtk_signal_connect(GTK_OBJECT(dialog), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &dialog); gnome_dialog_set_parent(GNOME_DIALOG(dialog), GTK_WINDOW(app)); gtk_widget_show(dialog); } } |