Qtopia 1.6.0 と Opie cvs20030318


タイトルのまんまである。 Opie 側の代表に snapshot 20021122 でなく cvs (2003 3/18 時点) を使うのは、 でたばっかの Qtopia 1.6.0 に対して時期的に古い snapshot は公平でないということによる。

とくに qtopia 1.6.0 はノーマルの libqte 2.3.4 では動かず、 opie cvs から override patch を当てなければならなかった (もしくは Qt/Embedded 2.3.4 の cvs snapshot を使う?) のだから、override patch を含まない opie snapshot 20021122 では不公平がすぎるというものである。

もっとも opie cvs のものと opie snapshot で本質的な違いは見出せなかった。 Qtopia 1.6.0 が叩いてる override patch のコードは縦横動的切替えのためにあり、 それを必要とする opie cvs も同様のことができるとふんで動かしてみた opie cvs だけど、 こちらはそういうことはできなかった。

なお、

このページでも OpenZaurus は使ってない。 それぞれに付属してくるアプリ以外はおおむね Debian woody のものである。 てか、OpenZaurus のバイナリを使ったことはないし、これからもたぶん使うことはない。 ソースとの対応がとれないバイナリなんて。

libqte 2.3.4

まず公平のために足場となる Qt/Embedded 2.3.4 を同じにする。 足場まで切替えるのめんどーだし ...。

Qtopia 1.5.x, Qtopia 1.6.0, Opie snapshot-20021122, Opie CVS などと Qt/Embedded の上で動く似たようなものがいくつかあるが、 「似たようなもの」であって「同じもの」ではなく、 それぞれに付属する Qt/Embedded の config file (qconfig-qpe.h) は少しずつ違う。 3/16 でハマった件も真の原因はおそらくこのあたり。

パッチは opie-cvs から unpolish, style, setpalette, listview, override, gfxraster, simpad をあてた。つまり、FAIL しないやつをすべて。

Config file としては両者を混ぜ合わせて こういうの を使う。 これで libqte が 2.3.4 あたりでサポートした QWIZARD, QMEMORYFILE の振舞いが qtopia や opie の期待するものになる。

... ことになってんだけどさ、config file 中で QMEMORYFILE を外すことを要求していながら 実際のアプリでは「qmemoryfile を作るよ〜」なるメッセージが stderr に出てくるのは どういうわけだ > qtopia 1.6.0

qtopia-free-1.6.0 の build

Beta 期の snapshot の build ならともかく、 正式版がでたあとの今は build に 開発メモ ほどの苦労はない。libqte を build したあとで、
# export QTDIR=/home/src/Qt/arm/qt-2.3.4
# export QPEDIR=/home/src/Qt/arm/qtopia-free-1.6.0
# cp /opt/Qtopia/bin/uic ${QTDIR}/bin
# cd ${QTDIR}/include 
# ln -sf ${QPEDIR}/include/qpe qpe
# ln -sf ${QPEDIR}/include/qtopia qtopia
# cd ${QPEDIR}/src
# ./configure -platform linux-sharp-g++
# make
ていどで素直に make できる。... はずなんだが、ちょっとバグってんな。 アプリの make 時になぜか make したばっかのライブラリのインストール先をみてくんない。
--- src/configs/linux-sharp-g++-shared~ Fri Mar 14 01:59:59 2003
+++ src/configs/linux-sharp-g++-shared  Tue Mar 18 22:57:06 2003
@@ -25,8 +25,8 @@
 SYSCONF_LFLAGS_X11     = 
 SYSCONF_LIBS_X11       = 
 # Qt, Qt+OpenGL
-SYSCONF_LFLAGS_QT      = -L$(QTDIR)/lib
-SYSCONF_LIBS_QT                = -lqte$(QT_THREAD_SUFFIX)
+SYSCONF_LFLAGS_QT      = -L$(QTDIR)/lib -L$(QPEDIR)/lib
+SYSCONF_LIBS_QT                = -lqte$(QT_THREAD_SUFFIX) -lqtopia
 SYSCONF_LIBS_QT_OPENGL = 
 # OpenGL
 SYSCONF_LFLAGS_OPENGL  = 
てなことはしておく必要があった。

Qtopia 1.6.0

実機につっこんで動かしてみた。 例によって jail 環境なので速度の評価はあんまりアテにならない。
日本語入力
こちらも opie と同じく libCRIM による日本語手書き認識はちゃんと使えた。 ただ、QMulitiLineEdit/QLineEdit 内の仮名漢字変換のほうはダメ。 libqte 2.3.4 必須になっていてシャープの libqte 2.3.2 (いちいち「シャープの」と修飾するのがわずらわしくなってきた。以下 2.3.2j と略記) では動かないから。
縦横切替え
本家のスクリーンショット開発メモのスクリーンショットを見ていただけでは分からんが、 さりげに縦横即時切替えが入った \^_^/ つーても切り替わるのに 7 秒くらいかかるけど。 Landscape 時にアイコンを横に 4 つ並べるのもナイス:
qpe160 in landscape

ただし、これがまともに使えるのは英語モード時のみで、 言語切替えと併用するとボロボロになる。横に 2 つしか置かなかったり、落ちたり。 文字幅でも計算してんのかな ... どーせ C700 由来のコードだろーになんで動かんのや ??

できれば、ついでに言語切替えも即時切替えに対応してくれ (今は 1.5.0 と同じく qpe を立ち上げなおしている)。

動作速度とメモリ
Opie よりは少しマシだが、起動時間が 10 秒前後というのは、ナンだな。 使うつもりならやっぱり高速起動オプション必須。quickexec のほうは未評価。

占有メモリは 1.5.0 の時よりもやや減ってみえるが、そんなこともないんだろう。 ま、増えてるにしても減ってるにしても差は気にするほどではなさそうだ。

アプリ
あいかわらずお絵描きソフトは付属しない。Sketches of Q か OPIE の DrawPad 頼みってことか。 FileSelector は 1.5.0 と同じく、内部的に ls -lR するタイプで、 ~/Documents/ が大きい場合に Text Editor などで起動時間が冗談にならない可能性がある。

個々のアプリは 1.5.0 と本質的な違いは見出せなかった。 まあ 3 分くらいしか触ってないわけだが ...。

OPIE cvs20030318

日本語関連はすでに書いた。 縦横切替えは cvs の最新版といえど qtopia 1.5.0 と同レベルなので書くほどのことはない。
動作速度とメモリ
起動はともかく遅い。10 〜 20 秒。高速起動しないものは使うなと言ってるに等しい。 まあ shared library が色々増えて脹れあがったしねぇ。 事実上 quickexec 頼みかも(未評価)。 libCRIM を諦めれば gcc3 で make できて objprelink がまともに効くようになるが、 やってみてもたいして速度が向上したりはしなかった。 動き出せば個々の widget の反応は qtopia よりいいかも(気のせいかも)。まだ測ってないのでなんとも。

占有メモリは Qtopia 1.5.0/1.6.0 に対して +2MB は覚悟しないといけなさそう。 qpe 本体 ( サーバの /usr/local/opie/bin/qpe のことだ。 何故か /usr/local/opie/bin/opie とは言わない) は似たようなもんなんだが、どこでどう食ってるのかは不明。

アプリ
多くの opie 由来のアプリが qtopia 環境でも使われてることを思えば、 アプリで差別化することはできない。 ただ、3 つほど本質的に違う点がある。

QTabWidget のデフォルト
Style/Skin のカスタマイズに関しては qtopia 1.6.0 は opie の敵ではない。 フォント切りかえが出来るようになった以外は qtopia 1.5.0 と同じな qtopia 1.6.0 と違い、 opie では (有償版の qtopia にしか含まれてないとおぼしき) aqua style を含み、さらに QTabWidget のデフォルトの切替えが外からできるようになった:
Tab Setting
タブのデフォルトを上に出すか下に出すかを切替えられる (という意味だよねぇ。動作的にはそういう雰囲気なんだが、コード読んでないので詳細不明)。 ちなみに上の例はタブが下に出ている図 (cf. Qtopia 1.6.0 の開発メモのスクリーンショット中の Appearance 画面ではタブが上に出てるな)。

Tab を下に出して何が嬉しいかって、片手で操作するのにいい。 フルスクリーン使う QTabWidget の場合でタブに指が届く。 QTabWidget は qtopia/opie でなく libqt/libqte に含まれる widget だから qtopia/opie 間で差があるはずはないんだが、 qtopia ではまだサポートされていない。

Tab でない、drop down menu 形式にすることもできる:

Drop down tab
が、... さすがにデフォルトをこーしてしまうのは、 アプリ側のデザインの都合とカチあうんではなかろうか。 そもそもこの Appearance でのデザインそのものがカチあってるよーな気がするし。 Style/Font/Colors... を選ぶ drop down menu が無用に長く感じるとゆー意味で。

FileSelector
Opie は qtopia のものと違い、FileSelector が ls -lR しない。 TextEditor の FileSelector 画面もかなりまともなものになる (下の afm のものと本質的に同じ)。 いや、qtopia 1.5.0j ならともかく qtopia 1.5.0 も 1.6.0 のも使う気せんかったもんねぇ。
Launcher 最下段にならぶアイコンの扱い
ふたつ褒めたが最後のはダメな点(笑)。

アプリを右上の「x」ボタンで close しても最下段左にならぶ当該アプリのアイコンは消えない。 そのアイコンを(長めに?)タップすることで初めて消える。 これはつまり、close したアプリに対して最下段アイコンを通じてなにかしらの操作ができる ... か、できるようにすることを目的とした仕様変更のはずだが、 アイコンを消す以外のことは出来ないうえに 短クリックなどなにかしらの動作がわりあたってるとおぼしき操作をすると qpe ごと落ちてくれる -_-;;
これ、実はバグだったよーだ。今は qtopia のと同じふつーの動作に戻っている。

以上の 3 点は前提として、個別のアプリを掲げるとすれば、 Advanced File Manager につきる:

Advanced FM
ディレクトリを複数ひらける、速い、まとも!
Zaurus Software Index にあるから qtopia 環境でも使える風。 ただ、なんかインストールにごちゃごちゃと煩い注釈がついてるみたいだけど。

アイコン
わりとどーでもいいことかもしれないが、 snapshort 20021122 の時はアイコンが Qtopia 1.5.0 のとほとんど同じものだったのに、 cvs 20030318 の時点ではかなり自前のもの (kde 3.1 のもの?) に置き換えられている。 一つめのが snapshort 20021122 で二つめのが cvs 20030318 の時点:
snapshot 20021122 cvs 20030318

つまり、 本家スクリーンショット も最新追従しとらんのだな ...。

ところで、気色悪かった Appearance の icon が変わったと思ったら、別のやつが目玉になった。 wellenreiter とかいうやつ。 ったく。

例によって追記

SD に opie を載せたところ、各アプリの起動時間は 5 〜 8 秒になった。 qtopia 1.5.0j ROM 1.10J よりは速く、1.20J よりはちょっと遅い位? けっこ許せるか。 なお、strace で中を覗くかぎり、widget っつーか qpe サーバの応答は qtopia より 20% くらい速くなっていた。やるじゃん > OPIE.

ニュース的な追記 (Mar. 26, 2003)

遂に opie cvs に縦横即時切替えが入った (core/applets/rotateapplet/)。

もっとも、この関係で default rotation という概念が入り、これがまた A300 でバグっている (部分的に A, B, C への対応が入っている; cf. libopie/odevice.cpp) ため、かえって A300 ではまともに動作せんハズではあるし、 landscape でヨコ 3 つなのはそのままらしい。 なんつーか qtopia 1.6.0 の挙動を見習う気はないか ──

などと書いていたのだが、ちゃんとヨコ 4 つになった。すまんかった > OPIE.

Rotation applet

やっぱり追記

FileSelector だが、opie も ls -lR してた(泣)。 Opie の textedit の open dialog は諸悪の根源たる Global::findDocuments() を使わなくなっていたため、上述のように誤解した ...。
FileSelector, OFileSelector ともども 内部的に Global::findDocuments() を叩いているため、 コード的に qtopia 1.5 からあまり変わってない showimg の立ち上がりや drawpad の import などでは凄まじい時間がかかる。

これの対処法ってのもいちおうあって、 autocheck = 0 と一行だけ書いた .opiestorage.cf を mount point のディレクトリに置くと、その partition は見なくなる (library/global.cppcheckStorage() 及び core/launcher/launcher.cppLauncher::loadDocs()):

# cd /home
# echo 'autocheck = 0' > .opiestorage.cf
# cp .opiestorage.cf /mnt/card
これで opieplayer も showimg も openfile 周りが格段に速くなった (別に褒めてない。単にようやくまともになった、というだけのことだ)。 Global::findDocuments() に openFile のすべてを頼ってるタイプのアプリでは ファイルが開けなくなるが、opieplayer や showimg では ファイル名を指定して開くことができるので関係ない。 てか、Global::findDocuments() に全てを預けるようなタコアプリは捨て捨て。

もちろんこれは opie だけで、qtopia 1.x では効かない。
かわりといってはなんだが qtopia 1.6.0 では .Qtopia-ignore というファイルを置いておくと、 そのディレクトリから下をみなくなるようになっている (library/applnk.cppDocLnkSet::findChildren(); opie でも使えるけど)。
ったく、わかってんならちまちまと小細工せず、 抜本的にどーにかしようというつもりはないんかな ... core/launcher/launcher.cpp に、

/** This is a HACK....
 * Reason: scanning huge mediums, microdirvers for examples
 * consomes time. To avoid that we invented the MediumMountCheck
 *
 * a) the user globally disabled medium checking. We can ignore
 *    all removable medium
 * b) the user enabled medium checking globally and we need to use this mimefilter
 * c) the user enabled medium checking on a per medium bases
 *  c1) we already checked and its not ask again turns
 *  c2) we need to ask and then apply the mimefilter
 */
なんて書いてないでさ ...

ニュース的な追記、その 2.

4 月頭に A300, B500, C700 への対応コードが入った。opie のソース無修正で動く。 もっとも B の名前を B600 と誤記してるのはかわらないし、 A300 のサウンドへの対応もまだまだ (A だけ half duplex だからなぁ ...) なのもかわってない。 gcc の責任もあるのかどーか、サウンド(特に VMemo) を叩くと signal 11 やら signal 15 やら、危なっかしいエラーでまくりである:
# dmesg
 (中略)
r7 : ffffffff  r6 : ffffffff  r5 : 00000000  r4 : 00008201
r3 : 00000000  r2 : 00000036  r1 : 0000003c  r0 : bffff370
Flags: nzCv  IRQs on  FIQs on  Mode USER_32  Segment user
Control: 397F  Table: A14D8000  DAC: 00000015
signal = 11
pc : [<0008e3fc>]    lr : [<4036b07c>]    Not tainted
sp : bffff94c  ip : 000731c0  fp : bffff964
r10: 405f32cc  r9 : 0009adec  r8 : 00005124
r7 : 00005120  r6 : 00000000  r5 : 000a2490  r4 : 0009ba58
r3 : 4074bd80  r2 : f7ffffff  r1 : 000a2460  r0 : 0009ba58
Flags: nzCv  IRQs on  FIQs on  Mode USER_32  Segment user
Control: 397F  Table: A530C000  DAC: 00000015
これでカーネルが死ぬことはないようだが、 qpe が死ぬことがあるので実用上は Vmemo は untouchable である。

C700 のコードも on-the-fly rotation 周りに「まだだよん」とコメントされてる部分があったり。 Input style/view style の切替えのあたりが不安だ(笑)。

「やっぱり追記」に追記

OFileSelector, OFileDialog の挙動については 6/10 の項も参照のこと。


[日記へ] [目次へ]