Menu

#358 ファイルダイアログの初期位置を指定(タスクトレイ)

None
closed
nobody
None
5
2013-06-16
2013-03-18
novice123
No

タスクトレイから"新規作成"、"開く"を選択したときに
ファイルダイアログの初期位置設定(カレントディレクトリ)
を反映するようにしました。

■sakura.exe - タスクトレイ - 新規作成 - 開く/保存
システムディレクトリ -> カレントディレクトリ

■sakura.exe - タスクトレイ - 開く
MRU -> カレントディレクトリ

■"sakura.exe -NOWIN" - タスクトレイ - 新規作成 - 開く/保存
MRU -> カレントディレクトリ

1 Attachments

Discussion

  • ds14050

    ds14050 - 2013-03-18

    試してみました。コントロールプロセスは、一番最初に起動されたsakura.exeのカレントディレクトリをいつまでも引きずるのでしょうか。

    たまたまその日一番最初に開いたテキストが a/b.txtだったというだけでトレイアイコンから新規作成する(無題)ドキュメントの保存先が a/ に固定されます。

    コントロールプロセスが存在するあいだ、aディレクトリを改名・削除することができません。

     

    Last edit: ds14050 2013-03-18
  • novice123

    novice123 - 2013-03-19

    ご指摘の通り、引きずってしまいます。
    コントロールプロセスのカレントディレクトリがシステムディレクトリになっている理由が不明だったのですが、これが理由ですね(システムディレクトリは削除されないので、改名・削除を気にしなくてよい)。

    コントロールプロセスのカレントディレクトリはシステムディレクトリのままにして、再度検討してみます。

     
  • novice123

    novice123 - 2013-03-19

    共有メモリにカレントディレクトリを保持する変数を追加し、コントロールプロセスから新規作成、開くを選択したときに保持している変数を渡すようにしました。

    カレントディレクトリの保持の方法は下記の通りです。

    1.コントロールプロセス起動時
    コントロールプロセスが共有メモリを初期化するタイミングで、カレントディレクトリを保持する変数に現在のカレントディレクトリを無条件で設定します。
    (ノーマルプロセスからコントロールプロセスを間接起動orコントロールプロセスを直接起動しているかが判断できない)

    2.ノーマルプロセス起動時
    共有メモリに保持しているカレントディレクトリがシステムディレクトリと同じであれば、カレントディレクトリを保持する変数に現在のカレントディレクトリを上書きします。

    デバッグ中に気が付きましたが、ノーマルプロセスから起動されるコントロールプロセスのカレントディレクトリはシステムディレクトリになりますが、"sakura.exe -NOWIN"でコントロールプロセスを直接起動されるとカレントディレクトリはシステムディレクトリになりません(当たり前ですが)。
    もしかしたら、コントロールプロセスは直接起動できないようにしたほうがよいかもしれません。

     
  • novice123

    novice123 - 2013-03-19

    もしかしたら、コントロールプロセスは直接起動できないようにしたほうがよいかもしれません。

    別途パッチを作成しました。
    http://sourceforge.net/p/sakura-editor/patchunicode/359/

     
  • ds14050

    ds14050 - 2013-03-20

    一番最初に起動した sakura.exeの作業フォルダをリネームしたときにコントロールプロセスからの起動に失敗しました。

    神楽さんの要望を前提から整理します。BBSの投稿内容と食い違う部分は自分で試して理解・解釈した結果ですが、そのせいでご本人の本意から外れていたらごめんなさい。傍観者ですから理解が浅ければ指摘してください。

    1. ファイルオープンダイアログの初期フォルダ指定オプションはエディタプロセスのワーキングディレクトリを指定するものではない。
    2. ショートカットから起動したエディタウィンドウはショートカットで指定した作業フォルダを依然として使っているし、コントロールプロセスが作成した新規エディタのワーキングディレクトリは依然 MRUを元にしている。
    3. 初期フォルダ指定オプションでカレントディレクトリ以外を指定している場合、コントロールプロセスが作成した無題ドキュメントが存在しているあいだ、まったく無縁の MRUディレクトリがロックされる。

    この 3番が問題にされているのではないかと思います。ユーザーが起動したのでない、初期フォルダ指定が効いている無題ドキュメントのワーキングディレクトリを再考してほしいと。

     
  • ds14050

    ds14050 - 2013-03-20

    トレイアイコンをダブルクリックするばかりで気付きませんでしたが、神楽さん自身はコントロールプロセスが開くファイルオープンダイアログも初期フォルダ指定を尊重しろ、と言っているのですね。それはもっともですが、訴えられている問題の原因ではないと思います。

    novice123さんは要望を文字通り受け取りコントロールプロセスに初期フォルダ指定を尊重させようとしていたのだと、ここに至って理解しました。そして、コントロールプロセスにとって「初期フォルダ指定=カレントフォルダ」という設定が「初期フォルダ指定=システムディレクトリ」と同じになってしまうことに苦慮されていたのでしょうか。

    「初期フォルダ指定=カレントフォルダ」という指定には、初期フォルダは親プロセスから継承するという意味が含まれていると考えます。コントロールプロセスの直接の親はひとつだけですが、すべてのエディタプロセスのために働くことからそれらすべてを親とみなせば、MRUフォルダをカレントフォルダとするのは自然なことです。MRUフォルダはエディタプロセス全体の最後の痕跡ですから。これがこれまでの挙動の勝手な解釈ですが、ユーザーの望みと一致しているかは不明です。コントロールプロセスにとって初期フォルダ指定の「カレントフォルダ」と「最近使ったフォルダ」が同じでいいのかという疑問もわきます。これに関して結論はありません。

     

    Last edit: ds14050 2013-03-20
  • novice123

    novice123 - 2013-03-21

    コントロールプロセスからの起動に失敗する箇所は修正しました。

    ユーザの意図しないカレントディレクトリでプロセスを生成しないように、最初に起動したカレントディレクトリ(作業フォルダ)でプロセスを生成することでディレクトリがロックされる問題を回避しています。

    皆さんの要望に対応できたと思っているのですが、問題があればご指摘ください。

     
  • Moca

    Moca - 2013-06-06

    カレントディレクトリの引き継ぎができなくなってますね。
    引き継ぐときは
    ファイルAから新規作成するとファイルAのディレクトリ。
    ファイルBから新規作成するとファイルBのディレクトリ。
    で開いてほしいです。

     
    • novice123

      novice123 - 2013-06-09

      ファイルダイアログの初期位置

      ・カレントフォルダ
      外部からsakura.exe起動したときの作業フォルダをファイルダイアログの初期位置にします。
      "カレントフォルダ"より"作業フォルダ"の方が名称としてはふさわしいです。

      ・最近使ったフォルダ
      最近使ったフォルダを参照。従来のサクラエディタの動作に近いです。

      ・指定フォルダ
      ユーザ指定したフォルダ。

      "最近使ったフォルダ"に設定にすれば、ご要望の動作になると思いますが、
      厳密な意味でのカレントディレクトリはm_szCurrentPathに設定した値になります。
      従来の動作を残すのであれば、
      新規作成時のカレントディレクトリ設定は、別オプション対応のほうがいいのかもしれません。
      (1)起動元のsakura.exeのカレントディレクトリ引継ぎ
      (2)ユーザが起動したsakura.exeの作業フォルダ引継ぎ

       
      • Moca

        Moca - 2013-06-09

        AとBは同時に起動しているという意味です。
        で、かつ、トレイじゃなくて編集ウィンドウから起動した場合のことでした。
        CControlTray::OpenNewEditorは編集ウィンドウでも使うので、bパッチのようにpszCurDirを無視されると泣きます。
        紛らわしくてごめんなさい。
        トレイから開く場合は、そんな感じでいいと思います。
        下のcパッチのようにカレントフォルダのとき、MRUFolderを追跡しなくてもいいと思います。

         
  • Moca

    Moca - 2013-06-06

    ・「指定フォルダをカレントで開く」もできるようにしてみました
    トレイの場合は、MRU=カレントディレクトリになるようにMRUFolderで細工しました
    [patchunicode:#385]も当てることを想定しています。
    ご意見募集中です。

     

    Related

    PatchUnicode: #385

  • Moca

    Moca - 2013-06-09

    ・カレントディレクトリ
    のときは、最後に「アクティブ」にしたウィンドウのカレントディレクトリを採用する
    というのはどうでしょうか。
    これだと、トレイから開くのと編集ウィンドウから開くので差がなくなります。
    現状と編集ウィンドウ側の動作は互換性が保てます。

    bパッチの「外部からsakura.exe起動したとき」だと情報が古いとおもいます。
    閉じて開くや、タスクバーに登録してあるアイコンから無題で起動してファイルを開いた場合など、
    特に後者は、プログラムのあるフォルダに固定されてしまい、使い物になりません。
    コマンドプロンプトとかから起動するにしても、
    C:>sakura C:\folder1\test.txt
    と起動すると、次新規作成するとtest.txtのフォルダではなく、もちろん「C:\」にするんですよね?
    関連づけで起動したときは、最後に関連づけから開いたフォルダになって、
    サクラ上から閉じて開く/別のファイルを開いても、あくまで、最後にダブルクリックしたフォルダになると。

    スタートメニュー/デスクトップとかに「サクラ(作業1)」「サクラ(作業2)」とかショートカットを作って
    それぞれ、作業フォルダを割り振るとかなら、その方がいいこともあるかもしれませんね。
    (作業指定が1つなら、「指定フォルダ」でだいたい代用可能)
    それはそれで有用かもしれません。
    ただそれなら、いままでとだいぶ動きが違うので4つめのオプションにしてほしいです。

    bパッチでも神楽さんの要望とも違うと思います。
    最後に関連づけで開いたファイルのフォルダがロックされてしまいます。
    「指定フォルダ」を選んだときは、新規無題ウィンドウのカレントディレクトリを「指定フォルダ」にしてほしいんだと思います。
    サクラ上のウィンドウ起動時だけでいいのか、外部から起動の場合や閉じて無題の扱いはどうするのかとか気になる点はありますが。

    ・タグジャンプや外部コマンド実行のベースになるアクティブなディレクトリ
    ・ファイルを開くダイアログのディレクトリ(上と同じでもよい)
    ・ロックしないようにする実際のカレントディレクトリ
    を分離できるならそのほうがいいけど難しそうです。
    長文しつれいしました。

     
  • novice123

    novice123 - 2013-06-10

    ・カレントディレクトリ
    従来通りの動作にしたいと思います(trunk2_inidir_c.patchで変更済み)。

    ・コントロールプロセスのカレントディレクトリの扱い
    最後に「アクティブ」にしたウィンドウのカレントディレクトリにしたいと思います。
    つまりは、"カレントディレクトリ=最近使ったフォルダ"ですね。

    共有メモリにカレントディレクトリを保持する必要がなさそうなので、ソースコードを見直してみます。

     

    Last edit: novice123 2013-06-10
  • novice123

    novice123 - 2013-06-10

    先に[patchunicode:#385]commitして頂いても問題ないと思います。
    お手数をおかけして申し訳ありませんでした。

     

    Related

    PatchUnicode: #385

  • novice123

    novice123 - 2013-06-11

    ・共有メモリにカレントディレクトリを保持するのをやめました。

    ・最近使ったフォルダを選択したときに、存在するフォルダが見つかるまでスキャンするようにしました。
    CControlTray::OnNewEditor()で行っていた処理をCSakuraEnvironment::GetDlgInitialDir()に移動しました。

    ・カレントディレクトリの固定は別件にしたいと思います。

     
  • novice123

    novice123 - 2013-06-16

    [r3152]でcommitしました。

     

    Related

    Commit: [r3152]

  • Moca

    Moca - 2013-06-16
    • status: open --> closed
    • Group: -->
     

Log in to post a comment.

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.