topwin.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660
  1. /*
  2. * File : win_server.c
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://www.rt-thread.org/license/LICENSE
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. * 2009-10-16 Bernard first version
  13. */
  14. #include "panel.h"
  15. #include "topwin.h"
  16. #include "mouse.h"
  17. #include <rtgui/rtgui_system.h>
  18. #include <rtgui/event.h>
  19. #include <rtgui/image.h>
  20. #include <rtgui/rtgui_theme.h>
  21. #include <rtgui/rtgui_system.h>
  22. #include <rtgui/widgets/window.h>
  23. rtgui_win_t* rtgui_server_focus_win = RT_NULL;
  24. static rtgui_list_t _rtgui_win_show_list;
  25. static rtgui_list_t _rtgui_win_hide_list;
  26. void rtgui_panel_redraw(rtgui_rect_t* rect);
  27. void rtgui_win_init(void)
  28. {
  29. //初始化窗口列表
  30. rtgui_list_init(&_rtgui_win_show_list);
  31. rtgui_list_init(&_rtgui_win_hide_list);
  32. }
  33. static rt_bool_t rtgui_win_search_in_list(rtgui_win_t* win, rtgui_list_t *list)
  34. {
  35. rtgui_list_t *node;
  36. rtgui_win_t* wid;
  37. /* search in list */
  38. rtgui_list_foreach(node, list)
  39. {
  40. wid = rtgui_list_entry(node, rtgui_win_t, list);
  41. if(wid == win) return RT_TRUE;
  42. }
  43. return RT_FALSE;
  44. }
  45. //添加一个窗口到隐藏窗口列表(默认新建的窗口处于隐藏状态)
  46. rt_err_t rtgui_topwin_add(rtgui_win_t* win)
  47. {
  48. if(win != RT_NULL)
  49. {
  50. /* update clip info */
  51. rtgui_widget_update_clip(win);
  52. list_insert(&(_rtgui_win_hide_list), &(win->list));
  53. return RT_EOK;
  54. }
  55. return RT_ERROR;
  56. }
  57. /* 移除一个窗口 */
  58. rt_err_t rtgui_topwin_remove(rtgui_win_t* win)
  59. {
  60. RT_ASSERT(win != RT_NULL);
  61. if(rtgui_win_search_in_list(win,&_rtgui_win_show_list))
  62. { /* in show list */
  63. rtgui_list_t *node;
  64. rtgui_win_t *wid;
  65. rtgui_rect_t rect = RTGUI_WIDGET_EXTENT(win);
  66. int front_num=0;//计算Z序在当前窗口之上的窗口数量
  67. /* remove node from list */
  68. rtgui_list_remove(&_rtgui_win_show_list, &(win->list));
  69. rtgui_update_external_clip_info();
  70. rtgui_list_foreach(node, &_rtgui_win_show_list)
  71. {
  72. wid = rtgui_list_entry(node, rtgui_win_t, list);
  73. /* 更新"已显示"窗口中与"刚删除的窗口"重叠的区域 */
  74. rtgui_toplevel_update_clip(wid, &rect, front_num);
  75. rtgui_win_ondraw(wid);
  76. front_num++;
  77. }
  78. /* 激活下一个窗口 */
  79. if(_rtgui_win_show_list.next != RT_NULL)
  80. {
  81. rtgui_win_t* wnd = rtgui_list_entry(_rtgui_win_show_list.next,rtgui_win_t, list);
  82. rtgui_topwin_raise(wnd);
  83. rtgui_server_focus_win = wnd;
  84. }
  85. else
  86. {
  87. /* 没有可以显示的窗口 */
  88. rtgui_server_focus_win = RT_NULL;
  89. }
  90. rtgui_panel_redraw(&rect);
  91. return RT_EOK;
  92. }
  93. else if(rtgui_win_search_in_list(win, &_rtgui_win_hide_list))
  94. {//在"隐藏"列表中
  95. /* remove node from list */
  96. rtgui_list_remove(&_rtgui_win_hide_list, &(win->list));
  97. return RT_EOK;
  98. }
  99. return RT_ERROR;
  100. }
  101. /* activate a win
  102. */
  103. rt_err_t rtgui_topwin_activate(rtgui_win_t* win)
  104. {
  105. if((rtgui_server_focus_win != RT_NULL) && (rtgui_server_focus_win != win))
  106. {
  107. rtgui_topwin_deactivate(rtgui_server_focus_win);
  108. }
  109. win->status |= RTGUI_WIN_STATUS_ACTIVATE;
  110. rtgui_server_focus_win = win;
  111. rtgui_widget_update_clip(win);
  112. rtgui_widget_focus(win);
  113. rtgui_widget_update(win);
  114. return RT_EOK;
  115. }
  116. /*
  117. * deactivate a win
  118. */
  119. rt_err_t rtgui_topwin_deactivate(rtgui_win_t* win)
  120. {
  121. win->status &= ~RTGUI_WIN_STATUS_ACTIVATE;
  122. /* 该窗口在之前应该是活动的,所有可以直接绘图 */
  123. rtgui_theme_draw_win_title(win);
  124. if(rtgui_server_focus_win == win)
  125. {
  126. rtgui_server_focus_win = RT_NULL;
  127. }
  128. return RT_EOK;
  129. }
  130. /* raise window to front 将指定窗口提升为当前窗口 */
  131. rt_err_t rtgui_topwin_raise(rtgui_win_t* win)
  132. {
  133. RT_ASSERT(win != RT_NULL);
  134. /* find the twin node */
  135. if(rtgui_win_search_in_list(win, &_rtgui_win_show_list))
  136. {//窗口在显示列表中
  137. rtgui_list_t *node;
  138. rtgui_win_t *wid;
  139. rtgui_rect_t rect = RTGUI_WIDGET_EXTENT(win);
  140. int front_num = 0;
  141. /* the window is already placed in front */
  142. if(&(win->list) == _rtgui_win_show_list.next)
  143. {/* 该窗口已经在最前面 */
  144. rtgui_server_focus_win = RT_NULL;
  145. rtgui_topwin_activate(win);
  146. return RT_EOK;
  147. }
  148. if(rtgui_server_focus_win != RT_NULL && rtgui_server_focus_win != win)
  149. {/* 旧窗口置为非活动状态 */
  150. rtgui_topwin_deactivate(rtgui_server_focus_win);
  151. }
  152. rtgui_list_foreach(node, &_rtgui_win_show_list)
  153. {/* 更新各窗口的剪切域 */
  154. wid = rtgui_list_entry(node, rtgui_win_t, list);
  155. //除了"输入法"窗口,当前窗口不会被任何窗口覆盖
  156. if(wid == win)
  157. {
  158. front_num++;
  159. continue;
  160. }
  161. //其它窗口则需要剪切掉当前窗口
  162. rtgui_toplevel_update_clip(wid, &rect, front_num);
  163. rtgui_win_ondraw(wid); //这个地方采用区域绘图效果会更好
  164. front_num++;
  165. }
  166. /* remove node from list */
  167. rtgui_list_remove(&_rtgui_win_show_list, &(win->list));
  168. /* add to front */
  169. list_insert(&_rtgui_win_show_list, &(win->list));
  170. //新窗口置为活动状态
  171. rtgui_topwin_activate(win);
  172. return RT_EOK;
  173. }
  174. return RT_ERROR;
  175. }
  176. /* show a window */
  177. rt_err_t rtgui_topwin_show(rtgui_win_t* win)
  178. {
  179. rtgui_panel_t *panel = rtgui_panel_get();
  180. /* find it */
  181. if(win != RT_NULL)
  182. {
  183. if(rtgui_win_search_in_list(win, &_rtgui_win_hide_list))
  184. {//在隐藏列表中
  185. /* remove node from hidden list */
  186. rtgui_list_remove(&_rtgui_win_hide_list, &(win->list));
  187. /* add node to show list */
  188. list_insert(&_rtgui_win_show_list, &(win->list));
  189. rtgui_update_external_clip_info();
  190. rtgui_panel_update_clip(panel);
  191. RTGUI_WIDGET_UNHIDE(win);
  192. /* activate this window */
  193. rtgui_topwin_activate(win);
  194. }
  195. else if(rtgui_win_search_in_list(win, &_rtgui_win_show_list))
  196. {//在显示列表中
  197. /* just raise it */
  198. rtgui_topwin_raise(win);
  199. }
  200. return RT_EOK;
  201. }
  202. return RT_ERROR;
  203. }
  204. /* hide a window */
  205. rt_err_t rtgui_topwin_hide(rtgui_win_t* win)
  206. {
  207. rtgui_panel_t *panel = rtgui_panel_get();
  208. /* found it */
  209. if(win != RT_NULL)
  210. {
  211. /* remove node from show list */
  212. rtgui_list_remove(&_rtgui_win_show_list, &(win->list));
  213. rtgui_update_external_clip_info();
  214. rtgui_panel_update_clip(panel);
  215. /* add node to hidden list */
  216. list_insert(&_rtgui_win_hide_list, &(win->list));
  217. /* redraw the old rect */
  218. rtgui_panel_redraw(&(RTGUI_WIDGET_EXTENT(win)));
  219. if(rtgui_server_focus_win == win)
  220. {
  221. /* activate the next window */
  222. if(_rtgui_win_show_list.next != RT_NULL)
  223. {
  224. /* get the win */
  225. win = rtgui_list_entry(_rtgui_win_show_list.next,rtgui_win_t, list);
  226. rtgui_server_focus_win = RT_NULL;
  227. rtgui_topwin_activate(win);
  228. }
  229. else
  230. {
  231. /* there is no shown window right now */
  232. rtgui_server_focus_win = RT_NULL;
  233. }
  234. }
  235. return RT_EOK;
  236. }
  237. return RT_ERROR;
  238. }
  239. /* move top window */
  240. rt_err_t rtgui_topwin_move(rtgui_win_t* win, int x, int y)
  241. {
  242. rtgui_panel_t *panel = rtgui_panel_get();
  243. if(win != RT_NULL)
  244. {
  245. int dx, dy;
  246. rtgui_list_t *node;
  247. rtgui_win_t *wid;
  248. rtgui_rect_t rect = RTGUI_WIDGET_EXTENT(win);
  249. int front_num = 0;
  250. /* get the delta move x, y */
  251. dx = x - RTGUI_WIDGET(win)->extent.x1;
  252. dy = y - RTGUI_WIDGET(win)->extent.y1;
  253. /* move window rect */
  254. rtgui_widget_move_to_logic(RTGUI_WIDGET(win), dx, dy);
  255. /* 窗口移动了,需要更新external信息 */
  256. rtgui_update_external_clip_info();
  257. rtgui_list_foreach(node, &_rtgui_win_show_list)
  258. {/* 更新各窗口的剪切域 */
  259. wid = rtgui_list_entry(node, rtgui_win_t, list);
  260. if(wid == win)
  261. {
  262. front_num++;
  263. continue;
  264. }
  265. rtgui_toplevel_update_clip(wid, &rect, front_num);
  266. rtgui_win_ondraw(wid);
  267. front_num++;
  268. }
  269. /* 当前窗口是活动的,直接更新它的clip */
  270. rtgui_widget_update_clip(win);
  271. rtgui_widget_update(win);
  272. /* update old window coverage area */
  273. rtgui_panel_redraw(&rect);
  274. rtgui_topwin_activate(win);
  275. return RT_EOK;
  276. }
  277. return RT_ERROR;
  278. }
  279. /*
  280. * resize a top win
  281. * Note: currently, only support resize hidden window
  282. */
  283. rt_err_t rtgui_topwin_resize(rtgui_win_t* win, rtgui_rect_t* r)
  284. {
  285. if(win != RT_NULL)
  286. {
  287. RTGUI_WIDGET_EXTENT(win) = *r;
  288. /* update title & border clip info */
  289. rtgui_widget_update_clip(win);
  290. return RT_EOK;
  291. }
  292. return RT_ERROR;
  293. }
  294. rtgui_win_t* rtgui_topwin_get_wnd(int x, int y)
  295. {
  296. rtgui_list_t* node;
  297. rtgui_win_t* win;
  298. /* search in show win list */
  299. if(_rtgui_win_show_list.next != RT_NULL)
  300. {
  301. rtgui_list_foreach(node, &(_rtgui_win_show_list))
  302. {
  303. win = rtgui_list_entry(node, rtgui_win_t, list);
  304. /* is this window? */
  305. if(rtgui_rect_contains_point(&(RTGUI_WIDGET_EXTENT(win)), x, y) == RT_EOK)
  306. {
  307. return win;
  308. }
  309. }
  310. }
  311. return RT_NULL;
  312. }
  313. //front_num: 需要剪切掉的topwin层数,只剪切Z序在自己之上的
  314. void rtgui_toplevel_update_clip(PVOID wdt, rtgui_rect_t *rect, int front_num)
  315. {
  316. rtgui_widget_t *widget = (rtgui_widget_t*)wdt;
  317. rtgui_widget_t *child;
  318. rtgui_list_t *node;
  319. rtgui_rect_t new_rect;
  320. new_rect = widget->extent;
  321. if(rtgui_rect_is_intersect(rect, &new_rect) == RT_EOK)
  322. {//两个区域相交
  323. rtgui_rect_intersect(rect, &new_rect);//计算重叠的区域
  324. rtgui_region_reset(&(widget->clip), &new_rect);//将重叠区域作为剪切域
  325. if(front_num > 0)
  326. {
  327. rt_int32_t i;
  328. rtgui_rect_t *ext_rect;
  329. ext_rect = external_clip_rect;
  330. for(i=0;i<front_num;i++)
  331. {
  332. rtgui_region_subtract_rect(&(widget->clip), &(widget->clip),ext_rect);
  333. ext_rect++;
  334. }
  335. }
  336. }
  337. else
  338. {
  339. rtgui_region_reset(&(widget->clip), &rtgui_empty_rect);
  340. }
  341. {/* 将控件clip限定在屏幕之内 */
  342. rtgui_rect_t screen_rect;
  343. rtgui_graphic_driver_get_rect(rtgui_graphic_driver_get_default(),&screen_rect);
  344. rtgui_region_intersect_rect(&(widget->clip), &(widget->clip), &screen_rect);
  345. }
  346. if(RTGUI_IS_CONTAINER(widget))
  347. {/* 是容器控件,则更新rect范围内的子控件 */
  348. rtgui_list_foreach(node, &(RTGUI_CONTAINER(widget)->children))
  349. {
  350. child = rtgui_list_entry(node, rtgui_widget_t, sibling);
  351. if(RTGUI_WIDGET_IS_HIDE(child))continue;
  352. /* 复位子控件Clip */
  353. rtgui_region_subtract_rect(&(widget->clip), &(widget->clip),&(child->extent));
  354. rtgui_toplevel_update_clip(child, rect, front_num);
  355. }
  356. }
  357. }
  358. void rtgui_panel_redraw(rtgui_rect_t* rect)
  359. {
  360. rtgui_panel_t *panel = rtgui_panel_get();
  361. rtgui_toplevel_update_clip(panel,rect,external_clip_size);
  362. rtgui_theme_draw_panel(panel);
  363. /* reset panel clip */
  364. rtgui_update_external_clip_info();
  365. rtgui_panel_update_clip(panel);
  366. }
  367. void rtgui_topwin_title_onmouse(rtgui_win_t* win, rtgui_event_mouse_t* event)
  368. {
  369. rtgui_rect_t rect;
  370. if(event->button & RTGUI_MOUSE_BUTTON_LEFT)
  371. {
  372. if(event->button & RTGUI_MOUSE_BUTTON_DOWN)
  373. {//鼠标按键按下
  374. if(win->style & RTGUI_WIN_CLOSEBOX)
  375. {//关闭
  376. rtgui_win_get_closebox_rect(win, &rect);
  377. rtgui_widget_rect_to_device(win, &rect);
  378. if(rtgui_rect_contains_point(&rect, event->x, event->y) == RT_EOK)
  379. {
  380. win->style |= RTGUI_WIN_CLOSEBOX_PRESSED;
  381. rtgui_theme_draw_win_closebox(win);
  382. return;
  383. }
  384. }
  385. if(win->style & RTGUI_WIN_MAXBOX)
  386. {//最大化
  387. rtgui_win_get_maxbox_rect(win, &rect);
  388. rtgui_widget_rect_to_device(win, &rect);
  389. if(rtgui_rect_contains_point(&rect, event->x, event->y) == RT_EOK)
  390. {
  391. win->style |= RTGUI_WIN_MAXBOX_PRESSED;
  392. rtgui_theme_draw_win_maxbox(win);
  393. return;
  394. }
  395. }
  396. if(win->style & RTGUI_WIN_MINBOX)
  397. {//最小化
  398. rtgui_win_get_minbox_rect(win, &rect);
  399. rtgui_widget_rect_to_device(win, &rect);
  400. if(rtgui_rect_contains_point(&rect, event->x, event->y) == RT_EOK)
  401. {
  402. win->style |= RTGUI_WIN_MINBOX_PRESSED;
  403. rtgui_theme_draw_win_minbox(win);
  404. return;
  405. }
  406. }
  407. #ifdef RTGUI_USING_WINMOVE
  408. /* maybe move window */
  409. rtgui_cursor_set_location(event->x, event->y);
  410. rtgui_winrect_set(win);
  411. #endif
  412. }
  413. else if(event->button & RTGUI_MOUSE_BUTTON_UP)
  414. {//数遍按键弹起
  415. if(win->style & RTGUI_WIN_CLOSEBOX)
  416. {//关闭
  417. rtgui_win_get_closebox_rect(win, &rect);
  418. rtgui_widget_rect_to_device(win, &rect);
  419. if(rtgui_rect_contains_point(&rect, event->x, event->y) == RT_EOK)
  420. {
  421. rtgui_event_win_t event;
  422. win->style &= ~RTGUI_WIN_CLOSEBOX_PRESSED;
  423. rtgui_theme_draw_win_closebox(win);
  424. /* 发送"关闭窗口"事件 */
  425. RTGUI_EVENT_WIN_CLOSE_INIT(&event);
  426. event.wid = win;
  427. rtgui_thread_send(win->tid, RTGUI_EVENT(&event), sizeof(rtgui_event_win_t));
  428. return;
  429. }
  430. }
  431. if(win->style & RTGUI_WIN_MAXBOX)
  432. {//最大化
  433. rtgui_win_get_maxbox_rect(win, &rect);
  434. rtgui_widget_rect_to_device(win, &rect);
  435. if(rtgui_rect_contains_point(&rect, event->x, event->y) == RT_EOK)
  436. {
  437. rtgui_event_win_t ewin;
  438. win->style &= ~RTGUI_WIN_MAXBOX_PRESSED;
  439. rtgui_theme_draw_win_maxbox(win);
  440. /* send close event to window */
  441. RTGUI_EVENT_WIN_MAX_INIT(&ewin);
  442. ewin.wid = win;
  443. rtgui_thread_send(win->tid, &(ewin.parent), sizeof(rtgui_event_win_t));
  444. return;
  445. }
  446. }
  447. if(win->style & RTGUI_WIN_MINBOX)
  448. {//最小化
  449. rtgui_win_get_minbox_rect(win, &rect);
  450. rtgui_widget_rect_to_device(win, &rect);
  451. if(rtgui_rect_contains_point(&rect, event->x, event->y) == RT_EOK)
  452. {
  453. rtgui_event_win_t ewin;
  454. win->style &= ~RTGUI_WIN_MINBOX_PRESSED;
  455. rtgui_theme_draw_win_minbox(win);
  456. /* send close event to window */
  457. RTGUI_EVENT_WIN_MIN_INIT(&ewin);
  458. ewin.wid = win;
  459. rtgui_thread_send(win->tid, &(ewin.parent), sizeof(rtgui_event_win_t));
  460. return;
  461. }
  462. }
  463. }
  464. }
  465. }
  466. void rtgui_panel_update_clip(PVOID wdt)
  467. {
  468. rtgui_list_t *node;
  469. rtgui_widget_t *child=RT_NULL, *widget;
  470. widget = (rtgui_widget_t*)wdt;
  471. rtgui_region_reset(&(widget->clip), &(widget->extent));
  472. //裁剪panel Clip
  473. if(external_clip_size > 0)
  474. {
  475. rt_int32_t i;
  476. rtgui_rect_t *rect;
  477. rect = external_clip_rect;
  478. for(i=0;i<external_clip_size;i++)
  479. {
  480. rtgui_region_subtract_rect(&(widget->clip), &(widget->clip),rect);
  481. rect++;
  482. }
  483. }
  484. if(RTGUI_IS_CONTAINER(widget))
  485. {//首先复位panel下的子控件Clip
  486. rtgui_list_foreach(node, &(RTGUI_CONTAINER(widget)->children))
  487. {
  488. child = rtgui_list_entry(node, rtgui_widget_t, sibling);
  489. if(RTGUI_WIDGET_IS_HIDE(child))continue;
  490. //if(RTGUI_IS_WIN(child))continue; //窗口不在这里处理
  491. //复位子控件Clip
  492. rtgui_region_subtract_rect(&(widget->clip), &(widget->clip),&(child->extent));
  493. rtgui_panel_update_clip(child);
  494. }
  495. }
  496. }
  497. //更新Panel Clip时使用
  498. void rtgui_update_external_clip_info(void)
  499. {
  500. rtgui_rect_t *rect;
  501. rtgui_win_t *win;
  502. rtgui_list_t *node;
  503. rt_uint32_t count=0;
  504. rtgui_panel_t *panel=rtgui_panel_get();
  505. RT_ASSERT(panel != RT_NULL);
  506. if(external_clip_size > 0)
  507. {//清除原有数据
  508. rt_free(external_clip_rect);
  509. external_clip_rect = RT_NULL;
  510. external_clip_size = 0;
  511. }
  512. rtgui_list_foreach(node, &_rtgui_win_show_list)
  513. {//计算窗口个数
  514. count ++;
  515. }
  516. external_clip_rect = (rtgui_rect_t*)rt_malloc(sizeof(rtgui_rect_t)*count);
  517. external_clip_size = count;
  518. //rt_kprintf("external_clip_size=%d\n",external_clip_size);
  519. rect = external_clip_rect;
  520. rtgui_list_foreach(node, &_rtgui_win_show_list)
  521. {
  522. win = rtgui_list_entry(node, rtgui_win_t, list);
  523. *rect = RTGUI_WIDGET_EXTENT(win);
  524. rect ++;
  525. }
  526. }
  527. #ifdef RT_USING_FINSH
  528. #include <finsh.h>
  529. //列印窗口列表
  530. rt_bool_t list_win(void)
  531. {
  532. rtgui_list_t *node;
  533. rtgui_win_t* win;
  534. rt_kprintf("window'name thread'name modal window'id\n");
  535. rt_kprintf("---------------- ---------------- ---------------- ----------\n");
  536. /* search in list */
  537. rtgui_list_foreach(node, &_rtgui_win_show_list)
  538. {
  539. win = rtgui_list_entry(node, rtgui_win_t, list);
  540. if(win != RT_NULL)
  541. {
  542. rt_kprintf("%-16s %-16s %-16s 0x%08X\n",
  543. win->title,win->tid->name,
  544. ((RTGUI_WIN_IS_MODAL_MODE(win))?"MODAL_OK":"MODAL_CANCEL"),
  545. win);
  546. }
  547. }
  548. if(rtgui_server_focus_win != RT_NULL)
  549. {
  550. win = rtgui_server_focus_win;
  551. rt_kprintf("activate win=%-s,ID=0x%08X, st=%08X\n",
  552. win->title,win,win->status);
  553. }
  554. return RT_TRUE;
  555. }
  556. FINSH_FUNCTION_EXPORT(list_win, list show window);
  557. #endif