source: projects/visualisator/gtk.c @ 9

Last change on this file since 9 was 9, checked in by sven, 11 years ago
  • Recreated Makefiles in visualisator/ and puncher/
  • All /visualisator/ sources now compile with -Wall compiler flag
  • The basic /puncher/ sources compile with -Wall, too.
  • Added Readme for schriften/

Current development is now focussed at /puncher/frontend.gtk.c.

-- Sven @ workstation

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
57                filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER (chooser));
58                if(filename == NULL) {
59                        printf(_("No file selected to open.\n"));
60                        gtk_widget_destroy(GTK_WIDGET(chooser));
61                        return FALSE;
62                } else {
63                        gtk_paper_tape_read_from_file(papertape, filename);
64                        g_free(filename);
65                        gtk_widget_destroy(GTK_WIDGET(chooser));
66                        return TRUE;
67                }
68        }
69        gtk_widget_destroy(chooser);
70        return FALSE;
71} // open_file_dialog
72
73int main(int argc, char *argv[]) {
74        GtkWidget *window, *mainbox;
75        GtkPaperTape *papertape;
76        gtk_init(&argc, &argv);
77       
78        // main window generation
79        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
80        gtk_window_set_default_size(GTK_WINDOW(window), 600, 600);
81        gtk_window_set_title(GTK_WINDOW(window), "GtkPaperTape Demo");
82        g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
83       
84        // generate main box (menubar + papertape whole widget)
85        mainbox = gtk_vbox_new(FALSE, 0);
86        gtk_container_add(GTK_CONTAINER(window), mainbox);
87        gtk_widget_show(mainbox);
88       
89        // main widget generation
90        papertape = GTK_PAPER_TAPE(gtk_paper_tape_new(window));
91       
92        // menus start
93        {
94                GtkWidget *menu, *menubar, *menuitem;
95                // menus
96                menubar = gtk_menu_bar_new();
97                gtk_box_pack_start(GTK_BOX(mainbox), menubar, FALSE, TRUE, 0);
98                gtk_widget_show(menubar);
99       
100                // FIRST menu: File {{{
101                menu = gtk_menu_new();
102                // Oeffnen
103                g_signal_connect(G_OBJECT(fast_stock_menuitem(menu, GTK_STOCK_OPEN)),
104                        "activate", G_CALLBACK(open_file_dialog), papertape);
105                fast_menu_seperator(menu);
106                gtk_paper_tape_menu_export(papertape, menu);
107                fast_menu_seperator(menu);
108                g_signal_connect(G_OBJECT(fast_stock_menuitem(menu, GTK_STOCK_QUIT)),
109                        "activate", G_CALLBACK(gtk_main_quit), NULL);
110       
111                menuitem = gtk_menu_item_new_with_mnemonic("_Datei");
112                gtk_menu_item_set_submenu(GTK_MENU_ITEM (menuitem), menu);
113                gtk_menu_shell_append(GTK_MENU_SHELL (menubar), menuitem);
114                gtk_widget_show (menuitem);
115       
116                // Zweites Menue: Ansicht
117                menu = gtk_menu_new();
118                gtk_paper_tape_menu_view(papertape, menu);
119       
120                menuitem = gtk_menu_item_new_with_mnemonic("_Ansicht");
121                gtk_menu_item_set_submenu(GTK_MENU_ITEM (menuitem), menu);
122                gtk_menu_shell_append(GTK_MENU_SHELL (menubar), menuitem);
123                gtk_widget_show (menuitem);
124       
125                // Drittes Menue: Farben
126                menu = gtk_menu_new();
127                gtk_paper_tape_menu_colors(papertape, menu);
128       
129                menuitem = gtk_menu_item_new_with_mnemonic("_Farben");
130                gtk_menu_item_set_submenu(GTK_MENU_ITEM (menuitem), menu);
131                gtk_menu_shell_append(GTK_MENU_SHELL (menubar), menuitem);
132                gtk_widget_show (menuitem);
133        }
134        // menus end
135
136        // attach papertape whole widget to mainbox
137        gtk_box_pack_start(GTK_BOX(mainbox),
138                GTK_WIDGET(gtk_paper_tape_get_whole_box(GTK_PAPER_TAPE(papertape))),
139                TRUE, TRUE, 0);
140
141
142        // parse command options
143        {
144                char *filename = NULL;
145                gboolean read_from_stdin = FALSE;
146                GError *error = NULL;
147                GOptionContext *context;
148                // (noch?) nicht genutzt:
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