4 * Copyright (c) 2011 project bchan
6 * This software is provided 'as-is', without any express or implied
7 * warranty. In no event will the authors be held liable for any damages
8 * arising from the use of this software.
10 * Permission is granted to anyone to use this software for any purpose,
11 * including commercial applications, and to alter it and redistribute it
12 * freely, subject to the following restrictions:
14 * 1. The origin of this software must not be misrepresented; you must not
15 * claim that you wrote the original software. If you use this software
16 * in a product, an acknowledgment in the product documentation would be
17 * appreciated but is not required.
19 * 2. Altered source versions must be plainly marked as such, and must not be
20 * misrepresented as being the original software.
22 * 3. This notice may not be removed or altered from any source
34 #include <btron/btron.h>
35 #include <btron/hmi.h>
36 #include <btron/vobj.h>
37 #include <bsys/queue.h>
39 #ifdef BCHAN_CONFIG_DEBUG
40 # define DP(arg) printf arg
41 # define DP_ER(msg, err) printf("%s (%d/%x)\n", msg, err>>16, err)
44 # define DP_ER(msg, err) /**/
47 typedef VOID (*windowscroll_scrollcalback)(VP arg, W dh, W dv);
49 struct windowscroll_t_ {
52 windowscroll_scrollcalback scroll_callback;
53 W draw_l,draw_t,draw_r,draw_b;
54 W work_l,work_t,work_r,work_b;
57 typedef struct windowscroll_t_ windowscroll_t;
59 LOCAL VOID windowscroll_callback_scroll(windowscroll_t *wscr, W dh, W dv)
61 if (wscr->scroll_callback != NULL) {
62 (*wscr->scroll_callback)(wscr->arg, -dh, -dv);
66 LOCAL W windowscroll_updaterbar(windowscroll_t *wscr)
70 sbarval[0] = wscr->work_t;
71 sbarval[1] = wscr->work_b;
73 sbarval[3] = wscr->draw_b - wscr->draw_t;
74 if (sbarval[1] > sbarval[3]) {
75 sbarval[1] = sbarval[3];
77 if((err = cset_val(wscr->rbar, 4, sbarval)) < 0){
78 DP(("windowscroll_updaterbar:cset_val rbar\n"));
79 DP((" :%d %d %d %d\n", sbarval[0], sbarval[1], sbarval[2], sbarval[3]));
86 LOCAL W windowscroll_updatebbar(windowscroll_t *wscr)
90 sbarval[0] = wscr->work_r;
91 sbarval[1] = wscr->work_l;
92 sbarval[2] = wscr->draw_r - wscr->draw_l;
94 if (sbarval[0] > sbarval[2]) {
95 sbarval[0] = sbarval[2];
97 if((err = cset_val(wscr->bbar, 4, sbarval)) < 0){
98 DP(("windowscroll_updatebbar:cset_val bbar\n"));
99 DP((" :%d %d %d %d\n", sbarval[0], sbarval[1], sbarval[2], sbarval[3]));
106 EXPORT W windowscroll_updatebar(windowscroll_t *wscr)
110 err = windowscroll_updaterbar(wscr);
115 err = windowscroll_updatebbar(wscr);
123 LOCAL W windowscroll_scrollbar(windowscroll_t *wscr, WEVENT *wev, PAID scrbarPAID)
126 W *clo = barval,*chi = barval+1,*lo = barval+2,*hi = barval+3;
128 W pressval,smoothscrolldiff;
135 if((i = cact_par(scrbarPAID, wev)) < 0) {
136 DP_ER("cact_par error", i);
139 cget_val(scrbarPAID, 4, barval);
140 if((i & 0xc) == 0x8) { /*¥¸¥ã¥ó¥×*/
141 if (scrbarPAID == wscr->rbar) { /*±¦¥Ð¡¼*/
143 dv = -(*clo-wscr->work_t);
146 windowscroll_callback_scroll(wscr, dh, dv);
147 } else if (scrbarPAID == wscr->bbar) { /*²¼¥Ð¡¼*/
148 dh = -(*chi-wscr->work_l);
152 windowscroll_callback_scroll(wscr, dh, dv);
154 if ((i & 0x6000) == 0x6000) {
155 /*¥¸¥ã¥ó¥×°ÜÆ°Ãæ¤ÎÃͤÎÊѹ¹*/
161 /*¥¹¥à¡¼¥¹¥¹¥¯¥í¡¼¥ë*/
162 /*¥×¥ì¥¹°ÌÃ֤ȥΥ֤ΰÌÃÖ¤ËÈæÎ㤷¤¿Â®Å٤ǥ¹¥¯¥í¡¼¥ë*/
163 case 0x6000: /*¾å¤Ø¤Î¥¹¥à¡¼¥¹¥¹¥¯¥í¡¼¥ë¤ÇÃæÃÇ*/
164 case 0x6001: /*²¼¤Ø¤Î¥¹¥à¡¼¥¹¥¹¥¯¥í¡¼¥ë¤ÇÃæÃÇ*/
165 if ((err = cget_pos(scrbarPAID, &sbarRECT)) < 0) {
168 pressval = (wev->s.pos.y - sbarRECT.c.top)*
169 (*hi - *lo)/(sbarRECT.c.bottom-sbarRECT.c.top) + *lo;
170 smoothscrolldiff = (pressval - (*chi+*clo)/2)/5;
171 if (smoothscrolldiff == 0) {
174 if ((*clo + smoothscrolldiff) < *lo) {
180 } else if ((*chi + smoothscrolldiff) > *hi) {
188 dv = -smoothscrolldiff;
192 windowscroll_callback_scroll(wscr, dh, dv);
193 windowscroll_updaterbar(wscr);
195 case 0x6002: /*º¸¤Ø¤Î¥¹¥à¡¼¥¹¥¹¥¯¥í¡¼¥ë¤ÇÃæÃÇ*/
196 case 0x6003: /*±¦¤Ø¤Î¥¹¥à¡¼¥¹¥¹¥¯¥í¡¼¥ë¤ÇÃæÃÇ*/
197 if ((err = cget_pos(scrbarPAID, &sbarRECT)) < 0) {
200 pressval = (wev->s.pos.x - sbarRECT.c.left)*
201 (*lo - *hi)/(sbarRECT.c.right-sbarRECT.c.left) + *hi;
202 smoothscrolldiff = (pressval - (*clo+*chi)/2)/5;
203 if (smoothscrolldiff == 0) {
206 if ((*clo + smoothscrolldiff) > *lo) {
212 } else if ((*chi + smoothscrolldiff) < *hi) {
219 dh = -smoothscrolldiff;
224 windowscroll_callback_scroll(wscr, dh, dv);
225 windowscroll_updatebbar(wscr);
227 case 0x5004: /*¾å¤Ø¤Î¥¨¥ê¥¢¥¹¥¯¥í¡¼¥ë¤Ç½ªÎ»*/
228 if ((wscr->work_t - (*chi-*clo)) < *lo) {
230 dv = -(*lo - wscr->work_t);
237 windowscroll_callback_scroll(wscr, dh, dv);
238 windowscroll_updaterbar(wscr);
240 case 0x5005: /*²¼¤Ø¤Î¥¨¥ê¥¢¥¹¥¯¥í¡¼¥ë¤Ç½ªÎ»*/
241 if((wscr->work_b + (*chi-*clo)) > *hi){
243 dv = -(*hi - wscr->work_b);
250 windowscroll_callback_scroll(wscr, dh, dv);
251 windowscroll_updaterbar(wscr);
253 case 0x5006: /*º¸¤Ø¤Î¥¨¥ê¥¢¥¹¥¯¥í¡¼¥ë¤Ç½ªÎ»*/
254 if((wscr->work_l - (*clo-*chi)) < *hi){
255 dh = -(*hi - wscr->work_l);
263 windowscroll_callback_scroll(wscr, dh, dv);
264 windowscroll_updatebbar(wscr);
266 case 0x5007: /*±¦¤Ø¤Î¥¨¥ê¥¢¥¹¥¯¥í¡¼¥ë¤Ç½ªÎ»*/
267 if((wscr->work_r + (*clo-*chi)) > *lo){
268 dh = -(*lo - wscr->work_r);
276 windowscroll_callback_scroll(wscr, dh, dv);
277 windowscroll_updatebbar(wscr);
286 EXPORT VOID windowscroll_scrollbyvalue(windowscroll_t *wscr, W dh, W dv)
292 windowscroll_callback_scroll(wscr, -dh, -dv);
293 windowscroll_updatebar(wscr);
296 LOCAL W windowscroll_weventrbar(windowscroll_t *wscr, WEVENT *wev)
298 return windowscroll_scrollbar(wscr, wev, wscr->rbar);
301 LOCAL W windowscroll_weventbbar(windowscroll_t *wscr, WEVENT *wev)
303 return windowscroll_scrollbar(wscr, wev, wscr->bbar);
306 LOCAL W windowscroll_setworkrect(windowscroll_t *wscr, W l, W t, W r, W b)
312 return windowscroll_updatebar(wscr);
315 LOCAL W windowscroll_setdrawrect(windowscroll_t *wscr, W l, W t, W r, W b)
321 return windowscroll_updatebar(wscr);
324 LOCAL VOID windowscroll_settarget(windowscroll_t *wscr, WID target)
330 wget_bar(target, &(wscr->rbar), &(wscr->bbar), NULL);
331 cchg_par(wscr->rbar, P_NORMAL|P_NOFRAME|P_ENABLE|P_ACT|P_DRAGBREAK);
332 cchg_par(wscr->bbar, P_NORMAL|P_NOFRAME|P_ENABLE|P_ACT|P_DRAGBREAK);
336 LOCAL W windowscroll_initialize(windowscroll_t *wscr, WID target, windowscroll_scrollcalback scrollcallback, VP arg)
338 windowscroll_settarget(wscr, target);
339 wscr->scroll_callback = scrollcallback;
353 LOCAL VOID windowscroll_finalize(windowscroll_t *wscr)
357 struct ngwordlist_node_t_ {
362 typedef struct ngwordlist_node_t_ ngwordlist_node_t;
364 LOCAL ngwordlist_node_t* ngwordlist_node_new(TC *str, W strlen)
366 ngwordlist_node_t *node;
368 node = (ngwordlist_node_t*)malloc(sizeof(ngwordlist_node_t));
373 node->str = malloc(sizeof(TC)*strlen);
374 if (node->str == NULL) {
378 memcpy(node->str, str, sizeof(TC)*strlen);
380 QueInit(&(node->queue));
385 LOCAL VOID ngwordlist_node_delete(ngwordlist_node_t *node)
387 QueRemove(&(node->queue));
392 LOCAL VOID ngwordlist_node_insert(ngwordlist_node_t *entry, ngwordlist_node_t *node)
394 QueInsert(&(entry->queue), &(node->queue));
397 LOCAL ngwordlist_node_t* ngwordlist_node_next(ngwordlist_node_t *node)
399 return (ngwordlist_node_t *)(node->queue.next);
402 struct datwindow_t_ {
405 datwindow_scrollcalback scroll_callback;
411 struct cfrmwindow_t_ {
426 /* left top of content rect */
434 struct ngwordwindow_t_ {
448 ngwordlist_node_t node;
455 datwindow_t *mainwindow;
456 cfrmwindow_t *cfrmwindow;
457 ngwordwindow_t *ngwordwindow;
460 EXPORT W datwindow_startredisp(datwindow_t *window, RECT *r)
462 return wsta_dsp(window->wid, r, NULL);
465 EXPORT W datwindow_endredisp(datwindow_t *window)
467 return wend_dsp(window->wid);
470 EXPORT W datwindow_eraseworkarea(datwindow_t *window, RECT *r)
472 return wera_wnd(window->wid, r);
475 EXPORT W datwindow_scrollworkarea(datwindow_t *window, W dh, W dv)
477 return wscr_wnd(window->wid, NULL, dh, dv, W_MOVE|W_RDSET);
480 EXPORT VOID datwindow_scrollbyvalue(datwindow_t *window, W dh, W dv)
482 windowscroll_scrollbyvalue(&window->wscr, dh, dv);
485 EXPORT W datwindow_requestredisp(datwindow_t *window)
487 return wreq_dsp(window->wid);
490 EXPORT GID datwindow_startdrag(datwindow_t *window)
492 return wsta_drg(window->wid, 0);
495 EXPORT W datwindow_getdrag(datwindow_t *window, PNT *pos, WID *wid, PNT *pos_butup)
499 etype = wget_drg(pos, &window->savedwev);
500 *wid = window->savedwev.s.wid;
501 if (etype == EV_BUTUP) {
502 *pos_butup = window->savedwev.s.pos;
508 EXPORT VOID datwindow_enddrag(datwindow_t *window)
513 EXPORT VOID datwindow_responsepasterequest(datwindow_t *window, W nak, PNT *pos)
516 window->savedwev.r.r.p.rightbot.x = pos->x;
517 window->savedwev.r.r.p.rightbot.y = pos->y;
519 wrsp_evt(&window->savedwev, nak);
522 EXPORT W datwindow_getworkrect(datwindow_t *window, RECT *r)
524 return wget_wrk(window->wid, r);
527 EXPORT GID datwindow_getGID(datwindow_t *window)
529 return wget_gid(window->wid);
532 EXPORT WID datwindow_getWID(datwindow_t *window)
537 EXPORT W datwindow_settitle(datwindow_t *window, TC *title)
539 return wset_tit(window->wid, -1, title, 0);
542 EXPORT W datwindow_setdrawrect(datwindow_t *window, W l, W t, W r, W b)
544 return windowscroll_setdrawrect(&window->wscr, l, t, r, b);
547 EXPORT W datwindow_setworkrect(datwindow_t *window, W l, W t, W r, W b)
549 return windowscroll_setworkrect(&window->wscr, l, t, r, b);
552 LOCAL WID dathmi_getmainWID(dathmi_t *hmi)
554 if (hmi->mainwindow == NULL) {
557 return hmi->mainwindow->wid;
560 LOCAL WID dathmi_getcfrmWID(dathmi_t *hmi)
562 if (hmi->cfrmwindow == NULL) {
565 return hmi->cfrmwindow->wid;
568 LOCAL WID dathmi_getngwordWID(dathmi_t *hmi)
570 if (hmi->ngwordwindow == NULL) {
573 return hmi->ngwordwindow->wid;
576 /* TODO: same as layoutstyle_resetgenvfont */
577 LOCAL VOID cfrmwindow_resetgenv(cfrmwindow_t *window)
584 gget_fon(gid, &spec, NULL);
585 spec.attr |= FT_PROP;
586 spec.attr |= FT_GRAYSCALE;
587 spec.fclass = FTC_DEFAULT;
590 gset_fon(gid, &spec);
591 gset_chc(gid, 0x10000000, 0x10efefef);
596 #define CFRMWINDOW_LAYOUT_WHOLE_MARGIN 5
597 #define CFRMWINDOW_LAYOUT_FROM_MARGIN 0
598 #define CFRMWINDOW_LAYOUT_MAIL_MARGIN 0
599 #define CFRMWINDOW_LAYOUT_MESSAGE_MARGIN 16
600 #define CFRMWINDOW_LAYOUT_BUTTON_MARGIN 5
602 LOCAL VOID cfrmwindow_calclayout(cfrmwindow_t *window, SIZE *sz)
604 SIZE sz_from = {0,0}, sz_mail = {0,0}, sz_msg = {0,0}, sz_button = {0,0};
605 TC label_from[] = {0x4C3E, 0x4130, TK_COLN, TK_KSP, TNULL};
606 TC label_mail[] = {TK_E, 0x213E, TK_m, TK_a, TK_i, TK_l, TK_COLN, TK_KSP, TNULL};
608 W width_from, width_mail;
609 actionlist_t *alist_from = NULL, *alist_mail = NULL, *alist_message = NULL;
610 TC *from, *mail, *message;
611 W from_len, mail_len, message_len;
616 if (window->post == NULL) {
622 from = postresdata_getfromstring(window->post);
623 from_len = postresdata_getfromstringlen(window->post);
624 mail = postresdata_getmailstring(window->post);
625 mail_len = postresdata_getmailstringlen(window->post);
626 message = postresdata_getmessagestring(window->post);
627 message_len = postresdata_getmessagestringlen(window->post);
629 cfrmwindow_resetgenv(window);
630 width_from = gget_stw(gid, label_from, 4, NULL, NULL);
631 if (width_from < 0) {
634 tadlib_calcdrawsize(from, from_len, gid, &sz_from, &alist_from);
635 sz_from.h += width_from + CFRMWINDOW_LAYOUT_FROM_MARGIN * 2;
636 sz_from.v += CFRMWINDOW_LAYOUT_FROM_MARGIN * 2;
638 if (alist_from != NULL) {
639 actionlist_delete(alist_from);
641 cfrmwindow_resetgenv(window);
642 width_mail = gget_stw(gid, label_mail, 4, NULL, NULL);
643 if (width_mail < 0) {
646 tadlib_calcdrawsize(mail, mail_len, gid, &sz_mail, &alist_mail);
647 sz_mail.h += width_mail + CFRMWINDOW_LAYOUT_MAIL_MARGIN * 2;
648 sz_mail.v += CFRMWINDOW_LAYOUT_MAIL_MARGIN * 2;
650 if (alist_mail != NULL) {
651 actionlist_delete(alist_mail);
653 cfrmwindow_resetgenv(window);
654 tadlib_calcdrawsize(message, message_len, gid, &sz_msg, &alist_message);
655 if (alist_message != NULL) {
656 actionlist_delete(alist_message);
658 sz_msg.h += CFRMWINDOW_LAYOUT_MESSAGE_MARGIN * 2;
659 sz_msg.v += CFRMWINDOW_LAYOUT_MESSAGE_MARGIN * 2;
661 sz_button.h = window->sz_ms_post.h + window->sz_ms_cancel.h + CFRMWINDOW_LAYOUT_BUTTON_MARGIN * 4;
662 sz_button.v = (window->sz_ms_post.v > window->sz_ms_cancel.v) ? window->sz_ms_post.v : window->sz_ms_cancel.v + CFRMWINDOW_LAYOUT_BUTTON_MARGIN * 2;
665 if (sz->h < sz_from.h) {
669 if (sz->h < sz_mail.h) {
673 if (sz->h < sz_msg.h) {
676 sz->v += sz_button.v;
677 if (sz->h < sz_button.h) {
680 sz->h += CFRMWINDOW_LAYOUT_WHOLE_MARGIN * 2;
681 sz->v += CFRMWINDOW_LAYOUT_WHOLE_MARGIN * 2;
683 window->pos_from.x = CFRMWINDOW_LAYOUT_WHOLE_MARGIN + CFRMWINDOW_LAYOUT_FROM_MARGIN;
684 window->pos_from.y = CFRMWINDOW_LAYOUT_WHOLE_MARGIN + CFRMWINDOW_LAYOUT_FROM_MARGIN;
685 window->pos_mail.x = CFRMWINDOW_LAYOUT_WHOLE_MARGIN + CFRMWINDOW_LAYOUT_MAIL_MARGIN;
686 window->pos_mail.y = CFRMWINDOW_LAYOUT_WHOLE_MARGIN + sz_from.v + CFRMWINDOW_LAYOUT_MAIL_MARGIN;
687 window->pos_message.x = CFRMWINDOW_LAYOUT_WHOLE_MARGIN + CFRMWINDOW_LAYOUT_MESSAGE_MARGIN;
688 window->pos_message.y = CFRMWINDOW_LAYOUT_WHOLE_MARGIN + sz_from.v + sz_mail.v + CFRMWINDOW_LAYOUT_MESSAGE_MARGIN;
689 window->pos_cancel.x = CFRMWINDOW_LAYOUT_WHOLE_MARGIN + CFRMWINDOW_LAYOUT_BUTTON_MARGIN;
690 window->pos_cancel.y = CFRMWINDOW_LAYOUT_WHOLE_MARGIN + sz_from.v + sz_mail.v + sz_msg.v + CFRMWINDOW_LAYOUT_BUTTON_MARGIN;
691 window->pos_post.x = window->pos_cancel.x + window->sz_ms_cancel.h + CFRMWINDOW_LAYOUT_BUTTON_MARGIN;
692 window->pos_post.y = window->pos_cancel.y;
695 EXPORT W cfrmwindow_open(cfrmwindow_t* window)
707 if (window->wid > 0) {
711 wid = wopn_wnd(WA_SUBW|WA_SIZE|WA_HHDL|WA_VHDL|WA_BBAR|WA_RBAR, window->parent, &(window->r), NULL, 2, window->windowtitle, &pat0, NULL);
713 DP_ER("wopn_wnd: confirm error", wid);
717 window->gid = wget_gid(wid);
718 windowscroll_settarget(&window->wscr, wid);
720 cfrmwindow_calclayout(window, &sz);
721 windowscroll_setdrawrect(&window->wscr, 0, 0, sz.h, sz.v);
722 windowscroll_setworkrect(&window->wscr, 0, 0, window->r.c.right, window->r.c.bottom);
724 window->ms_cancel_id = copn_par(wid, window->dnum_cancel, &window->pos_cancel);
725 if (window->ms_cancel_id < 0) {
726 DP_ER("copn_par error:", window->ms_cancel_id);
729 window->ms_post_id = copn_par(wid, window->dnum_post, &window->pos_post);
730 if (window->ms_post_id < 0) {
731 DP_ER("copn_par error:", window->ms_post_id);
739 LOCAL W ngwordwindow_writeswitchselecterstring(ngwordwindow_t *window, TC *str)
741 ngwordlist_node_t *node;
745 node = ngwordlist_node_next(&window->node);
746 for (; node != &window->node;) {
747 size += 1; /* MC_STR */
749 node = ngwordlist_node_next(node);
752 size = 1; /* MC_STR */
757 node = ngwordlist_node_next(&window->node);
758 for (; node != &window->node;) {
759 str[size++] = MC_STR;
760 memcpy(str + size, node->str, node->len * sizeof(TC));
762 node = ngwordlist_node_next(node);
765 str[size++] = MC_STR;
772 LOCAL W ngwordwindow_updatescrollselector(ngwordwindow_t *window)
776 len = ngwordwindow_writeswitchselecterstring(window, NULL);
777 window->selector = realloc(window->selector, len*sizeof(TC));
778 if (window->selector == NULL) {
779 return -1; /* TODO */
781 ngwordwindow_writeswitchselecterstring(window, window->selector);
782 cset_dat(window->ss_list_id, (W)window->selector);
787 EXPORT W ngwordwindow_open(ngwordwindow_t *window)
789 TC test[] = {TK_N, TK_G, 0x256F, 0x213C, 0x2549, 0x306C, 0x4D77,TNULL};
793 if (window->wid > 0) {
797 wid = wopn_wnd(WA_SUBW, window->parent, &(window->r), NULL, 2, test, &window->bgpat, NULL);
799 DP_ER("wopn_wnd: ngword error", wid);
803 window->gid = wget_gid(wid);
807 window->ss_list_id = copn_par(wid, window->dnum_list, &pos);
808 if (window->ss_list_id < 0) {
809 DP_ER("copn_par list error:", window->ss_list_id);
813 window->ms_delete_id = copn_par(wid, window->dnum_delete, &pos);
814 if (window->ms_delete_id < 0) {
815 DP_ER("copn_par delete error:", window->ms_delete_id);
819 window->tb_input_id = copn_par(wid, window->dnum_input, &pos);
820 if (window->tb_input_id < 0) {
821 DP_ER("copn_par input error:", window->tb_input_id);
825 window->ms_append_id = copn_par(wid, window->dnum_append, &pos);
826 if (window->ms_append_id < 0) {
827 DP_ER("copn_par append error:", window->ms_append_id);
830 ngwordwindow_updatescrollselector(window);
837 LOCAL Bool ngwordwindow_searchwordbyindex(ngwordwindow_t *window, W index, TC **str, W *len)
839 ngwordlist_node_t *node;
843 node = ngwordlist_node_next(&window->node);
844 for (; node != &window->node;) {
850 node = ngwordlist_node_next(node);
857 EXPORT W ngwordwindow_appendword(ngwordwindow_t *window, TC *str, W len)
859 ngwordlist_node_t *newnode;
861 newnode = ngwordlist_node_new(str, len);
862 if (newnode == NULL) {
863 return -1; /* TODO */
865 ngwordlist_node_insert(newnode, &window->node);
866 return ngwordwindow_updatescrollselector(window);
869 EXPORT W ngwordwindow_removeword(ngwordwindow_t *window, TC *str, W len)
871 ngwordlist_node_t *node;
874 node = ngwordlist_node_next(&window->node);
875 for (; node != &window->node;) {
876 if (node->len == len) {
877 result = tc_strncmp(node->str, str, len);
879 ngwordlist_node_delete(node);
880 return ngwordwindow_updatescrollselector(window);
883 node = ngwordlist_node_next(node);
888 EXPORT VOID cfrmwindow_setpostresdata(cfrmwindow_t *window, postresdata_t *post)
896 if (window->wid > 0) {
897 cfrmwindow_calclayout(window, &sz);
898 windowscroll_setdrawrect(&window->wscr, 0, 0, sz.h, sz.v);
902 wset_wrk(window->wid, &work);
903 windowscroll_setworkrect(&window->wscr, work.c.left, work.c.top, work.c.right, work.c.bottom);
905 r.c.left = window->pos_cancel.x;
906 r.c.top = window->pos_cancel.y;
907 r.c.right = r.c.left + window->sz_ms_cancel.h;
908 r.c.bottom = r.c.top + window->sz_ms_cancel.v;
909 err = cset_pos(window->ms_cancel_id, &r);
911 DP_ER("cset_pos error cancel button", err);
913 r.c.left = window->pos_post.x;
914 r.c.top = window->pos_post.y;
915 r.c.right = r.c.left + window->sz_ms_post.h;
916 r.c.bottom = r.c.top + window->sz_ms_post.v;
917 err = cset_pos(window->ms_post_id, &r);
919 DP_ER("cset_pos error post button", err);
922 wreq_dsp(window->wid);
926 LOCAL VOID cfrmwindow_draw(cfrmwindow_t *window, RECT *r)
928 TC label_from[] = {0x4C3E, 0x4130, TK_COLN, TK_KSP, TNULL};
929 TC label_mail[] = {TK_E, 0x213E, TK_m, TK_a, TK_i, TK_l, TK_COLN, TK_KSP, TNULL};
931 TC *from, *mail, *message;
932 W from_len, mail_len, message_len;
934 if (window->post == NULL) {
940 from = postresdata_getfromstring(window->post);
941 from_len = postresdata_getfromstringlen(window->post);
942 mail = postresdata_getmailstring(window->post);
943 mail_len = postresdata_getmailstringlen(window->post);
944 message = postresdata_getmessagestring(window->post);
945 message_len = postresdata_getmessagestringlen(window->post);
947 cfrmwindow_resetgenv(window);
948 gdra_stp(gid, window->pos_from.x, window->pos_from.y + 16, label_from, 4, G_STORE);
949 tadlib_drawtext(from, from_len, gid, 0, 0);
950 cfrmwindow_resetgenv(window);
951 gdra_stp(gid, window->pos_mail.x, window->pos_mail.y + 16, label_mail, 8, G_STORE);
952 tadlib_drawtext(mail, mail_len, gid, 0, 0);
953 cfrmwindow_resetgenv(window);
954 gset_chp(gid, window->pos_message.x, window->pos_message.y + 16, True);
955 tadlib_drawtext(message, message_len, gid, -window->pos_message.x, -window->pos_message.y);
957 cdsp_pwd(window->wid, r, P_RDISP);
960 LOCAL VOID cfrmwindow_redisp(cfrmwindow_t *window)
964 if (wsta_dsp(window->wid, &r, NULL) == 0) {
967 wera_wnd(window->wid, &r);
968 cfrmwindow_draw(window, &r);
969 } while (wend_dsp(window->wid) > 0);
972 LOCAL VOID cfrmwindow_close2(cfrmwindow_t *window)
977 windowscroll_settarget(&window->wscr, -1);
979 err = wget_sts(window->wid, &stat, NULL);
983 wcls_wnd(window->wid, CLR);
986 window->ms_post_id = -1;
987 window->ms_cancel_id = -1;
990 LOCAL VOID cfrmwindow_close(cfrmwindow_t *window, dathmievent_t *evt)
992 cfrmwindow_close2(window);
993 evt->type = DATHMIEVENT_TYPE_CONFIRM_CLOSE;
994 evt->data.confirm_close.send = False;
997 LOCAL VOID ngwordwindow_close(ngwordwindow_t *window)
1003 err = wget_sts(window->wid, &stat, NULL);
1007 wcls_wnd(window->wid, CLR);
1012 LOCAL VOID ngwordwindow_draw(ngwordwindow_t *window, RECT *r)
1014 cdsp_pwd(window->wid, r, P_RDISP);
1017 LOCAL VOID ngwordwindow_redisp(ngwordwindow_t *window)
1021 if (wsta_dsp(window->wid, &r, NULL) == 0) {
1024 wera_wnd(window->wid, &r);
1025 ngwordwindow_draw(window, &r);
1026 } while (wend_dsp(window->wid) > 0);
1029 LOCAL VOID dathmi_weventrequest(dathmi_t *hmi, WEVENT *wev, dathmievent_t *evt)
1031 WID main_wid, cfrm_wid, ngword_wid;
1033 main_wid = dathmi_getmainWID(hmi);
1034 cfrm_wid = dathmi_getcfrmWID(hmi);
1035 ngword_wid = dathmi_getngwordWID(hmi);
1037 switch (wev->g.cmd) {
1038 case W_REDISP: /*ºÆɽ¼¨Í×µá*/
1039 if (wev->g.wid == main_wid) {
1040 evt->type = DATHMIEVENT_TYPE_THREAD_DRAW;
1041 } else if (wev->g.wid == cfrm_wid) {
1042 cfrmwindow_redisp(hmi->cfrmwindow);
1043 } else if (wev->g.wid == ngword_wid) {
1044 ngwordwindow_redisp(hmi->ngwordwindow);
1047 case W_PASTE: /*Ž¹þ¤ßÍ×µá*/
1048 if (wev->g.wid == main_wid) {
1049 evt->type = DATHMIEVENT_TYPE_THREAD_PASTE;
1050 memcpy(&hmi->mainwindow->savedwev, wev, sizeof(WEVENT));
1051 } else if (wev->g.wid == cfrm_wid) {
1052 wrsp_evt(wev, 1); /*NACK*/
1053 } else if (wev->g.wid == ngword_wid) {
1054 wrsp_evt(wev, 1); /*NACK*/
1057 case W_DELETE: /*Êݸ½ªÎ»*/
1058 wrsp_evt(wev, 0); /*ACK*/
1059 if (wev->g.wid == main_wid) {
1060 evt->type = DATHMIEVENT_TYPE_THREAD_CLOSE;
1061 evt->data.main_close.save = True;
1062 } else if (wev->g.wid == cfrm_wid) {
1063 cfrmwindow_close(hmi->cfrmwindow, evt);
1064 } else if (wev->g.wid == ngword_wid) {
1065 ngwordwindow_close(hmi->ngwordwindow);
1066 evt->type = DATHMIEVENT_TYPE_NGWORD_CLOSE;
1069 case W_FINISH: /*ÇÑ´þ½ªÎ»*/
1070 wrsp_evt(wev, 0); /*ACK*/
1071 if (wev->g.wid == main_wid) {
1072 evt->type = DATHMIEVENT_TYPE_THREAD_CLOSE;
1073 evt->data.main_close.save = False;
1074 } else if (wev->g.wid == cfrm_wid) {
1075 cfrmwindow_close(hmi->cfrmwindow, evt);
1076 } else if (wev->g.wid == ngword_wid) {
1077 ngwordwindow_close(hmi->ngwordwindow);
1078 evt->type = DATHMIEVENT_TYPE_NGWORD_CLOSE;
1084 LOCAL VOID cfrmwindow_resize(cfrmwindow_t *window)
1087 Bool workchange = False;
1089 wget_wrk(window->wid, &work);
1090 if (work.c.left < 0) {
1094 if (work.c.top < 0) {
1098 wset_wrk(window->wid, &work);
1099 gset_vis(window->gid, work);
1101 windowscroll_setworkrect(&window->wscr, work.c.left, work.c.top, work.c.right, work.c.bottom);
1103 if (workchange == True) {
1104 wera_wnd(window->wid, NULL);
1105 wreq_dsp(window->wid);
1109 LOCAL VOID datwindow_resize(datwindow_t *window, SIZE *sz)
1112 Bool workchange = False;
1114 wget_wrk(window->wid, &work);
1115 if (work.c.left != 0) {
1119 if (work.c.top != 0) {
1123 wset_wrk(window->wid, &work);
1124 gset_vis(window->gid, work);
1126 if (workchange == True) {
1127 wera_wnd(window->wid, NULL);
1128 wreq_dsp(window->wid);
1131 sz->v = work.c.bottom - work.c.top;
1132 sz->h = work.c.right - work.c.left;
1135 LOCAL VOID cfrmwindow_butdnwork(cfrmwindow_t *window, WEVENT *wev, dathmievent_t *evt)
1140 ret = cfnd_par(window->wid, wev->s.pos, &id);
1144 if (id == window->ms_post_id) {
1145 ret = cact_par(window->ms_post_id, wev);
1146 if ((ret & 0x5000) != 0x5000) {
1149 cfrmwindow_close2(window);
1150 evt->type = DATHMIEVENT_TYPE_CONFIRM_CLOSE;
1151 evt->data.confirm_close.send = True;
1154 if (id == window->ms_cancel_id) {
1155 ret = cact_par(window->ms_cancel_id, wev);
1156 if ((ret & 0x5000) != 0x5000) {
1159 cfrmwindow_close2(window);
1160 evt->type = DATHMIEVENT_TYPE_CONFIRM_CLOSE;
1161 evt->data.confirm_close.send = False;
1166 LOCAL VOID ngwordwindow_butdnwork(ngwordwindow_t *window, WEVENT *wev, dathmievent_t *evt)
1169 W ret, len, val, err;
1173 ret = cfnd_par(window->wid, wev->s.pos, &id);
1177 if (id == window->ss_list_id) {
1178 cact_par(window->ss_list_id, wev);
1180 if (id == window->ms_delete_id) {
1181 ret = cact_par(window->ms_delete_id, wev);
1182 if ((ret & 0x5000) != 0x5000) {
1185 err = cget_val(window->ss_list_id, 1, (W*)&val);
1187 DP_ER("cget_val ss_list_id error:", err);
1193 found = ngwordwindow_searchwordbyindex(window, val - 1, &str, &len);
1194 if (found == False) {
1195 DP(("not found in ngwordwindow parts\n"));
1198 memcpy(window->strbuf, str, len * sizeof(TC));
1199 evt->type = DATHMIEVENT_TYPE_NGWORD_REMOVE;
1200 evt->data.ngword_append.str = window->strbuf;
1201 evt->data.ngword_append.len = len;
1204 if (id == window->tb_input_id) {
1206 ret = cact_par(window->tb_input_id, wev);
1208 DP_ER("cact_par tb_input_id error:", ret);
1211 switch (ret & 0xefff) {
1213 switch (wev->s.type) {
1219 oprc_dev(&wev->e, NULL, 0);
1222 wev->s.type = EV_NULL;
1225 if ((wev->s.type == EV_KEYDWN)&&(wev->s.stat & ES_CMD)) {
1228 wev->s.type = EV_NULL;
1231 case (0x4000|P_TAB):
1233 case (0x4000|P_BUT):
1241 if (id == window->ms_append_id) {
1242 ret = cact_par(window->ms_append_id, wev);
1243 if ((ret & 0x5000) != 0x5000) {
1246 len = cget_val(window->tb_input_id, 128, (W*)window->strbuf);
1250 evt->type = DATHMIEVENT_TYPE_NGWORD_APPEND;
1251 evt->data.ngword_append.str = window->strbuf;
1252 evt->data.ngword_append.len = len;
1253 len = cset_val(window->tb_input_id, 0, NULL);
1255 DP_ER("cset_val tb_input_id error", len);
1261 LOCAL VOID dathmi_weventbutdn(dathmi_t *hmi, WEVENT *wev, dathmievent_t *evt)
1264 WID main_wid, cfrm_wid, ngword_wid;
1266 main_wid = dathmi_getmainWID(hmi);
1267 cfrm_wid = dathmi_getcfrmWID(hmi);
1268 ngword_wid = dathmi_getngwordWID(hmi);
1270 switch (wev->s.cmd) {
1272 switch (wchk_dck(wev->s.time)) {
1274 if (wev->s.wid == main_wid) {
1275 evt->type = DATHMIEVENT_TYPE_THREAD_CLOSE;
1276 evt->data.main_close.save = True; /* TODO: tmp value. */
1277 } else if (wev->s.wid == cfrm_wid) {
1278 cfrmwindow_close2(hmi->cfrmwindow);
1279 evt->type = DATHMIEVENT_TYPE_CONFIRM_CLOSE;
1280 evt->data.confirm_close.send = False;
1281 } else if (wev->s.wid == ngword_wid) {
1282 ngwordwindow_close(hmi->ngwordwindow);
1283 evt->type = DATHMIEVENT_TYPE_NGWORD_CLOSE;
1293 if (wmov_drg(wev, NULL) > 0) {
1294 if (wev->s.wid == main_wid) {
1295 evt->type = DATHMIEVENT_TYPE_THREAD_DRAW;
1296 } else if (wev->s.wid == cfrm_wid) {
1297 cfrmwindow_redisp(hmi->cfrmwindow);
1298 } else if (wev->s.wid == ngword_wid) {
1299 ngwordwindow_redisp(hmi->ngwordwindow);
1307 switch (wchk_dck(wev->s.time)) {
1309 i = wchg_wnd(wev->s.wid, NULL, W_MOVE);
1312 i = wrsz_drg(wev, NULL, NULL);
1318 if (wev->s.wid == main_wid) {
1319 evt->type = DATHMIEVENT_TYPE_THREAD_RESIZE;
1320 datwindow_resize(hmi->mainwindow, &evt->data.main_resize.work_sz);
1321 windowscroll_updatebar(&hmi->mainwindow->wscr);
1323 //evt->type = DATHMIEVENT_TYPE_THREAD_DRAW;
1324 /* TODO: queueing */
1325 evt->data.main_resize.needdraw = True;
1327 evt->data.main_resize.needdraw = False;
1329 } else if (wev->s.wid == cfrm_wid) {
1330 cfrmwindow_resize(hmi->cfrmwindow);
1331 windowscroll_updatebar(&hmi->cfrmwindow->wscr);
1333 cfrmwindow_redisp(hmi->cfrmwindow);
1336 /* ngword window need not do nothing. */
1339 if (wev->s.wid == main_wid) {
1340 windowscroll_weventrbar(&hmi->mainwindow->wscr, wev);
1341 } else if (wev->s.wid == cfrm_wid) {
1342 windowscroll_weventrbar(&hmi->cfrmwindow->wscr, wev);
1344 /* ngword window need not do nothing. */
1347 if (wev->s.wid == main_wid) {
1348 windowscroll_weventbbar(&hmi->mainwindow->wscr, wev);
1349 } else if (wev->s.wid == cfrm_wid) {
1350 windowscroll_weventbbar(&hmi->cfrmwindow->wscr, wev);
1352 /* ngword window need not do nothing. */
1355 if (wev->s.wid == main_wid) {
1356 evt->type = DATHMIEVENT_TYPE_THREAD_BUTDN;
1357 evt->data.main_butdn.type = wchk_dck(wev->s.time);
1358 evt->data.main_butdn.pos = wev->s.pos;
1359 memcpy(&hmi->mainwindow->savedwev, wev, sizeof(WEVENT));
1360 } else if (wev->s.wid == cfrm_wid) {
1361 cfrmwindow_butdnwork(hmi->cfrmwindow, wev, evt);
1362 } else if (wev->s.wid == ngword_wid) {
1363 ngwordwindow_butdnwork(hmi->ngwordwindow, wev, evt);
1371 LOCAL VOID dathmi_weventswitch(dathmi_t *hmi, WEVENT *wev, dathmievent_t *evt)
1373 evt->type = DATHMIEVENT_TYPE_THREAD_SWITCH;
1374 evt->data.main_switch.needdraw = False;
1375 //dathmi_weventbutdn(hmi, wev, evt);
1378 LOCAL VOID dathmi_weventreswitch(dathmi_t *hmi, WEVENT *wev, dathmievent_t *evt)
1380 WID main_wid, cfrm_wid, ngword_wid;
1382 main_wid = dathmi_getmainWID(hmi);
1383 cfrm_wid = dathmi_getcfrmWID(hmi);
1384 ngword_wid = dathmi_getngwordWID(hmi);
1386 if (wev->s.wid == main_wid) {
1387 evt->type = DATHMIEVENT_TYPE_THREAD_SWITCH;
1388 evt->data.main_switch.needdraw = True;
1389 } else if (wev->s.wid == cfrm_wid) {
1390 cfrmwindow_redisp(hmi->cfrmwindow);
1391 } else if (wev->s.wid == ngword_wid) {
1392 ngwordwindow_redisp(hmi->ngwordwindow);
1394 //dathmi_weventbutdn(hmi, wev, evt); TODO: event queueing
1397 LOCAL VOID dathmi_receivemessage(dathmi_t *hmi, dathmievent_t *evt)
1402 err = rcv_msg(MM_ALL, &msg, sizeof(MESSAGE), WAIT|NOCLR);
1404 if (msg.msg_type == MS_TMOUT) { /* should be use other type? */
1405 evt->type = DATHMIEVENT_TYPE_COMMON_TIMEOUT;
1406 evt->data.common_timeout.code = msg.msg_body.TMOUT.code;
1409 clr_msg(MM_ALL, MM_ALL);
1412 EXPORT W dathmi_getevent(dathmi_t *hmi, dathmievent_t **evt)
1415 WID main_wid, cfrm_wid, ngword_wid;
1417 main_wid = dathmi_getmainWID(hmi);
1418 cfrm_wid = dathmi_getcfrmWID(hmi);
1419 ngword_wid = dathmi_getngwordWID(hmi);
1421 hmi->evt.type = DATHMIEVENT_TYPE_NONE;
1423 wget_evt(&wev0, WAIT);
1424 switch (wev0.s.type) {
1426 if ((wev0.s.wid != main_wid)&&(wev0.s.wid != cfrm_wid)&&(wev0.s.wid != ngword_wid)) {
1427 hmi->evt.type = DATHMIEVENT_TYPE_COMMON_MOUSEMOVE;
1428 hmi->evt.data.common_mousemove.pos = wev0.s.pos;
1429 break; /*¥¦¥£¥ó¥É¥¦³°*/
1431 if (wev0.s.cmd != W_WORK)
1432 break; /*ºî¶ÈÎΰ賰*/
1433 if (wev0.s.stat & ES_CMD)
1434 break; /*Ì¿Îᥡ¼¤¬²¡¤µ¤ì¤Æ¤¤¤ë*/
1435 if (wev0.s.wid == main_wid) {
1436 hmi->evt.type = DATHMIEVENT_TYPE_THREAD_MOUSEMOVE;
1437 hmi->evt.data.main_mousemove.pos = wev0.s.pos;
1438 hmi->evt.data.main_mousemove.stat = wev0.s.stat;
1439 } else if (wev0.s.wid == cfrm_wid) {
1440 cidl_par(wev0.s.wid, &wev0.s.pos);
1441 } else if (wev0.s.wid == ngword_wid) {
1442 cidl_par(wev0.s.wid, &wev0.s.pos);
1446 dathmi_weventrequest(hmi, &wev0, &hmi->evt);
1449 dathmi_weventreswitch(hmi, &wev0, &hmi->evt);
1452 dathmi_weventswitch(hmi, &wev0, &hmi->evt);
1455 dathmi_weventbutdn(hmi, &wev0, &hmi->evt);
1459 hmi->evt.type = DATHMIEVENT_TYPE_COMMON_KEYDOWN;
1460 hmi->evt.data.common_keydown.keycode = wev0.e.data.key.code;
1461 hmi->evt.data.common_keydown.keytop = wev0.e.data.key.keytop;
1462 hmi->evt.data.common_keydown.stat = wev0.e.stat;
1468 oprc_dev(&wev0.e, NULL, 0);
1471 dathmi_receivemessage(hmi, &hmi->evt);
1474 hmi->evt.type = DATHMIEVENT_TYPE_COMMON_MENU;
1475 hmi->evt.data.common_menu.pos = wev0.s.pos;
1484 LOCAL VOID datwindow_scroll(VP arg, W dh, W dv)
1486 datwindow_t *window = (datwindow_t*)arg;
1487 (*window->scroll_callback)(window->arg, dh, dv);
1490 LOCAL datwindow_t* datwindow_new(RECT *r, TC *title, PAT *bgpat, datwindow_scrollcalback scrollcallback, VP arg)
1492 datwindow_t* window;
1495 window = malloc(sizeof(datwindow_t));
1496 if (window == NULL) {
1500 window->wid = wopn_wnd(WA_SIZE|WA_HHDL|WA_VHDL|WA_BBAR|WA_RBAR, 0, r, NULL, 1, title, bgpat, NULL);
1501 if (window->wid < 0) {
1505 err = windowscroll_initialize(&window->wscr, window->wid, datwindow_scroll, (VP)window);
1507 wcls_wnd(window->wid, CLR);
1511 window->scroll_callback = scrollcallback;
1517 LOCAL VOID datwindow_delete(datwindow_t *window)
1519 wcls_wnd(window->wid, CLR);
1520 windowscroll_finalize(&window->wscr);
1524 EXPORT datwindow_t* dathmi_newmainwindow(dathmi_t *hmi, RECT *r, TC *title, PAT *bgpat, datwindow_scrollcalback scrollcallback, VP arg)
1526 hmi->mainwindow = datwindow_new(r, title, bgpat, scrollcallback, arg);
1527 return hmi->mainwindow;
1530 EXPORT VOID dathmi_deletemainwindow(dathmi_t *hmi, datwindow_t *window)
1532 datwindow_delete(window);
1533 hmi->mainwindow = NULL;
1536 LOCAL VOID cfrmwindow_scroll(VP arg, W dh, W dv)
1538 cfrmwindow_t *window = (cfrmwindow_t*)arg;
1539 wscr_wnd(window->wid, NULL, -dh, -dv, W_SCRL|W_RDSET);
1540 cfrmwindow_redisp(window);
1543 EXPORT cfrmwindow_t* cfrmwindow_new(RECT *r, WID parent, W dnum_title, W dnum_post, W dnum_cancel)
1545 cfrmwindow_t *window;
1549 window = (cfrmwindow_t*)malloc(sizeof(cfrmwindow_t));
1550 if (window == NULL) {
1555 window->parent = parent;
1556 window->ms_post_id = -1;
1557 window->ms_cancel_id = -1;
1559 window->post = NULL;
1560 err = windowscroll_initialize(&window->wscr, window->wid, cfrmwindow_scroll, (VP)window);
1566 err = dget_dtp(TEXT_DATA, dnum_title, (void**)&window->windowtitle);
1568 DP_ER("dget_dtp: message retrieving error", err);
1569 windowscroll_finalize(&window->wscr);
1574 err = dget_dtp(PARTS_DATA, dnum_post, (void**)&sw);
1576 DP_ER("dget_dtp: message retrieving error", err);
1577 windowscroll_finalize(&window->wscr);
1581 window->dnum_post = dnum_post;
1582 window->sz_ms_post.h = sw->r.c.right - sw->r.c.left;
1583 window->sz_ms_post.v = sw->r.c.bottom - sw->r.c.top;
1585 err = dget_dtp(PARTS_DATA, dnum_cancel, (void**)&sw);
1587 DP_ER("dget_dtp: message retrieving error", err);
1588 windowscroll_finalize(&window->wscr);
1592 window->dnum_cancel = dnum_cancel;
1593 window->sz_ms_cancel.h = sw->r.c.right - sw->r.c.left;
1594 window->sz_ms_cancel.v = sw->r.c.bottom - sw->r.c.top;
1599 EXPORT cfrmwindow_t *dathmi_newconfirmwindow(dathmi_t *hmi, RECT *r, W dnum_title, W dnum_post, W dnum_cancel)
1602 main_wid = dathmi_getmainWID(hmi);
1604 DP_ER("main window not exist", 0);
1607 hmi->cfrmwindow = cfrmwindow_new(r, main_wid, dnum_title, dnum_post, dnum_cancel);
1608 return hmi->cfrmwindow;
1611 LOCAL VOID cfrmwindow_delete(cfrmwindow_t *window)
1613 if (window->wid > 0) {
1614 wcls_wnd(window->wid, CLR);
1616 windowscroll_finalize(&window->wscr);
1620 EXPORT VOID dathmi_deleteconfirmwindow(dathmi_t *hmi, cfrmwindow_t *window)
1622 cfrmwindow_delete(window);
1623 hmi->cfrmwindow = NULL;
1626 LOCAL ngwordwindow_t* ngwordwindow_new(PNT *p, WID parent, W dnum_list, W dnum_delete, W dnum_input, W dnum_append)
1628 ngwordwindow_t *window;
1631 window = (ngwordwindow_t*)malloc(sizeof(ngwordwindow_t));
1632 if (window == NULL) {
1633 DP_ER("malloc error:", 0);
1638 window->parent = parent;
1639 window->r.p.lefttop = *p;
1640 window->r.p.rightbot.x = p->x + 300 + 7;
1641 window->r.p.rightbot.y = p->y + 200 + 30;
1642 err = wget_inf(WI_PANELBACK, &window->bgpat, sizeof(PAT));
1643 if (err != sizeof(PAT)) {
1644 DP_ER("wget_inf error:", err);
1645 window->bgpat.spat.kind = 0;
1646 window->bgpat.spat.hsize = 16;
1647 window->bgpat.spat.vsize = 16;
1648 window->bgpat.spat.fgcol = 0x10ffffff;
1649 window->bgpat.spat.bgcol = 0;
1650 window->bgpat.spat.mask = FILL100;
1652 window->dnum_list = dnum_list;
1653 window->dnum_delete = dnum_delete;
1654 window->dnum_input = dnum_input;
1655 window->dnum_append = dnum_append;
1656 window->ss_list_id = -1;
1657 window->ms_delete_id = -1;
1658 window->tb_input_id = -1;
1659 window->ms_append_id = -1;
1660 QueInit(&(window->node.queue));
1661 window->selector = NULL;
1666 LOCAL VOID ngwordwindow_delete(ngwordwindow_t *window)
1668 ngwordlist_node_t *node;
1670 node = ngwordlist_node_next(&window->node);
1671 for (; node != &window->node;) {
1672 ngwordlist_node_delete(node);
1673 node = ngwordlist_node_next(&window->node);
1675 if (window->wid > 0) {
1676 wcls_wnd(window->wid, CLR);
1681 EXPORT ngwordwindow_t *dathmi_newngwordwindow(dathmi_t *hmi, PNT *p, W dnum_list, W dnum_delete, W dnum_input, W dnum_append)
1684 main_wid = dathmi_getmainWID(hmi);
1686 DP_ER("main window not exist", 0);
1689 hmi->ngwordwindow = ngwordwindow_new(p, main_wid, dnum_list, dnum_delete, dnum_input, dnum_append);
1690 return hmi->ngwordwindow;
1693 EXPORT VOID dathmi_deletengwordwindow(dathmi_t *hmi, ngwordwindow_t *window)
1695 ngwordwindow_delete(window);
1696 hmi->ngwordwindow = NULL;
1699 EXPORT dathmi_t* dathmi_new()
1703 hmi = (dathmi_t *)malloc(sizeof(dathmi_t));
1707 hmi->mainwindow = NULL;
1708 hmi->cfrmwindow = NULL;
1709 hmi->ngwordwindow = NULL;
1714 EXPORT VOID dathmi_delete(dathmi_t *hmi)
1716 if (hmi->ngwordwindow != NULL) {
1717 ngwordwindow_delete(hmi->ngwordwindow);
1719 if (hmi->cfrmwindow != NULL) {
1720 cfrmwindow_delete(hmi->cfrmwindow);
1722 if (hmi->mainwindow != NULL) {
1723 datwindow_delete(hmi->mainwindow);