Allegro IDE Mac 版アプリケーション作成時の問題点メモ

Allegro CL の Common Graphics (CG) と Integrated Development Environment (IDE) で開発したアプリケーションは、次のプラットフォーム上で動作します。

どのプラットフォーム上でも、おおよそ同じように動作しますが、 Linux と Max OS X では GTK を使用して実現してしているため、 Windows で動作させた場合と多少異なることがあります。

その違いについては、Allegro CL のドキュメント Platform-specific information に記されており、また、 General Issues And Incompatibilities With The Windows Version でリスト化されています。

今回、Windows 上で開発した IDE アプリケーションを Mac 上に移植する機会があり、 これらのリストに含まれていない違いも見付かりましたので、以下に問題点と回避策を示します。

Table of Contents

1 static-text コントロールの位置指定

  • 詳細
    static-text:justification による位置指定オプション (:center, :right) が効きませんでした。

    下の絵のように、Mac では必ず左寄せになります。

    [ Windows ][ Mac ]
    ../image/static-text-windows.png../image/static-text-mac.png
  • 補足
    Linux や Mac 版の static-text widget は GtkLabel widget を使用して実現しているので、CG からコントロールできないことがあります。 一方 scrolling-static-text widget は一から lisp で実現しているので、 window system が異なる環境であっても、 同じように動作する widget になっています。

2 trackbar コントロールの初期スライダ位置

  • 詳細
    スライダ位置を指定して trackbar を作成しても、必ず左端になりました。

    ../image/trackbar-init-position.png

  • 回避策
    Franz から正式にパッチがリリースされている可能性もあるので、まずは Allegro CL を update してください。

    それでもなお問題が解決しない場合には、次のパッチを workaround として使用します。

    #+gtk
    (in-package :cg.gtk)
    
    #+gtk
    (defun initialize-cg-plat ()
      
      ;; Remember that we're calling gtk_init in the
      ;; device-open for screen so that it is done before
      ;; that method calls the function to find the root
      ;; window handle.
      
      ;; Avoid the weird problem with double-float GTK functions
      ;; each failing on the first call, by calling each one of
      ;; them once when initializing Common Graphics.
      (gtk:gtk_range_set_range
       (gtk:gtk_hscale_new
         (gtk:gtk_adjustment_new 30d0 0d0 100d0 5d0 20d0 50d0))
       0d0 100d0)
      (gtk:gtk_range_set_increments
       (gtk:gtk_hscale_new_with_range 0d0 100d0 5d0)
       5d0 20d0)
      (gtk:gtk_vscale_new_with_range 0d0 100d0 5d0)
      
      (initialize-system-colors) ;; 28sep05
      
      ;; Defy the laws of X and find the X server's
      ;; pixels-to-points ratio.
      (setq *pixels-to-points* ;; 27sep05
            (ignore-errors ;; This requires Pango 1.8.
             (find-real-pixels-to-points)))
      
      (setq *default-fixed-font*
            (make-font-ex
             nil
             (or (find-a-fixed-width-gtk-font-face) ;; bug15733
                 "Sans")
             (points-to-pixels 12))) ;; 27sep05 15jan10 05sep12
      (setq *default-proportional-font*
            (make-font-ex nil "Sans" 10 '(:bold))) ;; 27sep05
      (setq *title-bar-font* ;; 05may05
            (make-font-ex nil "Sans" 12 '(:bold))) ;; 27sep05
      
      ;; Install our key snooper for intercepting keystrokes
      ;; at a very low level when necessary.
      (setq *cg-key-snooper-id*
        (gtk_key_snooper_install
         (register-foreign-callable 'cg-key-snooper)
         NULL)))
    
    
  • 補足
    CG では、double-float を引数に取る GTK の関数をいくつか呼び出しています。 それらの関数の最初の呼び出しにおいてのみ、 正しく動作していないことがわかりました。

    trackbar は GTK の関数 GtkRange を使用しており、 今回移植したシステムにおいて、 たまたま最初に GtkRange を呼び出す widget であったため、 この問題に遭遇しました。 例えば、同じく GtkRange を使用している scrollbar が最初に呼び出していたとすれば、 そちらで問題が発生したということになります。

    この問題は、GTK の関数の最初の呼び出しにおいてのみ起きるので、 上記のパッチは、我々のアプリケーションが GTK の関数を呼び出す前に、 CG 側で一度呼び出しておこうというものです。 あくまでも、workaound としてお使いください。

    この件は Allegro CL の開発元 franz に報告済みで、 上記のパッチも franz より頂いたものです。 修正パッチの正式なリリースを待つことにしましょう。

3 trackbar コントロールにおけるスライダ幅の変更

  • 詳細
    trackbar で表示中のスライダ幅を小さく変更する処理で、次のような不都合がありました。

    変更後のスライダ幅の範囲外にスライダがある状態で、スライダ幅を小さく変更します。 すると、スライダの左移動処理がコールされ、その結果、 表示上のスライダの位置とプログラムで管理しているスライダの位置とが食い違うことになりました。

    例えば、表示中のスライダ幅が 0 から 100 で、スライダが 100 の位置にあるとします。 この状態でスライダ幅を 0 から 80 に変更すると、表示上はスライダは 80 にありますが、 スライダが左に 20 移動したというイベントが発生しました。このイベントは、Windows 上では発生しませんでした。

    [ スライダ幅変更前 ][ 変更後 ]
    ../image/trackbar-change-range-from.png../image/trackbar-change-range-to.png
  • 回避策
    変更後のスライダ幅に入るようスライダを移動してから、 スライダ幅を変更します。
  • 補足
    Windows における trackbar は、スライダが範囲外の位置にあっても何もせず、 CG もまた何もしません。しかし GTK では、 変更後の範囲に合うよう自動で位置が変更され、その後、 変更があったイベントを発生させます。

    このため、Windows と Mac とで、動作が異なりました。

4 デフォルトフォントのサイズの違い

  • 詳細
    フォントを指定せずにテキストを表示した場合、 システムのデフォルトフォントが使用されます。

    数字の表示において、Mac の場合、 このデフォルトのフォントが Windows に比べてかなり大きいです。

    [ デフォルトのフォント(Sans) ][ フォントファミリ Terminal を指定 ]
    ../image/font-sans.png../image/font-terminal.png
  • 回避策
    各コントロールでフォントを指定します。

5 プログラムアイコンを使用できない

  • 詳細
    Mac と Linux は GTK を使用しており、 これらではプログラムアイコンを実現していないため使用できません。

    icon-file を参照してください。

    [ Windows 版でプログラムアイコンを指定 ]
    ../image/icon-windows.png

    [ Mac 版で指定しようと Icon File をクリックすると、画面下に未実装の旨のメッセージが表示される ]

    ../image/icon-mac.png

6 with-hourglass でマウスの砂時計表示が矢印に戻らない

  • 詳細
    with-hourglass を使用すると、この macro の body 部を処理している間は、 マウスの表示が砂時計になります。Mac の場合、 body の処理が終わったにもかかわらずマウスの表示が砂時計のままとなり、 矢印に戻りませんでした。

    ../image/with-hourglass.png

  • 回避策
    Franz から正式にパッチがリリースされている可能性もあるので、まずは Allegro CL を update してください。

    それでもなお問題が解決しない場合には、次のパッチを workaround として使用します。

    (in-package :cg.gtk)
    
    ;;; chee   13nov12 spr39824 stop mapping the :default mouse cursor
    ;;;        to NULL, which inherits the parent window's cursor,
    ;;;        because the parent can be the with-cursor cursor if
    ;;;        the mouse had moved over it, and so inheriting it would
    ;;;        not revert from the with-cursor cursor; mapping to
    ;;;        arrow-cursor (as update-interior-cursor does already)
    ;;;        is simpler and more predictable; plus we document that
    ;;;        :default means "typically the arrow cursor" and we don't
    ;;;        say anything about inheriting from the parent window
    (defun convert-special-cursor-value (cursor)
      (case cursor
        (:default arrow-cursor ;; spr39824
            #+old ;; spr39824 13nov12
            NULL)
    
        ;; Blank cursor (invisible).
        ((nil)(let* ((cursor (find-cursor :blank-cursor)))
              (run-cg-hook open-cursor-handle-hook cursor) ;; spr35697
              (cursor-handle cursor)))
    
        (t cursor)))
    
    

Author: 数理システム知識工学部

Date: 2013-06-24T16:03+0900

Generated by Org version 7.9.2 with Emacs version 24

© Mathematical Systems Inc. 2013