sdk-hwV1.3/external/eyesee-mpp/dragonboard/include/V5CDRTP/minigui/minigui.h

3521 lines
104 KiB
C
Executable File

/**
* \file minigui.h
* \author Wei Yongming <vincent@minigui.org>
* \date 2002/01/06
*
* \brief This file includes global and miscellaneous interfaces of MiniGUI.
*
\verbatim
This file is part of MiniGUI, a mature cross-platform windowing
and Graphics User Interface (GUI) support system for embedded systems
and smart IoT devices.
Copyright (C) 2002~2018, Beijing FMSoft Technologies Co., Ltd.
Copyright (C) 1998~2002, WEI Yongming
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Or,
As this program is a library, any link to this program must follow
GNU General Public License version 3 (GPLv3). If you cannot accept
GPLv3, you need to be licensed from FMSoft.
If you have got a commercial license of this program, please use it
under the terms and conditions of the commercial license.
For more information about the commercial license, please refer to
<http://www.minigui.com/en/about/licensing-policy/>.
\endverbatim
*/
/*
* $Id: minigui.h 13674 2010-12-06 06:45:01Z wanzheng $
*
* MiniGUI for Linux/uClinux, eCos, uC/OS-II, VxWorks,
* pSOS, ThreadX, NuCleus, OSE, and Win32.
*/
#ifndef _MGUI_MINIGUI_H
#define _MGUI_MINIGUI_H
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/**
* \addtogroup global_vars Global variables
* @{
*/
/**
* \defgroup rect_vars Global Rectangles
* @{
*/
/**
* \var RECT g_rcScr
* \brief Contains the rectangle of the whole screen.
*/
extern MG_EXPORT RECT g_rcScr;
/**
* \def g_rcDesktop
* \brief Contains the rectangle of desktop of the application.
*
* \a g_rcDesktop is defined as an alias (macro) of \a g_rcScr.
*
* \sa g_rcScr
*/
#define g_rcDesktop g_rcScr
/** @} end of rect_vars */
/**
* \defgroup lite_vars MiniGUI-Processes specific variables
* @{
*/
#ifdef _MGRM_PROCESSES
#include <sys/types.h>
/**
* \var BOOL mgIsServer
* \brief Indicates whether the process is the server or a client on
* MiniGUI-Processes.
*
* \note Only defined for MiniGUI-Processes.
*/
extern MG_EXPORT BOOL mgIsServer;
/**
* \var void* mgSharedRes
* \brief Contains the pointer to the shared resource of MiniGUI-Processes.
*
* \note Not defined for MiniGUI-Threads, and the shared resource is
* read-only for all clients.
*
* \sa mgSizeRes
*/
extern MG_EXPORT void* mgSharedRes;
/**
* \var void* mgSizeRes
* \brief Contains the length of shared resource of MiniGUI-Processes.
*
* \note Only defined for MiniGUI-Processes.
*
* \sa mgSharedRes
*/
extern MG_EXPORT size_t mgSizeRes;
/**
* \def LEN_LAYER_NAME
* \brief The maximum length of name of layer in MiniGUI-Processes.
**/
#define LEN_LAYER_NAME 14
/**
* \def LEN_CLIENT_NAME
* \brief The maximum length of name of client in MiniGUI-Processes.
**/
#define LEN_CLIENT_NAME 14
/**
* \def INV_LAYER_HANDLE
* \brief Invalid handle value of the layer.
**/
#define INV_LAYER_HANDLE 0
struct _MG_Layer;
/** Client information. */
typedef struct _MG_Client
{
/** The name of the client. */
char name [LEN_CLIENT_NAME + 1];
/** PID of the client process. */
pid_t pid;
/** UID of the client process. */
uid_t uid;
/** The file descriptor of the socket connected to the client. */
int fd;
/** Flag indicate whether this client has dirty windows. */
BOOL has_dirty;
/** The last active tick count of the client. */
DWORD last_live_time;
/** The additional data of the client. */
DWORD dwAddData;
/** The pointer to the next client in the same layer. */
struct _MG_Client* next;
/** The pointer to the previous client in the same layer. */
struct _MG_Client* prev;
/** The pointer to the layer on which the client lays. */
struct _MG_Layer* layer;
/** The pointer to the global resoures of the client. */
struct GlobalRes* global_res;
} MG_Client;
/** Layer information. */
typedef struct _MG_Layer
{
/** The name of the layer. */
char name [LEN_LAYER_NAME + 1];
/** The pointer to the active client on the layer. */
DWORD dwAddData;
/** The pointer to the list of clients in the layer. */
MG_Client* cli_head;
/** The pointer to the active client on the layer. */
MG_Client* cli_active;
/** The pointer to the next layer. */
struct _MG_Layer* next;
/** The pointer to the previous layer. */
struct _MG_Layer* prev;
/** Internal field. */
void* zorder_info;
/** Internal field. */
int zorder_shmid;
} MG_Layer;
/*screen attr type*/
#define SCREEN_ATTR_ALPHA_CHANNEL 0x01 //alpha channel
#define SCREEN_ATTR_COLORKEY 0x02 //colorkey
#define SCREEN_ATTR_COLORSPACE 0x03 //colorspace
#define SCREEN_ATTR_ALPHA 0x04
#define SCREEN_NO_EXIST -99 //screen don't exist
/**
* \var int mgClientSize
* \brief The current size of the array \a mgClients.
*
* \sa mgClients
*/
extern MG_EXPORT int mgClientSize;
/**
* \var MG_Client* mgClients
* \brief The pointer to the array contains all clients' information.
*
* You can access the elements in \a mgClients as a normal array. If the
* field \a fd of one element is not less than zero, then the element
* will be a vaild client.
*
* \sa MG_Client
*/
extern MG_EXPORT MG_Client* mgClients;
/**
* \var MG_Layer* mgTopmostLayer
* \brief The pointer to the topmost layer.
*
* \sa MG_Layer
*/
extern MG_EXPORT MG_Layer* mgTopmostLayer;
/**
* \var MG_Layer* mgLayers
* \brief The pointer to the array of layers.
*
* \sa MG_Layer
*/
extern MG_EXPORT MG_Layer* mgLayers;
#endif /* _MGRM_PROCESSES */
/** @} end of lite_vars */
/** @} end of global_vars */
/**
* \fn int GUIAPI InitGUI (int, const char **)
* \brief Initialize MiniGUI.
*
* The meaning of two parameters is same with parameters of main function.
*
**/
MG_EXPORT int GUIAPI InitGUI (int, const char **);
/**
* \fn void GUIAPI TerminateGUI (int not_used)
* \brief Terminate MiniGUI.
*
* \param not_used not used
*
**/
MG_EXPORT void GUIAPI TerminateGUI (int not_used);
/**
* \fn void GUIAPI MiniGUIPanic (int exitcode)
* \brief The panic of MiniGUI application.
*
* The function forces to close GAL and IAL engine.
*
* \param exitcode The value of exitcode, now it can be any values.
*
**/
MG_EXPORT void GUIAPI MiniGUIPanic (int exitcode);
/**
* \addtogroup fns Functions
* @{
*/
/**
* \addtogroup global_fns Global/general functions
* @{
*/
/**
* \defgroup lite_fns MiniGUI-Processes specific functions
* @{
*/
#ifndef _MGRM_THREADS
/**
* \defgroup lite_listenfd_fns Listening a file descriptor
*
* Register/Unregister a listen fd to MiniGUI.
*
* When you need to listen a file descriptor, you can use \a select(2)
* system call. In MiniGUI, you can also register it to MiniGUI to
* be a listened fd, and when there is a read/write/except event on
* the registered fd , MiniGUI will sent a notification message to
* the registered window.
*
* Example:
*
* \include listenfd.c
*
* @{
*/
/**
* \def MAX_NR_LISTEN_FD
* \brief The max number of listen fd which user can use.
**/
#define MAX_NR_LISTEN_FD 5
#ifdef WIN32
#ifndef POLLIN
#define POLLIN 0x001
#endif
#ifndef POLLOUT
#define POLLOUT 0x004
#endif
#ifndef POLLERR
#define POLLERR 0x008
#endif
#endif
/**
* \fn BOOL GUIAPI RegisterListenFD (int fd, int type,\
HWND hwnd, void* context)
* \brief Registers a listening file descriptor to MiniGUI-Lite.
*
* This function registers the file desciptor \a fd to MiniGUI-Lite for
* listening.
*
* When there is a read/write/except event on this \a fd, MiniGUI
* will post a MSG_FDEVENT message with wParam being equal to
* MAKELONG (fd, type), and the lParam being set to \a context
* to the target window \a hwnd.
*
* \param fd The file descriptor to be listened.
* \param type The type of the event to be listened, can be POLLIN, POLLOUT,
* or POLLERR.
* \param hwnd The handle to the window will receive MSG_FDEVENT message.
* \param context The value will be passed to the window as lParam of
* MSG_FDEVENT message.
*
* \return TRUE if all OK, and FALSE on error.
*
* \note Only available on MiniGUI-Processes.
*
* \sa UnregisterListenFD, system_msgs
*/
MG_EXPORT BOOL GUIAPI RegisterListenFD (int fd, int type,
HWND hwnd, void* context);
/**
* \fn BOOL GUIAPI UnregisterListenFD (int fd)
* \brief Unregisters a being listened file descriptor.
*
* This function unregisters the being listened file descriptor \a fd.
*
* \param fd The file descriptor to be unregistered, should be a being
* listened file descriptor.
* \return TRUE if all OK, and FALSE on error.
*
* \note Only available on MiniGUI-Processes.
*
* \sa RegisterListenFD
*/
MG_EXPORT BOOL GUIAPI UnregisterListenFD (int fd);
/** @} end of lite_listenfd_fns */
#ifdef _MGRM_PROCESSES
/**
* \defgroup lite_layer_fns Layer operations
*
* A client in MiniGUI-Processes can create a new layer or join
* an existed layer.
*
* Example:
*
* \include client_startup.c
*
* @{
*/
/**
* \def NAME_SELF_LAYER
* \brief The name of the self layer.
**/
#define NAME_SELF_LAYER ""
/**
* \def NAME_TOPMOST_LAYER
* \brief The name of the topmost layer.
**/
#define NAME_TOPMOST_LAYER ""
/**
* \def NAME_DEF_LAYER
* \brief The default name of the layer.
**/
#define NAME_DEF_LAYER "mginit"
/**
* \fn GHANDLE GUIAPI JoinLayer (const char* layer_name,\
const char* client_name,\
int max_nr_topmosts, int max_nr_normals)
* \brief Joins to a layer.
*
* This function should be called by clients before calling any other MiniGUI
* functions. You can call \a GetLayerInfo to get the layer information.
* If the layer to be joined does not exist, the server, i.e. \a mginit, will
* try to create a new one. If you passed a NULL pointer or a null string for
* \a layer_name, the client will join to the default layer.
*
* If the client want to create a new layer, you should specify the maximal
* number of topmost frame objects (max_nr_topmosts) and the maximal number of
* normal frame objects (max_nr_normals) in the new layer. Passing zero to
* \a max_nr_topmosts and max_nr_normals will use the default values, and the default
* values are specified by ServerStartup.
*
* Note that the server will create a default layer named "mginit".
*
* \param layer_name The name of the layer.You can use NAME_TOPMOST_LAYER to
* specify the current topmost layer.
* \param client_name The name of the client.
* \param max_nr_topmosts The maximal number of topmost z-order nodes in
* the new layer.
* \param max_nr_normals The maximal number of normal z-order nodes in
* the new layer.
*
* \return The handle to the layer on success, INV_LAYER_HANDLE on error.
*
* \note Only call this function in clients of MiniGUI-Processes.
*
* \sa GetLayerInfo, ServerStartup, ServerCreateLayer
*/
MG_EXPORT GHANDLE GUIAPI JoinLayer (const char* layer_name,
const char* client_name,
int max_nr_topmosts, int max_nr_normals);
/**
* \fn GHANDLE GUIAPI GetLayerInfo (const char* layer_name,\
int* nr_clients, BOOL* is_topmost, int* cli_active)
* \brief Gets information of a layer by a client.
*
* You can get the information of a layer through this function.
* The information will be returned through the pointer arguments
* if the specific pointer is not NULL.
*
* \param layer_name The name of the layer. You can use NAME_SELF_LAYER to
* specify the layer the calling client belongs to.
* \param nr_clients The number of clients in the layer will be returned
* through this pointer.
* \param is_topmost A boolean which indicates whether the layer is the
* topmost layer will be returned.
* \param cli_active The identifier of the active client in the layer.
*
* \return Returns the handle to the layer on success,
* INV_LAYER_HANDLE on error.
*
* \note Only call this function in clients of MiniGUI-Processes.
*
* \sa JoinLayer
*/
MG_EXPORT GHANDLE GUIAPI GetLayerInfo (const char* layer_name,
int* nr_clients, BOOL* is_topmost, int* cli_active);
/**
* \fn BOOL GUIAPI SetTopmostLayer (BOOL handle_name,\
* GHANDLE handle, const char* name)
* \brief Brings a layer to be the topmost one.
*
* This function brings the specified layer \a handle to be the topmost layer.
*
* \param handle_name The way specifing the layer; TRUE for handle of
* the layer, FALSE for name.
* \param handle The handle to the layer.
* \param name The name of the layer. You can use NAME_SELF_LAYER to
* specify the layer to which the calling client belongs.
*
* \return TRUE on success, otherwise FALSE.
*
* \note Only call this function in clients of MiniGUI-Processes.
*/
MG_EXPORT BOOL GUIAPI SetTopmostLayer (BOOL handle_name,
GHANDLE handle, const char* name);
/**
* \fn BOOL GUIAPI DeleteLayer (BOOL handle_name,\
GHANDLE handle, const char* layer_name)
* \brief Deletes a specific layer.
*
* \param handle_name The way specifing the layer; TRUE for handle of
* the layer, FALSE for name.
* \param handle The handle to the layer.
* \param layer_name The name of the layer. You can use NAME_SELF_LAYER to
* specify the layer to which the calling client belongs.
*
* \return TRUE for success, FALSE on error.
*
* \note Only call this function in clients of MiniGUI-Processes.
*
* \sa JoinLayer
*/
MG_EXPORT BOOL GUIAPI DeleteLayer (BOOL handle_name,
GHANDLE handle, const char* layer_name);
/** @} end of lite_layer_fns */
/**
* \defgroup lite_server_fns Server-only operations
*
* MiniGUI provides some server-only functions for you to create a
* customized server for MiniGUI-Processes, i.e. \a mginit.
*
* Example:
*
* \include server_startup.c
*
* @{
*/
/**
* \var typedef void (* ON_LOCK_CLIENT_REQ) (void)
* \brief Type of client request lock callback.
*
* \sa OnTrylockClientReq, OnLockClientReq, OnUnlockClientReq
*/
typedef int (* ON_LOCK_CLIENT_REQ) (void);
/**
* \var typedef void (* ON_TRYLOCK_CLIENT_REQ) (void)
* \brief Type of client request lock callback.
*
* \sa OnTrylockClientReq, OnLockClientReq, OnUnlockClientReq
*/
typedef int (* ON_TRYLOCK_CLIENT_REQ) (void);
/**
* \var typedef void (* ON_UNLOCK_CLIENT_REQ) (void)
* \brief Type of client request unlock callback.
*
* \sa OnTrylockClientReq, OnLockClientReq, OnUnlockClientReq
*/
typedef void (* ON_UNLOCK_CLIENT_REQ) (void);
/**
* \var ON_LOCK_CLIENT_REQ OnLockClientReq
* \brief Sets to a function to lock a client request.
*
* \note Only available for the client of MiniGUI-Processes.
*
* \sa ON_LOCK_CLIENT_REQ
*/
extern MG_EXPORT ON_LOCK_CLIENT_REQ OnLockClientReq;
/**
* \var ON_TRYLOCK_CLIENT_REQ OnTrylockClientReq
* \brief Sets to a function to lock a client request.
*
* \note Only available for the client of MiniGUI-Processes.
*
* \sa ON_TRYLOCK_CLIENT_REQ
*/
extern MG_EXPORT ON_TRYLOCK_CLIENT_REQ OnTrylockClientReq;
/**
* \var ON_UNLOCK_CLIENT_REQ OnUnlockClientReq
* \brief Sets to a function to unlock a client request.
*
* \note Only available for the client of MiniGUI-Processes.
*
* \sa ON_UNLOCK_CLIENT_REQ
*/
extern MG_EXPORT ON_UNLOCK_CLIENT_REQ OnUnlockClientReq;
#define LCO_NEW_CLIENT 1
#define LCO_DEL_CLIENT 2
/**
* \var typedef void (* ON_NEW_DEL_CLIENT) (int op, int cli)
* \brief Type of client event callback.
*
* \sa OnNewDelClient, OnChangeLayer
*/
typedef void (* ON_NEW_DEL_CLIENT) (int op, int cli);
#define LCO_NEW_LAYER 1
#define LCO_DEL_LAYER 2
#define LCO_JOIN_CLIENT 3
#define LCO_REMOVE_CLIENT 4
#define LCO_TOPMOST_CHANGED 5
#define LCO_ACTIVE_CHANGED 6
/**
* \var typedef void (* ON_CHANGE_LAYER) (int op,
MG_Layer* layer, MG_Client* client)
* \brief Type of layer change event callback.
*
* \sa OnNewDelClient, OnChangeLayer
*/
typedef void (* ON_CHANGE_LAYER) (int op, MG_Layer* layer,
MG_Client* client);
#define ZNOP_ALLOCATE 1
#define ZNOP_FREE 2
#define ZNOP_MOVE2TOP 3
#define ZNOP_SHOW 4
#define ZNOP_HIDE 5
#define ZNOP_MOVEWIN 6
#define ZNOP_SETACTIVE 7
#define ZNOP_ENABLEWINDOW 11
#define ZNOP_DISABLEWINDOW 12
#define ZNOP_STARTDRAG 13
#define ZNOP_CANCELDRAG 14
#define ZNOP_CHANGECAPTION 15
/**
* \var typedef void (* ON_ZNODE_OPERATION) (int op, int cli, int idx_znode)
* \brief Type of z-node operation callback.
*
* \sa OnNewDelClient, OnChangeLayer, OnZNodeOperation
*/
typedef void (* ON_ZNODE_OPERATION) (int op, int cli, int idx_znode);
/**
* \var ON_NEW_DEL_CLIENT OnNewDelClient
* \brief Sets to a function to handle a comming in (going away)
* connection of client.
*
* When a client is connecting to or disconnecting from the server, MiniGUI
* will call this function to tell you the event and the client identifier.
* The event could be one of the following:
*
* - LCO_NEW_CLIENT\n
* A new client is connecting to the server.
* - LCO_DEL_CLIENT\n
* A new client is disconnecting from the server.
*
* The event will be passed through the argument of \a op, and the client
* identifier will be passed through the argument of \a cli.
* You can get the information of the client by accessing \a mgClients
* with \a cli.
*
* \note Only available for the server of MiniGUI-Processes.
*
* \sa ON_NEW_DEL_CLIENT, mgClients
*/
extern MG_EXPORT ON_NEW_DEL_CLIENT OnNewDelClient;
/**
* \var ON_CHANGE_LAYER OnChangeLayer
* \brief Sets to a function to handle events of layers.
*
* When a layer is changing, MiniGUI will call this function to tell
* you the event and the layer or the client which leads to the event.
* The event could be one of the following:
*
* - LCO_NEW_LAYER\n
* A new layer is creating.
* - LCO_DEL_LAYER\n
* A new layer is deleting.
* - LCO_JOIN_CLIENT\n
* A client is joining to the layer.
* - LCO_REMOVE_CLIENT\n
* A client is removing from the layer.
* - LCO_TOPMOST_CHANGED\n
* The topmost layer changed, the layer will be the topmost one.
* - LCO_ACTIVE_CHANGED\n
* The active client changed, the client will be the active one.
*
* The event will be passed through the argument of \a op, and the
* pointers to the relevant layer and client will be passed through
* the argument of \a layer and \a client respectively.
*
* \note Only available for the server of MiniGUI-Processes.
*
* \sa ON_NEW_DEL_CLIENT, mgClients
*/
extern MG_EXPORT ON_CHANGE_LAYER OnChangeLayer;
/**
* \var ON_ZNODE_OPERATION OnZNodeOperation
* \brief Sets to a function to handle events of z-node.
*
* After the server does an operation on a znode, MiniGUI will call
* this function to tell you the event and the layer, the client, and
* the z-node which leads to the event.
*
* The event could be one of the following:
*
* - ZNOP_ALLOCATE\n
* The z-node has been created.
* - ZNOP_FREE\n
* The z-node has been destroyed.
* - ZNOP_MOVE2TOP\n
* The z-node has been moved to be the topmost one.
* - ZNOP_SHOW\n
* The z-node has been shown.
* - ZNOP_HIDE\n
* The z-node has been hidden.
* - ZNOP_MOVEWIN\n
* The z-node has been moved or its size has changed.
* - ZNOP_SETACTIVE\n
* The z-node has been set to be the active one.
* - ZNOP_ENABLEWINDOW\n
* The z-node is disabled or enabled.
* - ZNOP_STARTDRAG\n
* Start to drag the z-node.
* - ZNOP_CANCELDRAG\n
* Cancel to drag the z-node.
* - ZNOP_CHANGECAPTION\n
* The caption of the z-node has changed.
*
* The event will be passed through the argument of \a op; the
* pointers to the layer, the identifier of the client, and the index of
* the z-node will be passed through the argument of \a layer, \a cli,
* and \a idx_znode respectively.
*
* \note Only available for the server of MiniGUI-Processes.
*
* \sa ON_ZNODE_OPERATION, ServerGetZNodeInfo, mgClients
*/
extern MG_EXPORT ON_ZNODE_OPERATION OnZNodeOperation;
/**
* \fn BOOL GUIAPI ServerStartup (int nr_globals,\
int def_nr_topmosts, int def_nr_normals)
* \brief Initializes the server of MiniGUI-Processes.
*
* This function initializes the server, i.e. \a mginit. It creates the
* shared resource, the listening socket, the default layer, and other
* internal objects. Your costomized \a mginit program should call
* this function before calling any other function.
*
* Note that the default layer created by the server called
* "mginit" (NAME_DEF_LAYER).
*
* \param nr_globals The number of the global z-order nodes. All z-order nodes
* created by mginit are global ones.
* \param def_nr_topmosts The maximal number of the topmost z-order nodes in
* the default layer. It is also the default number of topmost
* z-order nodes of a new layer.
* \param def_nr_normals The maximal number of normal global z-order nodes in
* the new layer. It is also the default number of normal
* z-order nodes of a new layer.
*
* \return TRUE on success, otherwise FALSE.
*
* \note Server-only function, i.e. \em only can be called by \a mginit.
*/
MG_EXPORT BOOL GUIAPI ServerStartup (int nr_globals,
int def_nr_topmosts, int def_nr_normals);
/**
* \fn MG_Layer* GUIAPI ServerCreateLayer (const char* layer_name,\
int max_nr_topmosts, int max_nr_normals)
* \brief Create a new layer from the server.
*
* This function creates a new layer named by \a layer_name.
* You should specify the maximal number of topmost frame
* objects (max_nr_topmosts) and the maximal number of normal frame
* objects (max_nr_normals) in the new layer. Passing zero to
* max_nr_topmosts and max_nr_normals will use the default values,
* and the default values are specified by ServerStartup.
*
* Note that the server will create a default layer named "mginit".
*
* \param layer_name The name of the layer. If there is already a layer
* named \a layer_name, the function will return the pointer to the layer.
* \param max_nr_topmosts The maximal number of topmost z-order nodes in
* the new layer.
* \param max_nr_normals The maximal number of normal z-order nodes in
* the new layer.
*
* \return The handle to the layer on success, NULL on error.
*
* \note Only call this function in the server of MiniGUI-Processes.
*
* \sa ServerDeleteLayer, ServerStartup
*/
MG_EXPORT MG_Layer* GUIAPI ServerCreateLayer (const char* layer_name,
int max_nr_topmosts, int max_nr_normals);
/**
* \fn BOOL GUIAPI ServerSetTopmostLayer (MG_Layer* layer)
* \brief Sets topmost layer from the server.
*
* This functions sets the specified layer \a layer to be the topmost layer.
*
* \param layer The pointer to the layer.
*
* \return TRUE on success, otherwise FALSE.
*
* \note Server-only function.
*
* \sa SetTopmostClient, SetTopmostLayer
*/
MG_EXPORT BOOL GUIAPI ServerSetTopmostLayer (MG_Layer* layer);
/**
* \fn BOOL GUIAPI ServerDeleteLayer (MG_Layer* layer)
* \brief Delete a layer from the server.
*
* This functions deletes the specified layer \a layer.
*
* \param layer The pointer to the layer.
*
* \return TRUE on success, otherwise FALSE.
*
* \note Server-only function.
*
* \sa ServerCreateLayer, JoinLayer, DeleteLayer
*/
MG_EXPORT BOOL GUIAPI ServerDeleteLayer (MG_Layer* layer);
/**
* \fn int GUIAPI ServerGetNextZNode (MG_Layer* layer, int idx_znode, \
* int* cli)
* \brief Get the next z-node in the specified layer from the server.
*
* This functions gets the next z-node in the specified layer \a layer from
* the server.
*
* \param layer The pointer to the layer, NULL for the current topmost layer.
* \param idx_znode The initial z-node. If the initial z-node index is
* less than or equal to zero, the function will return
* the index of the first z-node in the layer.
* \param cli The client identifier of the next znode will be returned
* through this pointer. NULL is okay.
*
* \return The index of the next z-node. Zero when the next z-node is
* the last one; < 0 when error;
*
* \note Server-only function. Note that this function will not return
* the z-node of the desktop, and the desktop always has the index
* of z-node zero.
*
* \sa ServerGetZNodeInfo
*/
MG_EXPORT int GUIAPI ServerGetNextZNode (MG_Layer* layer, int idx_znode,
int* cli);
#define ZNIT_DESKTOP 0x50000000
#define ZNIT_GLOBAL_MAINWIN 0x31000000
#define ZNIT_GLOBAL_TOOLWIN 0x32000000
#define ZNIT_GLOBAL_CONTROL 0x30000000
#define ZNIT_TOPMOST_MAINWIN 0x21000000
#define ZNIT_TOPMOST_TOOLWIN 0x22000000
#define ZNIT_TOPMOST_CONTROL 0x20000000
#define ZNIT_NORMAL_MAINWIN 0x11000000
#define ZNIT_NORMAL_TOOLWIN 0x12000000
#define ZNIT_NORMAL_CONTROL 0x10000000
#define ZNIT_NULL 0x00000000
#define ZNIF_VISIBLE 0x00000002
#define ZNIF_DISABLED 0x00000004
/** Z-node information structure */
typedef struct _ZNODEINFO
{
/**
* The type of the znode, can be one of the following values:
* - ZNIT_GLOBAL_MAINWIN\n
* a global main window.
* - ZNIT_GLOBAL_TOOLWIN\n
* a global tool window.
* - ZNIT_GLOBAL_CONTROL\n
* a global control with WS_EX_CTRLASMAINWIN style.
* - ZNIT_TOPMOST_MAINWIN\n
* a topmost main window.
* - ZNIT_TOPMOST_TOOLWIN\n
* a topmost tool window.
* - ZNIT_TOPMOST_CONTROL\n
* a topmost control with WS_EX_CTRLASMAINWIN style.
* - ZNIT_NORMAL_MAINWIN\n
* a normal main window.
* - ZNIT_NORMAL_TOOLWIN\n
* a normal tool window.
* - ZNIT_NORMAL_CONTROL\n
* a normal control with WS_EX_CTRLASMAINWIN style.
* - ZNIT_DESKTOP\n
* the desktop.
* - ZNIT_NULL\n
* a null and not-used z-node which does not refer to any window.
*/
DWORD type;
/**
* The flags of the znode, can be OR'd with the following values:
* - ZNIF_VISIBLE\n
* a visible window.
* - ZNIF_DISABLED\n
* a disabled window.
* Note that the flags are only applied to window.
*/
DWORD flags;
/** The pointer to the caption string of the znode if it is a window. */
const char* caption;
/** The rectangle of the znode in the screen. */
RECT rc;
/** Client id of the znode. */
int cli;
/** The window handle of the znode if it is a window. */
HWND hwnd;
/**
* The window handle of the znode's main window if it is a control
* with WS_EX_CTRLASMAINWIN style.
*/
HWND main_win;
} ZNODEINFO;
/**
* \fn BOOL GUIAPI ServerGetZNodeInfo (MG_Layer* layer, int idx_znode, \
* ZNODEINFO* znode_info)
* \brief Get the z-node information in the specified layer from the server.
*
* This functions gets the z-node information in the specified layer \a layer
* from the server.
*
* \param layer The pointer to the layer, NULL for the current topmost layer.
* \param idx_znode The index of the znode.
* \param znode_info The information of the requested znode will be returned
* through this structure.
*
* \return TRUE on success, otherwise FALSE.
*
* \note Server-only function.
*
* \sa ServerGetNextZNode, ZNODEINFO
*/
MG_EXPORT BOOL GUIAPI ServerGetZNodeInfo (MG_Layer* layer, int idx_znode,
ZNODEINFO* znode_info);
/**
* \fn BOOL GUIAPI ServerDoZNodeOperation (MG_Layer* layer, int idx_znode, \
* int op_code, void* op_data, BOOL notify)
* \brief Does an operation on the z-node in the specified layer
* from the server.
*
* This functions does an operation upon the z-node in the specified
* layer \a layer from the server.
*
* \param layer The pointer to the layer, NULL for the current topmost layer.
* \param idx_znode The index of the znode.
* \param op_code The code of the operation, can be one of the following
* values:
* - ZNOP_MOVE2TOP\n
* Move the znode to be the topmost one.
* - ZNOP_SETACTIVE\n
* Set the znode to be the active one.
* Note that the operation can be applied only for a main window.
* \param op_data The data of the operation, used to pass the data need by
* the operation. For example, if the operation is moving the z-node,
* \a op_data will be a pointer to a RECT structure, which contains
* the new position and size of the znode. Not used currently, reserved
* for future use.
* \param notify Whether to notify the client about the change of the znode.
*
* \return TRUE on success, otherwise FALSE.
*
* \note Server-only function, and the operation can be applied only for
* a main window.
*
* \sa ServerGetZNodeInfo
*/
MG_EXPORT BOOL GUIAPI ServerDoZNodeOperation (MG_Layer* layer, int idx_znode,
int op_code, void* op_data, BOOL notify);
/**
* \fn int GUIAPI GetClientByPID (int pid)
* \brief Returns the client identifier from PID of a client.
*
* This function gets the identifier of the sepcified client from the PID of it.
*
* \param pid The process ID of the client.
* \return The client identifier on success, less than 0 on error.
*
* \note Server-only function.
*/
MG_EXPORT int GUIAPI GetClientByPID (int pid);
/**
* \fn BOOL GUIAPI SetTopmostClient (int cli)
* \brief Sets topmost layer by a client identifier.
*
* This function sets the topmost layer by the specified client
* identifier \a cli. It will bring the layer contains the client
* to be the topmost one.
*
* \param cli The identifier of the client.
*
* \return TRUE on success, otherwise FALSE.
*
* \note Server-only function.
*
* \sa ServerSetTopmostLayer, SetTopmostLayer
*/
MG_EXPORT BOOL GUIAPI SetTopmostClient (int cli);
/**
* \fn void GUIAPI DisableClientsOutput (void)
* \brief Disable all clients output.
*/
MG_EXPORT void GUIAPI DisableClientsOutput (void);
/**
* \fn void GUIAPI UpdateTopmostLayer (const RECT* dirty_rc)
* \brief Update topmost layer.
*
* \param dirty_rc The refresh region.
*/
MG_EXPORT void GUIAPI UpdateTopmostLayer (const RECT* dirty_rc);
/** @} end of lite_server_fns */
/**
* \defgroup lite_request_fns Simple request/reply interfaces
*
* You can register a customized request handler to extend your server,
* i.e. mginit, of MiniGUI-Processes.
*
* A request consists of an identifier and the data associated with
* the request. The identifier is used by MiniGUI to determine which
* handler should be called when a request arrives. When MiniGUI
* finds one handler, it will call the handler and pass the socket
* fd connected to the client, the data associated with the request,
* and the length of the data. Eventually, the handler will sent the
* reply to the client.
*
* After register a customized request handler in your server, you can call
* \a ClientRequest function in the client to send a request to the server
* and wait for the reply. On the other hand, the request handler in the
* server will receive the request and call \a ServerSendReply to send the
* reply to the client. In this way, you can create a simple IPC
* (inter-process conmmunication) mechanism between clients and the server.
*
* Example:
*
* \include request.c
*
* @{
*/
/**
* \def MAX_SYS_REQID
* \brief Maximal system reserved request identifier.
*
* \sa RegisterRequestHandler
*/
#define MAX_SYS_REQID 0x0020
/**
* \def MAX_REQID
* \brief Maximal request identifier.
*
* \sa RegisterRequestHandler
*/
#define MAX_REQID 0x0030
/** A request will be sent to the server of MiniGUI-Processes. */
typedef struct _REQUEST {
/** The identifier of the type of the request. */
int id;
/** The data will be sent to the server. */
const void* data;
/** The length of the data. */
size_t len_data;
} REQUEST;
/** Data type of pointer to a REQUEST */
typedef REQUEST* PREQUEST;
/**
* \fn int ClientRequestEx (const REQUEST* request, const void* ex_data,
int ex_data_len, void* result, int len_rslt)
* \brief Sends a request to the server and wait reply.
*
* If \a result is NULL or \a len_rslt is zero, the function will return
* immediately after sent the data to the server.
*
* \param request The pointer to REQUEST, which contains the data of
* the request.
* \param ex_data The pointer to extra data to be sent to the server.
* \param ex_data_len The length of the extra data in bytes.
* \param result The buffer receives the reply.
* \param len_rslt The lenght of the buffer.
*
* \return Zero on success, no-zero on error.
*
* \note Only used by clients to send a request to the server of
* MiniGUI-Processes.
*
* \sa ServerSendReply
*/
MG_EXPORT int GUIAPI ClientRequestEx (const REQUEST* request, const void* ex_data,
int ex_data_len, void* result, int len_rslt);
/**
* \fn int ClientRequest (const REQUEST* request, void* result, int len_rslt)
* \brief Sends a request to the server and wait reply.
*
* If \a result is NULL or \a len_rslt is zero, the function will return
* immediately after sent the data to the server.
*
* This function is a simplified version of ClientRequestEx, i.e.
* there is no extra data to be sent.
*
* \param request The pointer to REQUEST, which contains the data of
* the request.
* \param result The buffer receives the reply.
* \param len_rslt The lenght of the buffer.
*
* \return Zero on success, no-zero on error.
*
* \note Only used by clients to send a request to the server of
* MiniGUI-Processes.
*
* \sa ClientRequestEx, ServerSendReply
*/
static inline int ClientRequest (const REQUEST* request,
void* result, int len_rslt)
{
return ClientRequestEx (request, NULL, 0, result, len_rslt);
}
/**
* \fn int GUIAPI GetSockFD2Server (void)
* \brief Gets the file descriptor of the socket connected to the server.
*
* This function returns the file descriptor of the socket connected
* to the server, i.e. mginit.
*
* \return The file descriptor of the socket connected to the server.
*
* \note Only used by clients, no meaning for the server.
*/
MG_EXPORT int GUIAPI GetSockFD2Server (void);
/**
* \fn int GUIAPI ServerSendReply (int clifd, const void* reply, int len)
* \brief Sends the reply to the client.
*
* This function sends a replay pointed to by \a reply which is
* \a len bytes long to the client.
*
* \note Only used by the server to send the reply to the client.
* This function typically called in your customized request handler.
*
* \param clifd The fd connected to the client.
* \param reply The buffer contains the reply data.
* \param len The length of the reply data in bytes.
* \return Zero on success, no-zero on error.
*
* \sa ClientRequest, RegisterRequestHandler
*/
MG_EXPORT int GUIAPI ServerSendReply (int clifd, const void* reply, int len);
/**
* \var typedef int (* REQ_HANDLER)(int cli, int clifd, void* buff, size_t len)
* \brief Request handler.
*
* \sa RegisterRequestHandler
*/
typedef int (* REQ_HANDLER) (int cli, int clifd, void* buff, size_t len);
/**
* \fn BOOL GUIAPI RegisterRequestHandler (int req_id, REQ_HANDLER your_handler)
* \brief Registers a customize request handler.
*
* This function registers a request handler to the server, i.e. \a mginit.
*
* \param req_id The identifier of the customized request.
* \param your_handler The handler of the request.
* Being NULL to unregister the request handler.
*
* \return TRUE on success, FALSE on error.
*
* \note Only used by the server to register a request handler.
* And the identifier should be larger than \a MAX_SYS_REQID and
* less than or equal to \a MAX_REQID.
*
* \sa ClientRequest, ServerSendReply, MAX_SYS_REQID, MAX_REQID
*/
MG_EXPORT BOOL GUIAPI RegisterRequestHandler (int req_id, REQ_HANDLER your_handler);
/**
* \fn EQ_HANDLER GUIAPI GetRequestHandler (int req_id)
* \brief Gets the request handler by request identifier.
*
* This function returns the request handler of the specified request
* identifier \a req_id.
*
* \param req_id The request identifier.
*
* \return The handler on success, NULL on error.
*
* \note Only can be used by the server.
*
* \sa RegisterRequestHandler
*/
MG_EXPORT REQ_HANDLER GUIAPI GetRequestHandler (int req_id);
/** @} end of lite_request_fns */
/**
* \defgroup lite_socket_fns General socket operations
*
* MiniGUI-Processes uses UNIX domain socket to build the communication
* between the server and the clients.
*
* You can also use the underlay interfaces which MiniGUI uses to create
* your own UNIX domain socket.
*
* Example:
*
* \include socket.c
*
* @{
*/
/**
* \fn int serv_listen (const char* name)
* \brief Creates a listen socket.
*
* This function is used by the server to create a listening socket.
* Any MiniGUI-Processes application can call this function to create a
* listening socket. The server, i.e. \a mginit, of MiniGUI-Processes uses
* this function to create its listening socket, and named the socket
* to '/var/tmp/minigui'.
*
* \param name The path name of the listening socket.
* \return The file discriptor of the listening socket created, -1 on error.
*
* \note As a convention, you should located the socket in '/var/tmp/'
* directory.
*/
MG_EXPORT int serv_listen (const char* name);
/**
* \fn int serv_accept (int listenfd, pid_t *pidptr, uid_t *uidptr)
* \brief Waits for a client connection to arrive, and accept it.
*
* This function is used by the server to wait a connection and accept it.
*
* After creating a listening socket by calling \a serv_listen, you can
* call this function to create a connection with a client. We also obtain
* the client's PID and UID from the pathname that it must bind before
* calling us.
*
* \param listenfd The fd of listen socket.
* \param pidptr The client PID will be saved to this buffer when this
* function returns.
* \param uidptr The client UID will be saved to this buffer when this
* function returns.
*
* \return The new connected fd if all OK, < 0 on error.
*
* \sa serv_listen, cli_conn
*/
MG_EXPORT int serv_accept (int listenfd, pid_t *pidptr, uid_t *uidptr);
/**
* \fn int cli_conn (const char* name, char project)
* \brief Used by clients to connect to a server.
*
* This function is used by clients to connect to a server.
*
* The created socket will be located at the directory '/var/tmp',
* and with name of '/var/tmp/xxxxx-c', where 'xxxxx' is the pid of client.
* and 'c' is a character to distinguish different projects.
*
* Note that MiniGUI itself uses 'a' as the project character to
* create socket between 'mginit' and clients.
*
* \param name The name of the well-known listen socket (created by server).
* \param project A character to distinguish different projects
* (Do \em NOT use 'a').
* \return The new connected fd if all OK, < 0 on error.
*
* \sa serv_listen, serv_accept
*/
MG_EXPORT int cli_conn (const char* name, char project);
#define SOCKERR_IO -1
#define SOCKERR_CLOSED -2
#define SOCKERR_INVARG -3
#define SOCKERR_TIMEOUT -4
#define SOCKERR_OK 0
/**
* \fn int sock_write_t (int fd, const void* buff,\
int count, unsigned int timeout)
* \brief Writes data to socket.
*
* This function writes the data block pointed to by \a buff
* which is \a count bytes long to the socket \a fd.
*
* \param fd The file descriptor of the socket.
* \param buff The buffer contains the data.
* \param count The length in bytes of the buffer.
* \param timeout An upper bound on the amount of time elapsed before
* \a sock_write_t returns. When it is zero, \a sock_write_t can
* block indefinitely. The timeout value is in tick count, and
* tick count of MiniGUI is in unit of 10 milliseconds.
* \return SOCKERR_OK if all OK, < 0 on error.
*
* \retval SOCKERR_OK Read data successfully.
* \retval SOCKERR_IO There are some I/O errors occurred.
* \retval SOCKERR_CLOSED The socket has been closed by the peer.
* \retval SOCKERR_INVARG You passed invalid arguments.
* \retval SOCKERR_TIMEOUT Timeout.
*
* \note The \a timeout only goes into effect when this function called
* by the server of MiniGUI-Processes, i.e. \a mginit.
*
* \sa sock_read_t
*/
MG_EXPORT int sock_write_t (int fd, const void* buff,
int count, unsigned int timeout);
/**
* \fn int sock_read_t (int fd, void* buff, int count, unsigned int timeout)
* \brief Reads data from socket.
*
* This function reads data which is \a count bytes long to the buffer \a buff
* from the socket \a fd.
*
* \param fd The file descriptor of the socket.
* \param buff The buffer used to save the data.
* \param count The length in bytes of the buffer.
* \param timeout An upper bound on the amount of time elapsed before
* \a sock_read_t returns. When it is zero, \a sock_read_t can
* block indefinitely. The timeout value is in the tick count of MiniGUI,
* and tick count of MiniGUI is in unit of 10 milliseconds.
* \return SOCKERR_OK if all OK, < 0 on error.
*
* \retval SOCKERR_OK Read data successfully.
* \retval SOCKERR_IO There are some I/O errors occurred.
* \retval SOCKERR_CLOSED The socket has been closed by the peer.
* \retval SOCKERR_INVARG You passed invalid arguments.
* \retval SOCKERR_TIMEOUT Timeout.
*
* \note The \a timeout only goes into effect when this function called
* by the server of MiniGUI-Processes, i.e. \a mginit.
*
* \sa sock_write_t
*/
MG_EXPORT int sock_read_t (int fd, void* buff, int count, unsigned int timeout);
/**
* \def sock_write(fd, buff, count)
* \brief The blocking version of \a sock_write_t function.
*
* \sa sock_write_t
*/
#define sock_write(fd, buff, count) sock_write_t(fd, buff, count, 0)
/**
* \def sock_read(fd, buff, count)
* \brief The blocking version of \a sock_read_t function.
*
* \sa sock_read_t
*/
#define sock_read(fd, buff, count) sock_read_t(fd, buff, count, 0)
/** @} end of lite_socket_fns */
/** @} end of lite_fns */
#endif /* _MGRM_PROCESSES */
#endif /* LITE_VERSION */
/**
* \defgroup init_fns Initialization and termination functions
*
* Normally, the only entry of any MiniGUI application is \a MiniGUIMain.
* The application will terminate when you call \a exit(3) or just
* return from \a MiniGUIMain.
*
* Example 1:
*
* \include miniguimain.c
*
* Example 2:
*
* \include helloworld.c
*
* @{
*/
/**
* \fn BOOL GUIAPI ReinitDesktopEx (BOOL init_sys_text)
* \brief Re-initializes the desktop.
*
* When you changed the charset or the background picture of the desktop,
* you should call this function to re-initialize the local system text
* (when \a init_sys_text is TRUE), the background picture, and the desktop
* menu.
*
* \param init_sys_text Indicates whether to initialize the local system text.
*
* \return TRUE on success, otherwise FALSE.
*
* \sa ReinitDesktop
*/
MG_EXPORT BOOL GUIAPI ReinitDesktopEx (BOOL init_sys_text);
/**
* \def ReinitDesktop()
* \brief Re-initializes the desktop including the local system text.
*
* \return TRUE on success, otherwise FALSE.
*
* \note This function defined as a macro calling \a ReinitDesktopEx with
* \a init_sys_text set to TRUE.
*
* \sa ReinitDesktopEx
*/
#define ReinitDesktop() ReinitDesktopEx (TRUE)
/**
* \fn void GUIAPI ExitGUISafely (int exitcode)
* \brief Exits your MiniGUI application safely.
*
* Calling this function will terminate your MiniGUI application. This
* function will restore console attributes and call \a exit() function and
* pass \a exitcode to it.
*
* \param exitcode The exit status will be passed to exit(3) function.
*
* \return This function will not return.
*
* \sa exit(3)
*/
MG_EXPORT void GUIAPI ExitGUISafely (int exitcode);
#ifdef _USE_MINIGUIENTRY
#define main_entry minigui_entry
int minigui_entry (int args, const char* arg[]);
#else
#define main_entry main
#endif
/**
* \def MiniGUIMain
* \brief The main entry of a MiniGUI application.
*
* This function should be defined by your application. Before Version 1.6.1,
* MiniGUI defines \a main() function in libminigui library for your
* application, and call \a MiniGUIMain() in this \a main() function.
* The \a main() defined by MiniGUI is responsible of initializing and
* terminating MiniGUI.
*
* After version 1.6.1, MiniGUI defines MiniGUIMain as a macro.
*
* \param args The number of arguments passed to \a main() by operating system.
* \param argv The arguments passed to \a main() by operating system.
*
* \return The exit status will be retured to the parent process.
*/
#define MiniGUIMain \
MiniGUIAppMain (int args, const char* argv[]); \
int main_entry (int args, const char* argv[]) \
{ \
int iRet = 0; \
if (InitGUI (args, argv) != 0) { \
return 1; \
} \
iRet = MiniGUIAppMain (args, argv); \
TerminateGUI (iRet); \
return iRet; \
} \
int MiniGUIAppMain
/**
* \def IDM_DTI_FIRST
* \brief The minimum interger value of command ID when user customize
* desktop menu.
**/
#define IDM_DTI_FIRST (300)
/** Desktop operation set */
typedef struct _DESKTOPOPS {
/** called when starting a new session, and return a context */
void* (*init) (void);
/** called when terminating a seesion */
void (*deinit) (void* context);
/** called when the desktop should be repainted */
void (*paint_desktop) (void* context,
HDC dc_desktop, const RECT* inv_rc);
/** the keyboard event handler for the desktop */
void (*keyboard_handler) (void* context,
int message, WPARAM wParam, LPARAM lParam);
/** the mouse event handler for the desktop */
void (*mouse_handler) (void* context,
int message, WPARAM wParam, LPARAM lParam);
/** the desktop menu customizer */
void (*customize_desktop_menu) (void* context,
HMENU hmenu, int start_pos);
/** the desktop menu command handler */
void (*desktop_menucmd_handler) (void* context, int id);
} DESKTOPOPS;
/**
* \fn DESKTOPOPS* GUIAPI SetCustomDesktopOperationSet (DESKTOPOPS* usr_dsk_ops)
*
* \brief Set customer desktop operation set.
*
* \param usr_dsk_ops The pointer to user customer desktop operation set.
*
* \return Old desktop operation set.
*
* \code
* static void* this_init(void)
* {
* ......
* }
*
* static void this_deinit(void* context)
* {
* ......
* }
*
* static void this_paint_desktop(void* context,\
* HDC dc_desktop, const RECT* inv_rc)
* {
* ......
* }
*
* static void this_keyboard_handler(void* context, int message,\
* WPARAM wParam, LPARAM lParam)
* {
* ......
* }
*
* static void this_mouse_handler(void* context, int message,\
* WPARAM wParam, LPARAM lParam)
* {
* ......
* }
*
* static void this_customize_desktop_menu (void* context,\
* HMENU hmnu, int start_pos)
* {
* ......
* }
*
* static void this_desktop_menucmd_handler (void* context, int id)
* {
* ......
* }
*
* static DESKTOPOPS this_dsk_ops =
* {
* this_init,
* this_deinit,
* this_paint_desktop,
* this_keyboard_handler,
* this_mouse_handler,
* this_customize_desktop_menu,
* this_desktop_menucmd_handler,
* };
*
* SetCustomDesktopOperationSet(&this_dsk_ops);
*
* \endcode
*
* \sa DESKTOPOPS
*
*/
MG_EXPORT DESKTOPOPS* GUIAPI SetCustomDesktopOperationSet
(DESKTOPOPS* usr_dsk_ops);
/**
* \fn void GUIAPI DesktopUpdateAllWindow (void)
*
* \brief Update all visible windows on the desktop.
*
* On MiniGUI-Processes update all the main windows of the client and desktop window,
* and it only can be used by mginit on MiniGUI-Processes.
* On MiniGUI-Threads and MiniGUI-Standalone update all visible windows and desktop window.
*
*/
MG_EXPORT void GUIAPI DesktopUpdateAllWindow (void);
/** @} end of init_fns */
/**
* \defgroup mouse_calibrate Mouse calibration.
* @{
*/
#ifdef _MGHAVE_MOUSECALIBRATE
/**
* \fn BOOL GUIAPI SetMouseCalibrationParameters (const POINT* src_pts,\
const POINT* dst_pts)
* \brief Sets the parameters for doing mouse calibration.
*
* This function set the parameters for doing mouse calibration.
* You should pass five source points and five destination points.
*
* Normally, the points should be the upper-left, upper-right, lower-right,
* lower-left, and center points on the touch panel. The source point is
* the coordinates before calibrating, and the destination point is the
* desired coordinates after calibrating.
*
* This function will try to evaluate a matrix to calibrate. If the points
* are okay, MiniGUI will do the calibration after getting a point from the
* underlay IAL engine.
*
* \param src_pts The pointer to an array of five source points.
* \param dst_pts The pointer to an array of five destination points.
*
* \return TRUE for success, FALSE for bad arguments.
*
* \note This function is available when _MGHAVE_MOUSECALIBRATE
* (option: --enable-mousecalibrate) defined.
* \note Only call this function in MiniGUI-Standalone, MiniGUI-Threads,
* and the server (mginit) of MiniGUI-Processes. The behavior of this
* function will be undefined if you call it in a client of
* MiniGUI-Processes.
*/
MG_EXPORT BOOL GUIAPI SetMouseCalibrationParameters (const POINT* src_pts,
const POINT* dst_pts);
/**
* \fn void GUIAPI GetOriginalMousePosition (int* x, int* y)
* \brief Gets the original mouse position.
*
* \param x The pointer used to return the x coordinate of original mouse
* position.
* \param y The pointer used to return the y coordinate of original mouse
* position.
*
* \return none.
*
* \note This function is available when _MGHAVE_MOUSECALIBRATE
* (option: --enable-mousecalibrate) defined.
*
* \note Only call this function in MiniGUI-Standalone, MiniGUI-Threads,
* and the server (mginit) of MiniGUI-Processes. The behavior of this
* function will be undefined if you call it in a client of
* MiniGUI-Processes.
*/
MG_EXPORT void GUIAPI GetOriginalMousePosition (int* x, int* y);
#endif /* _MGHAVE_MOUSECALIBRATE */
/** @} end of mouse_calibrate */
/**
* \defgroup about_dlg About MiniGUI dialog
* @{
*/
#ifdef _MGMISC_ABOUTDLG
#ifdef _MGRM_THREADS
/**
* \fn HWND GUIAPI OpenAboutDialog (void)
* \brief Opens or actives the 'About MiniGUI' dialog.
*
* Calling this function will create a main window displaying
* copyright and license information of MiniGUI. When the about dialog
* is displaying, calling this function again will bring the dialog to be
* the topmost main window, not create a new one.
*
* \return The handle to the about dialog box.
*
* \note This function is available for MiniGUI-Threads and when
* _MGMISC_ABOUTDLG defined. For MiniGUI-Processes, you should
* call 'void GUIAPI OpenAboutDialog (HWND hHosting)' function instead.
*/
MG_EXPORT void GUIAPI OpenAboutDialog (void);
#else
/**
* \fn HWND GUIAPI OpenAboutDialog (HWND hHosting)
* \brief Opens or actives the 'About MiniGUI' dialog.
*
* Calling this function will create a main window displaying
* copyright and license information of MiniGUI. When the about dialog
* is displaying, calling this function again will bring the dialog to be
* the topmost main window, not create a new one.
*
* \param hHosting The hosting main window of the about dialog.
*
* \return The handle to the about dialog box.
*
* \note This function is available for MiniGUI-Processes and when
* _MGMISC_ABOUTDLG defined. For MiniGUI-Threads, you should
* call 'void GUIAPI OpenAboutDialog (void)' function instead.
*/
MG_EXPORT HWND GUIAPI OpenAboutDialog (HWND hHosting);
#endif /* _MGRM_THREADS */
#endif /* _MGMISC_ABOUTDLG */
/** @} end of about_dlg */
/**
* \defgroup etc_fns Configuration file operations
*
* The configuration file used by MiniGUI have a similiar format as
* M$ Windows INI file, i.e. the file consists of sections, and
* the section consists of key-value pairs, like this:
*
* \code
* [system]
* # GAL engine
* gal_engine=fbcon
*
* # IAL engine
* ial_engine=console
*
* mdev=/dev/mouse
* mtype=PS2
*
* [fbcon]
* defaultmode=1024x768-16bpp
*
* [qvfb]
* defaultmode=640x480-16bpp
* display=0
* \endcode
*
* Assume that the configuration file named \a my.cfg, if you want get
* the value of \a mdev in \a system section, you can call
* \a GetValueFromEtcFile in the following way:
*
* \code
* char buffer [51];
*
* GetValueFromEtcFile ("my.cfg", "system", "mdev", buffer, 51);
* \endcode
*
* Example:
*
* \include cfgfile.c
*
* @{
*/
/**
* \def ETC_MAXLINE
* \brief The max line number of etc file.
**/
#define ETC_MAXLINE 1024
/**
* \def ETC_FILENOTFOUND
* \brief No found etc file.
**/
#define ETC_FILENOTFOUND -1
/**
* \def ETC_SECTIONNOTFOUND
* \brief No found section in etc file.
**/
#define ETC_SECTIONNOTFOUND -2
/**
* \def ETC_KEYNOTFOUND
* \brief No found key in etc file.
**/
#define ETC_KEYNOTFOUND -3
/**
* \def ETC_TMPFILEFAILED
* \brief Create tmpfile failed.
**/
#define ETC_TMPFILEFAILED -4
/**
* \def ETC_FILEIOFAILED
* \brief IO operation failed to etc file.
**/
#define ETC_FILEIOFAILED -5
/**
* \def ETC_INTCONV
* \brief Convert the value string to an integer failed.
**/
#define ETC_INTCONV -6
/**
* \def ETC_INVALIDOBJ
* \brief Invalid object to etc file.
**/
#define ETC_INVALIDOBJ -7
/**
* \def ETC_READONLYOBJ
* \brief Read only to etc file.
**/
#define ETC_READONLYOBJ -8
/**
* \def ETC_OK
* \brief Operate success to etc file.
**/
#define ETC_OK 0
/** Etc The current config section information */
typedef struct _ETCSECTION
{
/** Allocated number of keys */
int key_nr_alloc;
/** Key number in the section */
int key_nr;
/** Name of the section */
char *name;
/** Array of keys */
char** keys;
/** Array of values */
char** values;
} ETCSECTION;
/** Data type of pointer to a ETCSECTION */
typedef ETCSECTION* PETCSECTION;
/** ETC_S The current config file information*/
typedef struct _ETC_S
{
/** Allocated number of sections */
int sect_nr_alloc;
/** Number of sections */
int section_nr;
/** Pointer to section arrays */
PETCSECTION sections;
} ETC_S;
#ifndef _MGINCORE_RES
/**
* \var char* ETCFILEPATH
* \brief The path name of MiniGUI configuration file.
*
* By default, the configuration file of MiniGUI must be installed in /etc,
* /usr/local/etc or your home directory. When you install it in your
* home directory, the name should be ".MiniGUI.cfg".
*
* MiniGUI will try to use MiniGUI.cfg in the current directory,
* \a ~/.MiniGUI.cfg, then \a /usr/local/etc/MiniGUI.cfg, and
* \a /etc/MiniGUI.cfg last.
*
* If MiniGUI can not find any \a MiniGUI.cfg file, or find a bad
* formated configure file, the initialzation of MiniGUI will be canceled.
*/
extern MG_EXPORT char ETCFILEPATH [];
#endif /* _MGINCORE_RES */
/**
* \fn int GUIAPI GetValueFromEtcFile (const char* pEtcFile,\
const char* pSection, const char* pKey, char* pValue, int iLen)
* \brief Gets value from a configuration file.
*
* This function gets the value of the key \a pKey in the section \a pSection
* of the configuration file \a pEtcFile, and saves the value to the buffer
* pointed to by \a pValue.
*
* \param pEtcFile The path name of the configuration file.
* \param pSection The section name in which the value located.
* \param pKey The key name of the value.
* \param pValue The value will be saved in this buffer.
* \param iLen The length in bytes of the buffer.
*
* \return ETC_OK on success, < 0 on error.
*
* \retval ETC_OK Gets value successfullly.
* \retval ETC_FILENOTFOUND Can not find the specified configuration file.
* \retval ETC_SECTIONNOTFOUND Can not find the specified section in the
* configuration file.
* \retval ETC_KEYNOTFOUND Can not find the specified key in the section.
* \retval ETC_FILEIOFAILED File I/O operation error occurred.
*
* \note MiniGUI use \a strncpy to copy actual value to \a pValue. Thus,
* if the length of the actual value is larger than \a iLen, the
* result copied to \a pValue will \em NOT be null-terminated.
*
* \sa GetIntValueFromEtcFile, SetValueToEtcFile, strncpy(3)
*/
MG_EXPORT int GUIAPI GetValueFromEtcFile (const char* pEtcFile,
const char* pSection, const char* pKey, char* pValue, int iLen);
/**
* \fn int GUIAPI GetIntValueFromEtcFile (const char* pEtcFile,\
const char* pSection, const char* pKey, int* value)
* \brief Gets integer value from a configuration file.
*
* This function gets the integer value of the key \a pKey in the section
* \a pSection of the configuration file \a pEtcFile, and returns the
* integer value through the buffer pointed to by \a value.
*
* \param pEtcFile The path name of the configuration file.
* \param pSection The section name in which the value located.
* \param pKey The key name of the value.
* \param value The integer value will be saved in this buffer.
*
* \return ETC_OK on success, < 0 on error.
*
* \retval ETC_OK Gets value successfullly.
* \retval ETC_FILENOTFOUND Can not find the specified configuration file.
* \retval ETC_SECTIONNOTFOUND Can not find the specified section in the
* configuration file.
* \retval ETC_KEYNOTFOUND Can not find the specified key in the section.
* \retval ETC_FILEIOFAILED File I/O operation error occurred.
* \retval ETC_INTCONV Can not convert the value string to an integer.
*
* \note MiniGUI uses \a strtol to convert the string value to an integer,
* and pass the base as 0. Thus, the valid string value can be
* converted to integer should be in the following forms:
*
* - [+|-]0x[0-9|A-F]*\n
* Will be read in base 16.
* - [+|-]0[0-7]*\n
* Will be read in base 8.
* - [+|-][1-9][0-9]*\n
* Will be read in base 10.
*
* \sa GetValueFromEtcFile, SetValueToEtcFile, strtol(3)
*/
MG_EXPORT int GUIAPI GetIntValueFromEtcFile (const char* pEtcFile,
const char* pSection, const char* pKey, int* value);
/**
* \fn int GUIAPI SetValueToEtcFile (const char* pEtcFile,\
const char* pSection, const char* pKey, char* pValue)
* \brief Sets a value in a configuration file.
*
* This function sets the value of the key \a pKey in the section \a pSection
* of the configuration file \a pEtcFile to be the string pointed to by
* \a pValue.
*
* \param pEtcFile The path name of the configuration file.
* \param pSection The section name in which the value located.
* \param pKey The key name of the value.
* \param pValue The null-terminated value string.
*
* \return ETC_OK on success, < 0 on error.
*
* \retval ETC_OK Sets value successfullly.
* \retval ETC_FILEIOFAILED File I/O operation error occurred.
* \retval ETC_TMPFILEFAILED Can not create temporary file.
*
* \note If the specified configuration file does not exist,
* MiniGUI will try to create this file.
*
* \sa GetValueFromEtcFile, GetIntValueFromEtcFile
*/
MG_EXPORT int GUIAPI SetValueToEtcFile (const char* pEtcFile,
const char* pSection, const char* pKey, char* pValue);
/**
* \fn int GUIAPI RemoveSectionInEtcFile (const char* pEtcFile,\
const char* pSection)
* \brief Removes a section in an etc file.
*
* This function removes a section named \a pSection from the etc file
* named \a pEtcFile.
*
* \param pEtcFile The name of the etc file.
* \param pSection The name of the pSection;
*
* \return ETC_OK on success, < 0 on error.
*
* \retval ETC_OK Gets value successfullly.
* \retval ETC_FILEIOFAILED File I/O operation error occurred.
* \retval ETC_SECTIONNOTFOUND Can not find the specified section in the
* etc object.
*
* \sa RemoveSectionInEtc
*/
MG_EXPORT int GUIAPI RemoveSectionInEtcFile (const char* pEtcFile,
const char* pSection);
/**
* \fn int GUIAPI SaveSectionToEtcFile (const char* pEtcFile, \
PETCSECTION psect);
* \brief Saves a section to an etc file.
*
* This function saves a section named \a psect to the etc file
* named \a pEtcFile.
*
* \param pEtcFile The name of the etc file.
* \param psect The name of the psect;
*
* \return ETC_OK on success, < 0 on error.
*
* \retval ETC_OK Gets value successfullly.
* \retval ETC_FILEIOFAILED File I/O operation error occurred.
* \retval ETC_SECTIONNOTFOUND Can not find the specified section in the
* etc object.
*/
MG_EXPORT int GUIAPI SaveSectionToEtcFile (const char* pEtcFile,
PETCSECTION psect);
/**
* \fn GHANDLE GUIAPI LoadEtcFile (const char * pEtcFile)
* \brief Loads an etc file into memory.
*
* This function loads the content of an etc file into the memory, later, you
* can visit the content using \a GetValueFromEtc function.
*
* \param pEtcFile The path name of the configuration file.
* If pEtcFile is NULL, the function will create an empty ETC object.
*
* \return Handle of the etc object on success, NULL on error.
*
* \sa UnloadEtcFile, GetValueFromEtc
*/
MG_EXPORT GHANDLE GUIAPI LoadEtcFile (const char * pEtcFile);
/**
* \fn int GUIAPI SaveEtcToFile (GHANDLE hEtc, const char* file_name);
* \brief Saves an ETC object into a file.
*
* This function saves the etc object into the file named \a file_name;
*
* \param hEtc Handle to the etc object.
* \param file_name The name of the target file.
*
* \return ETC_OK on success, 0 < on error.
*
* \retval ETC_OK Sets the etc object successfullly.
* \retval ETC_INVALIDOBJ Invalid etc object.
* \retval ETC_FILEIOFAILED File I/O operation error occurred.
*
* \sa LoadEtcFile
*/
MG_EXPORT int GUIAPI SaveEtcToFile (GHANDLE hEtc, const char* file_name);
/**
* \fn GUIAPI UnloadEtcFile (GHANDLE hEtc)
* \brief Unloads an etc file.
*
* This function unloads the etc object generated by using \sa LoadEtcFile
* function.
*
* \param hEtc Handle of the etc object.
*
* \return Returns 0 on success, -1 on error.
*
* \sa LoadEtcFile, GetValueFromEtc
*/
MG_EXPORT int GUIAPI UnloadEtcFile (GHANDLE hEtc);
/**
* \fn int GUIAPI GetValueFromEtc (GHANDLE hEtc, const char* pSection, \
const char* pKey, char* pValue, int iLen)
* \brief Gets value from a configuration etc object.
*
* This function gets value from an etc object, similar to GetValueFromEtcFile.
* This function gets the value of the key \a pKey in the section \a pSection
* of the etc object \a hEtc, and saves the value to the buffer pointed to
* by \a pValue.
*
* \param hEtc Handle to the etc object.
* \param pSection The section name in which the value located.
* \param pKey The key name of the value.
* \param pValue The value will be saved in this buffer.
* \param iLen The length in bytes of the buffer. This function will set value
* if the iLen is less than 1.
*
* \return ETC_OK on success, < 0 on error.
*
* \retval ETC_OK Gets value successfullly.
* \retval ETC_INVALIDOBJ Invalid etc object.
* \retval ETC_SECTIONNOTFOUND Can not find the specified section in the
* configuration file.
* \retval ETC_KEYNOTFOUND Can not find the specified key in the section.
* \retval ETC_READONLYOBJ The etc object is read-only.
*
* \sa GetValueFromEtcFile, LoadEtcFile, UnloadEtcFile
*/
MG_EXPORT int GUIAPI GetValueFromEtc (GHANDLE hEtc, const char* pSection,
const char* pKey, char* pValue, int iLen);
/**
* \fn int GUIAPI GetIntValueFromEtc (GHANDLE hEtc, const char* pSection,\
const char* pKey, int* pValue)
* \brief Gets the integer value from a configuration etc object.
*
* \sa GetValueFromEtc, GetIntValueFromEtcFile
*/
MG_EXPORT int GUIAPI GetIntValueFromEtc (GHANDLE hEtc, const char* pSection,
const char* pKey, int* pValue);
/**
* \def SetValueToEtc(GHANDLE hEtc, const char* pSection,\
const char* pKey, char* pValue)
* \brief Sets the value in the etc object.
*
* This fuctions sets the value in the etc object, somewhat similiar
* to \sa SetValueToEtcFile.
*
* \sa SetValueToEtcFile, GetValueFromEtc
*/
#define SetValueToEtc(hEtc, pSection, pKey, pValue) \
GetValueFromEtc(hEtc, pSection, pKey, pValue, -1)
/**
* \fn GHANDLE GUIAPI FindSectionInEtc (GHANDLE hEtc,\
const char* pSection, BOOL bCreateNew)
* \brief Finds/Creates a section from an etc object.
*
* This function look for a section named \a pSection from the etc object
* \a hEtc. If there is no such section in the etc object and \a bCreateNew
* is TRUE, the function will create an empty section.
*
* \param hEtc Handle to the etc object.
* \param pSection The name of the section.
* \param bCreateNew Indicate whether to create a new section.
*
* \return The handle to the section, 0 if not found or creatation failed.
*
* \sa GetValueFromEtcSec, GetIntValueFromEtcSec, SetValueInEtcSec
*/
MG_EXPORT GHANDLE GUIAPI FindSectionInEtc (GHANDLE hEtc,
const char* pSection, BOOL bCreateNew);
/**
* \fn int GUIAPI GetValueFromEtcSec (GHANDLE hSect,\
const char* pKey, char* pValue, int iLen)
* \brief Gets value from an etc section object.
*
* This function gets value from an etc section object, similar
* to GetValueFromEtc. It gets the value of the key \a pKey in the
* section \a hSect, and saves the value to the buffer pointed to
* by \a pValue.
*
* \param hSect The handle to the section.
* \param pKey The key name of the value.
* \param pValue The value will be saved in this buffer.
* \param iLen The length in bytes of the buffer. This function will set value
* if the iLen is less than 1.
*
* \return ETC_OK on success, < 0 on error.
*
* \retval ETC_OK Gets value successfullly.
* \retval ETC_INVALIDOBJ Invalid etc object.
* \retval ETC_KEYNOTFOUND Can not find the specified key in the section.
* \retval ETC_READONLYOBJ The section object is read-only.
*
* \sa GetValueFromEtcFile, GetValueFromEtc, FindSectionInEtc
*/
MG_EXPORT int GUIAPI GetValueFromEtcSec (GHANDLE hSect,
const char* pKey, char* pValue, int iLen);
/**
* \fn int GUIAPI GetIntValueFromEtcSec (GHANDLE hSect,\
const char* pKey, int* pValue)
* \brief Gets an integer value from an etc section object.
*
* This function gets an integer value from an etc section object,
* similar to GetIntValueFromEtc. It gets the value of the key \a pKey
* in the section \a hSect, and saves the value to the buffer pointed to
* by \a pValue.
*
* \param hSect The handle to the section.
* \param pKey The key name of the value.
* \param pValue The value will be saved in this buffer.
*
* \return ETC_OK on success, < 0 on error.
*
* \retval ETC_OK Gets value successfullly.
* \retval ETC_INVALIDOBJ Invalid etc object.
* \retval ETC_KEYNOTFOUND Can not find the specified key in the section.
* \retval ETC_INTCONV Can not convert the value string to an integer.
*
* \sa GetValueFromEtcFile, GetValueFromEtc, FindSectionInEtc
*/
MG_EXPORT int GUIAPI GetIntValueFromEtcSec (GHANDLE hSect,
const char* pKey, int* pValue);
/**
* \fn int GUIAPI SetValueToEtcSec (GHANDLE hSect,\
const char* pKey, char* pValue)
* \brief Sets the value in the etc section object.
*
* This fuctions sets the value in the etc section object \a hSect,
* somewhat similiar to SetValueToEtc \sa SetValueToEtc.
*
* \sa GetValueFromEtc, FindSectionInEtc
*/
MG_EXPORT int GUIAPI SetValueToEtcSec (GHANDLE hSect,
const char* pKey, char* pValue);
/**
* \fn int GUIAPI RemoveSectionInEtc (GHANDLE hEtc, const char* pSection)
* \brief Removes a section in etc object.
*
* This function removes a section named \a pSection from the etc object
* \a hEtc.
*
* \param hEtc The handle to the etc object.
* \param pSection The name of the pSection;
*
* \return ETC_OK on success, < 0 on error.
*
* \retval ETC_OK Gets value successfullly.
* \retval ETC_INVALIDOBJ Invalid etc object.
* \retval ETC_READONLYOBJ The etc object is read-only.
* \retval ETC_SECTIONNOTFOUND Can not find the specified section in the
* etc object.
*
* \sa RemoveSectionInEtcFile
*/
MG_EXPORT int GUIAPI RemoveSectionInEtc (GHANDLE hEtc, const char* pSection);
/* global MiniGUI etc file object */
extern MG_EXPORT GHANDLE hMgEtc;
/**
* \fn static inline int GetMgEtcValue(const char* pSection,\
const char *pKey, char *pValue, int iLen)
* \brief Gets value from MiniGUI configuration etc object
*
* This fuctions gets the value from MiniGUi configuration etc object,
* somewhat similiar to GetValueFromEtcFile and GetValueFromEtc
* \sa GetValueFromEtcFile \sa GetValueFromEtc.
*/
static inline int GetMgEtcValue(const char* pSection,
const char *pKey, char *pValue, int iLen)
{
#ifndef _MGINCORE_RES
if (!hMgEtc)
return GetValueFromEtcFile (ETCFILEPATH, pSection, pKey, pValue, iLen);
#endif
return GetValueFromEtc (hMgEtc, pSection, pKey, pValue, iLen);
}
/**
* \fn static inline int GetMgEtcIntValue (const char *pSection,\
const char* pKey, int *value)
* \brief Gets integer value from MiniGUI configuration etc object
*
* This fuctions get integer value from MiniGUI configuration etc object
* some what similiar to GetIntValueFromEtcFile and GetIntValueFromEtc
* \sa GetIntValueFromEtcFile \sa GetIntValueFromEtc
*/
static inline int GetMgEtcIntValue (const char *pSection,
const char* pKey, int *value)
{
#ifndef _MGINCORE_RES
if (!hMgEtc)
return GetIntValueFromEtcFile (ETCFILEPATH, pSection, pKey, value);
#endif
return GetIntValueFromEtc (hMgEtc, pSection, pKey, value);
}
/** @} end of etc_fns */
#ifdef _MGHAVE_CLIPBOARD
/**
* \addtogroup clipboard_fns ClipBoard Operations
* @{
*/
/**
* \def LEN_CLIPBOARD_NAME
* \brief The maximum length of the name of clipboard.
**/
#define LEN_CLIPBOARD_NAME 15
/**
* \def NR_CLIPBOARDS
* \brief The maximum number of clipboard.
**/
#define NR_CLIPBOARDS 4
/**
* \def CBNAME_TEXT
* \brief The default clipboard name of text control.
**/
#define CBNAME_TEXT ("text")
/**
* \def CBERR_OK
* \brief Operate clipboard success.
* \sa CreateClipBoard
**/
#define CBERR_OK 0
/**
* \def CBERR_BADNAME
* \brief Bad name to clipboard.
* \sa CreateClipBoard
**/
#define CBERR_BADNAME 1
/**
* \def CBERR_NOMEM
* \brief No enough memory to clipboard.
* \sa CreateClipBoard
**/
#define CBERR_NOMEM 2
/**
* \def CBOP_NORMAL
* \brief Overwrite operation to clipboard.
**/
#define CBOP_NORMAL 0
/**
* \def CBOP_APPEND
* \brief Append the new data to clipboarda after the old data.
**/
#define CBOP_APPEND 1
/**
* \fn int GUIAPI CreateClipBoard (const char* cb_name, size_t size)
* \brief Creates a new clipboard.
*
* This function creates a new clipboard with the name \a cb_name.
* MiniGUI itself creates a clipboard for text copying/pasting
* called CBNAME_TEXT.
*
* \param cb_name The name of the new clipboard.
* \param size The size of the clipboard.
*
* \retval CBERR_OK The clipboard created.
* \retval CBERR_BADNAME Duplicated clipboard name.
* \retval CBERR_NOMEM No enough memory.
*
* \sa DestroyClipBoard
*/
MG_EXPORT int GUIAPI CreateClipBoard (const char* cb_name, size_t size);
/**
* \fn int GUIAPI DestroyClipBoard (const char* cb_name)
* \brief Destroys a new clipboard.
*
* This function destroys a clipboard with the name \a cb_name.
*
* \param cb_name The name of the clipboard.
*
* \retval CBERR_OK The clipboard has been destroyed.
* \retval CBERR_BADNAME Can not find the clipboard with the name.
*
* \sa CreateClipBoard
*/
MG_EXPORT int GUIAPI DestroyClipBoard (const char* cb_name);
/**
* \fn int GUIAPI SetClipBoardData (const char* cb_name,\
void* data, size_t n, int cbop)
* \brief Sets the data of a clipboard.
*
* This function sets the data into the clipboard named \a cb_name.
*
* \param cb_name The name of the clipboard.
* \param data The pointer to the data.
* \param n The length of the data.
* \param cbop Type of clipboard operations, can be one of
* the following values:
* - CBOP_NORMAL\n
* Overwrite the old data.
* - CBOP_APPEND\n
* Append the new data after the old data.
*
* \retval CBERR_OK Success.
* \retval CBERR_BADNAME Bad clipboard name.
* \retval CBERR_NOMEM No enough memory.
*
* \sa GetClipBoardDataLen, GetClipBoardData
*/
MG_EXPORT int GUIAPI SetClipBoardData (const char* cb_name,
void* data, size_t n, int cbop);
/**
* \fn size_t GUIAPI GetClipBoardDataLen (const char* cb_name)
* \brief Gets the length of the data of a clipboard.
*
* This function gets the data length of the clipboard named \a cb_name.
*
* \param cb_name The name of the clipboard.
*
* \return The size of the data if success, otherwise zero.
*
* \sa GetClipBoardData
*/
MG_EXPORT size_t GUIAPI GetClipBoardDataLen (const char* cb_name);
/**
* \fn size_t GUIAPI GetClipBoardData (const char* cb_name,\
void* data, size_t n)
* \brief Gets the data of a clipboard.
*
* This function gets the all data from the clipboard named \a cb_name.
*
* \param cb_name The name of the clipboard.
* \param data The pointer to a buffer will save the data.
* \param n The length of the buffer.
*
* \return The size of the data got if success, otherwise zero.
*
* \sa GetClipBoardByte
*/
MG_EXPORT size_t GUIAPI GetClipBoardData (const char* cb_name,
void* data, size_t n);
/**
* \fn int GUIAPI GetClipBoardByte (const char* cb_name,\
int index, unsigned char* byte);
* \brief Gets a byte from a clipboard.
*
* This function gets a byte from the clipboard named \a cb_name.
*
* \param cb_name The name of the clipboard.
* \param index The index of the byte.
* \param byte The buffer saving the returned byte.
*
* \retval CBERR_OK Success.
* \retval CBERR_BADNAME Bad clipboard name.
* \retval CBERR_NOMEM The index is beyond the data in the clipboard.
*
* \sa GetClipBoardData
*/
MG_EXPORT int GUIAPI GetClipBoardByte (const char* cb_name,
int index, unsigned char* byte);
/** @} end of clipboard_fns */
#endif /* _MGHAVE_CLIPBOARD */
/**
* \addtogroup misc_fns Miscellaneous functions
* @{
*/
/**
* \fn void GUIAPI Ping (void)
* \brief Makes a beep sound.
* \sa Beep
*/
MG_EXPORT void GUIAPI Ping (void);
/**
* \def Beep
* \brief Alias of Ping.
* \sa Ping
*/
#define Beep Ping
/**
* \fn void GUIAPI Tone (int frequency_hz, int duration_ms)
* \brief Makes a tone.
*
* This function will return after the tone. Thus, your program
* will be blocked when the tone is being played.
*
* \param frequency_hz The frequency of the tone in hertz.
* \param duration_ms The duration of the tone in millisecond.
*
* \bug When MiniGUI runs on X Window or RTOS, the tone can not be played
* correctly.
*
* \sa Ping
*/
MG_EXPORT void GUIAPI Tone (int frequency_hz, int duration_ms);
/**
* \fn void* GUIAPI GetOriginalTermIO (void)
* \brief Gets \a termios structure of the original terminal before
* initializing MiniGUI.
*
* \return The pointer to the original \a termios structure.
*/
MG_EXPORT void* GUIAPI GetOriginalTermIO (void);
/** @} end of misc_fns */
/**
* \defgroup fixed_str Length-Fixed string operations
*
* MiniGUI maintains a private heap for length-fixed strings, and allocates
* length-fixed strings from this heap for window caption, menu item text,
* and so on. You can also use this private heap to allocate length-fixed
* strings.
*
* \include fixstr.c
*
* @{
*/
/**
* \fn char* GUIAPI FixStrAlloc (int len)
* \brief Allocates a buffer for a length-fixed string.
*
* This function allocates a buffer from the length-fixed string heap
* for a string which is \a len bytes long (does not include the null
* character of the string).
*
* \note You can change the content of the string, but do not change the
* length of this string (shorter is valid) via \a strcat function or
* other equivalent functions or operations.
*
* \param len The length of the string.
*
* \return The pointer to the buffer on success, otherwise NULL.
*
* \sa FreeFixStr
*/
MG_EXPORT char* GUIAPI FixStrAlloc (int len);
/**
* \fn char* GUIAPI FixStrDup (const char* str)
* \brief Duplicates a length-fixed string.
*
* This function allocates a buffer from the length-fixed string heap
* and copy the string \a str to the buffer.
*
* \note You can change the content of the string, but do not change the
* length of this string (shorter is valid) via \a strcat function or
* other equivalent functions or operations.
*
* \param str The pointer to the string will be duplicated.
*
* \return The pointer to the buffer on success, otherwise NULL.
*
* \sa FreeFixStr
*/
MG_EXPORT char* GUIAPI FixStrDup (const char* str);
/**
* \fn void GUIAPI FreeFixStr (char* str)
* \brief Frees a length-fixed string.
*
* This function frees the buffer used by the length-fixed string \a str.
*
* \param str The length-fixed string.
*
* \note Do not use \a free to free the length-fixed string.
*
* \sa FixStrAlloc
*/
MG_EXPORT void GUIAPI FreeFixStr (char* str);
/** @} end of fixed_str */
/**
* \defgroup cursor_fns Cursor operations
* @{
*/
#ifndef _MGHAVE_CURSOR
static inline void do_nothing (void) { return; }
#endif
#ifdef _MGHAVE_CURSOR
/**
* \fn HCURSOR GUIAPI LoadCursorFromFile (const char* filename)
* \brief Loads a cursor from a M$ Windows cursor file.
*
* This function loads a cursor from M$ Windows *.cur file
* named \a filename and returns the handle to loaded cursor.
* The returned handle can be used by \a SetCursor to set new mouse cursor.
*
* \param filename The path name of the cursor file.
*
* \return Handle to the cursor, zero on error.
*
* \note MiniGUI does not support 256-color or animation cursor.
*
* \sa SetCursor
*/
MG_EXPORT HCURSOR GUIAPI LoadCursorFromFile (const char* filename);
/**
* \fn HCURSOR GUIAPI LoadCursorFromMem (const void* area)
* \brief Loads a cursor from a memory area.
*
* This function loads a cursor from a memory area pointed to by \a area.
* The memory has the same layout as a M$ Windows CURSOR file.
* The returned handle can be used by \a SetCursor to set new mouse cursor.
*
* \param area The pointer to the cursor data.
*
* \return Handle to the cursor, zero on error.
*
* \note MiniGUI does not support 256-color or animation cursor.
*
* \sa SetCursor
*/
MG_EXPORT HCURSOR GUIAPI LoadCursorFromMem (const void* area);
/**
* \fn HCURSOR GUIAPI CreateCursor (int xhotspot, int yhotspot, int w, int h,\
const BYTE* pANDBits, const BYTE* pXORBits, int colornum)
* \brief Creates a cursor from memory data.
*
* This function creates a cursor from memory data rather than cursor file.
* \a xhotspot and \a yhotspot specify the hotpot of the cursor, \a w
* and \a h are the width and the height of the cursor respectively.
* \a pANDBits and \a pXORBits are AND bitmask and XOR bitmask of the cursor.
* MiniGUI currently support mono-color cursor and 16-color cursor, \a colornum
* specifies the cursor's color depth. For mono-color, it should be 1, and for
* 16-color cursor, it should be 4.
*
* \param xhotspot The x-coordinate of the hotspot.
* \param yhotspot The y-coordinate of the hotspot.
* \param w The width of the cursor.
* \param h The height of the cursor.
* \param pANDBits The pointer to AND bits of the cursor.
* \param pXORBits The pointer to XOR bits of the cursor.
* \param colornum The bit-per-pixel of XOR bits.
*
* \return Handle to the cursor, zero on error.
*
* \note MiniGUI only support 2-color or 16-color cursor.
*/
MG_EXPORT HCURSOR GUIAPI CreateCursor (int xhotspot, int yhotspot, int w, int h,
const BYTE* pANDBits, const BYTE* pXORBits, int colornum);
/**
* \fn HCURSOR GUIAPI CopyCursor (HCURSOR hcsr)
* \brief Copies a cursor object.
*
* This function copies the specified cursor.
*
* \param hcsr Handle to the cursor to be copied.
*
* \return If the function succeeds, the return value is the
* handle to the duplicate cursor. If the function fails,
* the return value is 0.
*/
MG_EXPORT HCURSOR GUIAPI CopyCursor (HCURSOR hcsr);
/**
* \fn BOOL GUIAPI DestroyCursor (HCURSOR hcsr)
* \brief Destroys a cursor object.
*
* This function destroys a cursor object specified by \a hcsr.
*
* \param hcsr Handle to the cursor.
*
* \return TRUE on success, otherwise FALSE.
*/
MG_EXPORT BOOL GUIAPI DestroyCursor (HCURSOR hcsr);
/**
* \fn HCURSOR GUIAPI GetSystemCursor (int csrid)
* \brief Gets the handle to a system cursor by its identifier.
*
* MiniGUI creates (MAX_SYSCURSORINDEX + 1) system cursors for application.
* You can use \a GetSystemCursor to get the handle to these system cursors.
* The identifier can be one of the following:
*
* - IDC_ARROW\n
* Normal arrow cursor.
* - IDC_IBEAM\n
* 'I' shaped beam cursor, indicate an input field.
* - IDC_PENCIL\n
* Pencil-shape cursor.
* - IDC_CROSS\n
* Cross cursor.
* - IDC_MOVE\n
* Moving cursor.
* - IDC_SIZENWSE\n
* Sizing cursor, along north-west and south-east.
* - IDC_SIZENESW\n
* Sizing cursor, along north-east and south-west.
* - IDC_SIZEWE\n
* Sizing cursor, along west and east.
* - IDC_SIZENS\n
* Sizing cursor, along north and south.
* - IDC_UPARROW\n
* Up arrow cursor.
* - IDC_NONE\n
* None cursor.
* - IDC_HELP\n
* Arrow with question.
* - IDC_BUSY\n
* Busy cursor.
* - IDC_WAIT\n
* Wait cursor.
* - IDC_RARROW\n
* Right arrow cursor.
* - IDC_COLOMN\n
* Cursor indicates column.
* - IDC_ROW\n
* Cursor indicates row.
* - IDC_DRAG\n
* Draging cursor.
* - IDC_NODROP\n
* No droping cursor.
* - IDC_HAND_POINT\n
* Hand point cursor.
* - IDC_HAND_SELECT\n
* Hand selection cursor.
* - IDC_SPLIT_HORZ\n
* Horizontal splitting cursor.
* - IDC_SPLIT_VERT\n
* Vertical splitting cursor.
*
* \param csrid The identifier of the system cursor.
* \return Handle to the system cursor, otherwise zero.
*/
MG_EXPORT HCURSOR GUIAPI GetSystemCursor (int csrid);
/**
* \fn HCURSOR GUIAPI GetCurrentCursor (void)
* \brief Gets the handle to the current cursor.
*
* This function retrives the current cursor and returns its handle.
*
* \return Handle to the current system cursor, zero means no current cursor.
*/
MG_EXPORT HCURSOR GUIAPI GetCurrentCursor (void);
#else
#define LoadCursorFromFile(filename) (do_nothing(), 0)
#define CreateCursor(x, y, w, h, ANDbs, XORbs, cr) (do_nothing(), 0)
#define DestroyCursor(hcsr) (do_nothing(), 0)
#define GetSystemCursor(csrid) (do_nothing(), 0)
#define GetCurrentCursor() (do_nothing(), 0)
#endif /* _MGHAVE_CURSOR */
#define MAX_SYSCURSORINDEX 22
/* System cursor index. */
/** System arrow cursor index. */
#define IDC_ARROW 0
/** System beam cursor index. */
#define IDC_IBEAM 1
/** System pencil cursor index. */
#define IDC_PENCIL 2
/** System cross cursor index. */
#define IDC_CROSS 3
/** System move cursor index. */
#define IDC_MOVE 4
/** System size northwest to southeast cursor index. */
#define IDC_SIZENWSE 5
/** System size northeast to southwest cursor index. */
#define IDC_SIZENESW 6
/** System west to east cursor index. */
#define IDC_SIZEWE 7
/** System north to south cursor index. */
#define IDC_SIZENS 8
/** System up arrow cursor index. */
#define IDC_UPARROW 9
/** System none cursor index. */
#define IDC_NONE 10
/** System help cursor index. */
#define IDC_HELP 11
/** System busy cursor index. */
#define IDC_BUSY 12
/** System wait cursor index. */
#define IDC_WAIT 13
/** System right arrow cursor index. */
#define IDC_RARROW 14
/** System colomn cursor index. */
#define IDC_COLOMN 15
/** System row cursor index. */
#define IDC_ROW 16
/** System drag cursor index. */
#define IDC_DRAG 17
/** System nodrop cursor index. */
#define IDC_NODROP 18
/** System hand point cursor index. */
#define IDC_HAND_POINT 19
/** System hand select cursor index. */
#define IDC_HAND_SELECT 20
/** System horizontal split cursor index. */
#define IDC_SPLIT_HORZ 21
/** System vertical cursor index. */
#define IDC_SPLIT_VERT 22
/**
* \fn void GUIAPI ClipCursor (const RECT* prc)
* \brief Clips the cursor range.
*
* This function sets cursor's clipping rectangle. \a prc
* is the new clipping rectangle in screen coordinates. If \a prc is NULL,
* \a ClipCursor will disable cursor clipping.
*
* \param prc The clipping rectangle.
* \return None.
*/
MG_EXPORT void GUIAPI ClipCursor (const RECT* prc);
/**
* \fn void GUIAPI GetClipCursor (RECT* prc)
* \brief Gets the current cursor clipping rectangle.
*
* This function copies the current clipping rectangle to
* a RECT pointed to by \a prc.
*
* \param prc The clipping rectangle will be saved to this rectangle.
* \return None.
*/
MG_EXPORT void GUIAPI GetClipCursor (RECT* prc);
/**
* \fn void GUIAPI GetCursorPos (POINT* ppt)
* \brief Gets position of the current cursor.
*
* This function copies the current mouse cursor position to
* a POINT structure pointed to by \a ppt.
*
* \param ppt The position will be saved in this buffer.
* \return None.
*
* \sa SetCursorPos, POINT
*/
MG_EXPORT void GUIAPI GetCursorPos (POINT* ppt);
/**
* \fn void GUIAPI SetCursorPos (int x, int y)
* \brief Sets position of the current cursor.
*
* This function sets mouse cursor position with the given
* arguments: \a (\a x,\a y).
*
* \param x The x-corrdinate of the expected poistion.
* \param y The y-corrdinate of the expected poistion.
* \return None.
*
* \sa GetCursorPos
*/
MG_EXPORT void GUIAPI SetCursorPos (int x, int y);
#ifdef _MGHAVE_CURSOR
/**
* \fn HCURSOR GUIAPI SetCursorEx (HCURSOR hcsr, BOOL set_def)
* \brief Changes the current cursor.
*
* This function changes the current cursor to be \a hcsr,
* and/or sets it to be the default cursor.
*
* If you pass \a set_def as TRUE, the expected cursor will be the default
* cursor. The default cursor will be used when you move the cursor to
* the desktop.
*
* \param hcsr The expected cursor handle.
* \param set_def Indicates whether setting the cursor as the default cursor.
*
* \return The old cursor handle.
*
* \sa SetCursor, SetDefaultCursor, GetDefaultCursor
*/
MG_EXPORT HCURSOR GUIAPI SetCursorEx (HCURSOR hcsr, BOOL set_def);
/**
* \def SetCursor(hcsr)
* \brief Changes the current cursor.
*
* This function changes the current cursor to be \a hcsr.
*
* \param hcsr The expected cursor handle.
* \return The old cursor handle.
*
* \note This function defined as a macro calling \a SetCursorEx with
* passing \a set_def as FALSE.
*
* \sa SetCursorEx, SetDefaultCursor
*/
#define SetCursor(hcsr) SetCursorEx (hcsr, FALSE)
/**
* \def SetDefaultCursor(hcsr)
* \brief Changes the current cursor, and set it as the default cursor.
*
* This function changes the current cursor to be \a hcsr, and set it as
* the default cursor.
*
* \param hcsr The expected cursor handle.
* \return The old cursor handle.
*
* \note This function defined as a macro calling \a SetCursorEx with
* passing \a set_def as TRUE.
*
* \sa SetCursorEx, SetCursor
*/
#define SetDefaultCursor(hcsr) SetCursorEx (hcsr, TRUE)
/**
* \fn HCURSOR GUIAPI GetDefaultCursor (void)
* \brief Gets the default cursor.
*
* This function gets the current default cursor.
*
* \return The current default cursor handle.
*
* \sa SetCursorEx, SetDefaultCursor
*/
MG_EXPORT HCURSOR GUIAPI GetDefaultCursor (void);
#else
#define SetCursorEx(hcsr, set_def) (do_nothing(), 0)
#define SetCursor(hcsr) (do_nothing(), 0)
#define SetDefaultCursor(hcsr) (do_nothing(), 0)
#define GetDefaultCursor() (do_nothing(), 0)
#endif /* _MGHAVE_CURSOR */
#ifdef _MGHAVE_CURSOR
/**
* \fn int GUIAPI ShowCursor (BOOL fShow)
* \brief Shows or hides cursor.
*
* This function shows or hides cursor according to the argument \a fShow.
* Show cursor when \a fShow is TRUE, and hide cursor when \a fShow is FALSE.
* MiniGUI maintains a showing count value. Calling \a ShowCursor once, the
* count will increase when \a fShow is TRUE, or decrease one when FALSE.
* When the count is less than 0, the cursor will disapear actually.
*
* \param fShow Indicates show or hide the cursor.
*
* \return Cursor showing count value.
*/
MG_EXPORT int GUIAPI ShowCursor (BOOL fShow);
#else
#define ShowCursor(fShow) (do_nothing(), 0)
#endif /* _MGHAVE_CURSOR */
/** @} end of cursor_fns */
/**
* \defgroup key_status Asynchronous key status functions
* @{
*/
/**
* \fn BOOL GUIAPI GetKeyStatus (UINT uKey)
* \brief Gets a key or a mouse button status.
*
* This function gets a key or a mouse button status, returns TRUE
* when pressed, or FALSE when released. \a uKey indicates
* the key or mouse button. For keys on keyboard, \a uKey should be
* the scancode of the key, for mouse button, \a uKey should be one
* value of the following:
*
* - SCANCODE_LEFTBUTTON\n
* Left mouse button.
* - SCANCODE_MIDDLBUTTON\n
* Middle mouse button.
* - SCANCODE_RIGHTBUTTON\n
* Right mouse button.
*
* These constants and the scancodes of keys are defined in <minigui/common.h>.
*
* \param uKey Indicates the key or mouse button.
*
* \return Returns TRUE when pressed, or FALSE when released.
*
* \sa GetShiftKeyStatus
*/
MG_EXPORT BOOL GUIAPI GetKeyStatus (UINT uKey);
/**
* \fn DWORD GUIAPI GetShiftKeyStatus (void)
* \brief Gets status of the shift keys.
*
* This function gets ths status of the shift keys, the returned value
* indicates the status of shift keys -- CapsLock, ScrollLock, NumLock,
* Left Shift, Right Shift, Left Ctrl, Right Ctrl, Left Alt, and Right Alt.
* You can use KS_* ORed with the status value to determine one shift key's
* status:
*
* - KS_CAPSLOCK\n
* Indicates that CapsLock is locked.
* - KS_NUMLOCK\n
* Indicates that NumLock is locked.
* - KS_SCROLLLOCK\n
* Indicates that ScrollLock is locked.
* - KS_LEFTCTRL\n
* Indicates that left Ctrl key is pressed.
* - KS_RIGHTCTRL\n
* Indicates that right Ctrl key is pressed.
* - KS_CTRL\n
* Indicates that either left or right Ctrl key is pressed.
* - KS_LEFTALT\n
* Indicates that left Alt key is pressed.
* - KS_RIGHTALT\n
* Indicates that right Alt key is pressed.
* - KS_ALT\n
* Indicates that either left or right Alt key is pressed.
* - KS_LEFTSHIFT\n
* Indicates that left Shift key is pressed.
* - KS_RIGHTSHIFT\n
* Indicates that right Shift key is pressed.
* - KS_SHIFT\n
* Indicates that either left or right Shift key is pressed.
*
* These constants are defined in <minigui/common.h>.
*
* \return The status of the shift keys.
* \sa key_defs
*/
MG_EXPORT DWORD GUIAPI GetShiftKeyStatus (void);
/**
* \fn void GUIAPI GetKeyboardState (BYTE* kbd_state)
* \brief Gets status of all keys on keyboard.
*
* This function gets the status of all keys on keyboard.
*
* The scancodes of all keys are defined in <minigui/common.h>.
*
* \param kbd_state The buffer returns the current status of all keys.
* Note that the length of the buffer should be larger than
* (MGUI_NR_KEYS + 1).
*
* \sa GetKeyStatus, MGUI_NR_KEYS
*/
MG_EXPORT void GUIAPI GetKeyboardState (BYTE* kbd_state);
/** @} end of key_status */
/**
* \defgroup sys_text Internationlization of system text
* @{
*/
/**
* \def IDS_MGST_WINDOW
* \brief The identifier of the window system text.
*/
#define IDS_MGST_WINDOW 0
/**
* \def IDS_MGST_START
* \brief The identifier of the start system text.
*/
#define IDS_MGST_START 1
/**
* \def IDS_MGST_REFRESH
* \brief The identifier of the refresh background system text.
*/
#define IDS_MGST_REFRESH 2
/**
* \def IDS_MGST_CLOSEALLWIN
* \brief The identifier of the close all windows system text.
*/
#define IDS_MGST_CLOSEALLWIN 3
/**
* \def IDS_MGST_ENDSESSION
* \brief The identifier of the end session system text.
*/
#define IDS_MGST_ENDSESSION 4
/**
* \def IDS_MGST_OPERATIONS
* \brief The identifier of the operations system text.
*/
#define IDS_MGST_OPERATIONS 5
/**
* \def IDS_MGST_MINIMIZE
* \brief The identifier of the minimize system text.
*/
#define IDS_MGST_MINIMIZE 6
/**
* \def IDS_MGST_MAXIMIZE
* \brief The identifier of the maximize system text.
*/
#define IDS_MGST_MAXIMIZE 7
/**
* \def IDS_MGST_RESTORE
* \brief The identifier of the restore system text.
*/
#define IDS_MGST_RESTORE 8
/**
* \def IDS_MGST_CLOSE
* \brief The identifier of the close system text.
*/
#define IDS_MGST_CLOSE 9
/**
* \def IDS_MGST_OK
* \brief The identifier of the ok system text.
*/
#define IDS_MGST_OK 10
/**
* \def IDS_MGST_NEXT
* \brief The identifier of the next system text.
*/
#define IDS_MGST_NEXT 11
/**
* \def IDS_MGST_CANCEL
* \brief The identifier of the cancel system text.
*/
#define IDS_MGST_CANCEL 12
/**
* \def IDS_MGST_PREV
* \brief The identifier of the previous system text.
*/
#define IDS_MGST_PREV 13
/**
* \def IDS_MGST_YES
* \brief The identifier of the yes system text.
*/
#define IDS_MGST_YES 14
/**
* \def IDS_MGST_NO
* \brief The identifier of the no system text.
*/
#define IDS_MGST_NO 15
/**
* \def IDS_MGST_ABORT
* \brief The identifier of the abort system text.
*/
#define IDS_MGST_ABORT 16
/**
* \def IDS_MGST_RETRY
* \brief The identifier of the retry system text.
*/
#define IDS_MGST_RETRY 17
/**
* \def IDS_MGST_IGNORE
* \brief The identifier of the ignore system text.
*/
#define IDS_MGST_IGNORE 18
/**
* \def IDS_MGST_ABOUTMG
* \brief The identifier of the about minigui system text.
*/
#define IDS_MGST_ABOUTMG 19
/**
* \def IDS_MGST_OPENFILE
* \brief The identifier of the open file system text.
*/
#define IDS_MGST_OPENFILE 20
/**
* \def IDS_MGST_SAVEFILE
* \brief The identifier of the save file system text.
*/
#define IDS_MGST_SAVEFILE 21
/**
* \def IDS_MGST_COLORSEL
* \brief The identifier of the color selection system text.
*/
#define IDS_MGST_COLORSEL 22
/**
* \def IDS_MGST_SWITCHLAYER
* \brief The identifier of the switch layer system text.
*/
#define IDS_MGST_SWITCHLAYER 23
/**
* \def IDS_MGST_DELLAYER
* \brief The identifier of the delete layer system text.
*/
#define IDS_MGST_DELLAYER 24
/**
* \def IDS_MGST_ERROR
* \brief The identifier of the error system text.
*/
#define IDS_MGST_ERROR 25
/**
* \def IDS_MGST_LOGO
* \brief The identifier of the logo system text.
*/
#define IDS_MGST_LOGO 26
/**
* \def IDS_MGST_CURRPATH
* \brief The identifier of the current path system text.
*/
#define IDS_MGST_CURRPATH 27
/**
* \def IDS_MGST_FILE
* \brief The identifier of the file system text.
*/
#define IDS_MGST_FILE 28
/**
* \def IDS_MGST_LOCATION
* \brief The identifier of the location system text.
*/
#define IDS_MGST_LOCATION 29
/**
* \def IDS_MGST_UP
* \brief The identifier of the up system text.
*/
#define IDS_MGST_UP 30
/**
* \def IDS_MGST_NAME
* \brief The identifier of the name system text.
*/
#define IDS_MGST_NAME 31
/**
* \def IDS_MGST_SIZE
* \brief The identifier of the size system text.
*/
#define IDS_MGST_SIZE 32
/**
* \def IDS_MGST_ACCESSMODE
* \brief The identifier of the access mode system text.
*/
#define IDS_MGST_ACCESSMODE 33
/**
* \def IDS_MGST_LASTMODTIME
* \brief The identifier of the last modify time system text.
*/
#define IDS_MGST_LASTMODTIME 34
/**
* \def IDS_MGST_OPEN
* \brief The identifier of the open system text.
*/
#define IDS_MGST_OPEN 35
/**
* \def IDS_MGST_FILENAME
* \brief The identifier of the file name system text.
*/
#define IDS_MGST_FILENAME 36
/**
* \def IDS_MGST_FILETYPE
* \brief The identifier of the file type system text.
*/
#define IDS_MGST_FILETYPE 37
/**
* \def IDS_MGST_SHOWHIDEFILE
* \brief The identifier of the show hide file system text.
*/
#define IDS_MGST_SHOWHIDEFILE 38
/**
* \def IDS_MGST_NOTFOUND
* \brief The identifier of the not found file system text.
*/
#define IDS_MGST_NOTFOUND 39
/**
* \def IDS_MGST_NR
* \brief The identifier of the can't read system text.
*/
#define IDS_MGST_NR 40
/**
* \def IDS_MGST_NW
* \brief The identifier of the can't write system text.
*/
#define IDS_MGST_NW 41
/**
* \def IDS_MGST_INFO
* \brief The identifier of the information system text.
*/
#define IDS_MGST_INFO 42
/**
* \def IDS_MGST_R
* \brief The identifier of the read system text.
*/
#define IDS_MGST_R 43
/**
* \def IDS_MGST_W
* \brief The identifier of the write system text.
*/
#define IDS_MGST_W 44
/**
* \def IDS_MGST_WR
* \brief The identifier of the read and write system text.
*/
#define IDS_MGST_WR 45
/**
* \def IDS_MGST_SAVE
* \brief The identifier of the save system text.
*/
#define IDS_MGST_SAVE 46
/**
* \def IDS_MGST_FILEEXIST
* \brief The identifier of the file exist system text.
*/
#define IDS_MGST_FILEEXIST 47
#define IDS_MGST_MAXNUM 47
/**
* \fn const char* GUIAPI GetSysText (unsigned int id);
* \brief Translates system text to localized text.
*
* When MiniGUI display some system messages, it will call \a GetSysText
* function to translate system text from English to other language.
* Global variable \a SysText contains all text used by MiniGUI in English.
*
* \a GetSysText function returns localized text from \a local_SysText.
* MiniGUI have already defined localized sytem text for en_US, zh_CN.GB2312
* and zh_TW.Big5 locales. MiniGUI initializes \a local_SysText to
* point one of above localized system text when startup. You can also
* let \a local_SysText point to your customized string array.
*
* \param id The system text id.
* \return The localized text.
*
* \sa SysText, local_SysText
*/
MG_EXPORT const char* GUIAPI GetSysText (unsigned int id);
/**
* \var const char* SysText []
* \brief Contains all text used by MiniGUI in English.
*
* System text defined as follows in MiniGUI:
*
* \code
* const char* SysText [] =
* {
* "Windows...",
* "Start...",
* "Refresh Background",
* "Close All Windows",
* "End Session",
* "Operations...",
* "Minimize",
* "Maximize",
* "Restore",
* "Close",
* "OK",
* "Next",
* "Cancel",
* "Previous",
* "Yes",
* "No",
* "Abort",
* "Retry",
* "Ignore",
* "About MiniGUI...",
* "Open File",
* "Save File",
* "Color Selection",
* "Switch Layer",
* "Delete Layer",
* "Error",
* "LOGO",
* "Current Path",
* "File",
* #if (!defined (__NOUNIX__) || defined (WIN32)) && defined (_MGCTRL_LISTVIEW)
* "Location",
* "Up",
* "Name",
* "Size",
* "Access Mode",
* "Last Modify Time",
* "Open",
* "File Name",
* "File Type",
* "Show Hide File",
* "Sorry! not find %s ",
* "Can't Read %s !",
* "Can't Write %s !",
* "Information",
* "R",
* "W",
* "WR",
* "Save",
* "File %s exists, Replace or not?",
* #endif
* NULL
* };
* \endcode
*
* \sa GetSysText, local_SysText
*/
extern MG_EXPORT const char* SysText [];
/**
* \var const char** local_SysText
* \brief The pointer to the current localized system text array.
*
* Changing \a local_SysText will lead to \a GetSysText returns a different
* localized system text. Please set it when MiniGUI starts
* and send desktop a MSG_REINITSESSION message (call \a ReinitDesktop
* function) after assigned a different value to this variable.
*
* \sa GetSysText, SysText, ReinitDesktopEx
*/
extern MG_EXPORT const char** local_SysText;
#ifdef _MGCHARSET_UNICODE
/**
* \fn const char** GUIAPI GetSysTextInUTF8 (const char* language)
* \brief Gets the localized system text array in UTF-8 for
* a specified language.
*
* This function returns the localized system text array in UTF-8 encode
* for the specified language. You can use the returned localized system
* text array to set \a local_SysText if your system logical fonts are using
* UNICODE/UTF-8 charset.
*
* \param language The language name. So far, you can specify the language
* as 'zh_CN' (for simlified Chinese)
* or 'zh_TW' (for tranditional Chinese).
*
* \return The pointer to the localized system text array.
*
* \sa SysText, local_SysText
*/
extern MG_EXPORT const char** GUIAPI GetSysTextInUTF8 (const char* language);
#endif /* _MGCHARSET_UNICODE */
/** @} end of sys_text */
/**
* \defgroup str_helpers String operation helpers
* @{
*/
/**
* \fn char* strnchr (const char* s, size_t n, int c);
* \brief Locates character in the first \a n characters of string \a s.
*
* \param s The pointer to the string.
* \param n The number of first characters will be searched.
* \param c The expected character.
*
* \return Returns a pointer to the first occurrence of the character \a c
* in the string \a s.
*
* \sa strchr(3)
*/
MG_EXPORT char* strnchr (const char* s, size_t n, int c);
/**
* \fn int substrlen (const char* text, int len, int delimiter,\
int* nr_delim)
* \brief Locates a substring delimited by one or more delimiters in the
* first \a len characters of string \a text.
*
* \param text The pointer to the string.
* \param len The number of first characters will be searched.
* \param delimiter The delimiter which delimites the substring from other.
* \param nr_delim The number of continuous delimiters will be returned
* through this pointer.
*
* \return The length of the substring.
*
* \sa strstr(3)
*/
MG_EXPORT int substrlen (const char* text, int len, int delimiter,
int* nr_delim);
/**
* \fn char* strtrimall (char* src);
* \brief Deletes all space characters.
*
* This function deletes the blank 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.
*
* \param src The pointer to the string.
*
* \return Returns a pointer to the string.
*/
MG_EXPORT char * strtrimall (char* src);
/** @} end of str_helpers */
/** @} end of global_fns */
/** @} end of fns */
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _MGUI_MINIGUI_H */