String - みる会図書館


検索対象: UNIX MAGAZINE 1992年6月号
7件見つかりました。

1. UNIX MAGAZINE 1992年6月号

連載 . / 凵 Language Apr. 1992 by srekcah@sra ・ co. JP #include #include # inc lude # inc lude #include #include く X11/Xatom. h> く X11/Intrinsic . h> く X11/StringDefs. h> く X11 / S e11. h > く X11/Xaw/Dia10g ・ h> く X11/Xaw/Cardina1s . h> Widget CreateDia10g(String, String, String, String ActivateDia10g (Widget , String*) ; void SetDia10gEdit (Widget 、 String) ; リスト 2 xdialog-glue. c * xdialog—glue ・ c Apr. 1992 by srekcah@sra. co ・ jp String*) ; # include #include # include "EXTERN . 五 " 'txdialog. " static enum { US_CreateDia10g, US—ActivateDia10g, US_SetDiaIogEdit , } usersubs ; static int usersub() ; int userinit ( ) char *filename "xdialog—glue make—usub ( "CreateDia10g" static int usersub(ix, sp, items) int iX ; register int sp; register ; make—usub ( "SetDia10gEdit" , US SetDia10gEdit , usersub , filename) ; make—usub ( "ActivateDia10g" , US ActivateDia10g, usersub , filename) ; US—CreateDia10g , usersub , filename) , . C register STR *Str; / * used in str_get and str_gnum macros * / STR **St = stack—>ary—array + sp; switch (ix) { case US—CreateDia10g : if (items く 1 ) fata1("Usage: &CreateDia10g($1abe1 [ , $icon, $edit, @buttons)] " ) ; else { Widget String String String String retval ; label icon edit (String)str-get(st [ 1 ] ) ; = NULL ; NULL ; *buttons = NULL; UNIX MAGAZINE 1992.6 101

2. UNIX MAGAZINE 1992年6月号

連載 , / 凵 Language— if (items > 1 ) { 102 fatal ( "UnimpIemented user—defined subroutine" ) ; default : return sp; SetDia10gEdit(dia10g, edit) ; String edit = str-get()t [ 2 ] ) ; Widget dialog = * (Widget*) str—get()t [ 1 ] ) ; } else { fata1("Usage : &SetDia10gEdit ($dialog' $edit) " ) ; if (items ! = 2 ) { case US—SetDiaIogEdit : return SP ; str—set ()t [ 2 ] , ( c 矼 * ) edit) ; if ( (items > 1 ) & & ()t [ 2 ] ! = &str-undef) ) { str—set ()t [ 0 ] , (char*) retval) ; retval = ActivateDia10g(dia10g, &edit) ; String edit NULL ; Widget dialog = * (Widget*)str—get(st [ 1 ] ) ; String retval ; } else { fata1("Usage : &ActivateDia10g($dia10g[,$edit] ) " ) ; if (items く 1 Ⅱ items > 2 ) { case US—ActivateDiaIog : return sp , XtFree (buttons) ; if (buttons) { str-nset ()t [ 0 ] , (char*)&retval , sizeof (Widget) ) ; retval = CreateDiaIog(1abe1, icon, edit , buttons) ; buttons [i] = NULL ; buttons [i] (string) str-get ()t [ i + 4 ] ) ; for(i = 0 ; 土く arrsiz—l buttons (String*)XtMa110c(sizeof(String)*arrsiz) ; int arrSIZ (items—3) + 1 ; int i ; if (items > 3 ) { (String) str-get ()t [ 3 ] ) ; edit } else { edit = NULL; if ()t [ 3 ] = = &str undef) { if (items > 2 ) { icon = (String) str-get ()t [ 2 ] ) ; } else { icon = NULL; if ()t [ 2 ] &str-undef) { UNIX MAGAZINE 1992.6

3. UNIX MAGAZINE 1992年6月号

連載 / 凵 Language— * public routines Widget CreateDia10g(String label , int ac = Arg args [ 10 ] ; Cardina1 i = 0 ; String b; Widget shell , dialog ; Widget w; B001ea れ bb; if ( !toplevel) { String 1C0 Ⅱ , String value , String *buttons) toplevel = XtAppInitia1ize (&app-con, "XDia10gPer1" , NULL , ZERO , &ac , NULL , NULL , NULL , ZERO) ; shell = XtCreatePopupShe11 ( "xdialog perl" dialog topLeveISheIIWidgetC1ass , toplevel , NULL , ZERO) ; XtCreateManagedWidget ( "dialog" , dia10gWidgetC1ass , she11 , NULL , ZERO) ; XtSetArg(args [i] , XtN1abe1, label) ; i + + ; if (icon) { XtSetArg (args Ci] , XtNicon , GetPixmapFromName (dialog, if (value) { XtSetArg (args [ 幻 , XtNva1ue , value) ; i + + ; XtSetVa1ues(dia10g, args , i) ; if (buttons & & *buttons) { while (b = *buttons + + ) { icon) ) ; 十十 ; XawDia10gAddButton(dia10g , b , ButtonProc , (va1ue?True : Fa1se) ) ; } else { XawDia10gAddButton(dia10g , "OK" , ButtonProc , (va1ue?True :Fa1se) ) ; return dialog ; String ActivateDia10g(Widget d, XEvent ev ; XtPopup (XtParent (d) , ButtonPressed = 0 ; String *value) XtGrabNone) ; while ( ! ButtonPressed) { XtAppNextEvent (app-con, &ev) ; XtDispatchEvent (&ev) ; XtPopdown(XtParent (d) ) ; XF1ush(XtDisp1ay(d)) ; *value = EditString; return PressedButtonName ; void 104 UNIX MAGAZINE 1992.6

4. UNIX MAGAZINE 1992年6月号

連載 / / Li Language¯ return SP ; リスト 3 xdialog. c * xdialog ・ c Apr. 1992 by srekcah@sra. co. 」 p #include "xdialog. h" * g10ba1 variables static Widget toplevel ; static XtAppContext app—con ; static int ButtonPressed ; / * the widget toplevel s e11 * / / * the application context * / static String PressedButtonName ; static String EditString ; * private function prototypes static void ButtonProc (Widget , XtP0inter , XtP0inter) ; static Pixmap GetPixmapFromName (Widget , String) ; * callback static void ButtonProc (Widget , XtPointer has—edit , Arg args [ 1 ] ; ButtonPressed = 1 ; XtP0inter junk) XtSetArg (args [ 0 ] , XtN1abe1 , &PressedButtonName) ; XtGetVa1ues (), args , ONE) ; if ( (B001ean)has—edit = = True) { EditString = XawDia10gGetVa1ueString(XtParent ( ) ) ; } else { EditString = NULL; * utility static Pixmap GetPixmapFromName (Widget w , String name) XrmVa1ue idata, odata; strlen(name) + 1 ; idata. size idata. addr = name ; odata. S1ze = 0 ; odata. addr = NULL ; XtConvertAndStore (), XtRString, &idata, if (odata. size) { return * ( (Pixmap*) (odata. addr)) ; } else { return (Pixmap) NULL; UNIX MAGAZINE 1992.6 XtRB itmap , &odata) ; 103

5. UNIX MAGAZINE 1992年6月号

連載 , / Li Language SetDia10gEdit (Widget d, String str; Arg args [ 1 ] ; if (*value) { String value) XtSetArg(args [ 0 ] , XtNva1ue , &str) ; XtGetVa1ues (), args , 1 ) ; if (str) { XtSetArg (args [ 0 ] , XtNva1ue , value) ; XtSetVa1ues (), args , 1 ) ; # Makefi1e for xdp リスト 4 Makefile Apr ・ 1992 by srekcah@sra. co ・ JP SRC LIBS OBJS . C . 0 : xdp : c c CC —1Xaw —1Xt —1Xmu —1Xext ー 1X11 $ (SRC) /uperl. 0 xdialog—glue .0 xdialog ・ 0 $ (OBJS) $(LD) $(OBJS) $(LIBS) ー 0 xdp clean: rm —f * ~ * . 0 リスト 5 xdpbiff # ! /usr/local/bin/xdp # ノヾッケージのロード requlre "stat. p1" ・ # ノヾネノレの生成 # /usr/sp001/mai1/${USER} を 5 分ごとに監視して、新しいメールが ” I see " ) ; undef , "/usr/incIude/X11/bitmaps/maiIfuII" ” has a new mail . \Ⅱー $panel = &CreateDia10g($ENV{"USER"} # ある場合パネルを表示して知らせる。 $st—mtime—sv = 0 ; while ( 1 ) { &Stat ( "/usr/spool/mail/" $ENV{"USER"}) ; if ($st_atime く $st—mtime & & $st—mtime ! = $b = &ActivateDia10g($pane1, (e) ; $st_mtime—sv = $st—mtime ; s1eep(60*5) ; UNIX MAGAZINE 1992.6 $st_mtime—sv) { 105

6. UNIX MAGAZINE 1992年6月号

連載 続ウインドウ・システムについて一 3 Display * 市 s 04 ; Drawable d; GC gc; int 田 , ; XmbTextItem *items ・ void XmbDrawString( 市夘 la , d, font-set, gc, 工 , リ , か XwcDrawString() を使用する。 単一の文字列を描画する場合、 XmbDrawString() トの領域などはいっさい描画しない。 前景色で錨画する。グリフの地の部分や、論理工クステン XmbDrawText() では、各文字のグリフの部分だけを れる。 直前の文字列セグメントと同しフォントセットが使用さ り幅として追加される。 font-set が None である場合は、 ltem 構造体の delta がゼロでない場合は、追加の文字送 メントだけ離されて、連続的に描画される。 XmbText- 各文字列セグメントは、それぞれの文字列のエスケープ } XmbTextItem; XFontSet font-set; int delta ・ int nchars ・ Char *chars ・ typedef struct { る。 は XwcTextItem 構造体の配列へのポインタで指定す 文字列セグメントは、 XmbTextItem 構造体、また int れ社 7 〃ー 6 リ es ; char *string; int 工 , GC gc; XFontSet font-set; Drawable d; Display * 市夘リ ; れ 9 , れ 7 〃ー 6 リ tes ) UNIX MAGAZINE 1992.6 使用する。 ImageString() か XwcDrawImageString() を 文字列をイメージとして描画する場合、 XmbDraw- 文字のグリフの部分だけを前景色て描画する。 XmbDrawString() も XmbDrawText() と同様、各 void XmbDrawImageString(display, d, font-set, gc, リ , st れ 9 , num-bytes) Display * 市 ; Drawable d; XFontSet font-set; GC gc; int 工 , リ ; char * st れ 9 ; int れ社 m ーわい es ; XmbDrawImageString() では、文字列の論理工クス テントを GC の背景色で塗り潰してから、各文字のグリ フの部分を前景色て描画する。 おわりに 今回は X11R5 で定義された Xlib の国際イ寸施能の 仕様のうち、ロケール、フォントセット、文字列描画に関 する部分を解説した。 とくにロケールに関連する部分では、多くのことが XIib の仕様では決められておらす、実装依存として残さ れている。これがユーサー ( プログラマー ) に与える影響 は大きい。たとえば、プログラム内の文字列のデータ構造 として、マルチバイト形式とワイド文字形式が定められて いるのはよいが、実装によってはワイド文字の大きさが異 なったり、マルチバイト形式のコード表現が異なったりす ることカ考えられる。 本来は、ソースの修正なしに再コンバイルと再リイクだ けで、はかの言語や実装に移植できることを目的としてい るが、プログラムの作り方によっては、同し日本語でも実 装が異なる場合は、プログラム刎正が必要なこともあり うる。 ANSI C 、 POSIX などの仕様、および XIib の国際化 対応能の仕様をよく理解し、修正せずにすむプログラム を書くよう心掛ける必があるだろう。 今回で X11R5 の解説を終了するつもりだったが、編 集部や読者からの要望もあり、もうしばらく X11R5 の詳 しい解説を続けることにする。次回は、今回とりあげられ なかった、、入力メソッド " の信を解説し、その後は Xsi と Ximp の実装について解説する予定である。 81 ( えんどう・ともひろ倉儚 )

7. UNIX MAGAZINE 1992年6月号

連載 続ウインドウ・システムについて一 3 見た目の部分であり、クライアント ( あるいはユーサー ) カ甘旨定するべきものである。フォントセットは、クライア ントカ甘旨定する見た目の情報と、ロケールから得られる文 字集合の情報を、同時に満足する一連のフォントを含む論 珊冓造といえる。見た目の情報は、フォントセット作成時 にべースフォント名 (base font name) により与えられ る。 XIib におけるフォントセットの型は XFontSet で ある。図 3 にフォントセットの概念を示す。 フォントセットの作成と解放 フォントセットは、 XCreateFontSet() により作成 する。 XFontSet XCreateFontSet(display, 6 e ールれ t ーれ ame 」 t , m れ 9 ー c ん 0 et ー st ー ret 社ロも m s をれ 9 ー c ん佖 rs et- co 社れ t ー t r れ , def-strtng-return Display * 市夘 ; char * 6 佖 se ーエ 0 れたれ佖 me 」た Char * * 7 れ SSt れー et—lis t ー 7 を t 社 7 フ霍 * れ ~ を SSt れ 9 ー C んー CO 社れーカれ・ char **def-string-return; XCreateFontSet() では、プロセスの現ロケールと se ールれたれ ame ー騰 t てオ旨定されるべースフォント名のリ ストから、必要なフォントを捜しだし、フォントセット 内にイ尉寺する。べースフォント名の指定ガ去刎列を図 4 に また、フォントセットを作成した時点での現ロケール の値もイ尉寺する。これは、フォントセットの作成後に現ロ ケールを変更した場合でも、すでに作成されたフォントセ ットを用いて正しく文字列を描画するために必要である。 ロケールで必要とされているにもかかわらす、該当す るフォントをみつけられない可能性もある。その場合は、 m な s 9 ー c ん佖 rse たた rn にみつけられなかった文字 集合を表す文字列を返す。 フォントセットは、 XFreeFontSet() 関数て解放す る。 void XFreeFontSet(display, font-set) Display * 夘 ; XFontSet *font-set; 78 フォントセット青報の取得 それぞれのフォントセットに含まれる X プロトコ ル的フォントについての詳細な情報 ( 正確なフォント 名や XFontStruct 構造体 ) を得るには、 XFontsOf- FontSet() を使用する。 int XFontsOfFontSet(font-set, font-struct-list-return, ルれ t ーれ ame 」た t 社卿 ~ XFontSet font-set; XFontStruct * * * font-struct-list-return• char * * * ルれ t ーれ佖 me 」た r れ・ フォントセットを作成したときのべースフォント名の 取得には、 XBaseFontNameListOfFontSet() を 使用する。 char *XBaseFontNameListOfFontSet(font-set) XFontSet font-set; フォントセットに記憶されているロケールを取り出すに は、 XLocaleOfFontSet() を使用する。 char *XLocaIeOfFontSet(font-set) XFontSet font-set; メトリクス関数 X プロトコル的フォントと同様、フォントセットに対 してもフォント・メトリクスや文字列工クステントの計算 ができる。 なお、マルチバイト形式とワイド文字形式の両者に対す る関数が用意されている場合、ここではマルチバイト形式 の関数 ( 関数名が、、 Xmb " で始まる ) のみを示す。ワイド 文字形式の関数 ( 関数名が "Xwc" で始まる ) では、文字 列データの型が char * から wchar-t * になり、データの 長さがバイト数から文字数になる。 フォント・メトリクス XExtentsOfFontSet() を使用して、フォントセッ トを論理的な単一のフォントとみなした場合の、各文字の 占める最大の領域を知ることができる。 XFontSetExtents *XExtentsOfFontSet(font-set) XFontSet font-set; こで、返される構造体は、次に示す XFontSetEx- tent 構造体である。 UNIX MAGAZINE 1992.6