LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1284|回复: 0

GTK2下写的迷你记事本

[复制链接]
发表于 2005-4-13 21:03:07 | 显示全部楼层 |阅读模式
编译:
gcc `pkg-config --cflags --libs gtk+-2.0` text.c -o minitext


  1. #include <gtk/gtk.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <unistd.h>
  5. #include <fcntl.h>
  6. #include <stdio.h>
  7. #include <wchar.h>

  8. #define HZ(text) (buf = g_locale_to_utf8(text, -1, NULL, NULL, NULL))

  9. void MessageWindow (gchar * message);
  10. void OnFileSelected (GtkWidget * w, GtkFileSelection * fs);
  11. static void SaveTxtToFile (GtkWidget * button, gpointer func_data);
  12. static int OnOverWrite (void);
  13. void SaveToFile (const gchar * selected_save_path);

  14. gint delete_event (GtkWidget * widget, GdkEvent * event, gpointer data);

  15. /* 全局性Widget */

  16. GtkWidget *FileChooser;
  17. GtkTextBuffer *TextBuffer;
  18. gchar *buf;
  19. /****************/

  20. void
  21. MessageWindow (gchar * message)
  22. {
  23.   GtkWidget *dialog;
  24.   dialog = gtk_message_dialog_new (NULL,
  25.                                                                    GTK_DIALOG_DESTROY_WITH_PARENT,
  26.                                                                    GTK_MESSAGE_INFO,
  27.                                                                    GTK_BUTTONS_OK, message, NULL);
  28.   gtk_dialog_run (GTK_DIALOG (dialog));
  29.   gtk_widget_destroy (dialog);
  30. }

  31. static void
  32. SaveTxtToFile (GtkWidget * button, gpointer func_data)
  33. {
  34.   

  35.   FileChooser = gtk_file_selection_new (HZ ("选择文件"));
  36.   g_free (buf);

  37.   gtk_widget_show (FileChooser);
  38.   g_signal_connect (G_OBJECT (GTK_FILE_SELECTION (FileChooser)->ok_button),
  39.                                         "clicked",
  40.                                         G_CALLBACK (OnFileSelected), (gpointer) FileChooser);

  41.   g_signal_connect_swapped (G_OBJECT
  42.                                                         (GTK_FILE_SELECTION (FileChooser)->cancel_button),
  43.                                                         "clicked", G_CALLBACK (gtk_widget_destroy),
  44.                                                         G_OBJECT (FileChooser));
  45. }

  46. void
  47. OnFileSelected (GtkWidget * w, GtkFileSelection * fs)
  48. {
  49.   const char *selected_save_path;
  50.   
  51.   gint result;

  52.   selected_save_path =
  53.         gtk_file_selection_get_filename (GTK_FILE_SELECTION (FileChooser));

  54.   if (g_file_test (selected_save_path, G_FILE_TEST_EXISTS) == TRUE)
  55.         {
  56.           gtk_widget_destroy (GTK_WIDGET (FileChooser));
  57.           result = OnOverWrite ();
  58.           switch (result)
  59.                 {
  60.                 case 1:
  61.                   SaveToFile (selected_save_path);
  62.                   return;
  63.                 case 0:
  64.                   return;
  65.                 }
  66.         }

  67.   gtk_widget_destroy (GTK_WIDGET (FileChooser));
  68.   SaveToFile (selected_save_path);
  69.   return;
  70. }

  71. static int
  72. OnOverWrite (void)
  73. {
  74.   GtkWidget *Messager;
  75.   
  76.   gint Ok;

  77.   Messager = gtk_message_dialog_new (NULL,
  78.                                                                          GTK_DIALOG_MODAL,
  79.                                                                          GTK_MESSAGE_QUESTION,
  80.                                                                          GTK_BUTTONS_YES_NO,
  81.                                                                          HZ ("文件已存在,是否替换?"));
  82.   g_free (buf);

  83.   Ok = gtk_dialog_run (GTK_DIALOG (Messager));
  84.   switch (Ok)
  85.         {
  86.         case GTK_RESPONSE_YES:
  87.           gtk_widget_destroy (Messager);
  88.           return 1;
  89.         default:
  90.           gtk_widget_destroy (Messager);
  91.           return 0;
  92.         }
  93. }

  94. void
  95. SaveToFile (const gchar * selected_save_path)
  96. {
  97.   FILE *fp;
  98.   GtkTextIter start, end;
  99.   gchar *Data, *Data2;

  100.   gtk_text_buffer_get_start_iter (TextBuffer, &start);
  101.   gtk_text_buffer_get_end_iter (TextBuffer, &end);

  102.   fp = fopen (selected_save_path, "w");

  103.   /* 从TextBuffer中得到文本 */
  104.   Data = gtk_text_buffer_get_text (TextBuffer, &start, &end, FALSE);

  105.   /* 将它转换成当地字符串 */
  106.   Data2 = g_locale_from_utf8 (Data, -1, NULL, NULL, NULL);
  107.   fwrite (Data2, strlen (Data2), 1, fp);

  108.   g_free (Data2);
  109.   g_free (Data);

  110.   fclose (fp);
  111. }


  112. gint
  113. delete_event (GtkWidget * widget, GdkEvent * event, gpointer data)
  114. {
  115.   gtk_main_quit ();
  116.   return FALSE;
  117. }

  118. int
  119. main (int argc, char *argv[])
  120. {
  121.   GtkWidget *window;
  122.   GtkWidget *view;
  123.   GtkWidget *box;
  124.   GtkWidget *hbox;
  125.   GtkWidget *vscroll;
  126.   GtkWidget *savebutton;
  127.   GtkWidget *align;

  128.   
  129.   pid_t pid;

  130. #ifndef DEBUG
  131.   /* 后台运行 */
  132.   pid = fork ();
  133.   if (pid > 0)
  134.         exit (0);
  135. #endif

  136.   gtk_init (&argc, &argv);

  137.   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

  138.   gtk_window_set_title (GTK_WINDOW (window), HZ ("迷你记事本"));
  139.   g_free (buf);


  140.   gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE);

  141.   /* 窗口缺省大小 400 x 300 */
  142.   gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
  143.   gtk_window_set_keep_above (GTK_WINDOW (window), 1);
  144.   gtk_container_set_border_width (GTK_CONTAINER (window), 10);
  145.   g_signal_connect (G_OBJECT (window), "delete_event",
  146.                                         G_CALLBACK (delete_event), NULL);
  147.   /* 新垂直箱子 */
  148.   box = gtk_vbox_new (FALSE, 0);
  149.   gtk_container_add (GTK_CONTAINER (window), box);

  150.   /* 新水平箱子 */
  151.   hbox = gtk_hbox_new (FALSE, 0);

  152.   vscroll = gtk_scrolled_window_new (NULL, NULL);
  153.   /* 自动滚动 */
  154.   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (vscroll),
  155.                                                                   GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);

  156.   /* 滚动条需要自行扩大 */
  157.   gtk_box_pack_start (GTK_BOX (box), vscroll, TRUE, TRUE, 1);

  158.   /* 新文本框 */
  159.   view = gtk_text_view_new ();
  160.   gtk_container_add (GTK_CONTAINER (vscroll), view);

  161.   TextBuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
  162.   /* 字符级回绕 */
  163.   gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view), GTK_WRAP_WORD_CHAR);
  164.   
  165.   /* 保存按钮 */
  166.   savebutton = gtk_button_new_with_label (HZ ("保存"));
  167.   g_free (buf);
  168.   
  169.   align = gtk_alignment_new(0.5, 0.5, 0.0, 0.0);
  170.   gtk_box_pack_start (GTK_BOX (box), align, FALSE, FALSE, 1);
  171.   gtk_container_add (GTK_CONTAINER (align), savebutton);

  172.   gtk_signal_connect (GTK_OBJECT (savebutton), "clicked",
  173.                                           GTK_SIGNAL_FUNC (SaveTxtToFile), NULL);

  174.   gtk_widget_show_all (window);

  175.   gtk_main ();
  176.   return 0;
  177. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表