0

gtk+-2.0 gtksourceview-2.0 を使用してテキスト エディターを作成しています。エディターを閉じて後で再度開いた後に使用するために、ノートブック内のタブを保存できるようにしたいと考えています。gtk_notebook_* の下の devhelp には、有望に見えるものは何も表示されません。これらのファイルへのパスをデータベース テーブルに保存し、データベースからテーブルを読み取り、アプリケーションの起動時にタブを作成することもできますが、これは少し面倒です。多くのエディターにはこの機能が組み込まれています。

これはgtkで可能ですか?私はCに比較的慣れていません.これらのパスを(データベース以外に)保存する他の方法はありますか? ありがとう。

4

2 に答える 2

1

GtkNotebook はこれを行うことができません。アプリケーションの状態を保存するコードを記述し、アプリケーションの起動時にそれをロードする必要があります。それが開いているファイルのパスのリストであれば、問題ありません。なぜそれが「ぎこちない」と思うのか分かりませんか?ツールキットは、魔法のようにアプリの詳細を認識していません。

于 2012-05-10T00:39:05.743 に答える
0

私は最初、設定ファイルへの/からの書き込みが遅いと思っていました.dbへの/からの書き込みについても同様の考えがありました。いくつかの良い提案が提供されました: 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]);

} 
于 2012-05-10T21:25:39.880 に答える