Advertisement
Guest User

Untitled

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