source: projects/visualisator/gtk.c @ 6

Last change on this file since 6 was 6, checked in by sven, 11 years ago

Completed documentation (everything in english) and licence issues (everything is
GPLv3 now).

File size: 5.7 KB
Line 
1/**
2 *
3 * gtk.c: A simple exemplar GTK program which uses all features of the
4 *        GtkPaperTape widget in one window. It does not implement any
5 *        extra features, except of:
6 *
7 *   * handling of command line options by using the glib parser, thus
8 *   * being able to read from stdin or any files
9 *   * an additional menu item to open files in the GUI
10 *
11 * rewritten from gtkprogram.c on 21.06.2008
12 * Started 05.06.2008 13:13 (the first new project in the SVN)
13 * Copyright (C) 2008  Sven Köppel
14 *
15 * This program is free software; you can redistribute
16 * it and/or modify it under the terms of the GNU General
17 * Public License as published by the Free Software
18 * Foundation; either version 3 of the License, or (at
19 * your option) any later version.
20 *
21 * This program is distributed in the hope that it will
22 * be useful, but WITHOUT ANY WARRANTY; without even the
23 * implied warranty of MERCHANTABILITY or FITNESS FOR A
24 * PARTICULAR PURPOSE. See the GNU General Public License
25 * for more details.
26 *
27 * You should have received a copy of the GNU General
28 * Public License along with this program; if not, see
29 * <http://www.gnu.org/licenses/>.
30 *
31 **/
32
33
34#include <gtk/gtk.h>
35#include "gtkpapertape.h"
36
37#define _(a) (a)
38
39gboolean open_file_dialog(GtkWidget *menuitem, GtkPaperTape* papertape) {
40        /**
41         * displays an "open file" dialog which runs gtk_paper_tape_read_from_file() if success,
42         * is run by the menu item "open file"
43         **/
44
45        GtkWidget *chooser;
46        chooser = gtk_file_chooser_dialog_new(
47                _("Select (binary) file to display as a paper tape"),
48                GTK_WINDOW(papertape->parent_window),
49                GTK_FILE_CHOOSER_ACTION_OPEN,
50                GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
51                GTK_STOCK_OPEN, GTK_RESPONSE_OK,
52                NULL);
53
54        if(gtk_dialog_run(GTK_DIALOG(chooser)) == GTK_RESPONSE_OK) {
55                char *filename;
56                FILE *file;
57
58                filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER (chooser));
59                if(filename == NULL) {
60                        g_printf(_("No file selected to open.\n"));
61                        gtk_widget_destroy(GTK_WIDGET(chooser));
62                        return FALSE;
63                } else {
64                        gtk_paper_tape_read_from_file(papertape, filename);
65                        g_free(filename);
66                        gtk_widget_destroy(GTK_WIDGET(chooser));
67                        return TRUE;
68                }
69        }
70        gtk_widget_destroy(chooser);
71        return FALSE;
72} // open_file_dialog
73
74int main(int argc, char *argv[]) {
75        GtkWidget *window, *mainbox, *statusbar;
76        GtkPaperTape *papertape;
77        gtk_init(&argc, &argv);
78       
79        // main window generation
80        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
81        gtk_window_set_default_size(GTK_WINDOW(window), 600, 600);
82        gtk_window_set_title(GTK_WINDOW(window), "GtkPaperTape Demo");
83        g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
84       
85        // generate main box (menubar + papertape whole widget)
86        mainbox = gtk_vbox_new(FALSE, 0);
87        gtk_container_add(GTK_CONTAINER(window), mainbox);
88        gtk_widget_show(mainbox);
89       
90        // main widget generation
91        papertape = GTK_PAPER_TAPE(gtk_paper_tape_new(window));
92       
93        // menus start
94        {
95                GtkWidget *menu, *menubar, *menuitem;
96                // menus
97                menubar = gtk_menu_bar_new();
98                gtk_box_pack_start(GTK_BOX(mainbox), menubar, FALSE, TRUE, 0);
99                gtk_widget_show(menubar);
100       
101                // FIRST menu: File {{{
102                menu = gtk_menu_new();
103                // Oeffnen
104                g_signal_connect(G_OBJECT(fast_stock_menuitem(menu, GTK_STOCK_OPEN)),
105                        "activate", G_CALLBACK(open_file_dialog), papertape);
106                fast_menu_seperator(menu);
107                gtk_paper_tape_menu_export(papertape, menu);
108                fast_menu_seperator(menu);
109                g_signal_connect(G_OBJECT(fast_stock_menuitem(menu, GTK_STOCK_QUIT)),
110                        "activate", G_CALLBACK(gtk_main_quit), NULL);
111       
112                menuitem = gtk_menu_item_new_with_mnemonic("_Datei");
113                gtk_menu_item_set_submenu(GTK_MENU_ITEM (menuitem), menu);
114                gtk_menu_shell_append(GTK_MENU_SHELL (menubar), menuitem);
115                gtk_widget_show (menuitem);
116       
117                // Zweites Menue: Ansicht
118                menu = gtk_menu_new();
119                gtk_paper_tape_menu_view(papertape, menu);
120       
121                menuitem = gtk_menu_item_new_with_mnemonic("_Ansicht");
122                gtk_menu_item_set_submenu(GTK_MENU_ITEM (menuitem), menu);
123                gtk_menu_shell_append(GTK_MENU_SHELL (menubar), menuitem);
124                gtk_widget_show (menuitem);
125       
126                // Drittes Menue: Farben
127                menu = gtk_menu_new();
128                gtk_paper_tape_menu_colors(papertape, menu);
129       
130                menuitem = gtk_menu_item_new_with_mnemonic("_Farben");
131                gtk_menu_item_set_submenu(GTK_MENU_ITEM (menuitem), menu);
132                gtk_menu_shell_append(GTK_MENU_SHELL (menubar), menuitem);
133                gtk_widget_show (menuitem);
134        }
135        // menus end
136
137        // attach papertape whole widget to mainbox
138        gtk_box_pack_start(GTK_BOX(mainbox),
139                GTK_WIDGET(gtk_paper_tape_get_whole_box(GTK_PAPER_TAPE(papertape))),
140                TRUE, TRUE, 0);
141
142
143        // parse command options
144        {
145                char *filename = NULL;
146                gboolean read_from_stdin = FALSE;
147                GError *error = NULL;
148                GOptionContext *context;
149                byte_t show_mystart = 0; // eigene Startprozedur anzeigen?
150                GOptionEntry option_entries[] = {
151                        { "filename", 'f', 0, G_OPTION_ARG_FILENAME, &filename, _("file to open"), NULL },
152                        { "stdin", 's', 0, G_OPTION_ARG_NONE, &read_from_stdin, _("read from standard input"), NULL },
153                        { NULL }
154                };
155
156                context = g_option_context_new(_(" - GtkPaperTape visualisation"));
157                g_option_context_add_main_entries(context, option_entries, NULL);
158                g_option_context_add_group(context, gtk_get_option_group(TRUE));
159                g_option_context_parse(context, &argc, &argv, &error);
160
161                if(read_from_stdin) {
162                        printf(_("%s: Reading data from standard input, will open window after EOF.\n"), argv[0]);
163                        byte_t *data;
164                        int length = file_get_contents(stdin, &data);
165                        gtk_paper_tape_set_data(papertape, length, data);
166                } else if(filename != NULL) {
167                        // eine Datei einlesen
168                        printf(_("Reading from file '%s'\n"), filename);
169                        if(!gtk_paper_tape_read_from_file(papertape, argv[1])) {
170                                printf(_("Failed to read from file!\n"));
171                                return 1;
172                        }
173                }
174        }
175        // end of parsing command options
176
177        gtk_widget_show(window);
178        gtk_main();
179        return 0;
180}
Note: See TracBrowser for help on using the repository browser.
© 2008 - 2013 technikum29 • Sven Köppel • Some rights reserved
Powered by Trac
Expect where otherwise noted, content on this site is licensed under a Creative Commons 3.0 License