ラベル 艦メモ の投稿を表示しています。 すべての投稿を表示
ラベル 艦メモ の投稿を表示しています。 すべての投稿を表示

2013年12月29日日曜日

Mac版 Qt 5.2のWebViewはPlugin機能が無効になっていた件

未だに年賀状が倒せていない隠者です。年の瀬も近づいて来ていますが、皆様進捗どうですか?

さて、先週の土曜日に、Qt勉強会 #6 @Tokyoに参加して来ました。Qt 5.2も出たことなので、艦メモをビルドしようとがんばったのですが、なぜかFlashがインストールされていません扱いでした。Mac Book Proではソースからビルドしていたのですが、MBAでは横着して5.2の正式版はパッケージから入れており、Beta版のソースコードも削除した直後で、ビルドのできないSrc(インストーラからinstallできるけど、configureなどは入っていない)はあるものの、デバッグまではできませんでした。

一応、勉強会では時間いっぱい粘って、WebKitのおおよそのソースコード構成は把握してまして、年末休みに突入してから、こちらでもない、あっちでもないとあれこれ彷徨いましたが、何の事はないそもそもPluginが有効になってない事がわかりました。

WebKitは、様々なアーキテクチャや下回り用に、コードの一部をMakefileで切り替えて使うように構成されています。今回問題になったのは、PluginPackageの下回りの切り替え部分でした。

通常、Mac版では

qtwebkit/Source/WebCore/plugins/mac/PluginPackageMac.cpp

が使われるべき所が、

qtwebkit/Source/WebCore/plugins/PluginPackageNone.cpp

のコードが使われていました。このコードは、プラグイン未使用環境用で処理の実装はなく、失敗を返すように実装されています。これでビルドされている限り、Pluginは利用できなくなります。


qtwebkit/Source/WebCore/Target.pri を読むと


 enable?(NETSCAPE_PLUGIN_API) {
    SOURCES += plugins/npapi.cpp
    unix {
        mac {
            SOURCES += \
                plugins/mac/PluginPackageMac.cpp
            OBJECTIVE_SOURCES += \
                platform/text/mac/StringImplMac.mm \
                platform/mac/WebCoreNSStringExtras.mm \
                plugins/mac/PluginViewMac.mm
        } else {
            SOURCES += \
                plugins/qt/PluginPackageQt.cpp \
                plugins/qt/PluginViewQt.cpp
        }
    }
      :
 } else {
     SOURCES += \
         plugins/PluginPackageNone.cpp \
         plugins/PluginViewNone.cpp
 }


となっています。つまり、NETSCAPE_PLUGIN_APIが有効になっていないわけです。
ごそごそっと検索かけると、この辺の定義は以下で行われていました。
qtwebkit/Tools/qmake/mkspecs/features/features.prf


    # Nescape plugins support (NPAPI)
    xlibAvailable() {
        WEBKIT_CONFIG += \
            netscape_plugin_api \
            use_plugin_backend_xlib
        # WebKit2
        WEBKIT_CONFIG += \
            plugin_architecture_x11 \
            plugin_process
    } else: unix|win32-*:!embedded:!wince* {
        WEBKIT_CONFIG += netscape_plugin_api
        # WebKit2
        WEBKIT_CONFIG += plugin_architecture_unsupported
    } else {
        WEBKIT_CONFIG += plugin_architecture_unsupported
    }

Macの場合、xlib扱いにはなっておらず、その次のunix:!embedded:!wince* に引っかかるはずなのですが、ここに入らずにelseに入っていました。

!embedded {
    message("!!!!! embedded? !!!!")
}

というのを追加してビルドするとメッセージが出力されるじゃないですか。どうやら、誰かがembeddedを立てているようです。そのせいで、netscape_plugin_apiがWEBKIT_CONFIGに追加されない状態でビルドされていました。

本来はembeddedを落とすのが正しい対処なのですが、誰が立ててるのか見当たらないというか、grepすると多く出過ぎるので、とりあえず暫定的に以下を追加しました。

} else : mac {
    WEBKIT_CONFIG += netscape_plugin_api
    WEBKIT_CONFIG += plugin_architecture_unsupported
}

そうすると今度は、Source/WebCore/platform/qt/FileSystemQt.cpp がビルドエラーじゃないですか・・・・なんと言う嫌がらせ。

調べてみたら、原因はこれでした。

  • Q_WS_MAC is no longer defined in Qt 5.
そう、no longer definedとされていた、Q_WS_MACが定義されなくなってます。

でも、ソースコードでは、未だに数カ所使われていました。そのうち以下の場所でエラーに成ってくれました。エラーでなかったら気がつかないだろう、それ。



 bool unloadModule(PlatformModule module)
 {
 #if defined(Q_WS_MAC)
     CFRelease(module);
     return true;
 #elif defined(Q_OS_WIN)
     return ::FreeLibrary(module);
 #else

 #ifndef QT_NO_LIBRARY
     if (module->unload()) {
         delete module;
         return true;
     }
 #endif
     return false;
 #endif
 }


というわけで、複数ある、Q_WS_MACをQ_OS_MACに置き換える必要がありました。
変更箇所は多いので、diffで上げておきます。


diff --git a/Source/WebCore/page/qt/EventHandlerQt.cpp b/Source/WebCore/page/qt/EventHandlerQt.cpp
index f45f81d..885fcde 100644
--- a/Source/WebCore/page/qt/EventHandlerQt.cpp
+++ b/Source/WebCore/page/qt/EventHandlerQt.cpp
@@ -52,7 +52,7 @@
 namespace WebCore {
-#if defined(Q_WS_MAC)
+#if defined(Q_OS_MAC)
 const double EventHandler::TextDragDelay = 0.15;
 #else
 const double EventHandler::TextDragDelay = 0.0;

diff --git a/Source/WebCore/platform/FileSystem.h b/Source/WebCore/platform/FileSystem.h
index e1d5b7e..b5fcfa6 100644
--- a/Source/WebCore/platform/FileSystem.h
+++ b/Source/WebCore/platform/FileSystem.h
@@ -48,7 +48,7 @@
 #endif
 #endif
-#if USE(CF) || (PLATFORM(QT) && defined(Q_WS_MAC))
+#if USE(CF) || (PLATFORM(QT) && defined(Q_OS_MAC))
 typedef struct __CFBundle* CFBundleRef;
 typedef const struct __CFData* CFDataRef;
 #endif
@@ -80,7 +80,7 @@ typedef GModule* PlatformModule;
 #elif PLATFORM(EFL)
 typedef Eina_Module* PlatformModule;
 #elif PLATFORM(QT)
-#if defined(Q_WS_MAC)
+#if defined(Q_OS_MAC)
 typedef CFBundleRef PlatformModule;
 #elif !defined(QT_NO_LIBRARY)
 typedef QLibrary* PlatformModule;

diff --git a/Source/WebCore/platform/qt/FileSystemQt.cpp b/Source/WebCore/platform/qt/FileSystemQt.cpp
index b5d0096..1cd8e2c 100644
--- a/Source/WebCore/platform/qt/FileSystemQt.cpp
+++ b/Source/WebCore/platform/qt/FileSystemQt.cpp
@@ -242,7 +242,7 @@ int writeToFile(PlatformFileHandle handle, const char* data, int length)
 bool unloadModule(PlatformModule module)
 {
-#if defined(Q_WS_MAC)
+#if defined(Q_OS_MAC)
     CFRelease(module);
     return true;

diff --git a/Source/WebCore/platform/qt/RenderThemeQStyle.cpp b/Source/WebCore/platform/qt/RenderThemeQStyle.cpp
index f85a75b..81f9278 100644
--- a/Source/WebCore/platform/qt/RenderThemeQStyle.cpp
+++ b/Source/WebCore/platform/qt/RenderThemeQStyle.cpp
@@ -117,7 +117,7 @@ RenderThemeQStyle::RenderThemeQStyle(Page* page)
 {
     int buttonPixelSize = 0;
     m_qStyle->getButtonMetrics(&m_buttonFontFamily, &buttonPixelSize);
-#ifdef Q_WS_MAC
+#ifdef Q_OS_MAC
     m_buttonFontPixelSize = buttonPixelSize;
 #endif
 }
@@ -228,7 +228,7 @@ void RenderThemeQStyle::adjustButtonStyle(StyleResolver* styleResolver, RenderSt
     // Ditch the border.
     style->resetBorder();
-#ifdef Q_WS_MAC
+#ifdef Q_OS_MAC
     if (style->appearance() == PushButtonPart) {
         // The Mac ports ignore the specified height for <input type="button"> elements
         // unless a border and/or background CSS property is also specified.
@@ -239,7 +239,7 @@ void RenderThemeQStyle::adjustButtonStyle(StyleResolver* styleResolver, RenderSt
     FontDescription fontDescription = style->fontDescription();
     fontDescription.setIsAbsoluteSize(true);
-#ifdef Q_WS_MAC // Use fixed font size and family on Mac (like Safari does)
+#ifdef Q_OS_MAC // Use fixed font size and family on Mac (like Safari does)
     fontDescription.setSpecifiedSize(m_buttonFontPixelSize);
     fontDescription.setComputedSize(m_buttonFontPixelSize);
 #else

まぁ、これでも実はビルドエラーが残っていまして、PluginPackageMac.cppで、他にもエラーが出ました。どうやら、WTF::RetainPtrが一部変更になっているようですが、ヘッダを帰ると影響が読めないので、PluginPackageMac.cppの方を一部修正しました。



diff --git a/Source/WebCore/plugins/mac/PluginPackageMac.cpp b/Source/WebCore/plugins/mac/PluginPackageMac.cpp
index 6b6c417..b40f0d4 100644
--- a/Source/WebCore/plugins/mac/PluginPackageMac.cpp
+++ b/Source/WebCore/plugins/mac/PluginPackageMac.cpp
@@ -138,7 +138,7 @@ bool PluginPackage::fetchInfo()
     if (mimeTypesFileName && CFGetTypeID(mimeTypesFileName.get()) == CFStringGetTypeID()) {
         WTF::RetainPtr<CFStringRef> fileName = (CFStringRef)mimeTypesFileName.get();
-        WTF::RetainPtr<CFStringRef> homeDir = adoptCF(homeDirectoryPath().createCFString());
+        WTF::RetainPtr<CFStringRef> homeDir = homeDirectoryPath().createCFString();
         WTF::RetainPtr<CFStringRef> path = adoptCF(CFStringCreateWithFormat(0, 0, CFSTR("%@/Library/Preferences/%@"), homeDir.get(), fileName.get()));
         WTF::RetainPtr<CFDictionaryRef> plist = readPListFile(path.get(), /*createFile*/ false, m_module);
@@ -255,7 +255,7 @@ bool PluginPackage::load()
         return true;
     }
-    WTF::RetainPtr<CFStringRef> path = adoptCF(m_path.createCFString());
+    WTF::RetainPtr<CFStringRef> path = m_path.createCFString();
     WTF::RetainPtr<CFURLRef> url = adoptCF(CFURLCreateWithFileSystemPath(kCFAllocatorDefault, path.get(),
                                                                         kCFURLPOSIXPathStyle, false));


これ、自動テストにプラグインの登録、PluginViewの利用が入っていないのでしょうねぇ。
入っていれば、さすがにこんな大きなデグレード、しかもビルドも通されていない等というお粗末な状態をRelease版として出さないのでしょうけど・・・。

一応、このQt5.2でビルドした艦メモさんは無事に起動して、利用できました。



まぁ、timerでこけるという変な現象は出ましたが、とりあえずはゲームできて、画像付きでつぶやけたから、良しとしましょう。あとは、誰がembeddedを立ててるか調べないとなぁ・・・というあたりで、今日はここまでで、ゲームに戻ってろ号任務をクリアしてきます。


2013年11月5日火曜日

QQuickViewを子にもつQDialogをrootObjectのサイズで固定する方法はないものか・・・

艦コレ絶賛はまり中の隠者です。

先ほど、初めて撃沈を体験しました。改造直前だし、中破だけどイベントボス戦だから、いけるかなと思ったのですけど、がっかりです。最後にスクリーンショットとっておくべきでしたね・・・。

さて、そんな艦コレ専用ブラウザの艦メモですが、先日の記事に載せたように、タイマーダイアログが英語版だとうまくダイアログ内に収まっていませんでした。


このTimer Dialogですが、QDialogの中にQQuickViewを入れてあり、実際のダイアログはQMLで作成されています。Setで呼ばれる一覧等は、先日の日記の伊織さんのコメントから、ダウンロードされている事がわかりました。

で、このQDialogですが、uiファイルでサイズが固定にされていました。
しかし、後からQMLを変更したり、フォントなどの関係で、どうしてもQML部のサイズが事前に固定できない場合が出てきます。

さらにtimerDialog.qmlのrootのRectangleはサイズ指定がありません。内部のColumnに表示されるItemの分だけ自動でサイズが決まるようです。

QQuickViewの内部のコンテンツサイズを取得するにはどうしたらよいのでしょうか。QQuickView::rootObjectで、rootのQQuickItemを取得し、QQuickItem::childrenRect()を取り出せば、子のRectが入手できます。あとは、そのsizeに適度なマージンを入れて、QDialogのsetMinimumSizeとsetMaximumSizeに設定してあげれば、QMLのサイズに合わせてダイアログのサイズを固定できそうです。

void TimerDialog::showEvent(QShowEvent *event)
{
    Q_UNUSED(event);
    if(m_viewer == NULL){
        m_viewer = new QtQuick2ApplicationViewer(windowHandle());
        connect(m_viewer->engine(), SIGNAL(quit()), this, SLOT(closeQml()));

        //C++のデータをQML側へ公開
        m_viewer->rootContext()->setContextProperty("timerData", &m_timerdata);

        //QML設定して表示
        m_viewer->setSource(QUrl("qrc:///qml/KanmusuMemory/timerDialog.qml"));
        m_viewer->show();
        QSize contentSize = m_viewer->rootObject()->childrenRect().toRect().size() + QSize(DIALOG_MARGIN,DIALOG_MARGIN);
        setMinimumSize(contentSize);
        setMaximumSize(contentSize);
    }

}

childrenRectは、RectFを返すので、toRect()でRect化した後、size()を取って、それにマージンを加えています。

Githubには入れておきましたが、まだMacでしか確認していないので、修正をWindowsとLinuxで確認したらpull Requestしてみますか。


2013年10月30日水曜日

艦メモのメモ

先週の金曜日に、うっかり着任してしまい、艦コレはまり中の隠者です。

先日、開発者の @IoriAYANE さんから、Qtユーザー会の方でも開発者募集のメールが出ていた艦メモについて、メモ書きを残しておこうと思います。

まずは、伊織さんからのメッセージの転載。

> こんばんわ
> アプリはさくっと作ってさくっと放流の、いおりです。
> MLをもっとフランクに使っていこうぜって話題があったので。
>
>
> 艦メモという、DMMのゲーム「艦隊これくしょん」を遊ぶためのアプリを作ってます。
> ソースをGithubで公開しているので、もし艦これで遊んでてちょっといじってやるぜ!って
> 提督さんはぜひビルドしてみてください。
> そして、ぜひプルリクエストを送ってください!
> (チート機能は禁止ですよー、マクロとか)
>
> 艦これ
>
> 艦メモの紹介
>
> ビルド方法
>
> 艦メモのビルド方法(Windows編)
>
> 艦メモのビルド方法(Ubuntu編)
>
> 艦メモをビルドしてみた(MacOSX編)
>
> Github

続きまして、ディレクトリツリー。一度ビルドした後で取ったので、余計なものも入っているかもしれませんが。

KanmusuMemory
 - aboutdialog.cpp [いわゆるaboutダイアログ。貢献するとここにアカウント名が表示されるっぽい]
 - aboutdialog.h   [同上]
 - aboutdialog.ui  [同上]
 - cookiejar.cpp   [クッキー保存オブジェクト]
 - cookiejar.h     [同上]
 - favoritemenu.cpp [お気に入り機能、webpageform用かな?]
 - favoritemenu.h  [同上]
 - gamescreen.cpp   [キャプチャ時のGame画面切り出し?]
 - gamescreen.h     [同上]
 - i18n/ [翻訳ファイル - 伊織さんは英語で作ってから翻訳を作るそうです。すばらしぃ
   - qt_ja.qm
   - qt_ja_JP.qm
   - qt_ja_JP.ts
 - imageeditdialog.cpp  [画像編集ダイアログ]
 - imageeditdialog.h    [同上]
 - imageeditdialog.ui   [同上]
 - KanmusuMemory.icns
 - KanmusuMemory.ico
 - KanmusuMemory.pro [Qtのプロジェクトファイル。QtCreator使いはコレをQtCreatorで開く]
 - KanmusuMemory.qrc [Qtのリソース設定ファイル]
 - KanmusuMemory.rc  
 - kanmusumemory_global.h
 - LICENSE          [Apach2ライセンスですね]
 - main.cpp         [main関数はここ]
 - mainwindow.cpp   [main windowです]
 - mainwindow.h     [同上]
 - mainwindow.ui    [同上]
 - memorydialog.cpp [View Memoryダイアログ]
 - memorydialog.h   [同上]
 - memorydialog.ui  [同上]
 - qml/
   - KanmusuMemory/
     - ClipTool.qml
     - GradientEx.qml
     - imageEditDialog.qml
     - ImageEditView.qml
     - images/ 
       - spinner.png
     - js/
       - HttpAccess.js
     - memoryDialog.qml
     - test.qml
     - timerDialog.qml
     - TimerItem.qml
     - TimerSetting.qml
 - qtquick/
    - clipcursor.cpp
    - clipcursor.h
    - operatingsystem.cpp
    - operatingsystem.h
    - qfileasync.cpp
    - qfileasync.h
    - qmlfile.cpp
    - qmlfile.h
    - qtquick.pri
    - qtquick2applicationviewer.cpp
    - qtquick2applicationviewer.h
    - thumbnailprovider.h
    - timerdata.cpp
    - timerdata.h
 - README.md [githubでの説明用]
 - Readme.txt [艦メモについての説明書き]
 - resources/ 
   - alarm.mp3
   - downloaddata/
     - favoritedata.json
     - timerselectguide.json
     - timerselectguide_en.json
   - fav_icon_off.png
   - fav_icon_on.png
   - go_back.png
   - go_forward.png
   - icon.svg
   - KanmusuMemory128.png
   - KanmusuMemory16.png
   - KanmusuMemory256.png
   - KanmusuMemory32.png
   - KanmusuMemory48.png
   - KanmusuMemory512.png
   - KanmusuMemory64.png
   - KanmusuMemory80.png
   - KanmusuMemory96.png
   - mobile_icon.svg
   - mobile_icon_off.png
   - mobile_icon_on.png
   - reload.png
 - scripts/                [主にビルド後の配布パッケージ作成用スクリプト]
   - deb/                  [Ubuntu用debパッケージ作成用]
   - deploymac-dmg.sh      [dmgパッケージ作成用]
   - deploymac.sh          [Macデプロイ用スクリプト]
   - deploymaclibs.txt     [Macで利用するライブラリリスト]
   - deployubuntu.sh       [Ubuntuデプロイ用スクリプト] 
   - KanmusuMemory.sh 
   - macdeployhelper510.sh [deploymac.shから呼び出される]
   - Readme.txt            [Macデプロイスクリプトについて]
   - translate.bat         [lupdate呼び出し簡略化用?]
 - settingsdialog.cpp      [設定ダイアログ]
 - settingsdialog.h        [同上]
 - settingsdialog.ui       [同上]
 - tabwidget.cpp           [WebPageFormにタブを表示する用]
 - tabwidget.h             [同上]
 - timerdialog.cpp         [Timerダイアログ]
 - timerdialog.h           [同上]
 - timerdialog.ui          [同上]
 - tweetdialog.cpp         [ツイート用ダイアログ]
 - tweetdialog.h           [同上]
 - tweetdialog.ui          [同上]
 - twitterinfo_sample.h    [ツイッター用のヘッダサンプル。ビルド手順に従い、コピーと設定が必要]
 - webpageform.cpp         [Web表示ウィジェット - 配布版はまだ入っていない、ブラウザ分割ウィンド]
 - webpageform.h       [同上]
 - webpageform.ui      [同上]
 - webview.cpp             [QWebView拡張。WebPageFormとメインウィンドウで利用]
 - webview.h               [同上]

ほかのOSでも調べてからIssue登録予定だけど、Mac OS X(10.9)で、ビルドした環境での起動(英語表示)だと、以下の表示がウィンドウ内におさまってないらしい。

Timer Dialog

思い出のダイアログも以前は収まってなかったけど、update/merge後に試したら修正済みだったようです。最初にビルドした時は、キャンセルボタンも見えてなかったので、強制終了させてしまったのですけどね。同じ状態が再現した人はウィンドウを拡大すればキャンセルボタンがあるので、それでキャンセルできます。

ところで、Timerダイアログの参考時間は使いやすいのだけど、英語版でもそこだけは日本語なんですよねぇ。さすがにすべて英語訳するのは大変そうですけど。

大雑把にですがコードは読んだので、何か機能思いついたらごそごそ入れていってみたいなと思います。

P.S.
どうやら、翻訳ファイルには艦名が入っている模様。Timer用の翻訳データに見えるけど・・・・。もう少し調査が必要そう。