Как сохранить вкладки GTK Notebook для использования в более поздней сессии

Я создаю текстовый редактор, используя gtk+-2.0 gtksourceview-2.0. Я хочу сохранить вкладки в блокноте для использования после того, как я закрою редактор и снова открою его позже. Я не вижу ничего в devhelp под gtk_notebook_*, что выглядит многообещающе. Я мог бы сохранить пути к этим файлам в таблице базы данных, затем прочитать таблицу из БД и создать вкладки при запуске приложения, но это кажется немного неуклюжим. Многие редакторы имеют встроенную функциональность. Для одних, но я знаю, что есть и другие.

Это возможно в GTK? Я относительно новичок в C, есть ли другие способы хранения этих путей (кроме в базе данных)? Благодарю.

2 ответа

Решение

Сначала я думал, что запись в / из файла конфигурации будет медленной, у меня были похожие мысли о записи в / из БД. Хотя было предложено несколько хороших предложений: парсеры sqlite и config, в конечном итоге я решил, что запись / чтение нескольких строк в / из текстового файла по старинке не будет столь дорогостоящим.

Я собрал демонстрационную программу, прежде чем включить эти концепции в свой редактор, который я представил ниже. Не стесняйтесь критиковать эту программу, особенно в отношении использования памяти. Эта программа демонстрирует следующие шаги:

(если я создаю список, он, кажется, портит мой блок кода)

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]);

} 

GtkNotebook не может сделать это за вас, вам придется написать некоторый код для хранения состояния вашего приложения, а затем загрузить его при запуске приложения. Если это список путей открытых файлов, хорошо. Не уверен, почему вы думаете, что это "неуклюжий"? Инструментарий волшебным образом не знает о деталях вашего приложения.

Другие вопросы по тегам