Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <gtk/gtk.h>
- #include <gtksourceview/gtksource.h>
- #include <gdk/gdkkeysyms.h>
- #include <glib/gi18n.h>
- #include <errno.h>
- #include <unistd.h>
- #include <sys/stat.h>
- #include <sys/types.h>
- void dialog_show_open(GtkMenuItem *item, GtkTextView *textview);
- void dialog_show_save(GtkMenuItem *item, GtkTextView *textview);
- void dialog_show_save(GtkMenuItem *item, GtkTextView *textview);
- int main (int argc,
- char *argv[])
- {
- GtkWidget *window, *scrolled_win, *textview;
- GtkWidget *vbox, *menubar, *fileMenu, *fileMi, *quit_item, *open_item, *save_item;
- gtk_init (&argc, &argv);
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_maximize(GTK_WINDOW (window)); /* This is a cast: expand the windows to fullscreen*/
- vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
- gtk_container_add(GTK_CONTAINER(window), vbox);
- gtk_window_set_title (GTK_WINDOW (window), "Text Views");
- gtk_container_set_border_width (GTK_CONTAINER (window), 10);
- textview = gtk_source_view_new();
- menubar = gtk_menu_bar_new();
- fileMenu = gtk_menu_new();
- fileMi = gtk_menu_item_new_with_label("File");
- open_item = gtk_menu_item_new_with_label("Open");
- quit_item = gtk_menu_item_new_with_label("Quit");
- /* CTRL-Q accelerator */
- GtkAccelGroup *accel_group = NULL;
- accel_group = gtk_accel_group_new();
- gtk_window_add_accel_group(GTK_WINDOW(window), accel_group);
- gtk_widget_add_accelerator(quit_item, "activate", accel_group,
- GDK_KEY_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
- /*Expand the textbox to fullscreen */
- gtk_widget_set_hexpand(textview, TRUE);
- gtk_widget_set_vexpand(textview, TRUE);
- GtkCssProvider *provider = gtk_css_provider_new ();
- gtk_css_provider_load_from_path (provider,
- "gtk-widgets.css", NULL);
- GtkStyleContext *context;
- context = gtk_widget_get_style_context(textview);
- gtk_style_context_add_provider (context,
- GTK_STYLE_PROVIDER(provider),
- GTK_STYLE_PROVIDER_PRIORITY_USER);
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileMi), fileMenu);
- gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), open_item);
- gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), save_item);
- gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), quit_item);
- gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fileMi);
- gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
- scrolled_win = gtk_scrolled_window_new (NULL, NULL);
- gtk_container_add(GTK_CONTAINER(vbox), scrolled_win);
- gtk_container_add (GTK_CONTAINER (scrolled_win), textview);
- gtk_source_view_set_show_line_numbers (GTK_SOURCE_VIEW(textview), TRUE); /*Show line numbers */
- gtk_widget_show_all (window);
- g_signal_connect(G_OBJECT(window), "destroy",
- G_CALLBACK(gtk_main_quit), NULL);
- g_signal_connect(G_OBJECT(quit_item), "activate",
- G_CALLBACK(gtk_main_quit), NULL);
- g_signal_connect(G_OBJECT(open_item), "activate",
- G_CALLBACK(dialog_show_open), textview);
- g_signal_connect(G_OBJECT(open_item), "activate",
- G_CALLBACK(dialog_show_save), textview);
- gtk_main();
- return 0;
- }
- void dialog_show_open(GtkMenuItem *item, GtkTextView *textview)
- {
- FILE *fp;
- GtkWindow *parent_window = NULL;
- GtkFileChooserNative *native;
- gint res;
- native = gtk_file_chooser_native_new ("Open File",
- parent_window,
- GTK_FILE_CHOOSER_ACTION_OPEN,
- _("_Open"),
- _("_Cancel"));
- res = gtk_native_dialog_run (GTK_NATIVE_DIALOG (native));
- if (res == GTK_RESPONSE_ACCEPT)
- {
- char *filename;
- GtkFileChooser *chooser = GTK_FILE_CHOOSER (native);
- filename = gtk_file_chooser_get_filename (chooser);
- if(!(fp = fopen(filename, "r"))) /* if file cannot be opened */
- {
- g_printerr("%s: %s\n", filename, g_strerror(errno));
- return;
- }
- else {
- char *buf;
- int fd; /*File descriptor */
- fd = fileno(fp);
- struct stat fileStat;
- if(fstat(fd, &fileStat) < 0)
- return;
- GtkTextBuffer * buffer = gtk_text_view_get_buffer (textview);
- long fsize = fileStat.st_size;
- buf = malloc(fsize + 1);
- fread(buf, fsize, 1, fp);
- buf[fsize] = '\0';
- gtk_text_buffer_set_text(buffer, buf, -1);
- free(buf);
- fclose(fp);
- }
- g_free (filename);
- }
- g_object_unref (native);
- }
- void dialog_show_save(GtkMenuItem *item, GtkTextView *textview)
- {
- GtkWindow *parent_window = NULL;
- GtkFileChooserNative *native;
- int res;
- native = gtk_file_chooser_native_new ("Save the file",
- parent_window,
- GTK_FILE_CHOOSER_ACTION_OPEN,
- _("_Save"),
- _("_Cancel"));
- res = gtk_native_dialog_run (GTK_NATIVE_DIALOG (native));
- if (res == GTK_RESPONSE_ACCEPT)
- {
- char *filename;
- GtkFileChooser *chooser = GTK_FILE_CHOOSER (native);
- gtk_file_chooser_set_do_overwrite_confirmation(chooser, TRUE);
- filename = gtk_file_chooser_get_filename (chooser);
- if (gtk_notepad_save_file(filename)) {
- free(loaded_fn);
- loaded_fn = malloc(strlen(filename) + 1);
- strcpy(loaded_fn, filename);
- }
- g_free(filename);
- }
- g_object_unref (native);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement