ZEditorの修正案
カーソル位置の挙動に関する修正案
とりあえずバイナリとパッチのみ。説明は後で…(^_^; (パッチ見て下さい…)
ZEditorの掲示板の方でやりとりしてるのを実際に実装してみました。
バージョン2.0.5ベースです。
Ver2.0.6で対応して頂けたようなのでバイナリの公開を中止します。
バイナリは
tar zxvf zeditor2.0.5-y1.tar.gz
で展開して
/opt/QtPalmtop/bin/zeditor
と置き換えて下さい。
この際オリジナルのファイルは必ずバックアップしておいて下さい。
オリジナルと区別するためにキャプションを変えているのでその部分も
パッチに含まれています。
実際に変更したい処理とはもちろん関係ありません。
修正内容について
不具合その1
- 症状
他アプリケーションからファイルを指定されて開かれた場合(qcopメッセージ等でsetDocumentスロットで
ファイルが指定されて開かれた場合)に前回のカーソル位置が正しく復元しない。(高速起動OFF時)
※高速起動ONでもカーソル位置が復元しないように見えますが、これはこの不具合とは原因が別で"不具合その2"が原因です。
なぜ高速起動時の不具合は別かというと、高速起動時にはmain()はコールされないのでこの症状の処理内容とは合致しないからです。
- 処理内容
ファイル指定でZEditorが起動された場合に、setDocumentスロットでopenLastFile()が呼ばれて
カーソル位置が復元された後でwrap_this()がコールされてしまっているために、
カーソル位置が(0,0)にセットされてしまいます。
これはshowMainDocumentWidget()のコール中にsetDocumentスロットはコールされるので
main()で
a.showMainDocumentWidget(&e);
の後に
e.wrap_this();
をコールしているため、カーソル位置復元後にカーソル位置がリセットされるという処理内容になってしまっています。
- 対処方法
main()での処理順を変更し
e.wrap_this(); a.showMainDocumentWidget(&e);
としました。
不具合その2
- 症状
高速起動時のアプリケーション終了で前回のファイルの状態が更新されていないため、
カーソル位置の復元の挙動がおかしくなっている。
- 再現手順
- 1) ZEditorを高速起動に設定する
- 2) 適当なファイルを開く
- 3) カーソルを適当に移動して閉じる
- 4) 他アプリケーションから同じファイルを指定して開く
- ここでカーソルは2)で開いた時の位置になっている。
- 5) カーソルを移動せずに閉じる
- 6) もう一度他アプリケーションから同じファイルを指定して開く
- 今度は3)で閉じた位置にカーソルが移動している
- 7) この状態で閉じる、開く(他アプリケーションから)を繰り返すと開くたびにカーソルが移動してしまう
体感的には前々回のカーソル位置が復元されたような状態となってしまいます。
- 処理内容
具体的な処理内容としては、
3)でファイルを閉じた時にはカーソル位置の記憶は行われません。
が、しかし4)で他アプリケーションからファイル指定で起動された場合には
- openLastFile()の最初でカーソル位置が取得され(この時3)で記憶されていないので2で開いた時の位置が取得される)
- その後openFile()で3)で閉じた時のカーソル位置が記憶されます
- openFile()から戻ってきた後でopenLastFile()内でカーソル位置復元の処理があるために2)で開いた時の位置が復元されてしまいます。
とここまで書いたところで別の対処方法も思いついてしまったので別途記載します。
高速起動時の終了ではオブジェクトの解放は行われず、closeEvent()が呼ばれるだけなので、
closeEvent()でsetLastFile()をコールし、前回の状態を記憶するべきではないかと私は考えます。
※何故こう考えるかというと、高速起動ではない場合のアプリケーション終了時にはsetLastFile()が呼ばれ前回の状態が記憶されるので、高速起動でのアプリケーション終了も同じように扱うべきだと考えるからです。
高速起動On/Offで挙動が違ってしまっていたら厳密には高速起動に対応しているとは言えないと思います。
- 対処方法
現在はwriteConf()でsetLastFile()をコールしていたが、これだと高速起動OFFの場合の終了時には前回の状態を記憶するが、
高速起動ONの状態では前回の状態を記憶しなくなってしまいます。
- そのため、まず closeEvent() で setLastFile()を呼ぶようにしました。
- これに伴い、writeConf()での setLastFile()の呼び出しをやめるように変更しました。
これは、writeConf()が呼ばれるタイミングというのが、オプション変更時とオブジェクト解放時だったので、
オプション変更時には前回の状態を更新する必要は無いと考え、アプリケーション終了時(高速起動にも対応するためにcloseEvent())に前回の状態を記憶する処理にしているためです。
- 対処方法(別案)
今回私の行った対処方法では、アプリケーション終了時(高速起動含む)に前回の状態を記憶するという処理内容にしましたが、
openLastFile()での処理順を変更する事でも対処可能かと思われます。
// -------------------------------- change path, col, line !!! openFile( listF.path( index ) ); int col = listF.col( index ); int line = listF.line( index ); int color = listF.color( index );
上記の様にopenFile()をコールした後、カーソル位置を取得することでも一応この不具合に対処する事は可能です。
しかし、これは本質的な対処では無いと私は考えますので、closeEvent()で前回の状態を記憶するという処理の方が良いと思います。
コメント
[[#rcomment]]