Q׿JkҲժ GUI Request:  API C\ŪɡAĳziHP
Ѧ: http://xcin.linux.org.tw/xcin-2.5/xcin_menu.png

iHUzz :-))

-------------------------
1. ²:

 xcin-2.5.2 _JkҲն}l䴩 GUI Request \AOѿJkҲ
}ҨLHܸƪ覡Cѩ xcin DŶAoݭn
ܽTJkҲզӨiणΡA]Ӧo˪]pC

GUI Request OP winlist [cXb@_AiHOUاκAΥ\઺A
ZOiѿJkҲեΨܨTAڳ٬ GUI Request Cb winlist
wqAwid O] WTYPE_GUIREQ ( include/gui.h)C

ӦbثeAڥu]pF@ GUI Request ѿJkҲըϥΡAں٥
Menu Selection window (² menusel), \NOܥX@ӿA
source Nb gui_menusel.c CӭY٦ݭnAiHA[JL GUI Request
C

JkҲեiHzL xcin 禡IsӱҰʡBާ@ GUI Request  (z)C
ѩ GUI Request cݩ IMC @ (Ԩ structer @媺)A]A
Yb XCIN_SINGLE_IMC OFF AUAP IMC iHOۤv@M GUI
Request window sCoNOAziHb XIM client A }Ҥ@ GUI Request
windowAӦb client B }ҥt@ GUI Request window, G̤ۿWߡCMA
pGb XCIN_SINGLE_IMC ON AUAҦ clients ( IC) ɦP@ IMCA
hU GUI Request window ]P˳QҦ clients ɡC

bP@ IMC UAJkҲեiH}Ҧh GUI Request windowAӥB}Ҫ
èSCMAثeu@ءAY menusel, ]YzܡA]iHPɶ}
ҨTӿӥΡCثeڬO]wC IMC ̦hu}X GUI Request windowA
ڷQo˦bܦhpӬOΤFC


-------------------------
2. Ұ GUI Request:

b module.h wqA@ greq_t  unionANOΨӾާ@ GUI Request 
AwqpU:

typedef union {
    int                 type;
    greq_menusel_t      menusel;
} greq_t;

䤤 type NOΨӫwznҰʨ@ GUI Request window,  menusel 
Aznboس] GREQ_MENUSELAӨҹƵcY 

	greq_menusel_t   menusel;

q`ڭ̦b{nϥΤ@ӥ~Ӫ greq_t ƮɡA]nݬݨ type A
MAھڳo type ӦsT GUI Request ƵcC

JkҲխn}Ҥ@ GUI Request ɡAǳƦn@ greq_t 
ơAMzL

int greq_register(int imid, greq_t *greq,
		int (*greq_callback)(int, int, inpinfo_t *, greq_cb_t *));

禡IsN GUI Request U xcinCU޼ƪNqpU:

   1. imid: Yثe inpinfo_t  imid ȡAΨӫܦ GUI Request Oݩ
	    @ IMCC

   2. greq: YJkҲթҷǳƦn greq_t ƫСC

   3. greq_callback(): oӥiiLAYLܪǤJ NULL YiCoOJ
	    kҲլ GUI Request ҷǳƪ callback 禡AΨӷ GUI
	    Request J@ǯSƥ (pQƹ .... )A
	    xcin iHzL callback Nƥ^JkҲաAJk
	    եiH򪺰ʧ@C callback 禡ŧipU:

	int (*greq_callback)(int cmd, int reqid,
			     inpinfo_t *inpinfo, greq_cb_t *greq_cb);

	    䤤 cmd ƥ󪺥NXAreqid ƥvT GUI Request 
	    s (z)Ainpinfo  GUI Request ҳB IMC  inpinfo
	    cAǦ^JkҲեHKϥΡA greq_cb hOLB~
	    cAP GUI Request iHݭnӥ[HQΡC

	     callback pG榨\ɶǦ^ 0A_hLȡC GUI Request
	    PJkҲժ]pөwC

greq_register() pG榨\AK|^ GUI Request b xcin ҥN
s (jε 1)AsY٬ reqidCHYJkҲխnާ@ GUI Request,
FnwO@ IMC  GUI Request H~ (Y inpinfo->imid)AP٭n
w reqidCoOѩJkҲեiHbP@ IMC }Ҧh GUI Request window,
boبC@ӳo˪ window NO@ greq_tAӤP window NH reqid ӰϤC

JkҲեiHۥѱ greq_t  window ͻP (destroy)CYnͥA
N greq_register() ӵU@ӧYiAYnAhnzL

	void greq_unregister(int imid, int reqid);

禡ӰAo̥ǤJ GUI Request Ҧb IMC  imid HΨ reqidC

~AJkҲդ]iHgѦ禡oثe IMC `@}ҤF GUI Request:

	void greq_query(int imid, int *n_greq, int **reqid_list_return);

䤤 imid  IMC sAӨ禡̫|Ǧ^ *n_greq, ثe GUI Request 
ơAHΩҦ GUI Request  reqid }C: *reqid_list_returnCЪ`NJkҲ
NN}C free C

Ъ`NAbǱpU xcin |DثeB@ GUI Request window, Ҧp:

	1. ϥΪ̥ηƹIFWsNɡC
	2. ϥΪ̬M ctrl+alt+... OJkɡC

oɭԡApG GUI Request U@ greq_callback() 禡ɡAxcin q`|z
L禡qJkҲաAJkҲնiBzAM~NӵC

ܩO_iHȮáB GUI Request window (Y Map, Unmap), h GUI
Request window wqөwAëDҦ window ݭn\C

U²U GUI Request ާ@覡PƵcC


-------------------------
3. Menu Selection Window:

 GUI Request ² menuselAiHΨӶ}@ӿAѨϥΪ̨ӰؿܡC
menusel һݪƵcpU:

typedef struct {
    int type;				/* GUI Request type. */
    unsigned short n_item;              /* number of item lists. */
    unsigned short head_item;           /* head index of the item lists. */
    unsigned short n_sel;               /* number of selection keys. */
    char *selkeys;                      /* the selection keys. */
    unsigned short focus_item;          /* index of the focused item. */
    unsigned short focus_elem;          /* index of the focused element. */
    ubyte_t enable_focus_elem;          /* use focus element facility or not. */
    menu_item_t *item;                  /* the item lists. */
} greq_menusel_t;

Menusel ⳡAb٬ item head, kb٬ item list, pU:

	head1  |  item1-1  item1-2  item1-3 ....
	head2  |  item2-1  item2-2  item2-3 ....
	.....  |  .......  .......  .......

ӵjpOTwA׵ xcin Ĥ@DסA׳̦hOCApG
n_item ƥؤp󤭪ܡAhCƴN| n_item ȡC n_item iHWL 5,
ӵܮɬOq head_item }l@Ĥ@CܡCҦpAz@`@ 8
 item list,  head_item O] 2, hܦpU:

   (item head)   (item elements)
	head2  |  item2-1  item2-2  item2-3 ....
	head3  |  item3-1  item3-2  item3-3 ....
	head4  |  item4-1  item4-2  item4-3 ....
	head5  |  item5-1  item5-2  item5-3 ....
	head6  |  item6-1  item6-2  item6-3 ....

|hdBzJrA]ApGzn@ menu WU\
AziHb module function keystroke() WɡAN head_item  1,
UɱN[ 1 YiC

n_sel Ob@ item list ̦hXӿܶAub selkeys ]w
ɤ~ΡA selkeys O]wܥXA n_sel NO selkeys ƥءC
ҦpAڥiH]w:

	greq_menusel->selkeys = "asdfghjkl;";
	greq_menusel->n_sel = strlen(selkeys);

pܥXӪ item list NO:

	headN  |  a itemN-a  s itemN-s  d itemN-d  ....

`NC item e|H@ selkey, NOzb greq_menusel->selkeys 
ҳ]eCMzboإiH] NULL, hw]NH "1234567890" ӮMΡC

focus_item O@ item nSOHϥռХܡANnаb@ӶؤW@
ˡCboؤϥշ|Хܦb item list  head WAϥܦpU (ХܦbĤG item):

	head1  |  item1-1  item1-2  item1-3  ....
       <head2> |  item2-1  item2-2  item2-3  ....
	.....  |  .......  .......  .......

pGN enable_focus_elem ] 1 ɡAhϥռХܤ]iHХܦb@ item list 
Y element W ( focus_elem ӫw)AҦp (ХܦbĤG item ĤT 
element):

	head1  |  item1-1  item1-2  item1-3  ....
       <head2> |  item2-1  item2-2 <item2-3> ....
	.....  |  .......  .......  .......

YN enable_focus_elem ] 0, h item list | element ϥռХܡAB
focus_elem ]|@ΡC

̫᪺ menu_item_t *item OVC@ item list }CAp:

	item[0].title     ==> head1
	       .elements  ==> item1-1 item1-2 item1-3 ....
	       .........
	item[1].title     ==> head2
	       .elements  ==> item2-1 item2-2 item2-3 ....
	       .........

䤤C item list ӳwqpU:

typedef struct {
    wch_t *title;                       /* title of the item list. */
    wch_t *elements;                    /* elements of the item list. */
    ubyte_t *elem_group;                /* grouping info. of the elements. */
    unsigned short n_elem;              /* size of "elements" array. */
    unsigned short head_idx;            /* head index of the item list. */
    unsigned short n_sel_return;        /* num of selection returned by xcin. */
} menu_item_t;

䤤 title NOWXӹϤY@ item  head, ӥ element list hO
]b wch_t *elements A n_elem O elements }CӼơCpG elem_group
O NULL, hC elements }CNO@ӿﶵApG elem_group O NULL,
hiHΥӫwh elements }CX@ӿﶵAҦp:

	elem_group = NULL		/* C element OUOﶵ */
	title = head1
	elements = {A}, {B}, {C}, {D}
	-------------------------------------------------------------------
	head1  |  1.{A}  2.{B}  3.{C}  4.{D}

	elem_group = ....		/* iHwYz element X@ */
	title = head2			/* ӿﶵ			   */
	elements = {A}, {B}, {C}, {D}
	-------------------------------------------------------------------
	head2  |  1.{AB}  2.{C}  3.{D}

ܩ elem_group ΪkAP inpinfo  lcch_grouping P mcch_grouping 
k@Ҥ@ˡAziHѦ xcin-2.5/doc/internal/module AYiFѡC

ܩ head_idx @λPe gui_menusel_t->head_item @ˡA]OiD
xcin  item list nq@ element }le_C

ѩ menusel eפoHeǩҦ item element, peUɡAxcin
|zL n_sel_return ^ڤWueFX elementAGJkҲեiHǦ
XnվC

̫ᴣ@I: WzҴҦ index, p head_item, focus_item, focus_elem,
head_idx AO 1 }lpơAӤOq 0 }lAФn˿FC




T.H.Hsieh
