Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.66 KB | None | 0 0
  1. #include <gtk/gtk.h>
  2. #include <gtksourceview/gtksource.h>
  3. #include <gdk/gdkkeysyms.h>
  4. #include <glib/gi18n.h>
  5. #include <errno.h>
  6. #include <unistd.h>
  7. #include <sys/stat.h>
  8. #include <sys/types.h>
  9.  
  10. void dialog_show_open(GtkMenuItem *item, GtkTextView *textview);
  11. void dialog_show_save(GtkMenuItem *item, GtkTextView *textview);
  12. void dialog_show_save(GtkMenuItem *item, GtkTextView *textview);
  13.  
  14. int main (int argc,
  15. char *argv[])
  16. {
  17. GtkWidget *window, *scrolled_win, *textview;
  18. GtkWidget *vbox, *menubar, *fileMenu, *fileMi, *quit_item, *open_item, *save_item;
  19.  
  20. gtk_init (&argc, &argv);
  21.  
  22. window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  23. gtk_window_maximize(GTK_WINDOW (window)); /* This is a cast: expand the windows to fullscreen*/
  24. vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
  25. gtk_container_add(GTK_CONTAINER(window), vbox);
  26.  
  27. gtk_window_set_title (GTK_WINDOW (window), "Text Views");
  28. gtk_container_set_border_width (GTK_CONTAINER (window), 10);
  29.  
  30. textview = gtk_source_view_new();
  31.  
  32. menubar = gtk_menu_bar_new();
  33. fileMenu = gtk_menu_new();
  34.  
  35. fileMi = gtk_menu_item_new_with_label("File");
  36.  
  37. open_item = gtk_menu_item_new_with_label("Open");
  38. save_item = gtk_menu_item_new_with_label("Save");
  39. quit_item = gtk_menu_item_new_with_label("Quit");
  40.  
  41. /* CTRL-Q accelerator */
  42. GtkAccelGroup *accel_group = NULL;
  43. accel_group = gtk_accel_group_new();
  44. gtk_window_add_accel_group(GTK_WINDOW(window), accel_group);
  45.  
  46. gtk_widget_add_accelerator(quit_item, "activate", accel_group,
  47. GDK_KEY_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
  48.  
  49. /*Expand the textbox to fullscreen */
  50. gtk_widget_set_hexpand(textview, TRUE);
  51. gtk_widget_set_vexpand(textview, TRUE);
  52.  
  53. GtkCssProvider *provider = gtk_css_provider_new ();
  54. gtk_css_provider_load_from_path (provider,
  55. "gtk-widgets.css", NULL);
  56.  
  57. GtkStyleContext *context;
  58.  
  59. context = gtk_widget_get_style_context(textview);
  60.  
  61. gtk_style_context_add_provider (context,
  62. GTK_STYLE_PROVIDER(provider),
  63. GTK_STYLE_PROVIDER_PRIORITY_USER);
  64.  
  65. gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileMi), fileMenu);
  66. gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), open_item);
  67. gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), save_item);
  68. gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), quit_item);
  69.  
  70. gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fileMi);
  71. gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
  72.  
  73. scrolled_win = gtk_scrolled_window_new (NULL, NULL);
  74. gtk_container_add(GTK_CONTAINER(vbox), scrolled_win);
  75. gtk_container_add (GTK_CONTAINER (scrolled_win), textview);
  76.  
  77. gtk_source_view_set_show_line_numbers (GTK_SOURCE_VIEW(textview), TRUE); /*Show line numbers */
  78.  
  79. gtk_widget_show_all (window);
  80.  
  81. g_signal_connect(G_OBJECT(window), "destroy",
  82. G_CALLBACK(gtk_main_quit), NULL);
  83.  
  84. g_signal_connect(G_OBJECT(quit_item), "activate",
  85. G_CALLBACK(gtk_main_quit), NULL);
  86.  
  87. g_signal_connect(G_OBJECT(open_item), "activate",
  88. G_CALLBACK(dialog_show_open), textview);
  89.  
  90. g_signal_connect(G_OBJECT(open_item), "activate",
  91. G_CALLBACK(dialog_show_save), textview);
  92.  
  93. gtk_main();
  94.  
  95. return 0;
  96. }
  97.  
  98. void dialog_show_open(GtkMenuItem *item, GtkTextView *textview)
  99. {
  100. FILE *fp;
  101.  
  102. GtkWindow *parent_window = NULL;
  103.  
  104. GtkFileChooserNative *native;
  105. gint res;
  106.  
  107. native = gtk_file_chooser_native_new ("Open File",
  108. parent_window,
  109. GTK_FILE_CHOOSER_ACTION_OPEN,
  110. _("_Open"),
  111. _("_Cancel"));
  112.  
  113. res = gtk_native_dialog_run (GTK_NATIVE_DIALOG (native));
  114.  
  115. if (res == GTK_RESPONSE_ACCEPT)
  116. {
  117. char *filename;
  118. GtkFileChooser *chooser = GTK_FILE_CHOOSER (native);
  119. filename = gtk_file_chooser_get_filename (chooser);
  120.  
  121. if(!(fp = fopen(filename, "r"))) /* if file cannot be opened */
  122. {
  123. g_printerr("%s: %s\n", filename, g_strerror(errno));
  124. return;
  125. }
  126.  
  127. else {
  128. char *buf;
  129. int fd; /*File descriptor */
  130.  
  131. fd = fileno(fp);
  132. struct stat fileStat;
  133.  
  134.  
  135. if(fstat(fd, &fileStat) < 0)
  136. return;
  137.  
  138. GtkTextBuffer * buffer = gtk_text_view_get_buffer (textview);
  139.  
  140. long fsize = fileStat.st_size;
  141.  
  142. buf = malloc(fsize + 1);
  143. fread(buf, fsize, 1, fp);
  144. buf[fsize] = '\0';
  145.  
  146. gtk_text_buffer_set_text(buffer, buf, -1);
  147.  
  148. free(buf);
  149. fclose(fp);
  150. }
  151.  
  152. g_free (filename);
  153. }
  154.  
  155. g_object_unref (native);
  156.  
  157. }
  158.  
  159. void dialog_show_save(GtkMenuItem *item, GtkTextView *textview)
  160. {
  161. GtkWindow *parent_window = NULL;
  162.  
  163. GtkFileChooserNative *native;
  164. int res;
  165.  
  166. native = gtk_file_chooser_native_new ("Save the file",
  167. parent_window,
  168. GTK_FILE_CHOOSER_ACTION_OPEN,
  169. _("_Save"),
  170. _("_Cancel"));
  171.  
  172. res = gtk_native_dialog_run (GTK_NATIVE_DIALOG (native));
  173.  
  174. if (res == GTK_RESPONSE_ACCEPT)
  175. {
  176. char *filename;
  177. GtkFileChooser *chooser = GTK_FILE_CHOOSER (native);
  178. gtk_file_chooser_set_do_overwrite_confirmation(chooser, TRUE);
  179.  
  180. filename = gtk_file_chooser_get_filename (chooser);
  181.  
  182. if (gtk_notepad_save_file(filename)) {
  183. free(loaded_fn);
  184. loaded_fn = malloc(strlen(filename) + 1);
  185. strcpy(loaded_fn, filename);
  186. }
  187.  
  188. g_free(filename);
  189. }
  190.  
  191. g_object_unref (native);
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement