X Toolkit: Scrollbar Widget / thumbの位置設定
X Toolkit (Athena Widget)のスクロールバー・ウィジット(Scrollbar Widget)において,
サム(thumb;つまみ)のデフォルトの初期位置は,水平スクロールバーの場合は左端,
垂直スクロールバーの場合は上端になっています.
しかし,アプリケーションによってはアプリケーション開始直後のサムの位置を左端以外の位置にしたい場合もあります.
この文書ではスクロールバー・ウィジットのサムを任意の位置に設定する方法を説明します.
X Toolkitプログラミングの古い文献[1]を参照すると,サムの初期位置を変える方法として以下の2通つの方法が紹介されています.
  - 
    リソースXtNtopの値を0.0(左端または上端)〜1.0(右端または下端)の任意の値にセットしておく([1]p.129).
    
      - 
        現在このリソース名はXtNtopOfThumbに変更されていますので,以下ではXtNtopOfThumbと表記します.
      
 
    
   
  - 
    XtScrollbarSetThumb関数(?)を使って任意の位置を指定する([1]p.132).
    
      - 
        現在この関数はXawScrollbarSetThumbに変更されていますので,以下ではXawScrollbarSetThumbと表記します.
      
 
      - 
        XawScrollbarSetThumbのプロトタイプは以下の通りです.
        void XawScrollbarSetThumb(Widget w, float top, float show);
        topにはサムの位置,showにはサムの長さを0.0〜1.0の範囲で指定します.
        ただし,-1.0が指定された場合は値の変更は行なわず,
        以前の値をそのまま保持します(片方の値だけを変化させたい場合などに,もう一方の引数を-1.0と指定しておく).
       
    
   
いずれの方法も妥当な方法と思われるのですが,実際にやってみると,いずれも期待通りは動作してくれません.
リソースXtNtopOfThumbを指定してもサムの初期位置は変化しません.
また,XawScrollbarSetThumb関数を使って設定しようとすると
スクロールバーの表示がおかしくなってサムが表示されなくなってしまいます.
正しくサムの位置を設定するには以下のような手順でリソースXtNtopOfThumbの値をセットする必要があるようです.
0001    Widget toplevel, bar;
0002    float top = 0.5;
0003    static Arg argsBar[] = {
0004        {XtNlength, (XtArgVal)300},
0005        {XtNtopOfThumb, (XtArgVal)NULL},
0006    };
0007    toplevel = XtInitialize(argv[0], "Bar", NULL, 0, &argc, argv);
0009    bar = XtCreateManagedWidget("bar", scrollbarWidgetClass, toplevel,
                                    argsBar, XtNumber(argsBar));
0010    XtSetArg(argsBar[1], XtNtopOfThumb, *(XtArgVal *) &top);
0011    XtSetValues(bar, argsBar, XtNumber(argsBar));
  - 
    0002行目: 
    float型の変数topを確保しておき,その変数に所望の値をセットしておきます.
    ここではサムの位置がスクロールバーのほぼ中央にくるように,0.5を指定しています.
  
 
  - 
    0005行目: XtNtopOfThumb用の領域を確保しておきます.
  
 
  - 
    0010行目: XtSetArgマクロを使ってXtNtopOfThumbの値を
    *(XtArgVal *) &topにセットします.
    ここがXtSetArg(argsBar[1], XtNtopOfThumb, 0.5)ではダメなことに注意してください.
   
  - 
    0011行目: XtSetValuesでリソースの値を更新します.
  
 
この方法でサムの初期位置がうまく設定できるはずです
(ネットで検索してみると同様の手続きでサムの位置を設定しているプログラム[2]が見つかりました.
こちらも参照してみてください).
以下に実験用のサンプル・プログラムのソースをおいておきますので,試してみてください.
  - 
    thumb.c:
    上述のfloat型の変数topを仲介させてリソースXtNtopOfThumbの値をセットする方法.期待通りの動作をする.
  
 
  - 
    thumb2.c:
    リソースのXtNtopOfThumbに0.5をセットしてスクロールバー・ウィジットを作成.
    セットしたはずの0.5が無視されて,サムの初期位置は上端になる.
  
 
  - 
    thumb3.c:
    XawScrollbarSetThumbを使ってサムの位置をセット.
    スクロールバーにサムが表示されなくなる.
  
 
  - おまけ
    
  
 
参考文献
備考
- Debian GNU/Linux 2.1でxaw3dg 
1.3-6.3をインストールした状態で動作実験を行なっています.もしかしたらこの環境に何か問題があるのかも知れません.
 - 
XtNtopOfThumbの値が無視される理由や,XawScrollbarSetThumbの動作がおかしかったりする理由は,まだよく把握できていません.もしご存知の方がありましたら,教えていただけるとありがたいです.
 
Takashi HATAI
Jul. 24, 2000