【问题标题】:how to save gtk notebook tabs for use in a later session如何保存 gtk 笔记本选项卡以在以后的会话中使用
【发布时间】:2012-05-09 22:30:21
【问题描述】:

我正在使用 gtk+-2.0 gtksourceview-2.0 创建一个文本编辑器。我希望能够在关闭编辑器并在以后重新打开它之后保存笔记本中的选项卡以供使用。我在 gtk_notebook_* 下的 devhelp 中没有看到任何看起来很有希望的东西。我可以将这些文件的路径保存在数据库表中,然后从数据库中读取表并在应用程序启动时创建选项卡,但这似乎有点笨拙。许多编辑器都内置了此功能。对于一个 geany,但我知道还有其他的。

这在 gtk 中可能吗?我对 C 比较陌生,有没有其他方法可以存储这些路径(除了在数据库中)?谢谢。

【问题讨论】:

    标签: c gtk gtksourceview


    【解决方案1】:

    GtkNotebook 无法为您执行此操作,您必须编写一些代码来存储应用程序的状态,然后在应用程序启动时加载它。如果那是打开文件的路径列表,那很好。不知道为什么你认为这是“笨拙”?该工具包不会神奇地了解您的应用的详细信息。

    【讨论】:

    • 我说将这些路径存储在数据库中很笨重。我这么说是因为它太过分了,并且可能会引入沟通问题。更不用说它也很慢。我是 C 编程新手。“存储应用程序的状态”有哪些编码方法?谢谢。
    • @nomadicME,我不提倡为几个文件名使用数据库,但 sqlite 非常适合应用程序状态并且足够快。许多配置解析器以两种方式工作(读取和写入),因此这是少量状态的选项。无论如何,这个话题对于另一个问题来说是一个很好的话题。
    • 谢谢@ergosys,我会检查sqlite。
    • @nomadicME,需要明确的是,我是在暗示任何数据库,包括像 sqlite 这样的轻量级数据库,对于少量状态来说都是多余的,尽管 sqlite 可以很好地用于此目的。您可能会发现使用简单的配置文件读取器/写入器更容易。
    • @ergosys,感谢您的澄清。我也会检查配置文件读取器/写入器。
    【解决方案2】:

    我最初认为写入/从配置文件写入会很慢,我对写入/从数据库有类似的想法。虽然提供了一些很好的建议:sqlite 和配置文件解析器,但最终我决定以老式方式在文本文件中写入/读取几行代码不会那么昂贵。

    在将这些概念合并到我的编辑器之前,我整理了一个演示程序,我在下面提供了该程序。随意批评这个程序,特别是在内存使用方面。该程序演示了以下步骤:

    (如果我列出一个列表,它似乎与我的代码块混淆)

    1) 检查配置文件是否存在,2) 如果存在则删除配置文件,3) 将路径写入配置文件,4) 从配置文件中读取路径

    /*
     * Compile Command:
     * gcc ledit_config.c -o ledit_config 
     * 
     */
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>   // system
    
    #define NUM_TABS 10
    
    char paths[NUM_TABS][200];
    
    void write_config();
    void read_config();
    
    int main ()
    {
      write_config();
      read_config();
    }
    
    void write_config()
    {
      char *config_file;
      char temp[200];
      int i=0;
    
      /* change to the user's home directory (for fopen) */
      (int)chdir(getenv("HOME"));
      config_file = ".config/ledit/files";
    
      /* populate paths array with random paths */
      strcpy(paths[0], "~/Documents/code/glade/tutorial1/scratch_files/scratch.py");
      strcpy(paths[4], "~/Documents/code/glade/tutorial1/scratch_files/scratch.c");
      strcpy(paths[7], "~/Documents/code/glade/tutorial1/scratch_files/scratch.glade");
    
      if (fopen(config_file, "r") == NULL) /* file does not exist */
      {
        system("mkdir -p $HOME/.config/ledit/");
        FILE *fp;
        fp=fopen(config_file, "w");
    
        for(i = 0;i < NUM_TABS;++i)
        {
          strcpy(temp,paths[i]);
          strcat(temp, "\n");
          if (strlen(temp) > strlen("\n")) /* check to see if element actually contains more than just "\n" */
          {
            fprintf(fp, "%s",temp);
          }
        }
    
        fclose(fp);
      }
      else /* file does exist */
      {
        system("rm $HOME/.config/ledit/files");
        FILE *fp;
        fp=fopen(config_file, "w");
    
        for(i = 0;i < NUM_TABS;++i)
        {
          strcpy(temp,paths[i]);
          strcat(temp, "\n");
          if (strlen(temp) > strlen("\n")) /* check to see if element actually contains more than just "\n" */
          {
            fprintf(fp, "%s",temp);
          }
        }
    
        fclose(fp);
      }
    
    }
    
    void read_config()
    {
      char line[200];
      char *config_file;
      int i=0;
    
      /* change to the user's home directory (for fopen) */
      (int)chdir(getenv("HOME"));
      config_file = ".config/ledit/files";
    
      /* empty the paths array */
      for(i = 0;i < NUM_TABS;++i)
        strcpy(paths[i], "");
    
      /* read the config file and poplulate array */
      i = 0;
      FILE* fp = fopen(config_file,"r");
      while(fgets(line,sizeof(line),fp) != NULL)
      {
        strcpy(paths[i], line);
        i++;
      }
      fclose(fp);
    
      /* print out paths array for verification */
      for(i = 0;i < NUM_TABS;++i)
        printf("%s",paths[i]);
    
    } 
    

    【讨论】:

      猜你喜欢
      • 2016-03-24
      • 2022-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多