5 activate_toggle (GSimpleAction *action,
11 state = g_action_get_state (G_ACTION (action));
12 g_action_change_state (G_ACTION (action), g_variant_new_boolean (!g_variant_get_boolean (state)));
13 g_variant_unref (state);
17 change_fullscreen_state (GSimpleAction *action,
21 if (g_variant_get_boolean (state))
22 gtk_window_fullscreen (user_data);
24 gtk_window_unfullscreen (user_data);
26 g_simple_action_set_state (action, state);
30 get_clipboard (GtkWidget *widget)
32 return gtk_widget_get_clipboard (widget, gdk_atom_intern_static_string ("CLIPBOARD"));
36 window_copy (GSimpleAction *action,
40 GtkWindow *window = GTK_WINDOW (user_data);
41 GtkTextView *text = g_object_get_data ((GObject*)window, "bloatpad-text");
43 gtk_text_buffer_copy_clipboard (gtk_text_view_get_buffer (text),
44 get_clipboard ((GtkWidget*) text));
48 window_paste (GSimpleAction *action,
52 GtkWindow *window = GTK_WINDOW (user_data);
53 GtkTextView *text = g_object_get_data ((GObject*)window, "bloatpad-text");
55 gtk_text_buffer_paste_clipboard (gtk_text_view_get_buffer (text),
56 get_clipboard ((GtkWidget*) text),
62 static GActionEntry win_entries[] = {
63 { "copy", window_copy, NULL, NULL, NULL },
64 { "paste", window_paste, NULL, NULL, NULL },
65 { "fullscreen", activate_toggle, NULL, "false", change_fullscreen_state }
69 new_window (GApplication *app,
72 GtkWidget *window, *grid, *scrolled, *view;
74 window = gtk_application_window_new (GTK_APPLICATION (app));
75 gtk_window_set_default_size ((GtkWindow*)window, 640, 480);
76 g_action_map_add_action_entries (G_ACTION_MAP (window), win_entries, G_N_ELEMENTS (win_entries), window);
77 gtk_window_set_title (GTK_WINDOW (window), "Bloatpad");
79 grid = gtk_grid_new ();
80 gtk_container_add (GTK_CONTAINER (window), grid);
82 scrolled = gtk_scrolled_window_new (NULL, NULL);
83 gtk_widget_set_hexpand (scrolled, TRUE);
84 gtk_widget_set_vexpand (scrolled, TRUE);
85 view = gtk_text_view_new ();
87 g_object_set_data ((GObject*)window, "bloatpad-text", view);
89 gtk_container_add (GTK_CONTAINER (scrolled), view);
91 gtk_grid_attach (GTK_GRID (grid), scrolled, 0, 0, 1, 1);
98 if (g_file_load_contents (file, NULL, &contents, &length, NULL, NULL))
100 GtkTextBuffer *buffer;
102 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
103 gtk_text_buffer_set_text (buffer, contents, length);
108 gtk_widget_show_all (GTK_WIDGET (window));
112 bloat_pad_activate (GApplication *application)
114 new_window (application, NULL);
118 bloat_pad_open (GApplication *application,
125 for (i = 0; i < n_files; i++)
126 new_window (application, files[i]);
129 typedef GtkApplication BloatPad;
130 typedef GtkApplicationClass BloatPadClass;
132 G_DEFINE_TYPE (BloatPad, bloat_pad, GTK_TYPE_APPLICATION)
135 bloat_pad_finalize (GObject *object)
137 G_OBJECT_CLASS (bloat_pad_parent_class)->finalize (object);
141 show_about (GSimpleAction *action,
145 GtkWindow *window = user_data;
147 gtk_show_about_dialog (window,
148 "program-name", "Bloatpad",
149 "title", "About Bloatpad",
150 "comments", "Not much to say, really.",
156 quit_app (GSimpleAction *action,
163 g_print ("Going down...\n");
165 list = gtk_application_get_windows (GTK_APPLICATION (g_application_get_default ()));
171 gtk_widget_destroy (GTK_WIDGET (win));
177 static GActionEntry app_entries[] = {
178 { "about", show_about, NULL, NULL, NULL },
179 { "quit", quit_app, NULL, NULL, NULL },
182 static GActionGroup *
183 create_app_actions (void)
185 GSimpleActionGroup *actions = g_simple_action_group_new ();
186 g_simple_action_group_add_entries (actions,
187 app_entries, G_N_ELEMENTS (app_entries),
190 return G_ACTION_GROUP (actions);
194 create_app_menu (void)
196 GMenu *menu = g_menu_new ();
197 g_menu_append (menu, "_About Bloatpad", "app.about");
198 g_menu_append (menu, "_Quit", "app.quit");
200 return G_MENU_MODEL (menu);
204 create_window_menu (void)
209 submenu = g_menu_new ();
210 g_menu_append (submenu, "_Copy", "win.copy");
211 g_menu_append (submenu, "_Paste", "win.paste");
213 menu = g_menu_new ();
214 g_menu_append_submenu (menu, "_Edit", (GMenuModel*)submenu);
215 g_object_unref (submenu);
217 submenu = g_menu_new ();
218 g_menu_append (submenu, "_Fullscreen", "win.fullscreen");
220 g_menu_append_submenu (menu, "_View", (GMenuModel*)submenu);
221 g_object_unref (submenu);
223 return G_MENU_MODEL (menu);
227 bloat_pad_init (BloatPad *app)
229 GActionGroup *actions;
230 GMenuModel *app_menu;
231 GMenuModel *window_menu;
233 actions = create_app_actions ();
234 g_application_set_action_group (G_APPLICATION (app), actions);
235 g_object_unref (actions);
237 app_menu = create_app_menu ();
238 g_application_set_app_menu (G_APPLICATION (app), app_menu);
239 g_object_unref (app_menu);
241 window_menu = create_window_menu ();
242 g_application_set_menubar (G_APPLICATION (app), window_menu);
243 g_object_unref (window_menu);
247 bloat_pad_class_init (BloatPadClass *class)
249 G_OBJECT_CLASS (class)->finalize = bloat_pad_finalize;
251 G_APPLICATION_CLASS (class)->activate = bloat_pad_activate;
252 G_APPLICATION_CLASS (class)->open = bloat_pad_open;
260 return g_object_new (bloat_pad_get_type (),
261 "application-id", "org.gtk.Test.bloatpad",
262 "flags", G_APPLICATION_HANDLES_OPEN,
267 main (int argc, char **argv)
272 bloat_pad = bloat_pad_new ();
273 status = g_application_run (G_APPLICATION (bloat_pad), argc, argv);
274 g_object_unref (bloat_pad);