minigui.h
上传用户:sdaoma
上传日期:2013-08-07
资源大小:3838k
文件大小:68k
源码类别:

GPS编程

开发平台:

C/C++

  1. /**
  2.  * file minigui.h
  3.  * author Wei Yongming <ymwei@minigui.org>
  4.  * date 2002/01/06
  5.  * 
  6.  * This file includes global and miscellaneous interfaces of MiniGUI.
  7.  *
  8.  verbatim
  9.     Copyright (C) 1998-2002 Wei Yongming.
  10.     Copyright (C) 2002-2004 Feynman Software.
  11.     This file is part of MiniGUI, a compact cross-platform Graphics 
  12.     User Interface (GUI) support system for real-time embedded systems.
  13.     This program is free software; you can redistribute it and/or modify
  14.     it under the terms of the GNU General Public License as published by
  15.     the Free Software Foundation; either version 2 of the License, or
  16.     (at your option) any later version.
  17.     This program is distributed in the hope that it will be useful,
  18.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20.     GNU General Public License for more details.
  21.     You should have received a copy of the GNU General Public License
  22.     along with this program; if not, write to the Free Software
  23.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  24.  endverbatim
  25.  */
  26. /*
  27.  * $Id: minigui.h,v 1.91 2004/07/30 05:51:22 panweiguo Exp $
  28.  * 
  29.  *             MiniGUI for Linux/uClinux, eCos, uC/OS-II, and VxWorks version 1.6.x
  30.  *             Copyright (C) 1998-2002 Wei Yongming.
  31.  *             Copyright (C) 2002-2004 Feynman Software.
  32.  */
  33. #ifndef _MGUI_MINIGUI_H
  34.   #define _MGUI_MINIGUI_H
  35. #include <stdio.h>
  36. #ifndef _LITE_VERSION
  37.   #include "pthread.h"
  38.   #include "semaphore.h"
  39. #endif
  40. #ifdef __cplusplus
  41. extern "C" {
  42. #endif  /* __cplusplus */
  43.     /**
  44.      * addtogroup global_vars Global variables
  45.      * @{
  46.      */
  47.     /**
  48.      * defgroup rect_vars Global Rectangles
  49.      * @{
  50.      */
  51. /**
  52.  * var RECT g_rcScr
  53.  * brief Contains the rectangle of the whole screen.
  54.  */
  55. extern RECT g_rcScr;         /* The RECT of screen. */
  56. #if defined(_LITE_VERSION) && !defined(_STAND_ALONE)
  57. /**
  58.  * var RECT g_rcDesktop
  59.  * brief Contains the rectangle of desktop of the application.
  60.  *
  61.  * note Only available for MiniGUI-Lite as an actual global variable.
  62.  * And a g_rcDesktop is defined as an alias (macro) of a g_rcScr for MiniGUI-Threads.
  63.  *
  64.  * sa g_rcScr
  65.  */
  66. extern RECT g_rcDesktop;     /* The RECT of desktop. */
  67. #else
  68. #define g_rcDesktop     g_rcScr
  69. #endif
  70.     /** @} end of rect_vars */
  71.     /**
  72.      * defgroup lite_vars MiniGUI-Lite specific variables
  73.      * @{
  74.      */
  75. #if defined(_LITE_VERSION) && !defined(_STAND_ALONE)
  76. #include <sys/types.h>
  77. /**
  78.  * var BOOL mgIsServer
  79.  * brief Indicates whether the process is the server or a client on MiniGUI-Lite.
  80.  *
  81.  * note Only defined for MiniGUI-Lite.
  82.  */
  83. extern BOOL mgIsServer;      /* Is the server or a client. */
  84. /**
  85.  * var void* mgSharedRes
  86.  * brief Contains the pointer to the shared resource of MiniGUI-Lite.
  87.  *
  88.  * note Not defined for MiniGUI-Threads, and the shared resource is
  89.  * read-only for all clients.
  90.  *
  91.  * sa mgSizeRes
  92.  */
  93. extern void* mgSharedRes;    /* The pointer to shared resource. */
  94. /**
  95.  * var void* mgSizeRes
  96.  * brief Contains the length of shared resource of MiniGUI-Lite.
  97.  *
  98.  * note Only defined for MiniGUI-Lite. 
  99.  *
  100.  * sa mgSharedRes
  101.  */
  102. extern size_t mgSizeRes;     /* The size of shared resource. */
  103. #define LEN_LAYER_NAME      14
  104. #define LEN_CLIENT_NAME     14
  105. #define INV_LAYER_HANDLE    0
  106. /* variables only available for the server */
  107. struct MG_Layer;
  108. /** Client information. */
  109. typedef struct MG_Client
  110. {
  111.     /** The name of the client. */
  112.     char    name [LEN_CLIENT_NAME + 1];
  113.     /** PID of the client process. */
  114.     pid_t   pid;
  115.     /** UID of the client process. */
  116.     uid_t   uid;
  117.     /** The file descriptor of the socket connected to the client. */
  118.     int     fd;
  119.     /** The desktop rectangle of the client. */
  120.     RECT    rc;
  121.     /** The last active tick count of the client. */
  122.     DWORD   last_live_time;
  123.     /** The additional data of the client. */
  124.     DWORD   dwAddData;
  125.     /** The pointer to the next client in the same layer. */
  126.     struct  MG_Client* next;
  127.     /** The pointer to the previous client in the same layer. */
  128.     struct  MG_Client* prev;
  129.     /** The pointer to the layer on which the client lays. */
  130.     struct  MG_Layer* layer;
  131.     struct GlobalRes* global_res;
  132. } MG_Client;
  133. struct _CLIPRGN;
  134. /** Layer information. */
  135. typedef struct MG_Layer
  136. {
  137.     /** The name of the layer. */
  138.     char    name [LEN_LAYER_NAME + 1];
  139.     /** The pointer to the list of clients which lay on the layer. */
  140.     MG_Client* cli_head;
  141.     /** The pointer to the active client on the layer. */
  142.     MG_Client* cli_active;
  143.     /** The additional data of the layer. */
  144.     DWORD   dwAddData;
  145.     /** The pointer to the next layer. */
  146.     struct MG_Layer* next;
  147.     /** The pointer to the previous layer. */
  148.     struct MG_Layer* prev;
  149.     /** The pointer to the region contains the spare rectangles of the layer. */
  150.     struct _CLIPRGN* spare_rects;
  151. } MG_Layer;
  152. /**
  153.  * var int mgClientSize
  154.  * brief The current size of the array a mgClients.
  155.  *
  156.  * sa mgClients
  157.  */
  158. extern int mgClientSize;
  159. /**
  160.  * var MG_Client* mgClients
  161.  * brief The pointer to the array contains all clients' information.
  162.  *
  163.  * You can access the elements in a mgClients as a normal array. If the 
  164.  * field a fd of one element is not less than zero, then the element
  165.  * will be a vaild client.
  166.  *
  167.  * sa MG_Client
  168.  */
  169. extern MG_Client* mgClients;
  170. /**
  171.  * var MG_Layer* mgTopmostLayer
  172.  * brief The pointer to the topmost layer.
  173.  *
  174.  * sa MG_Layer
  175.  */
  176. extern MG_Layer* mgTopmostLayer;
  177. /**
  178.  * var MG_Layer* mgLayers
  179.  * brief The pointer to the list of layers.
  180.  *
  181.  * sa MG_Layer
  182.  */
  183. extern MG_Layer* mgLayers;
  184. #endif /* _LITE_VERSION && !_STAND_ALONE */
  185.     /** @} end of lite_vars */
  186.     /** @} end of global_vars */
  187. #ifndef _LITE_VERSION
  188. BOOL GUIAPI InitGUI (void);
  189. void GUIAPI TerminateGUI (int rcByGUI);
  190. void GUIAPI MiniGUIPanic (int exitcode);
  191. #endif
  192.     /**
  193.      * addtogroup fns Functions
  194.      * @{
  195.      */
  196.     /**
  197.      * addtogroup global_fns Global/general functions
  198.      * @{
  199.      */
  200.     /**
  201.      * defgroup lite_fns MiniGUI-Lite specific functions
  202.      * @{
  203.      */
  204. #ifdef _LITE_VERSION
  205.     /**
  206.      * defgroup lite_listenfd_fns Listening a file descriptor
  207.      *
  208.      * Register/Unregister a listen fd to MiniGUI.
  209.      *
  210.      * When you need to listen a file descriptor, you can use a select(2)
  211.      * system call. In MiniGUI, you can also register it to MiniGUI to 
  212.      * be a listened fd, and when there is a read/write/except event on 
  213.      * the registered fd , MiniGUI will sent a notification message to 
  214.      * the registered window.
  215.      *
  216.      * Example:
  217.      *
  218.      * include listenfd.c
  219.      *
  220.      * @{
  221.      */
  222. #define MAX_NR_LISTEN_FD   5
  223. /** 
  224.  * fn BOOL GUIAPI RegisterListenFD (int fd, int type, HWND hwnd, void* context)
  225.  * brief Registers a listened file descriptor to MiniGUI-Lite.
  226.  * This function registers the file desciptor a fd to MiniGUI-Lite for listening.
  227.  *
  228.  * When there is a read/write/except event on this a fd, MiniGUI
  229.  * will post a MSG_FDEVENT message with wParam being equal to
  230.  * MAKELONG (fd, type), and the lParam being set to a context
  231.  * to the target window.
  232.  *
  233.  * param fd The file descriptor to be listened.
  234.  * param type The type of the event to be listened, can be POLLIN, POLLOUT, or POLLERR.
  235.  * param hwnd The handle to the window will receive MSG_FDEVENT message.
  236.  * param context The value will be passed to the window as lParam of MSG_FDEVENT message.
  237.  * return TRUE if all OK, and FALSE on error.
  238.  *
  239.  * note Only available on MiniGUI-Lite.
  240.  *
  241.  * sa UnregisterListenFD, system_msgs
  242.  */
  243. BOOL GUIAPI RegisterListenFD (int fd, int type, HWND hwnd, void* context);
  244. /** 
  245.  * fn BOOL GUIAPI UnregisterListenFD (int fd)
  246.  * brief Unregisters a being listened file descriptor.
  247.  *
  248.  * This function unregisters the being listened file descriptor a fd.
  249.  *
  250.  * param fd The file descriptor to be unregistered, should be a being 
  251.  *        listened file descriptor.
  252.  * return TRUE if all OK, and FALSE on error.
  253.  *
  254.  * note Only available on MiniGUI-Lite.
  255.  *
  256.  * sa RegisterListenFD
  257.  */
  258. BOOL GUIAPI UnregisterListenFD (int fd);
  259.     /** @} end of lite_listenfd_fns */
  260. #ifdef _STAND_ALONE
  261. #define SetDesktopRect(lx, ty, rx, by) {}
  262. #else
  263.     /**
  264.      * defgroup lite_layer_fns Layer operations
  265.      *
  266.      * A client in MiniGUI-Lite can create a new layer or join an existed layer 
  267.      * in order to get the visible desktop rectangle on the screen of it.
  268.      *
  269.      * Example:
  270.      *
  271.      * include client_startup.c
  272.      *
  273.      * @{
  274.      */
  275. /** 
  276.  * fn GHANDLE GUIAPI JoinLayer (const char* layer_name, const char* client_name, int lx, int ty, int rx, int by)
  277.  * brief Joins to a layer.
  278.  *
  279.  * This function should be called by clients before calling any other MiniGUI
  280.  * functions. You can call a GetLayerInfo to get the layer information.
  281.  * If the layer to be joined does not exist, the server, i.e. a mginit, will
  282.  * try to create a new one. If you passed a NULL pointer or a null string for 
  283.  * a layer_name, a new layer will be created as well.
  284.  *
  285.  * For the server of MiniGUI-Lite, this function will ignore the arguments of
  286.  * a layer_name and a client_name. The rectangle defines a region in the 
  287.  * screen, which is exclusively used by the server, no client can output
  288.  * to this exclusive retangle.
  289.  *
  290.  * The server usually calls SetDesktopRect macro, which is defined as
  291.  * the following:
  292.  *
  293.  * code
  294.  *
  295.  * #define SetDesktopRect(lx, ty, rx, by) JoinLayer ("", "", lx, ty, rx, by)
  296.  *
  297.  * endcode
  298.  * 
  299.  * Note that the server can define the exclusive retangle out of the actual
  300.  * screen range.
  301.  * 
  302.  * param layer_name The name of the layer.
  303.  * param client_name The name of the client.
  304.  * param lx lx,ty,rx,by: The expected desktop rect of the client.
  305.  * param ty lx,ty,rx,by: The expected desktop rect of the client.
  306.  * param rx lx,ty,rx,by: The expected desktop rect of the client.
  307.  * param by lx,ty,rx,by: The expected desktop rect of the client.
  308.  * return The handle to the layer on success, INV_LAYER_HANDLE on error.
  309.  *
  310.  * sa GetLayerInfo, GetDesktopRect, ServerStartup
  311.  */
  312. GHANDLE GUIAPI JoinLayer (const char* layer_name, const char* client_name, 
  313.                 int lx, int ty, int rx, int by);
  314. #define SetDesktopRect(lx, ty, rx, by) 
  315.         JoinLayer ("", "", lx, ty, rx, by)
  316. /** 
  317.  * fn void GUIAPI GetDesktopRect (int* lx, int* ty, int* rx, int* by)
  318.  * brief Gets the desktop rectangle.
  319.  *
  320.  * After joined to a layer, client can call this function to get the
  321.  * actual desktop rect of itself. 
  322.  *
  323.  * param lx lx,ty,rx,by: The desktop rect will be returned through these pointers.
  324.  * param ty lx,ty,rx,by: The desktop rect will be returned through these pointers.
  325.  * param rx lx,ty,rx,by: The desktop rect will be returned through these pointers.
  326.  * param by lx,ty,rx,by: The desktop rect will be returned through these pointers.
  327.  *
  328.  * sa JoinLayer
  329.  */
  330. void GUIAPI GetDesktopRect (int* lx, int* ty, int* rx, int* by);
  331. #define NAME_SELF_LAYER     ""
  332. /** 
  333.  * fn GHANDLE GUIAPI GetLayerInfo (const char* layer_name, RECT* max_rect, int* nr_clients, BOOL* is_topmost, int* cli_active)
  334.  * brief Gets information of a layer.
  335.  *
  336.  * You can get the information of a layer through this function. 
  337.  * The information will be returned through the pointer arguments 
  338.  * if the specific pointer is not NULL.
  339.  *
  340.  * param layer_name The name of the layer.
  341.  * param max_rect The max desktop rect can be obtained will be returned through this pointer.
  342.  * param nr_clients The number of clients in the layer will be returned through this pointer.
  343.  * param is_topmost A boolean which indicates whether the layer is the topmost layer will be returned.
  344.  * param cli_active The identifier of the active client in the layer.
  345.  * return Returns the handle to the layer on success, INV_LAYER_HANDLE on error.
  346.  *
  347.  * sa JoinLayer
  348.  */
  349. GHANDLE GUIAPI GetLayerInfo (const char* layer_name, RECT* max_rect, 
  350.                 int* nr_clients, BOOL* is_topmost, int* cli_active);
  351. /** 
  352.  * fn BOOL GUIAPI BringLayer2Topmost (GHANDLE handle)
  353.  * brief Brings a layer to be the topmost one.
  354.  *
  355.  * This function brings the specified layer a handle to be the topmost layer.
  356.  *
  357.  * param handle The handle to the layer.
  358.  * return TRUE on success, otherwise FALSE.
  359.  *
  360.  * sa SetActiveClient
  361.  */
  362. BOOL GUIAPI BringLayer2Topmost (GHANDLE handle);
  363. /** 
  364.  * fn BOOL GUIAPI SetActiveClient (int active)
  365.  * brief Sets a client as the ative one.
  366.  *
  367.  * This function sets the specified client a active to be the active one.
  368.  * It also bring the layer in which the client lays to be the topmost as well.
  369.  *
  370.  * param active The identifier of the client.
  371.  * return TRUE on success, otherwise FALSE.
  372.  *
  373.  * sa BringLayer2Topmost
  374.  */
  375. BOOL GUIAPI SetActiveClient (int active);
  376.     /** @} end of lite_layer_fns */
  377.     /**
  378.      * defgroup lite_server_fns Server-only operations
  379.      *
  380.      * MiniGUI provides some server-only functions for you to create a
  381.      * customized server for MiniGUI-Lite, i.e. a mginit.
  382.      *
  383.      * Example:
  384.      *
  385.      * include server_startup.c
  386.      *
  387.      * @{
  388.      */
  389. #define LCO_NEW_CLIENT      1
  390. #define LCO_DEL_CLIENT      2
  391. /**
  392.  * var typedef void (* ON_NEW_DEL_CLIENT) (int op, int cli)
  393.  * brief Client event callback.
  394.  *
  395.  * sa OnNewDelClient, OnChangeLayer
  396.  */
  397. typedef void (* ON_NEW_DEL_CLIENT) (int op, int cli);
  398. #define LCO_NEW_LAYER       1
  399. #define LCO_DEL_LAYER       2
  400. #define LCO_JOIN_CLIENT     3
  401. #define LCO_REMOVE_CLIENT   4
  402. #define LCO_TOPMOST_CHANGED 5
  403. #define LCO_ACTIVE_CHANGED  6
  404. /**
  405.  * var typedef void (* ON_CHANGE_LAYER) (int op, MG_Layer* layer, MG_Client* client)
  406.  * brief Layer event callback.
  407.  *
  408.  * sa OnNewDelClient, OnChangeLayer
  409.  */
  410. typedef void (* ON_CHANGE_LAYER) (int op, MG_Layer* layer, MG_Client* client);
  411. /**
  412.  * var ON_NEW_DEL_CLIENT OnNewDelClient
  413.  * brief Sets to a function to handle a comming in/going away connection of client.
  414.  *
  415.  * When a client is connecting to or disconnecting from the server, MiniGUI
  416.  * will call this function to tell you the event and the client identifier. 
  417.  * The event could be one of the following:
  418.  *
  419.  *  - LCO_NEW_CLIENTn
  420.  *    A new client is connecting to the server.
  421.  *  - LCO_DEL_CLIENTn
  422.  *    A new client is disconnecting from the server.
  423.  *
  424.  * The event will be passed through the argument of a op, and the client
  425.  * identifier will be passed through the argument of a cli.
  426.  * You can get the information of the client by accessing a mgClients with a cli.
  427.  *
  428.  * note Only available for the server of MiniGUI-Lite.
  429.  * 
  430.  * sa ON_NEW_DEL_CLIENT, mgClients
  431.  */
  432. extern ON_NEW_DEL_CLIENT OnNewDelClient;
  433. /**
  434.  * var ON_CHANGE_LAYER OnChangeLayer
  435.  * brief Sets to a function to handle events of layers.
  436.  *
  437.  * When a layer is changing, MiniGUI will call this function to tell 
  438.  * you the event and the layer or the client which leads to the event.
  439.  * The event could be one of the following:
  440.  *
  441.  *  - LCO_NEW_LAYERn
  442.  *    A new layer is creating.
  443.  *  - LCO_DEL_LAYERn
  444.  *    A new layer is deleting.
  445.  *  - LCO_JOIN_CLIENTn
  446.  *    A client is joining to the layer.
  447.  *  - LCO_REMOVE_CLIENTn
  448.  *    A client is removing from the layer.
  449.  *  - LCO_TOPMOST_CHANGEDn
  450.  *    The topmost layer changed, the layer will be the topmost one.
  451.  *  - LCO_ACTIVE_CHANGEDn
  452.  *    The active client changed, the client will be the active one.
  453.  *
  454.  * The event will be passed through the argument of a op, and the pointers to the relevant
  455.  * layer and client will be passed through the argument of a layer and a client respectively.
  456.  *
  457.  * note Only available for the server of MiniGUI-Lite.
  458.  * 
  459.  * sa ON_NEW_DEL_CLIENT, mgClients
  460.  */
  461. extern ON_CHANGE_LAYER OnChangeLayer;
  462. /** 
  463.  * fn BOOL GUIAPI ServerStartup (void)
  464.  * brief Initializes the server of MiniGUI-Lite.
  465.  *
  466.  * This function initializes the server, i.e. a mginit. It creates
  467.  * the shared resource, the listening socket, and other internal objects.
  468.  * Your costomized a mginit program should call this function before calling
  469.  * any other function.
  470.  *
  471.  * return TRUE on success, otherwise FALSE.
  472.  *
  473.  * note Server-only function, i.e. em only can be called by a mginit.
  474.  */
  475. BOOL GUIAPI ServerStartup (void);
  476. /** 
  477.  * fn BOOL SetClientScreen (int lx, int ty, int rx, int by)
  478.  * brief Sets the screen rectangle can be used by clients.
  479.  *
  480.  * This function sets the screen rectangle can be used by clients.
  481.  * All clients' drawing will be clipped out of the rectangle.
  482.  *
  483.  * The rectangle set by this function should be a subrectangle of
  484.  * the server's exclusive rectangle defined by a SetDesktopRect.
  485.  *
  486.  * param lx lx,ty,rx,by: Specifies the screen rectangle.
  487.  * param ty lx,ty,rx,by: Specifies the screen rectangle.
  488.  * param rx lx,ty,rx,by: Specifies the screen rectangle.
  489.  * param by lx,ty,rx,by: Specifies the screen rectangle.
  490.  * return TRUE on success, otherwise FALSE.
  491.  *
  492.  * note Server-only function, i.e. em ONLY can be called by a mginit.
  493.  *
  494.  * note This function do nothing in MiniGUI v1.5.x and later.
  495.  *
  496.  * sa JoinLayer
  497.  */
  498. static inline BOOL SetClientScreen (int lx, int ty, int rx, int by)
  499. {
  500.     return TRUE;
  501. }
  502. /** 
  503.  * fn BOOL GUIAPI OnlyMeCanDraw (void)
  504.  * brief Tells clients do not draw anything on screen.
  505.  *
  506.  * If the server want to output something out of its exclusive rectangle,
  507.  * it can call this function to disable the clients' any drawing output.
  508.  * When the server done, it can call a ClientCanDrawNowEx function
  509.  * to tell clients in the topmost layer to repaint themselves.
  510.  *
  511.  * Note that the clients is still running after the server calling 
  512.  * this function.
  513.  * 
  514.  * return TRUE on success, otherwise FALSE.
  515.  *
  516.  * note Server-only function.
  517.  *
  518.  * sa ClientCanDrawNowEx, ClientCanDrawNow
  519.  */
  520. BOOL GUIAPI OnlyMeCanDraw (void);
  521. /** 
  522.  * fn BOOL GUIAPI ClientCanDrawNowEx (BOOL bRepaint, const RECT* invrc)
  523.  * brief Tells clients that they can output to screen now.
  524.  *
  525.  * param bRepaint Whether to repaint the clients in the topmost layer.
  526.  * param invrc The invalid screen rect. It can be NULL, 
  527.  *        indicates the whole desktop of clients should be repainted.
  528.  * return TRUE on success, otherwise FALSE.
  529.  *
  530.  * note Server-only function.
  531.  *
  532.  * sa OnlyMeCanDraw, ClientCanDrawNow
  533.  */
  534. BOOL GUIAPI ClientCanDrawNowEx (BOOL bRepaint, const RECT* invrc);
  535. /** 
  536.  * def ClientCanDrawNow()
  537.  * brief Tells clients that they can output to screen now, and 
  538.  *        notify clients to repaint the whole desktop.
  539.  *
  540.  * return TRUE on success, otherwise FALSE.
  541.  *
  542.  * note Server-only function, and defined as a macro 
  543.  *       calling a ClientCanDrawNowEx with a bRepaint is TRUE and a invrc is NULL.
  544.  *
  545.  * sa ClientCanDrawNowEx
  546.  */
  547. #define ClientCanDrawNow()    ClientCanDrawNowEx (TRUE, NULL)
  548. /**
  549.  * fn void GUIAPI UpdateTopmostLayer (const RECT* dirty_rc)
  550.  * brief Tells the clients in the topmost layer to update their windows.
  551.  *
  552.  * param dirty_rc The dirty rectangle in screen coordinate system.
  553.  *
  554.  * note Server-only function.
  555.  *
  556.  * sa OnlyMeCanDraw, ClientCanDrawNowEx
  557.  */
  558. void GUIAPI UpdateTopmostLayer (const RECT* dirty_rc);
  559. /** 
  560.  * fn BOOL GUIAPI SetTopMostClient (int cli)
  561.  * brief Sets topmost layer by a client identifier.
  562.  *
  563.  * This function sets the topmost layer by the specified client identifier a cli.
  564.  * It will bring the layer contains the client to be the topmost one.
  565.  *
  566.  * param cli The identifier of the client.
  567.  * return TRUE on success, otherwise FALSE.
  568.  *
  569.  * note Server-only function.
  570.  *
  571.  * sa SetTopMostLayer, BringLayer2Topmost
  572.  */
  573. BOOL GUIAPI SetTopMostClient (int cli);
  574. /** 
  575.  * fn BOOL GUIAPI SetTopMostLayer (MG_Layer* layer)
  576.  * brief Sets topmost layer.
  577.  *
  578.  * This functions sets the specified layer a layer to be the topmost layer.
  579.  *
  580.  * param layer The pointer to the layer.
  581.  * return TRUE on success, otherwise FALSE.
  582.  *
  583.  * note Server-only function.
  584.  *
  585.  * sa SetTopMostClient, BringLayer2Topmost
  586.  */
  587. BOOL GUIAPI SetTopMostLayer (MG_Layer* layer);
  588. /** 
  589.  * fn int GUIAPI GetClientByPID (int pid)
  590.  * brief Returns the client identifier from PID of a client.
  591.  *
  592.  * This function gets the identifier of the sepcified client from the PID of it.
  593.  *
  594.  * param pid The process ID of the client.
  595.  * return The client identifier on success, less than 0 on error.
  596.  *
  597.  * note Server-only function.
  598.  */
  599. int GUIAPI GetClientByPID (int pid);
  600.     /** @} end of lite_server_fns */
  601.     /**
  602.      * defgroup lite_request_fns Simple request/reply interfaces
  603.      * 
  604.      * You can register a customized request handler to extend your server, i.e. 
  605.      * a mginit, of MiniGUI-Lite.
  606.      *
  607.      * A request consists of an identifier and the data associated with the request.
  608.      * The identifier is used by MiniGUI to determine which handler should be called
  609.      * when a request arrives. When MiniGUI finds one handler, it will call the handler
  610.      * and pass the socket fd connected to the client, the data associated with the request,
  611.      * and the length of the data. Eventually, the handler will sent the reply to
  612.      * the client.
  613.      *
  614.      * After register a customized request handler in your server, you can call 
  615.      * a cli_request function in the client to send a request to 
  616.      * the server and wait for the reply. On the other hand, the request handler in the server
  617.      * will receive the request and call a send_reply to send the reply to the client.
  618.      * In this way, you can create a simple IPC (inter-process conmmunication) 
  619.      * mechanism between clients and the server.
  620.      *
  621.      * Example:
  622.      *
  623.      * include request.c
  624.      *
  625.      * @{
  626.      */
  627. /**
  628.  * def MAX_SYS_REQID
  629.  * brief Maximal system reserved request identifier.
  630.  *
  631.  * sa RegisterRequestHandler
  632.  */
  633. #define MAX_SYS_REQID           0x0011
  634. /**
  635.  * def MAX_REQID
  636.  * brief Maximal request identifier.
  637.  *
  638.  * sa RegisterRequestHandler
  639.  */
  640. #define MAX_REQID               0x0018
  641. /** A request will be sent to the server of MiniGUI-Lite. */
  642. typedef struct _REQUEST {
  643.     /** The identifier of the type of the request. */
  644.     int id;
  645.     /** The data will be sent to the server. */
  646.     const void* data;
  647.     /** The length of the data. */
  648.     size_t len_data;
  649. } REQUEST;
  650. typedef REQUEST* PREQUEST;
  651. /** 
  652.  * fn cli_request (PREQUEST request, void* result, int len_rslt)
  653.  * brief Sends a request to the server and wait reply.
  654.  *
  655.  * If a result is NULL or a len_rslt is zero, the function will return 
  656.  * immediately after sent the data to the server.
  657.  *
  658.  * param request The pointer to REQUEST, which contains the data of the request.
  659.  * param result The buffer receives the reply.
  660.  * param len_rslt The lenght of the buffer.
  661.  * return Zero on success, no-zero on error.
  662.  *
  663.  * note Only used by clients to send a request to the server of MiniGUI-Lite.
  664.  *
  665.  * sa send_reply
  666.  */
  667. int cli_request (PREQUEST request, void* result, int len_rslt);
  668. /** 
  669.  * fn int get_sock_fd2srv (void)
  670.  * brief Gets the file descriptor of the socket connected to the server.
  671.  *
  672.  * This function returns the file descriptor of the socket connected to the server,
  673.  * i.e. a mginit.
  674.  *
  675.  * return The file descriptor of the socket connected to the server.
  676.  *
  677.  * note Only used by clients, no meaning for the server.
  678.  */
  679. int get_sock_fd2srv (void);
  680. /** 
  681.  * fn send_reply (int clifd, const void* reply, int len)
  682.  * brief Sends the reply to the client.
  683.  *
  684.  * This function sends a replay pointed to by a reply which is 
  685.  * a len bytes long to the client.
  686.  *
  687.  * note Only used by the server to send the reply to the client.
  688.  * This function typically called in your customized request handler.
  689.  *
  690.  * param clifd The fd connected to the client.
  691.  * param reply The buffer contains the reply data.
  692.  * param len The length of the reply data in bytes.
  693.  * return Zero on success, no-zero on error.
  694.  *
  695.  * sa cli_request, RegisterRequestHandler
  696.  */
  697. int send_reply (int clifd, const void* reply, int len);
  698. /**
  699.  * var typedef int (* REQ_HANDLER)(int cli, int clifd, void* buff, size_t len)
  700.  * brief Request handler.
  701.  *
  702.  * sa RegisterRequestHandler
  703.  */
  704. typedef int (* REQ_HANDLER) (int cli, int clifd, void* buff, size_t len);
  705. /** 
  706.  * fn BOOL GUIAPI RegisterRequestHandler (int req_id, REQ_HANDLER your_handler)
  707.  * brief Registers a customize request handler.
  708.  *
  709.  * This function registers a request handler to the server, i.e. a mginit.
  710.  *
  711.  * param req_id The identifier of the customized request.
  712.  * param your_handler The handler of the request. Being NULL to unregister the request handler.
  713.  * return TRUE on success, FALSE on error.
  714.  *
  715.  * note Only used by the server to register a request handler.
  716.  *       And the identifier should be larger than a MAX_SYS_REQID and 
  717.  *       less than or equal to a MAX_REQID.
  718.  *
  719.  * sa cli_request, send_reply, MAX_SYS_REQID, MAX_REQID
  720.  */
  721. BOOL GUIAPI RegisterRequestHandler (int req_id, REQ_HANDLER your_handler);
  722. /** 
  723.  * fn EQ_HANDLER GUIAPI GetRequestHandler (int req_id)
  724.  * brief Gets the request handler by request identifier.
  725.  *
  726.  * This function returns the request handler of the specified request identifier a req_id.
  727.  *
  728.  * param req_id The request identifier.
  729.  * return The handler on success, NULL on error.
  730.  *
  731.  * note Only can be used by the server.
  732.  *
  733.  * sa RegisterRequestHandler
  734.  */
  735. REQ_HANDLER GUIAPI GetRequestHandler (int req_id);
  736.     /** @} end of lite_request_fns */
  737.     /**
  738.      * defgroup lite_socket_fns General socket operations
  739.      *
  740.      * MiniGUI-Lite uses UNIX domain socket to build the communication
  741.      * between the server and the clients.
  742.      *
  743.      * You can also use the underlay interfaces which MiniGUI uses to create
  744.      * your own UNIX domain socket.
  745.      *
  746.      * Example:
  747.      *
  748.      * include socket.c
  749.      *
  750.      * @{
  751.      */
  752. /**
  753.  * fn int serv_listen (const char* name)
  754.  * brief Creates a listen socket.
  755.  *
  756.  * This function is used by the server to create a listening socket. 
  757.  * Any MiniGUI-Lite application can call this function to create a 
  758.  * listening socket. The server, i.e. a mginit, of MiniGUI-Lite uses 
  759.  * this function to create its listening socket, and named the socket 
  760.  * to '/var/tmp/minigui'.
  761.  *
  762.  * param name The path name of the listening socket.
  763.  * return The file discriptor of the listening socket created, -1 on error.
  764.  *
  765.  * note As a convention, you should located the socket in '/var/tmp/' directory.
  766.  */
  767. int serv_listen (const char* name);
  768. /**
  769.  * fn int serv_accept (int listenfd, pid_t *pidptr, uid_t *uidptr)
  770.  * brief Waits for a client connection to arrive, and accept it.
  771.  *
  772.  * This function is used by the server to wait a connection and accept it.
  773.  *
  774.  * After creating a listening socket by calling a serv_listen, you can call this
  775.  * function to create a connection with a client. We also obtain the client's PID 
  776.  * and UID from the pathname that it must bind before calling us.
  777.  *
  778.  * param listenfd The fd of listen socket.
  779.  * param pidptr The client PID will be saved to this buffer when this function returns.
  780.  * param uidptr The client UID will be saved to this buffer when this function returns.
  781.  * return The new connected fd if all OK, < 0 on error.
  782.  *
  783.  * sa serv_listen, cli_conn
  784.  */
  785. int serv_accept (int listenfd, pid_t *pidptr, uid_t *uidptr);
  786. /**
  787.  * fn int cli_conn (const char* name, char project)
  788.  * brief Used by clients to connect to a server.
  789.  *
  790.  * This function is used by clients to connect to a server.
  791.  *
  792.  * The created socket will be located at the directory '/var/tmp',
  793.  * and with name of '/var/tmp/xxxxx-c', where 'xxxxx' is the pid of client.
  794.  * and 'c' is a character to distinguish different projects.
  795.  * MiniGUI itself uses 'a' as the project character to create socket between
  796.  * 'mginit' and clients.
  797.  *
  798.  * param name The name of the well-known listen socket (created by server).
  799.  * param project A character to distinguish different projects (Do em NOT use 'a').
  800.  * return The new connected fd if all OK, < 0 on error.
  801.  *
  802.  * sa serv_listen, serv_accept
  803.  */
  804. int cli_conn (const char* name, char project);
  805. #define SOCKERR_IO          -1
  806. #define SOCKERR_CLOSED      -2
  807. #define SOCKERR_INVARG      -3
  808. #define SOCKERR_TIMEOUT     -4
  809. #define SOCKERR_OK          0
  810. /**
  811.  * fn int sock_write_t (int fd, const void* buff, int count, unsigned int timeout) 
  812.  * brief Writes data to socket.
  813.  *
  814.  * This function writes the data block pointed to by a buff 
  815.  * which is a count bytes long to the socket a fd.
  816.  *
  817.  * param fd The file descriptor of the socket.
  818.  * param buff The buffer contains the data.
  819.  * param count The length in bytes of the buffer.
  820.  * param timeout An upper bound on the amount of time elapsed before 
  821.  *        a sock_write_t returns. When it is zero, a sock_write_t can 
  822.  *        block indefinitely. The timeout value is in tick count, and 
  823.  *        tick count of MiniGUI is in unit of 10 milliseconds.
  824.  * return SOCKERR_OK if all OK, < 0 on error.
  825.  *
  826.  * retval SOCKERR_OK       Read data successfully.
  827.  * retval SOCKERR_IO       There are some I/O errors occurred.
  828.  * retval SOCKERR_CLOSED   The socket has been closed by the peer.
  829.  * retval SOCKERR_INVARG   You passed invalid arguments.
  830.  * retval SOCKERR_TIMEOUT  Timeout.
  831.  *
  832.  * note The a timeout only goes into effect when this function called 
  833.  *       by the server of MiniGUI-Lite, i.e. a mginit. 
  834.  *
  835.  * sa sock_read_t
  836.  */
  837. int sock_write_t (int fd, const void* buff, int count, unsigned int timeout);
  838. /**
  839.  * fn int sock_read_t (int fd, void* buff, int count, unsigned int timeout)
  840.  * brief Reads data from socket.
  841.  *
  842.  * This function reads data which is a count bytes long to the buffer a buff
  843.  * from the socket a fd.
  844.  *
  845.  * param fd The file descriptor of the socket.
  846.  * param buff The buffer used to save the data.
  847.  * param count The length in bytes of the buffer.
  848.  * param timeout An upper bound on the amount of time elapsed before 
  849.  *        a sock_read_t returns. When it is zero, a sock_read_t can 
  850.  *        block indefinitely. The timeout value is in the tick count of MiniGUI,
  851.  *        and tick count of MiniGUI is in unit of 10 milliseconds.
  852.  * return SOCKERR_OK if all OK, < 0 on error.
  853.  *
  854.  * retval SOCKERR_OK       Read data successfully.
  855.  * retval SOCKERR_IO       There are some I/O errors occurred.
  856.  * retval SOCKERR_CLOSED   The socket has been closed by the peer.
  857.  * retval SOCKERR_INVARG   You passed invalid arguments.
  858.  * retval SOCKERR_TIMEOUT  Timeout.
  859.  *
  860.  * note The a timeout only goes into effect when this function called 
  861.  *       by the server of MiniGUI-Lite, i.e. a mginit. 
  862.  *
  863.  * sa sock_write_t
  864.  */
  865. int sock_read_t (int fd, void* buff, int count, unsigned int timeout);
  866. /**
  867.  * def sock_write(fd, buff, count)
  868.  * brief The blocking version of a sock_write_t function.
  869.  *
  870.  * sa sock_write_t
  871.  */
  872. #define sock_write(fd, buff, count) sock_write_t(fd, buff, count, 0)
  873. /**
  874.  * def sock_read(fd, buff, count)
  875.  * brief The blocking version of a sock_read_t function.
  876.  *
  877.  * sa sock_read_t
  878.  */
  879. #define sock_read(fd, buff, count) sock_read_t(fd, buff, count, 0)
  880.     /** @} end of lite_socket_fns */
  881.     /** @} end of lite_fns */
  882. #endif /* !_STAND_ALONE */
  883. #endif /* LITE_VERSION */
  884.     /**
  885.      * defgroup init_fns Initialization and termination functions
  886.      *
  887.      * Normally, the only entry of any MiniGUI application is a MiniGUIMain.
  888.      * The application will terminate when you call a exit(3) or just return from
  889.      * a MiniGUIMain.
  890.      *
  891.      * Example 1:
  892.      *
  893.      * include miniguimain.c
  894.      *
  895.      * Example 2:
  896.      *
  897.      * include hello_world.c
  898.      *
  899.      * @{
  900.      */
  901. /**
  902.  * fn BOOL GUIAPI ReinitDesktopEx (BOOL init_sys_text)
  903.  * brief Re-initializes the desktop.
  904.  *
  905.  * When you changed the charset or the background picture of the desktop,
  906.  * you should call this function to re-initialize the local system text
  907.  * (when a init_sys_text is TRUE), the background picture, and the desktop
  908.  * menu.
  909.  *
  910.  * param init_sys_text Indicates whether to initialize the local system text.
  911.  *
  912.  * return TRUE on success, otherwise FALSE.
  913.  *
  914.  * sa ReinitDesktop
  915.  */
  916. BOOL GUIAPI ReinitDesktopEx (BOOL init_sys_text);
  917. /**
  918.  * def ReinitDesktop()
  919.  * brief Re-initializes the desktop including the local system text.
  920.  *
  921.  * return TRUE on success, otherwise FALSE.
  922.  *
  923.  * note This function defined as a macro calling a ReinitDesktopEx with
  924.  * a init_sys_text set to TRUE.
  925.  *
  926.  * sa ReinitDesktopEx
  927.  */
  928. #define ReinitDesktop()    ReinitDesktopEx (TRUE)
  929. /*
  930.  * We remove the SuspendGUI and ResumeGUI functions. 
  931.  * Don't use these two functios any more.
  932.  * void GUIAPI SuspendGUI (void);
  933.  * BOOL GUIAPI ResumeGUI (void); 
  934.  */
  935. /**
  936.  * fn void GUIAPI ExitGUISafely (int exitcode)
  937.  * brief Exits your MiniGUI application safely.
  938.  *
  939.  * Calling this function will terminate your MiniGUI application. This
  940.  * function will restore console attributes and call a exit() function and 
  941.  * pass a exitcode to it.
  942.  *
  943.  * param exitcode The exit status will be passed to exit(3) function.
  944.  * return This function does not return.
  945.  *
  946.  * sa exit(3)
  947.  */
  948. void GUIAPI ExitGUISafely (int exitcode);
  949. /**
  950.  * fn int MiniGUIMain (int args, const char* arg[])
  951.  * brief The main entry of all MiniGUI applications.
  952.  *
  953.  * This function should be defined by your application. MiniGUI defines a main()
  954.  * function in libminigui library for your application, and call a MiniGUIMain() 
  955.  * in this a main() function. The a main() defined by MiniGUI is responsible of 
  956.  * initializing and terminating MiniGUI.
  957.  *
  958.  * param args The number of arguments passed to a main() by operating system.
  959.  * param arg The arguments passed to a main() by operating system.
  960.  * return The exit status will be retured to the parent process.
  961.  *
  962.  */
  963. int MiniGUIMain (int args, const char* arg[]);
  964. #ifndef _LITE_VERSION
  965. /*
  966.  * NOTE: The following two functions is only valid for MiniGUI-Threads
  967.  * since version 1.0.01.
  968.  */
  969. BOOL GUIAPI PreInitGUI (int args, const char* arg[], int* retp);
  970. int GUIAPI PostTerminateGUI (int args, const char* arg[], int rcByGUI); 
  971. #endif /* LITE_VERSION */
  972. #define IDM_DTI_FIRST   (300)
  973. #ifndef _LITE_VERSION
  974. /*
  975.  * NOTE: The following two functions is only valid for MiniGUI-Threads
  976.  * since version 1.0.01.
  977.  */
  978. void GUIAPI CustomizeDesktopMenu (HMENU hDesktopMenu, int iPos);
  979. int GUIAPI CustomDesktopCommand (int id);
  980. #endif
  981.     /** @} end of init_fns */
  982.     /**
  983.      * defgroup about_dlg About MiniGUI dialog
  984.      * @{
  985.      */
  986. #ifdef _MISC_ABOUTDLG
  987. #ifndef _LITE_VERSION
  988.   void GUIAPI OpenAboutDialog (void);
  989. #else
  990. /**
  991.  * fn HWND GUIAPI OpenAboutDialog (HWND hHosting)
  992.  * brief Opens or actives the 'About MiniGUI' dialog.
  993.  *
  994.  * Calling this function will create a main window displaying 
  995.  * copyright and license information of MiniGUI. When the about dialog 
  996.  * is displaying, calling this function again will bring the dialog to be 
  997.  * the topmost main window, not create a new one.
  998.  *
  999.  * param hHosting The hosting main window of the about dialog.
  1000.  * return The handle to the about dialog box.
  1001.  *
  1002.  * note This function is available for MiniGUI-Lite and when _MISC_ABOUTDLG defined.
  1003.  * For MiniGUI-Threads, you should call 'void GUIAPI OpenAboutDialog (void)' function
  1004.  * instead.
  1005.  */
  1006.   HWND GUIAPI OpenAboutDialog (HWND hHosting);
  1007. #endif /* _LITE_VERSION */
  1008. #endif /* _MISC_ABOUTDLG */
  1009.     /** @} end of about_dlg */
  1010.     /**
  1011.      * defgroup etc_fns Configuration file operations
  1012.      *
  1013.      * The configuration file used by MiniGUI have a similiar format as M$ Windows INI file,
  1014.      * i.e. the file consists of sections, and the section consists of key-value pairs, like this:
  1015.      *
  1016.      * code
  1017.      * [system]
  1018.      * # GAL engine
  1019.      * gal_engine=fbcon
  1020.      *
  1021.      * # IAL engine
  1022.      * ial_engine=console
  1023.      *
  1024.      * mdev=/dev/mouse
  1025.      * mtype=PS2
  1026.      * 
  1027.      * [fbcon]
  1028.      * defaultmode=1024x768-16bpp
  1029.      * 
  1030.      * [qvfb]
  1031.      * defaultmode=640x480-16bpp
  1032.      * display=0
  1033.      * endcode
  1034.      *
  1035.      * Assume that the configuration file named a my.cfg, if you want get the value of a mdev
  1036.      * in a system section, you can call a GetValueFromEtcFile in the following way:
  1037.      *
  1038.      * code
  1039.      * char buffer [51];
  1040.      *
  1041.      * GetValueFromEtcFile ("my.cfg", "system", "mdev", buffer, 51);
  1042.      * endcode
  1043.      *
  1044.      * Example:
  1045.      *
  1046.      * include cfgfile.c
  1047.      *
  1048.      * @{
  1049.      */
  1050. #define ETC_MAXLINE             1024
  1051. #define ETC_FILENOTFOUND        -1
  1052. #define ETC_SECTIONNOTFOUND     -2
  1053. #define ETC_KEYNOTFOUND         -3
  1054. #define ETC_TMPFILEFAILED       -4
  1055. #define ETC_FILEIOFAILED        -5
  1056. #define ETC_INTCONV             -6
  1057. #define ETC_OK                  0
  1058. #ifndef _INCORE_RES
  1059. /**
  1060.  * var char* ETCFILEPATH
  1061.  * brief The path name of MiniGUI configuration file.
  1062.  *
  1063.  * By default, the configuration file of MiniGUI must be installed in /etc,
  1064.  * /usr/local/etc or your home directory. When you install it in your
  1065.  * home directory, the name should be ".MiniGUI.cfg".
  1066.  *
  1067.  * MiniGUI will try to use a ~/.MiniGUI.cfg, then a /usr/local/etc/MiniGUI.cfg, 
  1068.  * and a /etc/MiniGUI.cfg last.
  1069.  *
  1070.  * If MiniGUI can not find any a MiniGUI.cfg file, or find a bad formated configure
  1071.  * file, the initialzation of MiniGUI will be canceled.
  1072.  */
  1073. extern char ETCFILEPATH [];
  1074. #endif /* _INCORE_RES */
  1075. /**
  1076.  * fn int GUIAPI GetValueFromEtcFile (const char* pEtcFile, const char* pSection, const char* pKey, char* pValue, int iLen)
  1077.  * brief Gets value from a configuration file.
  1078.  *
  1079.  * This function gets the value of the key a pKey in the section a pSection 
  1080.  * of the configuration file a pEtcFile, and saves the value to the buffer
  1081.  * pointed to by a pValue. 
  1082.  *
  1083.  * param pEtcFile The path name of the configuration file.
  1084.  * param pSection The section name in which the value located.
  1085.  * param pKey The key name of the value.
  1086.  * param pValue The value will be saved in this buffer.
  1087.  * param iLen The length in bytes of the buffer.
  1088.  * return ETC_OK on success, < 0 on error.
  1089.  *
  1090.  * retval ETC_OK               Gets value successfullly.
  1091.  * retval ETC_FILENOTFOUND     Can not find the specified configuration file.
  1092.  * retval ETC_SECTIONNOTFOUND  Can not find the specified section in the configuration file.
  1093.  * retval ETC_KEYNOTFOUND      Can not find the specified key in the section.
  1094.  * retval ETC_FILEIOFAILED     File I/O operation error occurred.
  1095.  *
  1096.  * note MiniGUI use a strncpy to copy actual value to a pValue. Thus, if the length of 
  1097.  * the actual value is larger than a iLen, the result copied to a pValue 
  1098.  * will em NOT be null-terminated.
  1099.  *
  1100.  * sa GetIntValueFromEtcFile, SetValueToEtcFile, strncpy(3)
  1101.  */
  1102. int GUIAPI GetValueFromEtcFile (const char* pEtcFile, const char* pSection,
  1103.                                const char* pKey, char* pValue, int iLen);
  1104. /**
  1105.  * fn int GUIAPI GetIntValueFromEtcFile (const char* pEtcFile, const char* pSection, const char* pKey, int* value)
  1106.  * brief Gets integer value from a configuration file.
  1107.  *
  1108.  * This function gets the integer value of the key a pKey in the section a pSection 
  1109.  * of the configuration file a pEtcFile, and returns the integer value through the buffer
  1110.  * pointed to by a value. 
  1111.  *
  1112.  * param pEtcFile The path name of the configuration file.
  1113.  * param pSection The section name in which the value located.
  1114.  * param pKey The key name of the value.
  1115.  * param value The integer value will be saved in this buffer.
  1116.  * return ETC_OK on success, < 0 on error.
  1117.  *
  1118.  * retval ETC_OK               Gets value successfullly.
  1119.  * retval ETC_FILENOTFOUND     Can not find the specified configuration file.
  1120.  * retval ETC_SECTIONNOTFOUND  Can not find the specified section in the configuration file.
  1121.  * retval ETC_KEYNOTFOUND      Can not find the specified key in the section.
  1122.  * retval ETC_FILEIOFAILED     File I/O operation error occurred.
  1123.  * retval ETC_INTCONV          Can not convert the value string to an integer.
  1124.  *
  1125.  * note MiniGUI uses a strtol to convert the string value to an integer, and pass the base as 0.
  1126.  * Thus, the valid string value can be converted to integer should be in the following forms:
  1127.  *
  1128.  *  - [+|-]0x[0-9|A-F]*n
  1129.  *    Will be read in base 16.
  1130.  *  - [+|-]0[0-7]*n
  1131.  *    Will be read in base 8.
  1132.  *  - [+|-][1-9][0-9]*n
  1133.  *    Will be read in base 10.
  1134.  *
  1135.  * sa GetValueFromEtcFile, SetValueToEtcFile, strtol(3)
  1136.  */
  1137. int GUIAPI GetIntValueFromEtcFile (const char* pEtcFile, const char* pSection,
  1138.                                const char* pKey, int* value);
  1139. /**
  1140.  * fn int GUIAPI SetValueToEtcFile (const char* pEtcFile, const char* pSection, const char* pKey, char* pValue)
  1141.  * brief Sets a value in a configuration file.
  1142.  *
  1143.  * This function sets the value of the key a pKey in the section a pSection
  1144.  * of the configuration file a pEtcFile to be the string pointed to by a pValue.
  1145.  *
  1146.  * param pEtcFile The path name of the configuration file.
  1147.  * param pSection The section name in which the value located.
  1148.  * param pKey The key name of the value.
  1149.  * param pValue The null-terminated value string.
  1150.  * return ETC_OK on success, < 0 on error.
  1151.  *
  1152.  * retval ETC_OK               Sets value successfullly.
  1153.  * retval ETC_FILEIOFAILED     File I/O operation error occurred.
  1154.  * retval ETC_TMPFILEFAILED    Can not create temporary file.
  1155.  *
  1156.  * note If the specified configuration file does not exist, MiniGUI will try to
  1157.  * create this file.
  1158.  *
  1159.  * sa GetValueFromEtcFile, GetIntValueFromEtcFile
  1160.  */
  1161. int GUIAPI SetValueToEtcFile (const char* pEtcFile, const char* pSection,
  1162.                                const char* pKey, char* pValue);
  1163. /**
  1164.  * fn GHANDLE GUIAPI LoadEtcFile (const char * pEtcFile)
  1165.  * brief Loads an etc file into memory.
  1166.  *
  1167.  * This function loads the content of an etc file into the memory, later, you
  1168.  * can visit the content using a GetValueFromEtc function.
  1169.  *
  1170.  * param pEtcFile The path name of the configuration file.
  1171.  * return Handle of the etc object on success, NULL on error.
  1172.  *
  1173.  * sa UnloadEtcFile, GetValueFromEtc
  1174.  */
  1175. GHANDLE GUIAPI LoadEtcFile (const char * pEtcFile);
  1176. /**
  1177.  * fn GUIAPI UnloadEtcFile (GHANDLE hEtc)
  1178.  * brief Unloads an etc file.
  1179.  *
  1180.  * This function unloads the etc object generated by using sa LoadEtcFile function.
  1181.  *
  1182.  * param hEtc Handle of the etc object.
  1183.  * return 0 on success, -1 on error.
  1184.  *
  1185.  * sa LoadEtcFile, GetValueFromEtc
  1186.  */
  1187. int GUIAPI UnloadEtcFile (GHANDLE hEtc);
  1188. /**
  1189.  * fn GUIAPI GetValueFromEtc (GHANDLE hEtc, const char* pSection, const char* pKey, char* pValue, int iLen)
  1190.  * brief Gets value from a configuration etc object.
  1191.  *
  1192.  * This function gets value from an etc object, similar to GetValueFromEtcFile.
  1193.  * This function gets the value of the key a pKey in the section a pSection 
  1194.  * of the etc object a hEtc, and saves the value to the buffer
  1195.  * pointed to by a pValue. 
  1196.  *
  1197.  * param hEtc Handle of the etc object.
  1198.  * param pSection The section name in which the value located.
  1199.  * param pKey The key name of the value.
  1200.  * param pValue The value will be saved in this buffer.
  1201.  * param iLen The length in bytes of the buffer.
  1202.  * return ETC_OK on success, < 0 on error.
  1203.  *
  1204.  * retval ETC_OK               Gets value successfullly.
  1205.  * retval ETC_FILENOTFOUND     Can not find the specified configuration file.
  1206.  * retval ETC_SECTIONNOTFOUND  Can not find the specified section in the configuration file.
  1207.  * retval ETC_KEYNOTFOUND      Can not find the specified key in the section.
  1208.  * retval ETC_FILEIOFAILED     File I/O operation error occurred.
  1209.  *
  1210.  * sa LoadEtcFile, UnloadEtcFile
  1211.  */
  1212. int GUIAPI GetValueFromEtc (GHANDLE hEtc, const char* pSection,
  1213.                                             const char* pKey, char* pValue, int iLen);
  1214. /**
  1215.  * fn int GUIAPI GetIntValueFromEtc (GHANDLE hEtc, const char* pSection, const char* pKey, int* pValue)
  1216.  * brief Gets the integer value from a configuration etc object.
  1217.  *
  1218.  * sa GetValueFromEtc, GetIntValueFromEtcFile
  1219.  */
  1220. int GUIAPI GetIntValueFromEtc (GHANDLE hEtc, const char* pSection,
  1221.                                             const char* pKey, int* pValue);
  1222. /**
  1223.  * def SetValueToEtc (GHANDLE hEtc, const char* pSection, const char* pKey, char* pValue)
  1224.  * brief Sets the value in the etc object.
  1225.  *
  1226.  * This fuctions sets the value in the etc object, somewhat similiar to sa SetValueToEtcFile.
  1227.  */
  1228. #define SetValueToEtc(hEtc, pSection, pKey, pValue) 
  1229.         GetValueFromEtc(hEtc, pSection, pKey, pValue, -1)
  1230. /* global MiniGUI etc file object */
  1231. extern GHANDLE hMgEtc;
  1232. /* Gets value from MiniGUI configuration etc object */
  1233. static inline int GetMgEtcValue(const char* pSection, const char *pKey, char *pValue, int iLen) 
  1234. {
  1235. #ifndef _INCORE_RES
  1236.     if (!hMgEtc)
  1237.         return GetValueFromEtcFile (ETCFILEPATH, pSection, pKey, pValue, iLen);
  1238. #endif
  1239.     return GetValueFromEtc (hMgEtc, pSection, pKey, pValue, iLen);
  1240. }
  1241. /* Gets integer value from MiniGUI configuration etc object */
  1242. static inline int GetMgEtcIntValue (const char *pSection, const char* pKey, int *value)
  1243. {
  1244. #ifndef _INCORE_RES
  1245.     if (!hMgEtc)
  1246.         return GetIntValueFromEtcFile (ETCFILEPATH, pSection, pKey, value);
  1247. #endif
  1248.     return GetIntValueFromEtc (hMgEtc, pSection, pKey, value);
  1249. }
  1250.     /** @} end of etc_fns */
  1251. #ifdef _CLIPBOARD_SUPPORT
  1252.     /**
  1253.      * addtogroup clipboard_fns ClipBoard Operations
  1254.      * @{
  1255.      */
  1256. #define LEN_CLIPBOARD_NAME      15
  1257. #define NR_CLIPBOARDS           4
  1258. #define CBNAME_TEXT             ("text")
  1259. #define CBERR_OK        0
  1260. #define CBERR_BADNAME   1
  1261. #define CBERR_NOMEM     2
  1262. #define CBOP_NORMAL     0
  1263. #define CBOP_APPEND     1
  1264. /**
  1265.  * fn int GUIAPI CreateClipBoard (const char* cb_name, size_t size)
  1266.  * brief Create a new clip board.
  1267.  *
  1268.  * This function creates a new clip board with the name a cb_name.
  1269.  * MiniGUI itself creates a clip board for text copying/pasting
  1270.  * called CBNAME_TEXT.
  1271.  *
  1272.  * param cb_name The name of the new clip board.
  1273.  * param size The size of the clip board.
  1274.  *
  1275.  * retval CBERR_OK         The clip board created.
  1276.  * retval CBERR_BADNAME    Duplicated clip board name.
  1277.  * retval CBERR_NOMEM      No enogh memory.
  1278.  *
  1279.  */
  1280. int GUIAPI CreateClipBoard (const char* cb_name, size_t size);
  1281. /**
  1282.  * fn int GUIAPI DestroyClipBoard (const char* cb_name)
  1283.  * brief Destroy a new clip board.
  1284.  *
  1285.  * This function destroies a clip board with the name a cb_name.
  1286.  *
  1287.  * param cb_name The name of the clip board.
  1288.  *
  1289.  * retval CBERR_OK         The clip board created.
  1290.  * retval CBERR_BADNAME    Can not find the clip board with the name.
  1291.  */
  1292. int GUIAPI DestroyClipBoard (const char* cb_name);
  1293. /**
  1294.  * fn int GUIAPI SetClipBoardData (const char* cb_name, void* data, size_t n, int cbop)
  1295.  * brief Set the data of a clip board.
  1296.  *
  1297.  * This function set the data into the clipboard named a cb_name.
  1298.  *
  1299.  * param cb_name The name of the clip board.
  1300.  * param data The pointer to the data.
  1301.  * param n The length of the data.
  1302.  * param cbop Type of clipboard operations, default is CBOP_NORMAL
  1303.  *
  1304.  * retval CBERR_OK         Success.
  1305.  * retval CBERR_BADNAME    Bad clip board name.
  1306.  * retval CBERR_NOMEM      No enogh memory.
  1307.  */
  1308. int GUIAPI SetClipBoardData (const char* cb_name, void* data, size_t n, int cbop);
  1309. /**
  1310.  * fn size_t GUIAPI GetClipBoardDataLen (const char* cb_name);
  1311.  * brief Get the length of the data of a clip board.
  1312.  *
  1313.  * This function the data length of the clipboard named a cb_name.
  1314.  *
  1315.  * param cb_name The name of the clip board.
  1316.  * return The size of the data if success, otherwise zero.
  1317.  */
  1318. size_t GUIAPI GetClipBoardDataLen (const char* cb_name);
  1319. /**
  1320.  * fn size_t GUIAPI GetClipBoardData (const char* cb_name, void* data, size_t n);
  1321.  * brief Get the data of a clip board.
  1322.  *
  1323.  * This function get the all data from the clipboard named a cb_name.
  1324.  *
  1325.  * param cb_name The name of the clip board.
  1326.  * param data The pointer to a buffer will save the data.
  1327.  * param n The length of the buffer.
  1328.  *
  1329.  * return The size of the data got if success, otherwise zero.
  1330.  */
  1331. size_t GUIAPI GetClipBoardData (const char* cb_name, void* data, size_t n);
  1332. /**
  1333.  * fn int GUIAPI GetClipBoardByte (const char* cb_name, int index, unsigned char* byte);
  1334.  * brief Get a byte of from a clip board.
  1335.  *
  1336.  * This function gets a byte from the clipboard named a cb_name.
  1337.  *
  1338.  * param cb_name The name of the clip board.
  1339.  * param index The index of the byte.
  1340.  * param byte The buffer saving the returned byte.
  1341.  *
  1342.  * retval CBERR_OK         The clip board created.
  1343.  * retval CBERR_BADNAME    Duplicated clip board name.
  1344.  * retval CBERR_NOMEM      The index is beyond the data in the clipboard.
  1345.  */
  1346. int GUIAPI GetClipBoardByte (const char* cb_name, int index, unsigned char* byte);
  1347.     /** @} end of clipboard_fns */
  1348. #endif /* _CLIPBOARD_SUPPORT */
  1349.     /**
  1350.      * addtogroup misc_fns Miscellaneous functions
  1351.      * @{
  1352.      */
  1353. /**
  1354.  * fn void GUIAPI Ping (void)
  1355.  * brief Makes a beep sound.
  1356.  * sa Beep
  1357.  */
  1358. void GUIAPI Ping (void);
  1359. /**
  1360.  * def Beep
  1361.  * brief Alias of Ping.
  1362.  * sa Ping
  1363.  */
  1364. #define Beep Ping
  1365. /**
  1366.  * fn void GUIAPI Tone (int frequency_hz, int duration_ms)
  1367.  * brief Makes a tone.
  1368.  *
  1369.  * This function will return after the tone. Thus, your program
  1370.  * will be blocked when the tone is being played.
  1371.  *
  1372.  * param frequency_hz The frequency of the tone in hertz.
  1373.  * param duration_ms The duration of the tone in millisecond.
  1374.  *
  1375.  * bug When MiniGUI runs on X Window, the tone can not be played correctly.
  1376.  *
  1377.  * sa Ping
  1378.  */
  1379. void GUIAPI Tone (int frequency_hz, int duration_ms);
  1380. /**
  1381.  * fn void* GUIAPI GetOriginalTermIO (void)
  1382.  * brief Gets a termios structure of the original terminal before initializing MiniGUI.
  1383.  *
  1384.  * return The pointer to the original a termios structure.
  1385.  */
  1386. void* GUIAPI GetOriginalTermIO (void);
  1387.     /** @} end of misc_fns */
  1388.     /**
  1389.      * defgroup fixed_str Length-Fixed string operations
  1390.      *
  1391.      * MiniGUI maintains a private heap for length-fixed strings, and allocates
  1392.      * length-fixed strings from this heap for window caption, menu item text, 
  1393.      * and so on. You can also use this private heap to allocate length-fixed strings.
  1394.      *
  1395.      * include fixstr.c
  1396.      *
  1397.      * @{
  1398.      */
  1399. /**
  1400.  * fn char* GUIAPI FixStrAlloc (int len)
  1401.  * brief Allocates a buffer for a length-fixed string.
  1402.  *
  1403.  * This function allocates a buffer from the length-fixed string heap
  1404.  * for a string which is a len bytes long (does not include 
  1405.  * the null character of the string). 
  1406.  *
  1407.  * note You can change the content of the string, but do not change the
  1408.  * length of this string (shorter is valid) via a strcat function or 
  1409.  * other equivalent functions or operations.
  1410.  *
  1411.  * param len The length of the string.
  1412.  * return The pointer to the buffer on success, otherwise NULL.
  1413.  *
  1414.  * sa FreeFixStr
  1415.  */
  1416. char* GUIAPI FixStrAlloc (int len);
  1417. /**
  1418.  * fn void GUIAPI FreeFixStr (char* str)
  1419.  * brief Frees a length-fixed string.
  1420.  *
  1421.  * This function frees the buffer used by the length-fixed string a str.
  1422.  *
  1423.  * param str The length-fixed string.
  1424.  *
  1425.  * note Do not use a free to free the length-fixed string.
  1426.  *
  1427.  * sa FixStrAlloc
  1428.  */
  1429. void GUIAPI FreeFixStr (char* str);
  1430.     /** @} end of fixed_str */
  1431.     /**
  1432.      * defgroup cursor_fns Cursor operations
  1433.      * @{
  1434.      */
  1435. #ifndef _CURSOR_SUPPORT
  1436. static inline void do_nothing (void) { return; }
  1437. #endif
  1438. #ifdef _CURSOR_SUPPORT
  1439. /**
  1440.  * fn HCURSOR GUIAPI LoadCursorFromFile (const char* filename)
  1441.  * brief Loads a cursor from a M$ Windows cursor file.
  1442.  *
  1443.  * This function loads a cursor from M$ Windows *.cur file 
  1444.  * named a filename and returns the handle to loaded cursor. 
  1445.  * The returned handle can be used by a SetCursor to set new mouse cursor.
  1446.  *
  1447.  * param filename The path name of the cursor file.
  1448.  * return Handle to the cursor, zero on error.
  1449.  *
  1450.  * note MiniGUI does not support 256-color or animation cursor.
  1451.  *
  1452.  * sa SetCursor
  1453.  */
  1454.   HCURSOR GUIAPI LoadCursorFromFile (const char* filename);
  1455. /**
  1456.  * fn HCURSOR GUIAPI LoadCursorFromMem (const void* area)
  1457.  * brief Loads a cursor from a memory area.
  1458.  *
  1459.  * This function loads a cursor from a memory area pointed to by a area. 
  1460.  * The memory has the same layout as a M$ Windows CURSOR file.
  1461.  * The returned handle can be used by a SetCursor to set new mouse cursor.
  1462.  *
  1463.  * param area The pointer to the cursor data.
  1464.  * return Handle to the cursor, zero on error.
  1465.  *
  1466.  * note MiniGUI does not support 256-color or animation cursor.
  1467.  *
  1468.  * sa SetCursor
  1469.  */
  1470.   HCURSOR GUIAPI LoadCursorFromMem (const void* area);
  1471. /**
  1472.  * fn HCURSOR GUIAPI CreateCursor (int xhotspot, int yhotspot, int w, int h, const BYTE* pANDBits, const BYTE* pXORBits, int colornum)
  1473.  * brief Creates a cursor from memory data.
  1474.  *
  1475.  * This function creates a cursor from memory data rather than cursor file. 
  1476.  * a xhotspot and a yhotspot specify the hotpot of the cursor, a w and a h are 
  1477.  * the width and the height of the cursor respectively. a pANDBits and a pXORBits
  1478.  * are AND bitmask and XOR bitmask of the cursor. 
  1479.  * MiniGUI currently support mono-color cursor and 16-color cursor, a colornum 
  1480.  * specifies the cursor's color depth. For mono-color, it should be 1, and for
  1481.  * 16-color cursor, it should be 4.
  1482.  *
  1483.  * param xhotspot The x-coordinate of the hotspot.
  1484.  * param yhotspot The y-coordinate of the hotspot.
  1485.  * param w The width of the cursor.
  1486.  * param h The height of the cursor.
  1487.  * param pANDBits The pointer to AND bits of the cursor.
  1488.  * param pXORBits The pointer to XOR bits of the cursor.
  1489.  * param colornum The bit-per-pixel of XOR bits.
  1490.  * return Handle to the cursor, zero on error.
  1491.  *
  1492.  * note MiniGUI only support 2-color or 16-color cursor.
  1493.  */
  1494.   HCURSOR GUIAPI CreateCursor (int xhotspot, int yhotspot, int w, int h, 
  1495.                const BYTE* pANDBits, const BYTE* pXORBits, int colornum);
  1496. /**
  1497.  * fn BOOL GUIAPI DestroyCursor (HCURSOR hcsr)
  1498.  * brief Destroies a cursor object.
  1499.  *
  1500.  * This function destroys a cursor object specified by a hcsr.
  1501.  *
  1502.  * param hcsr Handle to the cursor.
  1503.  * return TRUE on success, otherwise FALSE.
  1504.  */
  1505.   BOOL GUIAPI DestroyCursor (HCURSOR hcsr);
  1506. /**
  1507.  * fn HCURSOR GUIAPI GetSystemCursor (int csrid)
  1508.  * brief Gets the handle to a system cursor by its identifier.
  1509.  *
  1510.  * MiniGUI creates (MAX_SYSCURSORINDEX + 1) system cursors for application.
  1511.  * You can use a GetSystemCursor to get the handle to these system cursors.
  1512.  * The identifier can be one of the following:
  1513.  * 
  1514.  *  - IDC_ARROWn
  1515.  *    Normal arrow cursor.
  1516.  *  - IDC_IBEAMn
  1517.  *    'I' shaped beam cursor, indicate an input field.
  1518.  *  - IDC_PENCILn
  1519.  *    Pencil-shape cursor.
  1520.  *  - IDC_CROSSn
  1521.  *    Cross cursor.
  1522.  *  - IDC_MOVEn
  1523.  *    Moving cursor.
  1524.  *  - IDC_SIZENWSEn
  1525.  *    Sizing cursor, along north-west and south-east.
  1526.  *  - IDC_SIZENESWn
  1527.  *    Sizing cursor, along north-east and south-west.
  1528.  *  - IDC_SIZEWEn
  1529.  *    Sizing cursor, along west and east.
  1530.  *  - IDC_SIZENSn
  1531.  *    Sizing cursor, along north and south.
  1532.  *  - IDC_UPARROWn
  1533.  *    Up arrow cursor.
  1534.  *  - IDC_NONEn
  1535.  *    None cursor.
  1536.  *  - IDC_HELPn
  1537.  *    Arrow with question.
  1538.  *  - IDC_BUSYn
  1539.  *    Busy cursor.
  1540.  *  - IDC_WAITn
  1541.  *    Wait cursor.
  1542.  *  - IDC_RARROWn
  1543.  *    Right arrow cursor.
  1544.  *  - IDC_COLOMNn
  1545.  *    Cursor indicates column.
  1546.  *  - IDC_ROWn
  1547.  *    Cursor indicates row.
  1548.  *  - IDC_DRAGn
  1549.  *    Draging cursor.
  1550.  *  - IDC_NODROPn
  1551.  *    No droping cursor.
  1552.  *  - IDC_HAND_POINTn
  1553.  *    Hand point cursor.
  1554.  *  - IDC_HAND_SELECTn
  1555.  *    Hand selection cursor.
  1556.  *  - IDC_SPLIT_HORZn
  1557.  *    Horizontal splitting cursor.
  1558.  *  - IDC_SPLIT_VERTn
  1559.  *    Vertical splitting cursor.
  1560.  *
  1561.  * param csrid The identifier of the system cursor.
  1562.  * return Handle to the system cursor, otherwise zero.
  1563.  */
  1564.   HCURSOR GUIAPI GetSystemCursor (int csrid);
  1565. /**
  1566.  * fn HCURSOR GUIAPI GetCurrentCursor (void)
  1567.  * brief Gets the handle to the current cursor.
  1568.  *
  1569.  * This function retrives the current cursor and returns its handle.
  1570.  *
  1571.  * return Handle to the current system cursor, zero means no current cursor.
  1572.  */
  1573.   HCURSOR GUIAPI GetCurrentCursor (void);
  1574. #else
  1575.   #define LoadCursorFromFile(filename)    (do_nothing(), 0)
  1576.   #define CreateCursor(x, y, w, h, ANDbs, XORbs, cr) (do_nothing(), 0)
  1577.   #define DestroyCursor(hcsr)             (do_nothing(), 0)
  1578.   #define GetSystemCursor(csrid)          (do_nothing(), 0)
  1579.   #define GetCurrentCursor()              (do_nothing(), 0)
  1580. #endif /* _CURSOR_SUPPORT */
  1581. #define MAX_SYSCURSORINDEX    22
  1582. /* System cursor index. */
  1583. #define IDC_ARROW       0
  1584. #define IDC_IBEAM       1
  1585. #define IDC_PENCIL      2
  1586. #define IDC_CROSS       3
  1587. #define IDC_MOVE        4
  1588. #define IDC_SIZENWSE    5
  1589. #define IDC_SIZENESW    6
  1590. #define IDC_SIZEWE      7
  1591. #define IDC_SIZENS      8
  1592. #define IDC_UPARROW     9
  1593. #define IDC_NONE        10
  1594. #define IDC_HELP        11
  1595. #define IDC_BUSY        12
  1596. #define IDC_WAIT        13
  1597. #define IDC_RARROW      14
  1598. #define IDC_COLOMN      15
  1599. #define IDC_ROW         16
  1600. #define IDC_DRAG        17
  1601. #define IDC_NODROP      18
  1602. #define IDC_HAND_POINT  19
  1603. #define IDC_HAND_SELECT 20
  1604. #define IDC_SPLIT_HORZ  21
  1605. #define IDC_SPLIT_VERT  22
  1606. /**
  1607.  * fn void GUIAPI ClipCursor (const RECT* prc)
  1608.  * brief Clips the cursor range.
  1609.  *
  1610.  * This function sets cursor's clipping rectangle. a prc 
  1611.  * is the new clipping rectangle in screen coordinates. If a prc is NULL, 
  1612.  * a ClipCursor will disable cursor clipping.
  1613.  *
  1614.  * param prc The clipping rectangle.
  1615.  * return None.
  1616.  */
  1617. void GUIAPI ClipCursor (const RECT* prc);
  1618. /**
  1619.  * fn void GUIAPI GetClipCursor (RECT* prc)
  1620.  * brief Gets the current cursor clipping rectangle.
  1621.  *
  1622.  * This function copies the current clipping rectangle to 
  1623.  * a RECT pointed to by a prc.
  1624.  *
  1625.  * param prc The clipping rectangle will be saved to this rectangle.
  1626.  * return None.
  1627.  */
  1628. void GUIAPI GetClipCursor (RECT* prc);
  1629. /**
  1630.  * fn void GUIAPI GetCursorPos (POINT* ppt)
  1631.  * brief Gets position of the current cursor.
  1632.  *
  1633.  * This function copies the current mouse cursor position to 
  1634.  * a POINT structure pointed to by a ppt.
  1635.  *
  1636.  * param ppt The position will be saved in this buffer.
  1637.  * return None.
  1638.  *
  1639.  * sa SetCursorPos, POINT
  1640.  */
  1641. void GUIAPI GetCursorPos (POINT* ppt);
  1642. /**
  1643.  * fn void GUIAPI SetCursorPos (int x, int y)
  1644.  * brief Sets position of the current cursor.
  1645.  *
  1646.  * This function sets mouse cursor position with the given 
  1647.  * arguments: a (x,y).
  1648.  *
  1649.  * param x The x-corrdinate of the expected poistion.
  1650.  * param y The y-corrdinate of the expected poistion.
  1651.  * return None.
  1652.  *
  1653.  * sa GetCursorPos
  1654.  */
  1655. void GUIAPI SetCursorPos (int x, int y);
  1656. #ifdef _CURSOR_SUPPORT
  1657. /**
  1658.  * fn HCURSOR GUIAPI SetCursorEx (HCURSOR hcsr, BOOL set_def)
  1659.  * brief Changes the current cursor.
  1660.  *
  1661.  * This function changes the current cursor to be a hcsr,
  1662.  * and/or sets it to be the default cursor.
  1663.  *
  1664.  * If you pass a set_def as TRUE, the expected cursor will be the default cursor. 
  1665.  * The default cursor will be used when you move cursor to the desktop.
  1666.  *
  1667.  * param hcsr The expected cursor handle.
  1668.  * param set_def Indicates whether setting the cursor as the default cursor.
  1669.  * return The old cursor handle.
  1670.  *
  1671.  * sa SetCursor, SetDefaultCursor, GetDefaultCursor
  1672.  */
  1673.   HCURSOR GUIAPI SetCursorEx (HCURSOR hcsr, BOOL set_def);
  1674. /**
  1675.  * def SetCursor(hcsr)
  1676.  * brief Changes the current cursor.
  1677.  *
  1678.  * This function changes the current cursor to be a hcsr.
  1679.  *
  1680.  * param hcsr The expected cursor handle.
  1681.  * return The old cursor handle.
  1682.  *
  1683.  * note This function defined as a macro calling a SetCursorEx with
  1684.  * passing a set_def as FALSE.
  1685.  *
  1686.  * sa SetCursorEx, SetDefaultCursor
  1687.  */
  1688.   #define SetCursor(hcsr) SetCursorEx (hcsr, FALSE)
  1689. /**
  1690.  * def SetDefaultCursor(hcsr)
  1691.  * brief Changes the current cursor, and set it as the default cursor.
  1692.  *
  1693.  * This function changes the current cursor to be a hcsr, and set it as the default cursor.
  1694.  *
  1695.  * param hcsr The expected cursor handle.
  1696.  * return The old cursor handle.
  1697.  *
  1698.  * note This function defined as a macro calling a SetCursorEx with
  1699.  * passing a set_def as TRUE.
  1700.  *
  1701.  * sa SetCursorEx, SetCursor
  1702.  */
  1703.   #define SetDefaultCursor(hcsr) SetCursorEx (hcsr, TRUE)
  1704. /**
  1705.  * fn HCURSOR GUIAPI GetDefaultCursor (void)
  1706.  * brief Gets the default cursor.
  1707.  *
  1708.  * This function gets the current default cursor.
  1709.  *
  1710.  * return The current default cursor handle.
  1711.  *
  1712.  * sa SetCursorEx, SetDefaultCursor
  1713.  */
  1714.   HCURSOR GUIAPI GetDefaultCursor (void);
  1715. #else
  1716.   #define SetCursorEx(hcsr, set_def)    (do_nothing(), 0)
  1717.   #define SetCursor(hcsr)               (do_nothing(), 0)
  1718.   #define SetDefaultCursor(hcsr)        (do_nothing(), 0)
  1719.   #define GetDefaultCursor()            (do_nothing(), 0)
  1720. #endif /* _CURSOR_SUPPORT */
  1721. #ifdef _CURSOR_SUPPORT
  1722. /**
  1723.  * fn int GUIAPI ShowCursor (BOOL fShow)
  1724.  * brief Shows or hides cursor.
  1725.  *
  1726.  * This function shows or hides cursor according to the argument a fShow. 
  1727.  * Show cursor when a fShow is TRUE, and hide cursor when a fShow is FALSE.
  1728.  * MiniGUI maintains a showing count value. Calling a ShowCursor once, the count 
  1729.  * will increase when a fShow is TRUE, or decrease one when FALSE.
  1730.  * When the count is less than 0, the cursor will disapear actually.
  1731.  *
  1732.  * param fShow Indicates show or hide the cursor.
  1733.  * return Cursor showing count value. 
  1734.  */
  1735.   int GUIAPI ShowCursor (BOOL fShow);
  1736. #else
  1737.   #define ShowCursor(fShow)             (do_nothing(), 0)
  1738. #endif /* _CURSOR_SUPPORT */
  1739.     /** @} end of cursor_fns */
  1740.     /**
  1741.      * defgroup key_status Asynchronous key status functions
  1742.      * @{
  1743.      */
  1744. /**
  1745.  * fn BOOL GUIAPI GetKeyStatus (UINT uKey)
  1746.  * brief Gets a key or a mouse button status.
  1747.  *
  1748.  * This function gets a key or a mouse button status, returns TRUE 
  1749.  * when pressed, or FALSE when released. a uKey indicates 
  1750.  * the key or mouse button. For keys on keyboard, a uKey should be 
  1751.  * the scancode of the key, for mouse button, a uKey should be one 
  1752.  * value of the following:
  1753.  *
  1754.  *  - SCANCODE_LEFTBUTTONn
  1755.  *    Left mouse button.
  1756.  *  - SCANCODE_MIDDLBUTTONn
  1757.  *    Middle mouse button.
  1758.  *  - SCANCODE_RIGHTBUTTONn
  1759.  *    Right mouse button.
  1760.  *
  1761.  * These constants and the scancodes of keys are defined in <minigui/common.h>.
  1762.  *
  1763.  * param uKey Indicates the key or mouse button. 
  1764.  * return Returns TRUE when pressed, or FALSE when released.
  1765.  *
  1766.  * sa GetShiftKeyStatus
  1767.  */
  1768. BOOL GUIAPI GetKeyStatus (UINT uKey);
  1769. /**
  1770.  * fn DWORD GUIAPI GetShiftKeyStatus (void)
  1771.  * brief Gets status of the shift keys.
  1772.  *
  1773.  * This function gets ths status of the shift keys, the returned value 
  1774.  * indicates the status of shift keys -- CapsLock, ScrollLock, NumLock, Left Shift, 
  1775.  * Right Shift, Left Ctrl, Right Ctrl, Left Alt, and Right Alt. 
  1776.  * You can use KS_* ORed with the status value to determine one shift key's status:
  1777.  *
  1778.  *  - KS_CAPSLOCKn
  1779.  *    Indicates that CapsLock is locked.
  1780.  *  - KS_NUMLOCKn
  1781.  *    Indicates that NumLock is locked.
  1782.  *  - KS_SCROLLLOCKn
  1783.  *    Indicates that ScrollLock is locked.
  1784.  *  - KS_LEFTCTRLn
  1785.  *    Indicates that left Ctrl key is pressed.
  1786.  *  - KS_RIGHTCTRLn
  1787.  *    Indicates that right Ctrl key is pressed.
  1788.  *  - KS_CTRLn
  1789.  *    Indicates that either left or right Ctrl key is pressed.
  1790.  *  - KS_LEFTALTn
  1791.  *    Indicates that left Alt key is pressed.
  1792.  *  - KS_RIGHTALTn
  1793.  *    Indicates that right Alt key is pressed.
  1794.  *  - KS_ALTn
  1795.  *    Indicates that either left or right Alt key is pressed.
  1796.  *  - KS_LEFTSHIFTn
  1797.  *    Indicates that left Shift key is pressed.
  1798.  *  - KS_RIGHTSHIFTn
  1799.  *    Indicates that right Shift key is pressed.
  1800.  *  - KS_SHIFTn
  1801.  *    Indicates that either left or right Shift key is pressed.
  1802.  *
  1803.  * These constants are defined in <minigui/common.h>.
  1804.  *
  1805.  * return The status of the shift keys.
  1806.  * sa key_defs
  1807.  */
  1808. DWORD GUIAPI GetShiftKeyStatus (void);
  1809.     /** @} end of key_status */
  1810.     /**
  1811.      * defgroup sys_text Internationlization of system text
  1812.      * @{
  1813.      */
  1814. /**
  1815.  * fn const char* GetSysText (const char* text);
  1816.  * brief Translates system text to localized text.
  1817.  *
  1818.  * When MiniGUI display some system messages, it will call a GetSysText function 
  1819.  * to translate system text from English to other language. 
  1820.  * Global variable a SysText contains all text used by MiniGUI in English.
  1821.  *
  1822.  * a GetSysText function returns localized text from a local_SysText. 
  1823.  * MiniGUI have already defined localized sytem text for en_US, zh_CN.GB2312 
  1824.  * and zh_TW.Big5 locales. MiniGUI initializes a local_SysText to 
  1825.  * point one of above localized system text when startup.  You can also 
  1826.  * let a local_SysText point to your customized string array.
  1827.  * 
  1828.  * param text The system text in en_US locale.
  1829.  * return The localized text.
  1830.  *
  1831.  * sa SysText, local_SysText
  1832.  */
  1833. const char* GetSysText (const char* text);
  1834. /**
  1835.  * var const char* SysText []
  1836.  * brief Contains all text used by MiniGUI in English.
  1837.  *
  1838.  * System text defined as follows in MiniGUI:
  1839.  *
  1840.  * code
  1841.  * const char* SysText [] =
  1842.  * {
  1843.  *    "Windows...",
  1844.  *    "Start...",
  1845.  *    "Refresh Background",
  1846.  *    "Close All Windows",
  1847.  *    "End Session",
  1848.  *    "Operations...",
  1849.  *    "Minimize",
  1850.  *    "Maximize",
  1851.  *    "Restore",
  1852.  *    "Close",
  1853.  *    "OK",
  1854.  *    "Next",
  1855.  *    "Cancel",
  1856.  *    "Previous",
  1857.  *    "Yes",
  1858.  *    "No",
  1859.  *    "Abort",
  1860.  *    "Retry",
  1861.  *    "Ignore",
  1862.  *    "About MiniGUI...",
  1863.  *    "Open File",
  1864.  *    "Save File",
  1865.  *    "Color Selection",
  1866.  *    NULL
  1867.  * };
  1868.  * endcode
  1869.  *
  1870.  * sa GetSysText, local_SysText
  1871.  */
  1872. extern const char* SysText [];
  1873. /**
  1874.  * var const char** local_SysText
  1875.  * brief The pointer to the current localized system text array.
  1876.  *
  1877.  * Changing a local_SysText will lead to a GetSysText returns a different 
  1878.  * localized system text. Please set it after calling a SetDesktopRect, 
  1879.  * and send desktop a MSG_REINITSESSION message (call a ReinitDesktop function) 
  1880.  * after assigned a different value to this variable.
  1881.  *
  1882.  * sa GetSysText, SysText, ReinitDesktopEx
  1883.  */
  1884. extern const char** local_SysText;
  1885.     /** @} end of sys_text */
  1886.     /**
  1887.      * defgroup str_helpers String operation helpers
  1888.      * @{
  1889.      */
  1890. /**
  1891.  * fn char* strnchr (const char* s, size_t n, int c);
  1892.  * brief Locates character in the first a n characters of string a s.
  1893.  *
  1894.  * param s The pointer to the string.
  1895.  * param n The number of first characters will be searched.
  1896.  * param c The expected character.
  1897.  * return Returns a pointer to the first occurrence of the character a c in the string a s
  1898.  *
  1899.  * sa strchr(3)
  1900.  */
  1901. char* strnchr (const char* s, size_t n, int c);
  1902. /**
  1903.  * fn int substrlen (const char* text, int len, char delimiter, int* nr_delim)
  1904.  * brief Locates a substring delimited by one or more delimiters in the first a len characters of string a text.
  1905.  *
  1906.  * param text The pointer to the string.
  1907.  * param len The number of first characters will be searched.
  1908.  * param delimiter The delimiter which delimites the substring from other.
  1909.  * param nr_delim  The number of continuous delimiters will be returned through this pointer.
  1910.  * return The length of the substring.
  1911.  *
  1912.  * sa strstr(3)
  1913.  */
  1914. int substrlen (const char* text, int len, char delimiter, int* nr_delim);
  1915. /**
  1916.  * fn char* strtrimall (char* src);
  1917.  * brief deletes the space, form-feed('f'), newline('n'), carriage return('r'), horizontal tab('t'),and vertical tab('v') in the head and the tail of the string.
  1918.  *
  1919.  * param src The pointer to the string.
  1920.  * return Returns a pointer to the string.
  1921.  *
  1922.  * sa strchr(3)
  1923.  */
  1924. char * strtrimall (char* src);
  1925.     /** @} end of str_helpers */
  1926.     /** @} end of global_fns */
  1927.     /** @} end of fns */
  1928. #ifdef __cplusplus
  1929. }
  1930. #endif  /* __cplusplus */
  1931. #endif /* _MGUI_MINIGUI_H */