Files
MiniGUI/include/minigui.h

5063 lines
158 KiB
C

///////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT NOTICE
//
// The following open source license statement does not apply to any
// entity in the Exception List published by FMSoft.
//
// For more information, please visit:
//
// https://www.fmsoft.cn/exception-list
//
//////////////////////////////////////////////////////////////////////////////
/**
* \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~2020, 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/blog/minigui-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>
#include <sys/types.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/**
* \addtogroup global_vars Global variables
* @{
*/
#define ZOF_STATUS_MASK 0x0000000F
#define ZOF_VISIBLE 0x00000001
#define ZOF_DISABLED 0x00000002
#define ZOF_MAXIMIZED 0x00000004 // Since 5.0.0
#define ZOF_MINIMIZED 0x00000008 // Since 5.0.0
/* Since 5.0.6 */
#define ZOF_GESTURE_FLAGS_MASK 0X000000F0
#define ZOF_GF_SWIPE_HORZ 0x00000010
#define ZOF_GF_SWIPE_VERT 0x00000020
/* Since 5.0.0 */
#define ZOF_INTERNAL_FLAGS_MASK 0X000F0000
#define ZOF_IF_REFERENCE 0x00010000
#define ZOF_IF_ALWAYSTOP 0x00020000
#define ZOF_IF_SPECIAL 0x00040000 // Since 5.0.6
#define ZOF_TW_FLAG_MASK 0x00F00000
#define ZOF_TW_TROUNDCNS 0x00100000
#define ZOF_TW_BROUNDCNS 0x00200000
#define ZOF_TW_TBROUNDCNS 0x00300000
#define ZOF_TYPE_FLAG_MASK 0xFF000000
#define ZOF_TYPE_MASK 0xF0000000
#define ZOF_TYPE_NULL 0x00000000
#define ZOF_TYPE_DESKTOP 0x10000000 // fixed and only one.
#define ZOF_TYPE_LAUNCHER 0x20000000 // Since 5.0.0
#define ZOF_TYPE_NORMAL 0x30000000
#define ZOF_TYPE_HIGHER 0x40000000
#define ZOF_TYPE_DOCKER 0x50000000 // Since 5.0.0
#define ZOF_TYPE_SCREENLOCK 0x60000000 // Since 5.0.0
#define ZOF_TYPE_GLOBAL 0x70000000
#define ZOF_TYPE_TOOLTIP 0x80000000 // Since 5.0.0
#define ZOF_TYPE_POPUPMENU 0x90000000
#define ZOF_TYPE_BOTTOMMOST ZOF_TYPE_LAUNCHER
#define ZOF_TYPE_TOPMOST ZOF_TYPE_TOOLTIP
#define ZOF_TF_FLAG_MASK 0x0F000000
#define ZOF_TF_MAINWIN 0x01000000
#define ZOF_TF_TOOLWIN 0x02000000
#define ZOF_TF_CONTROL 0x04000000
#define ZNIT_NULL (ZOF_TYPE_NULL)
#define ZNIT_POPUPMENU (ZOF_TYPE_POPUPMENU)
#define ZNIT_TOOLTIP (ZOF_TYPE_TOOLTIP | ZOF_TF_MAINWIN)
#define ZNIT_GLOBAL_MAINWIN (ZOF_TYPE_GLOBAL | ZOF_TF_MAINWIN)
#define ZNIT_GLOBAL_TOOLWIN (ZOF_TYPE_GLOBAL | ZOF_TF_TOOLWIN)
#define ZNIT_GLOBAL_CONTROL (ZOF_TYPE_GLOBAL | ZOF_TF_CONTROL)
#define ZNIT_SCREENLOCK_MAINWIN (ZOF_TYPE_SCREENLOCK | ZOF_TF_MAINWIN)
#define ZNIT_SCREENLOCK_TOOLWIN (ZOF_TYPE_SCREENLOCK | ZOF_TF_TOOLWIN)
#define ZNIT_SCREENLOCK_CONTROL (ZOF_TYPE_SCREENLOCK | ZOF_TF_CONTROL)
#define ZNIT_DOCKER_MAINWIN (ZOF_TYPE_DOCKER | ZOF_TF_MAINWIN)
#define ZNIT_DOCKER_TOOLWIN (ZOF_TYPE_DOCKER | ZOF_TF_TOOLWIN)
#define ZNIT_DOCKER_CONTROL (ZOF_TYPE_DOCKER | ZOF_TF_CONTROL)
#define ZNIT_HIGHER_MAINWIN (ZOF_TYPE_HIGHER | ZOF_TF_MAINWIN)
#define ZNIT_HIGHER_TOOLWIN (ZOF_TYPE_HIGHER | ZOF_TF_TOOLWIN)
#define ZNIT_HIGHER_CONTROL (ZOF_TYPE_HIGHER | ZOF_TF_CONTROL)
#define ZNIT_NORMAL_MAINWIN (ZOF_TYPE_NORMAL | ZOF_TF_MAINWIN)
#define ZNIT_NORMAL_TOOLWIN (ZOF_TYPE_NORMAL | ZOF_TF_TOOLWIN)
#define ZNIT_NORMAL_CONTROL (ZOF_TYPE_NORMAL | ZOF_TF_CONTROL)
#define ZNIT_LAUNCHER_MAINWIN (ZOF_TYPE_LAUNCHER | ZOF_TF_MAINWIN)
#define ZNIT_LAUNCHER_TOOLWIN (ZOF_TYPE_LAUNCHER | ZOF_TF_TOOLWIN)
#define ZNIT_LAUNCHER_CONTROL (ZOF_TYPE_LAUNCHER | ZOF_TF_CONTROL)
#define ZNIT_DESKTOP (ZOF_TYPE_DESKTOP)
#define ZNIF_VISIBLE (ZOF_VISIBLE)
#define ZNIF_DISABLED (ZOF_DISABLED)
#define ZNIF_MAXIMIZED (ZOF_MAXIMIZED) /* Since 5.2.0 */
#define ZNIF_MINIMIZED (ZOF_MINIMIZED) /* Since 5.2.0 */
/* definitions for backward compatibility */
#define ZNIT_TOPMOST_MAINWIN (ZNIT_HIGHER_MAINWIN)
#define ZNIT_TOPMOST_TOOLWIN (ZNIT_HIGHER_TOOLWIN)
#define ZNIT_TOPMOST_CONTROL (ZNIT_HIGHER_CONTROL)
typedef struct _CalcPosInfo {
DWORD style;
DWORD ex_style;
RECT rc;
} CALCPOSINFO;
/**
* \defgroup rect_vars Global Rectangles
* @{
*/
/**
* \fn RECT GUIAPI GetScreenRect (void);
* \brief Return the rectangle of the physical screen.
*
* Since 5.0.0
*/
MG_EXPORT RECT GUIAPI GetScreenRect (void);
/**
* \def g_rcScr
* \brief Contains the rectangle of the whole screen.
*
* \note Since 5.0.0, g_rcScr is defined a macro to call \a GetScreenRect.
*/
#define g_rcScr (GetScreenRect())
/**
* \def g_rcDesktop
* \brief Contains the rectangle of desktop of the application.
*
* \note This global variable is defined as an alias (macro) of \a g_rcScr.
*
* \sa g_rcScr
*/
#define g_rcDesktop g_rcScr
/** @} end of rect_vars */
#ifdef _MGRM_PROCESSES
/**
* \defgroup lite_vars MiniGUI-Processes specific variables
* @{
*/
/**
* \fn BOOL GUIAPI IsServer(void);
* \brief Check whether the current process is the server of MiniGUI-Processes.
*
* \return TRUE if the current process is the server, and FALSE for any client.
*
* \note Only available on MiniGUI-Processes.
*
* \sa mgIsServer
*
* Since 5.0.0
*/
MG_EXPORT BOOL GUIAPI IsServer(void);
/**
* \def mgIsServer
* \brief Indicates whether the current process is the server or a client on
* MiniGUI-Processes.
*
* \note Only defined for MiniGUI-Processes.
*
* \note Since 5.0.0, mgIsServer is defined as a macro to call \a IsServer.
*/
#define mgIsServer (IsServer())
/**
* \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 15
/**
* \def LEN_CLIENT_NAME
* \brief The maximum length of name of client in MiniGUI-Processes.
**/
#define LEN_CLIENT_NAME 15
/**
* \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 additional data for the layer; reserved for the server. */
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;
/**
* \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* mgDefaultLayer
* \brief The pointer to the default layer.
*
* \sa MG_Layer
*/
extern MG_EXPORT MG_Layer* mgDefaultLayer;
/**
* \var MG_Layer* mgLayers
* \brief The pointer to the layer list.
*
* \sa MG_Layer
*/
extern MG_EXPORT MG_Layer* mgLayers;
/** @} end of lite_vars */
#endif /* _MGRM_PROCESSES */
/** @} end of global_vars */
/**
* \addtogroup fns Functions
* @{
*/
/**
* \addtogroup global_fns Global/general functions
* @{
*/
/**
* \fn int GUIAPI InitGUI (int argc, const char *argv[])
* \brief Initialize MiniGUI.
*
* The meaning of two parameters is same with parameters of main function.
*
**/
MG_EXPORT int GUIAPI InitGUI (int argc, const char *argv[]);
/**
* \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);
/**
* \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"
#ifdef _MGRM_PROCESSES
/**
* \defgroup lite_fns MiniGUI-Processes specific functions
* @{
*/
/**
* \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
*
* @{
*/
/**
* \fn GHANDLE GUIAPI JoinLayer (const char* layer_name,
const char* client_name,
int max_nr_highers, 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 z-nodes in the higher level (max_nr_highers) and the maximal
* number of z-nodes in the normal level (max_nr_normals) of the new layer.
* Passing zero to \a max_nr_highers 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_highers The maximal number of z-nodes in the higher level of
* the new layer.
* \param max_nr_normals The maximal number of z-nodes in the normal level of
* 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_highers, int max_nr_normals);
/**
* \fn GHANDLE GUIAPI GetLayerInfo (const char* layer_name,
int* nr_clients, BOOL* is_topmost, int* cli_active)
* \brief Get 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 layer_handle, const char* layer_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 layer_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 on success, otherwise FALSE.
*
* \note Only call this function in clients of MiniGUI-Processes.
*/
MG_EXPORT BOOL GUIAPI SetTopmostLayer (BOOL handle_name,
GHANDLE layer_handle, const char* layer_name);
/**
* \fn BOOL GUIAPI DeleteLayer (BOOL handle_name,
GHANDLE layer_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 layer_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 layer_handle, const char* layer_name);
/**
* \fn BOOL GUIAPI MoveToLayer (BOOL handle_name,
GHANDLE layer_handle, const char* layer_name)
* \brief Move current client to the specified layer.
*
* This function moves the current client to other layer specified
* \a handle or \a layer_name.
*
* \param handle_name The way specifing the layer; TRUE for handle of
* the layer, FALSE for name.
* \param layer_handle The handle to the layer.
* \param layer_name The name of the layer.
*
* \return TRUE on success, otherwise FALSE.
*
* \note Only one client which has no any window can be moved.
*
* \note The client which created a fixed main window
* (a main window acts as the screen lock, the docker, or the launcher) will
* be moved to the topmost layer automatically.
*
* \sa ServerMoveClientToLayer
*
* Since 5.0.0.
*/
MG_EXPORT BOOL GUIAPI MoveToLayer (BOOL handle_name,
GHANDLE layer_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 Set 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 Set 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 Set 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
#define ZNOP_REGIONCHANGED 16
#define ZNOP_COMPOSITINGCHANGED 17
#define ZNOP_ICONCHANGED 18 /* reserved for future */
/**
* \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 Set 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 Set 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 Set to a function to handle events of z-node.
*
* After the server does an operation on a z-node, 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.
* - ZNOP_REGIONCHANGED\n
* The region (mask rectangles) of the z-node has changed.
* - ZNOP_COMPOSITINGCHANGED\n
* The compositing type or the argument 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_highers, 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 z-nodes in the global level.
* All z-nodes created by `mginit` are global ones.
* \param def_nr_highers The maximal number of the z-nodes in the higher
* level of the default layer. It is also the default number of
* the z-nodes in the higher level of a new layer.
* \param def_nr_normals The maximal number of the z-nodes in the normal
* level of the default layer. It is also the default number of
* the z-nodes in the normal level 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_highers, int def_nr_normals);
/**
* \fn MG_Layer* GUIAPI ServerCreateLayer (const char* layer_name,
int max_nr_highers, 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 z-nodes in the higher level
* (max_nr_highers) and the maximal number of z-nodes in the normal level
* (max_nr_normals) of the new layer. Passing zero to
* max_nr_highers 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
* that layer.
* \param max_nr_highers The maximal number of z-nodes in the higher level of
* the new layer.
* \param max_nr_normals The maximal number of z-nodes in the normal level of
* 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_highers, int max_nr_normals);
/**
* \fn BOOL GUIAPI ServerSetTopmostLayer (MG_Layer* layer)
* \brief Set topmost layer from the server.
*
* This function 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 function 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 ServerGetTopmostZNodeOfType (MG_Layer* layer, DWORD type,
* int* cli)
* \brief Get the topmost z-node in the specified layer for the specific
* window type from the server.
*
* This function gets the topmost z-node of the type specified by
* \a type in the specified layer \a layer from the server.
*
* \param layer The pointer to the layer, NULL for the current topmost layer.
* \param type The window type, can be one of the following values:
* - ZOF_TYPE_TOOLTIP
* - ZOF_TYPE_GLOBAL
* - ZOF_TYPE_SCREENLOCK
* - ZOF_TYPE_DOCKER
* - ZOF_TYPE_HIGHER
* - ZOF_TYPE_NORMAL
* - ZOF_TYPE_LAUNCHER
* \param cli The client identifier of the topmost z-node will be returned
* through this pointer. NULL is okay.
*
* \return The index of the topmost z-node of the specified type.
* Zero when there is no z-node in the level; < 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 z-node index
* of zero.
*
* \sa ServerGetZNodeInfo
*/
MG_EXPORT int GUIAPI ServerGetTopmostZNodeOfType (MG_Layer* layer, DWORD type,
int* cli);
/**
* \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 function gets the next z-node of the z-node specified by
* \a idx_znode, i.e., the z-node below it, 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 (the topmost) z-node in the layer.
* \param cli The client identifier of the next z-node 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 desktop; < 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. Also note that you can use this function to
* travel all z-nodes from top to bottom.
*
* \sa ServerGetZNodeInfo
*/
MG_EXPORT int GUIAPI ServerGetNextZNode (MG_Layer* layer, int idx_znode,
int* cli);
/**
* \fn int GUIAPI ServerGetPrevZNode (MG_Layer* layer, int idx_znode,
* int* cli)
* \brief Get the previous z-node in the specified layer from the server.
*
* This function gets the previous z-node of the z-node specified by
* \a idx_znode, i.e., the z-node above it, 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 last (the bottommost) z-node in the layer.
* \param cli The client identifier of the next z-node will be returned
* through this pointer. NULL is okay.
*
* \return The index of the previous z-node. Zero when there is no z-node;
* < 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. Also note that you can use this function to
* travel all z-nodes from bottom to top.
*
* \sa ServerGetZNodeInfo
*
* Since 5.0.0
*/
MG_EXPORT int GUIAPI ServerGetPrevZNode (MG_Layer* layer, int idx_znode,
int* cli);
/** Z-node information structure */
typedef struct _ZNODEINFO {
/**
* The type of the z-node, can be one of the following values:
* - ZNIT_POPUPMENU\n
* a popup menu.
* - ZNIT_TOOLTIP\n
* - ZNIT_GLOBAL_MAINWIN\n
* a main window in the global/system level.
* - ZNIT_GLOBAL_TOOLWIN\n
* a tool window in the global/system level.
* - ZNIT_GLOBAL_CONTROL\n
* a control with WS_EX_CTRLASMAINWIN style in the global/system level.
* the global tooltip main window.
* - ZNIT_SCREENLOCK_MAINWIN\n
* a main window in the screen lock level.
* - ZNIT_SCREENLOCK_TOOLWIN\n
* a tool window in the screen lock level.
* - ZNIT_SCREENLOCK_CONTROL\n
* a control with WS_EX_CTRLASMAINWIN style in the screen lock level.
* - ZNIT_DOCKER_MAINWIN\n
* a main window in the docker level.
* - ZNIT_DOCKER_TOOLWIN\n
* a tool window in the docker level.
* - ZNIT_DOCKER_CONTROL\n
* a control with WS_EX_CTRLASMAINWIN style in the docker level.
* - ZNIT_HIGHER_MAINWIN\n
* a main window in the higher level.
* - ZNIT_HIGHER_TOOLWIN\n
* a tool window in the higher level.
* - ZNIT_HIGHER_CONTROL\n
* a control with WS_EX_CTRLASMAINWIN style in the higher level.
* - ZNIT_NORMAL_MAINWIN\n
* a main window in the normal level.
* - ZNIT_NORMAL_TOOLWIN\n
* a tool window in the normal level.
* - ZNIT_NORMAL_CONTROL\n
* a control with WS_EX_CTRLASMAINWIN style in the normal level.
* - ZNIT_LAUNCHER_MAINWIN\n
* a main window in the launcher level.
* - ZNIT_LAUNCHER_TOOLWIN\n
* a tool window in the launcher level.
* - ZNIT_LAUNCHER_CONTROL\n
* a control with WS_EX_CTRLASMAINWIN style in the launcher level.
* - ZNIT_DESKTOP\n
* the desktop.
* - ZNIT_NULL\n
* a null and not-used z-node which does not refer to
* any window/popupmenu.
*/
DWORD type;
/**
* The flags of the z-node, can be OR'd with the following values:
* - ZNIF_VISIBLE\n
* a visible window.
* - ZNIF_DISABLED\n
* a disabled window.
* - ZNIF_MAXIMIZED\n
* a maximized window.
* - ZNIF_MINIMIZED\n
* a minimized window.
* Note that the flags are only applied to window.
*/
DWORD flags;
/** The pointer to the caption string of the z-node if it is a window. */
const char* caption;
/** The rectangle of the z-node in the screen. */
RECT rc;
/** The window handle of the z-node if it is a window. */
HWND hwnd;
/**
* The window handle of the z-node's main window if it is a control
* with WS_EX_CTRLASMAINWIN style.
*/
HWND main_win;
/** Client id of the z-node. */
int cli;
#ifdef _MGSCHEMA_COMPOSITING
/**
* The compositing type for this z-node.
* For more information, see \a SetMainWindowCompositing.
*/
int ct;
/**
* The compositing argument for this z-node.
* For more information, see \a SetMainWindowCompositing.
*/
DWORD ct_arg;
#endif
/**
* The private data for this z-node.
* The initial value is NULL.
*/
void* priv_data;
} 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 function copies the z-node information of a window which uses
* the specific z-node index \a idx_znode 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 z-node.
* \param znode_info The information of the requested z-node 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);
/** Z-node header structure */
typedef struct _ZNODEHEADER {
/**
* The flags of the z-node, can be OR'd with the following values:
* - ZNIF_VISIBLE\n
* a visible window.
* - ZNIF_DISABLED\n
* a disabled window.
* - ZNIF_MAXIMIZED\n
* a maximized window.
* - ZNIF_MINIMIZED\n
* a minimized window.
* Note that the flags are only applied to window.
*/
DWORD flags;
/** The pointer to the caption string of the z-node if it is a window. */
const char* caption;
/** The window handle of the z-node if it is a window. */
HWND hwnd;
/**
* The window handle of the z-node's main window if it is a control
* with WS_EX_CTRLASMAINWIN style.
*/
HWND main_win;
/** The rectangle of the z-node in the screen. */
RECT rc;
/** Client id of the z-node. */
int cli;
/** The lock count (only for compositing schema). */
int lock_count;
#ifdef _MGSCHEMA_COMPOSITING
/** The count for changes of the content. */
unsigned int changes;
/**
* The compositing type for this z-node.
* For more information, see \a SetMainWindowCompositing.
*/
int ct;
/**
* The compositing argument for this z-node.
* For more information, see \a SetMainWindowCompositing.
*/
DWORD ct_arg;
/** The memory DC for this z-node. */
HDC mem_dc;
/** The dirty age of this z-node. */
unsigned int dirty_age;
/** The number of dirty rects. */
int nr_dirty_rcs;
/** The pointer to the dirty rectangles. */
const RECT* dirty_rcs;
#else
/** The z-node change age; no use for compositing schema */
unsigned int age;
/** The dirty recetangle of this z-node; no use for compositing schema */
RECT dirty_rc;
#endif
} ZNODEHEADER;
/**
* \fn const ZNODEHEADER* GUIAPI ServerGetWinZNodeHeader (
MG_Layer* layer, int idx_znode, void** priv_data, BOOL lock)
* \brief Get the pointer to the z-node header of a specific window
* in the specified layer.
*
* This function gets the pointer to the z-node header of the window
* which uses the specific z-node index \a idx_znode in the specified
* layer \a layer.
*
* \param layer The pointer to the layer, NULL for the current topmost layer.
* \param idx_znode The index of the z-node.
* \param priv_data The buffer to return the private data of the z-node;
* can be NULL.
* \param lock Whether to lock the shared surface.
*
* \return The pointer to the z-node header; NULL on error.
*
* \note This is the fast version of \a ServerGetZNodeInfo.
*
* \note Under compositing schema, this function will lock the shared surface
* of this z-node if the argument \a lock is TRUE. You should call
* \a ServerReleaseWinZNodeHeader to release the lock.
*
* \note Server-only function.
*
* \sa ServerGetZNodeInfo, ServerReleaseWinZNodeHeader, ZNODEHEADER
*
* Since 5.0.0
*/
MG_EXPORT const ZNODEHEADER* GUIAPI ServerGetWinZNodeHeader (
MG_Layer* layer, int idx_znode, void** priv_data, BOOL lock);
/**
* \fn void GUIAPI ServerReleaseWinZNodeHeader (MG_Layer* layer, int idx_znode)
* \brief Release z-node header of a specific window in the specified layer.
*
* This function releases the z-node header of the window
* which uses the specific z-node index \a idx_znode in the specified
* layer \a layer.
*
* \param layer The pointer to the layer, NULL for the current topmost layer.
* \param idx_znode The index of the z-node.
*
* \return TRUE for success, otherwise FALSE;
*
* \note Under compositing schema, this function will release the shared surface
* of this z-node locked by \a ServerGetWinZNodeHeader to release the lock.
*
* \note Server-only function.
*
* \sa ServerGetWinZNodeHeader
*
* Since 5.0.0
*/
#ifdef _MGSCHEMA_COMPOSITING
MG_EXPORT BOOL GUIAPI ServerReleaseWinZNodeHeader (MG_Layer* layer,
int idx_znode);
#else /* not defined _MGSCHEMA_COMPOSITING */
static inline BOOL GUIAPI ServerReleaseWinZNodeHeader (MG_Layer* layer,
int idx_znode)
{
return TRUE;
}
#endif /* not defined _MGSCHEMA_COMPOSITING */
/**
* \fn int GUIAPI ServerGetPopupMenusCount (void)
* \brief Get the number of popup menus shown on the screen.
*
* This function gets the number of popup menus shown currently on the screen.
*
* \return The number of the popup menus shown.
*
* \note Server-only function.
*
* \sa ServerGetPopupMenuZNodeHeader, ZNODEHEADER
*
* Since 5.0.0
*/
MG_EXPORT int GUIAPI ServerGetPopupMenusCount (void);
/**
* \fn const ZNODEHEADER* GUIAPI ServerGetPopupMenuZNodeHeader (
int idx_znode, BOOL lock)
* \brief Get the pointer to the z-node header of the specific popup menu.
*
* This function gets the pointer to the z-node header of the specific
* popup menu which is currently shown on the current layer.
*
* \param idx_znode The index of the popup menu. 0 means the first popup menu.
* \param priv_data The buffer to return the private data of the z-node;
* can be NULL.
* \param lock Whether to lock the shared surface.
*
* \return The pointer to the z-node header; NULL on error.
*
* \note Server-only function.
*
* \note Under compositing schema, this function will lock the shared surface
* of this z-node if the argument \a lock is TRUE. You should call
* \a ServerReleasePopupMenuZNodeHeader to release the lock.
*
* \sa ServerGetPopupMenusCount, ServerReleasePopupMenuZNodeHeader, ZNODEHEADER
*
* Since 5.0.0
*/
MG_EXPORT const ZNODEHEADER* GUIAPI ServerGetPopupMenuZNodeHeader (
int idx_znode, void** priv_data, BOOL lock);
/**
* \fn BOOL GUIAPI ServerReleasePopupMenuZNodeHeader (int idx_znode)
* \brief Release the lock of the z-node header of the specific popup menu.
*
* This function releases the lock of the z-node header of the specific
* popup menu which is currently shown on the current layer.
*
* \param idx_znode The index of the popup menu. 0 means the first popup menu.
*
* \return TRUE on success, otherwise FALSE.
*
* \note Server-only function.
*
* \note Under compositing schema, this function will release the lock of
* the shared surface of this z-node. You should call
* \a ServerReleasePopupMenuZNodeHeader to release the lock.
*
* \sa ServerGetPopupMenusCount, ServerReleasePopupMenuZNodeHeader, ZNODEHEADER
*
* Since 5.0.0
*/
#ifdef _MGSCHEMA_COMPOSITING
MG_EXPORT BOOL GUIAPI ServerReleasePopupMenuZNodeHeader (int idx_znode);
#else /* not defined _MGSCHEMA_COMPOSITING */
static inline BOOL GUIAPI ServerReleasePopupMenuZNodeHeader (int idx_znode)
{
return TRUE;
}
#endif /* not defined _MGSCHEMA_COMPOSITING */
typedef struct _CLIPRGN CLIPRGN;
#define RGN_OP_MASK 0x000F
#define RGN_OP_SET 0x0000
#define RGN_OP_INCLUDE 0x0001
#define RGN_OP_EXCLUDE 0x0002
#define RGN_OP_FLAG_ABS 0x0010
/**
* \fn BOOL GUIAPI ServerGetWinZNodeRegion (MG_Layer* layer, int idx_znode,
DWORD rgn_ops, CLIPRGN* dst_rgn)
* \brief Get the z-node region of a specific window in the specified layer.
*
* This function gets the region of the window which uses the specific
* z-node index \a idx_znode in the specified layer \a layer.
*
* \param layer The pointer to the layer, NULL for the current topmost layer.
* \param idx_znode The index of the z-node.
* \param rgn_ops The operation for the region of the window z-node and
* the destination region given by the last argument. It can be one of
* the following values and OR'ed with `RGN_OP_FLAG_ABS`:
* - RGN_OP_SET\n
* Set the destination region with the region of the window z-node.
* - RGN_OP_INCLUDE\n
* Union the region of the window z-node with the destination region.
* - RGN_OP_EXCLUDE\n
* Subtract the region of the window z-node from the destination region.
* If RGN_OP_FLAG_ABS is set, the function will convert the region to
* the screen coordinate system.
* \param dst_rgn The pointer to the destination region.
*
* \return TRUE for success, otherwise FALSE;
*
* \note Server-only function.
*
* \sa ServerGetPopupMenuZNodeRegion
*
* Since 5.0.0
*/
MG_EXPORT BOOL GUIAPI ServerGetWinZNodeRegion (MG_Layer* layer, int idx_znode,
DWORD rgn_ops, CLIPRGN* dst_rgn);
/**
* \fn BOOL GUIAPI ServerGetPopupMenuZNodeRegion (int idx_znode,
DWORD rgn_ops, CLIPRGN* dst_rgn)
* \brief Get the z-node region of a specific popup menu in the current layer.
*
* This function gets the region of the popup menu which uses the specific
* z-node index \a idx_znode in the specified layer \a layer.
*
* \param idx_znode The z-node index of the popup menu.
* \param rgn_ops The operation for the region of the popup menu z-node and
* the destination region given by the last argument. It can be one of
* the following values and OR'ed with `RGN_OP_FLAG_ABS`:
* - RGN_OP_SET\n
* Set the destination region with the region of the window z-node.
* - RGN_OP_INCLUDE\n
* Union the region of the window z-node with the destination region.
* - RGN_OP_EXCLUDE\n
* Subtract the region of the window z-node from the destination region.
* If RGN_OP_FLAG_ABS is set, the function will convert the region to
* the screen coordinate system.
* \param dst_rgn The pointer to the destination region.
*
* \return TRUE for success, otherwise FALSE;
*
* \note Server-only function.
*
* \note This function will add round corners to popup menus automatically when
* _MGSCHEMA_COMPOSITING is defined.
*
* \sa ServerGetWinZNodeRegion
*
* Since 5.0.0
*/
MG_EXPORT BOOL GUIAPI ServerGetPopupMenuZNodeRegion (int idx_znode,
DWORD rgn_ops, CLIPRGN* dst_rgn);
/**
* \fn BOOL GUIAPI ServerSetWinZNodePrivateData (MG_Layer* layer,
int idx_znode, void* priv_data)
* \brief Set the private data of the z-node of a specific window
* in the specified layer.
*
* This function sets the private data of the z-node header of the window
* which uses the specific z-node index \a idx_znode in the specified
* layer \a layer.
*
* \param layer The pointer to the layer, NULL for the current topmost layer.
* \param idx_znode The index of the z-node.
* \param priv_data The private data.
*
* \return TRUE on success, otherwise FALSE;
*
* \note Server-only function.
*
* \sa ServerGetWinZNodeHeader, ServerSetPopupMenuZNodePrivateData
*
* Since 5.0.0
*/
MG_EXPORT BOOL GUIAPI ServerSetWinZNodePrivateData (MG_Layer* layer,
int idx_znode, void* priv_data);
/**
* \fn BOOL GUIAPI ServerSetPopupMenuZNodePrivateData (int idx_znode,
void* priv_data)
* \brief Set the private data of the z-node of the specific popup menu.
*
* This function sets the private data of the z-node header of the specific
* popup menu which is currently shown on the current layer.
*
* \param idx_znode The index of the popup menu. 0 means the first popup menu.
* \param priv_data The private data.
*
* \return TRUE on success, otherwise FALSE;
*
* \note Server-only function.
*
* \sa ServerGetPopupMenuZNodeHeader, ServerSetWinZNodePrivateData
*
* Since 5.0.0
*/
MG_EXPORT BOOL GUIAPI ServerSetPopupMenuZNodePrivateData (int idx_znode,
void* priv_data);
/**
* \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 function 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 z-node.
* \param op_code The code of the operation, can be one of the following
* values:
* - ZNOP_MOVE2TOP\n
* Move the z-node to be the topmost one.
* - ZNOP_SETACTIVE\n
* Set the z-node 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 z-node. Not used currently, reserved
* for future use.
* \param notify Whether to notify the client about the change of the z-node.
*
* \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 BOOL GUIAPI ServerMoveClientToLayer (int cli, MG_Layer* dst_layer)
* \brief Move a client to the specified layer.
*
* This function moves a client specified by \a cli to other layer specified
* \a dst_layer.
*
* \param cli The identifier of the client.
* \param dst_layer The pointer to the destination layer.
*
* \return TRUE on success, otherwise FALSE.
*
* \note Server-only function. Only one client which has no any window can be moved.
*
* \note The client which created a fixed main window
* (a main window acts as the screen lock, the docker, or the launcher) will
* be moved to the topmost layer automatically.
*
* \sa MoveToLayer
*
* Since 5.0.0.
*/
MG_EXPORT BOOL GUIAPI ServerMoveClientToLayer (int cli, MG_Layer* dst_layer);
/**
* \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 Set 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);
#ifdef _MGSCHEMA_COMPOSITING
/**
* The struct type represents the context of a compositor.
* The concrete struct should be defined by the implementation of the compositor.
*/
struct _CompositorCtxt;
typedef struct _CompositorCtxt CompositorCtxt;
struct _CLIPRGN;
typedef struct _CLIPRGN CLIPRGN;
/**
* The struct type defines the operations for a compositor.
*/
typedef struct _CompositorOps {
/**
* This operation initializes the compositor
* and returns the compositing context.
*/
CompositorCtxt* (*initialize) (const char* name);
/**
* This operation destroies the compositing context
* and terminates the compositor.
*/
void (*terminate) (CompositorCtxt* ctxt);
/**
* This operation refreshes the whole screen due to the change of
* the compositor or the topmost layer.
*/
void (*refresh) (CompositorCtxt* ctxt);
/**
* This operation purges the private data of a popup menu z-node.
* It will be called before terminating the compositor for any
* popup menu z-node which has a non-NULL private data.
*/
void (*purge_ppp_data) (CompositorCtxt* ctxt, int zidx, void* data);
/**
* This operation purges the private data of a window z-node.
* It will be called before terminating the compositor for any
* window z-node which has a non-NULL private data.
*/
void (*purge_win_data) (CompositorCtxt* ctxt, MG_Layer* layer,
int zidx, void* data);
/**
* This operation calculate the default position and size for
* a main window with the extended style WS_EX_AUTOPOSITION.
*/
void (*calc_mainwin_pos) (CompositorCtxt* ctxt, MG_Layer* layer,
DWORD zt_type, int first_for_type, int cli, CALCPOSINFO* info);
/**
* This operation will be called when there was a layer operation.
* For more information, please refer to \a OnChangeLayer.
*/
void (*on_layer_op) (CompositorCtxt* ctxt, int layer_op,
MG_Layer* layer, MG_Client* client);
/**
* This operation will be called when the server intends to composite
* the whole screen for the particular layer.
* The compositor can reset the dirty region for the layer.
* If it returns FALSE, the compositor will not handle the layer.
*/
BOOL (*reset_dirty_region) (CompositorCtxt* ctxt, MG_Layer* layer);
/**
* This operation will be called when there are some dirty
* rectangles in the specific popup menu z-node.
* The compositor should merge the dirty rectangles to the
* dirty region maintained for the current layer.
*/
BOOL (*merge_dirty_ppp) (CompositorCtxt* ctxt, MG_Layer* layer, int zidx);
/**
* This operation will be called when there are some dirty rectangles
* in the specific window z-node on the specific layer.
* The compositor should merge the dirty rectangles to the
* dirty region maintained for the current layer.
*/
BOOL (*merge_dirty_win) (CompositorCtxt* ctxt, MG_Layer* layer, int zidx);
/**
* This operation will be called when there are some dirty rectangles
* in the wallpaper pattern.
* The compositor should merge the dirty rectangles of the wallpaper
* pattern to the dirty region maintained for the current layer.
*/
BOOL (*merge_dirty_wpp) (CompositorCtxt* ctxt, MG_Layer* layer);
/**
* This operation will be called to composite the dirty region
* for the particular layer.
*/
BOOL (*refresh_dirty_region) (CompositorCtxt* ctxt, MG_Layer* layer);
/**
* This operation will be called when a z-node was out of action, e.g.,
* the z-node was hidden or released.
* The argument \a layer gives the layer which has the dirty rectangle;
* NULL for the topmost layer.
* The argument \a cause_type gives the type of the z-node which caused
* the action. For the available z-node types, please refer to \a ZNODEINFO.
* The argument \a rc_dirty contains the rectangle of the z-node in screen
* coordinates.
* The compositor should refresh the screen for the dirty rectangle.
*/
void (*on_dirty_screen) (CompositorCtxt* ctxt, MG_Layer* layer,
DWORD cause_type, const RECT* rc_dirty);
/**
* This operation will be called when the system is showing a new
* popup menu. Note that the compositor can not assume that there
* are contents in the surface of the popup menu; but it can update
* some internal data in this operation.
*/
void (*on_showing_ppp) (CompositorCtxt* ctxt, int zidx);
/**
* This operation will be called when the system is hiding a popup menu.
* The compositor may purge the private data in this operation.
* The compositor can play an animation in this operation.
*/
void (*on_hiding_ppp) (CompositorCtxt* ctxt, int zidx);
/**
* This operation will be called when the system closed a tracking menu,
* The compositor can refresh the screen as there is no any popup menus.
* The argument \a rc_bound gives the bound rectangle of all visible
* popup menus before closing the menu.
*/
void (*on_closed_menu) (CompositorCtxt* ctxt, const RECT* rc_bound);
/**
* This operation will be called when the system is showing a window.
* Note that the compositor can not assume that there are contents in
* the surface of the window, but it can update some internal data
* in this operation.
*/
void (*on_showing_win) (CompositorCtxt* ctxt, MG_Layer* layer, int zidx);
/**
* This operation will be called when the system is hidding a window.
* The compositor may purge the private data in this operation.
* The compositor can play an animation in this operation.
*/
void (*on_hiding_win) (CompositorCtxt* ctxt, MG_Layer* layer, int zidx);
/**
* This operation will be called after the system raised the window
* z-node to top.
* The compositor should refresh the screen to reflect the change.
*/
void (*on_raised_win) (CompositorCtxt* ctxt, MG_Layer* layer, int zidx);
/**
* This operation will be called after the system changed the compositing
* type of the specific window z-node.
* The compositor should refresh the screen to reflect the change.
*/
void (*on_changed_ct) (CompositorCtxt* ctxt, MG_Layer* layer, int zidx);
/**
* This operation will be called after the system changed the region
* of the specific window z-node.
* The compositor should update the screen to reflect the change.
*/
void (*on_changed_rgn) (CompositorCtxt* ctxt, MG_Layer* layer,
int zidx, const RECT* rc_org_bound);
/**
* This operation will be called after the system moved a window.
* The compositor should update the screen to reflect the change.
* The argument \a rc_org gives the original rectangle of the window.
*/
void (*on_moved_win) (CompositorCtxt* ctxt, MG_Layer* layer,
int zidx, const RECT* rc_org);
/**
* This operation will composite multiple layers on the screen at the same
* time by using the combining paramemters.
*/
unsigned int (*composite_layers) (CompositorCtxt* ctxt, MG_Layer* layers[],
int nr_layers, void* combine_param);
/**
* This operation will be called when transiting to a new topmost layer.
* The compositor can play an animation to transit from the current
* topmost layer to the new topmost layer.
*/
void (*transit_to_layer) (CompositorCtxt* ctxt, MG_Layer* to_layer);
/**
* This operation will be called when the system is maximizing a window.
* The compositor can play an animation in this operation.
*/
void (*on_maximizing_win) (CompositorCtxt* ctxt, MG_Layer* layer, int zidx);
/**
* This operation will be called when the system is manimizing a window.
* The compositor can play an animation in this operation.
*/
void (*on_minimizing_win) (CompositorCtxt* ctxt, MG_Layer* layer, int zidx);
} CompositorOps;
#define FCM_HORIZONTAL 0x0000
#define FCM_VERTICAL 0x0001
#define FCM_METHOD_MASK 0x00FF
#define FCM_SCALE 0x0100
/** The combining parameters for the callback compositor. */
typedef struct _CombParamsFallback {
/**
* The combining method, can be one of the following values:
* - FCM_HORIZONTAL
* - FCM_VERTICAL
* and/or OR'd with the following value:
* - FCM_SCALE
*/
unsigned int method;
/** The percentage of the screen occupied by the first layer. */
float percent;
/** The scale factor of non-global z-nodes. */
float scale;
} COMBPARAMS_FALLBACK;
/**
* \brief Get the operations of a specific compositor.
*
* This function gets the operations of a specific compositor.
*
* \param name The name of the compositor. MiniGUI reserved `fallback`
* as the default compositor which is implemented in MiniGUI Core.
* You can use some operations of the default compositor as the
* corresponding operations for your own compositor.
*
* \return The object represents the compositor operations; NULL for
* no such compositor registered.
*
* \note Only called by the server.
*
* \sa ServerRegisterCompositor
*
* Since 5.0.0.
*/
MG_EXPORT const CompositorOps* GUIAPI ServerGetCompositorOps (const char* name);
/**
* \brief Register a new compositor.
*
* This function registers a new compositor.
*
* \param name The name of the compositor.
* \param ops The new compositor object.
*
* \return TRUE for success; otherwize (duplicated or no enough space) FALSE.
*
* \note Only called by the server.
*
* \sa ServerUnregisterCompositor
*
* Since 5.0.0.
*/
MG_EXPORT BOOL GUIAPI ServerRegisterCompositor (
const char* name, const CompositorOps* ops);
/**
* \brief Un-register a new compositor.
*
* This function un-registers a compositor.
*
* \param name The name of the compositor.
*
* \return The object represents the compositor implementation.
*
* \note Only called by the server.
*
* \sa ServerRegisterCompositor
*
* Since 5.0.0.
*/
MG_EXPORT BOOL GUIAPI ServerUnregisterCompositor (const char* name);
#define LEN_COMPOSITOR_NAME 15
#define COMPSOR_NAME_DEFAULT "default"
#define COMPSOR_NAME_FALLBACK "fallback"
/**
* \brief Select a compositor as the current compositor.
*
* This function selects a compositor as the current compositor
* and returns the compositor operations.
* It also destroies the old compositor object if there is old one.
*
* \param name The name of the compositor. If the argument is NULL,
* this function will return the current compositor.
* Use \a COMPSOR_NAME_DEFAULT when you want to refer to the
* default compositor.
* \param ctxt The buffer used to return the compositor context.
*
* \return The pointer to the compositor operations; NULL for error.
*
* \note Only called by the server.
*
* Since 5.0.0.
*/
MG_EXPORT const CompositorOps* GUIAPI ServerSelectCompositor (
const char* name, CompositorCtxt** ctxt);
/**
* \brief Get the name and the context of the current compositor.
*
* This function gets the name and the context of the current
* compositor.
*
* \param ops The buffer used to return the compositor operations.
* \param ctxt The buffer used to return the compositor context.
*
* \return The name of the current compositor; NULL for error.
*
* \note Only called by the server.
*
* Since 5.0.6.
*/
MG_EXPORT const char* GUIAPI ServerGetCurrentCompositor (
const CompositorOps** ops, CompositorCtxt** ctxt);
#define COMPSOR_OPS_VERSION 2
/**
* Implement this stub to return the compositor operations
* for a specific compositor name if you implement the compositor
* in a shared library.
*
* \param name The name of the compositor desired.
* \param fallback_ops The fallback operations.
* \param version The version code for the operations of the compositor.
*
* \note The compositor should return the version code it follows through
* \a version argument. If the version code is not matched, MiniGUI
* will refuse to load the compositor. The current version code
* is defined by \a COMPSOR_OPS_VERSION.
*
* \return The compositor operations for specific name, NULL for error.
*/
const CompositorOps* __ex_compositor_get (const char* name,
const CompositorOps* fallback_ops, int* version);
#endif /* defined _MGSCHEMA_COMPOSITING */
/** @} 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 0x0023
/**
* \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 ClientRequestEx2 (const REQUEST* request,
const void* ex_data, size_t ex_data_len, int fd_to_send,
void* result, int len_rslt, int* fd_received)
* \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 fd_to_send The file descriptor which will be sent to the server;
* it will be ignored if it is less than 0.
* \param result The buffer receives the reply.
* \param len_rslt The lenght of the buffer.
* \param fd_recevied The buffer will be used to return the file descriptor
* which was recevied from the server.
* If it is NULL, the file descriptor will be ignored.
* If there is no file descriptor received and it is not NULL,
* it will contain -1.
*
* \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
*
* Since: 5.0.0
*/
MG_EXPORT int GUIAPI ClientRequestEx2 (const REQUEST* request,
const void* ex_data, size_t ex_data_len, int fd_to_send,
void* result, size_t len_rslt, int* fd_received);
/**
* \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.
*
* \note If the reply containes a file descriptor sent from the server,
* you should call \a ClientRequestEx2 instead.
*
* \sa ClientRequestEx2, ServerSendReply
*/
static inline int GUIAPI ClientRequestEx (const REQUEST* request,
const void* ex_data, int ex_data_len,
void* result, int len_rslt)
{
return ClientRequestEx2 (request, ex_data, ex_data_len, -1,
result, len_rslt, NULL);
}
/**
* \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.
*
* \note If the reply containes a file descriptor sent from the server,
* you should call \a ClientRequestEx2 instead.
*
* \sa ClientRequestEx2, 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 Get 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 ServerSendReplyEx (int clifd,
const void* reply, int len, int fd_to_send)
* \brief Sends a reply to the client.
*
* This function sends a replay pointed to by \a reply which is
* \a len bytes long to the client, as well as the file descriptor
* will be sent 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.
* \param fd_to_send The file descriptor which will be sent to the client;
* it will be ignored if it is less than 0.
*
* \return Zero on success, no-zero on error.
*
* \sa ClientRequest, RegisterRequestHandler
*
* Since 5.0.0
*/
MG_EXPORT int GUIAPI ServerSendReplyEx (int clifd,
const void* reply, int len, int fd_to_send);
/**
* \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.
*
* \note If there is a file descriptor to send along with the reply,
* you should call \a ServerSendReplyEx instead.
*
* \sa ServerSendReplyEx, ClientRequestEx2, RegisterRequestHandler
*/
static inline int GUIAPI ServerSendReply (int clifd, const void* reply, int len)
{
return ServerSendReplyEx (clifd, reply, len, -1);
}
/**
* \var typedef int (* REQ_HANDLER)(int cli, int clifd, void* buff, size_t len)
* \brief The prototype of a request handler (version 0).
*
* \sa RegisterRequestHandler
*/
typedef int (* REQ_HANDLER) (int cli, int clifd, void* buff, size_t len);
/**
* \var typedef int (* REQ_HANDLER_V1)(int cli, int clifd,
void* buff, size_t len, int fd_received)
* \brief The prototype of an extended request handler (version 1).
*
* \sa RegisterRequestHandlerV1
*
* Since 5.0.0
*/
typedef int (* REQ_HANDLER_V1) (int cli, int clifd,
void* buff, size_t len, int fd_received);
/**
* \fn BOOL GUIAPI RegisterRequestHandler (int req_id, REQ_HANDLER your_handler)
* \brief Registers a customized request handler of version 0.
*
* This function registers a request handler (version 0) to the server.
*
* \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 BOOL GUIAPI RegisterRequestHandlerV1 (int req_id,
REQ_HANDLER_V1 your_handler_v1)
* \brief Registers a customized extended request handler of version 1.
*
* This function registers an extended request handler (version 1) to the server.
*
* \param req_id The identifier of the customized request.
* \param your_handler_v1 The handler (version 1) 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 an extended 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
*
* Since 5.0.0
*/
MG_EXPORT BOOL GUIAPI RegisterRequestHandlerV1 (int req_id,
REQ_HANDLER_V1 your_handler_v1);
/**
* \fn REQ_HANDLER GUIAPI GetRequestHandler (int req_id)
* \brief Get 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 If the registered request handler is an extended handler (version 1),
* The function returns NULL.
*
* \note Only used by the server to retrieve the current request handler.
*
* \note This function dose not return the request handler in different version.
* Please use \a GetRequestHandlerEx instead.
*
* \sa RegisterRequestHandler
*/
MG_EXPORT REQ_HANDLER GUIAPI GetRequestHandler (int req_id);
/**
* \fn REQ_HANDLER_V1 GUIAPI GetRequestHandlerV1 (int req_id)
* \brief Get the extended request handler by a 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 If the registered request handler is not an extended handler (version 1),
* The function returns NULL.
*
* \note Only used by the server to retrieve the current request handler.
*
* \note This function dose not return the request handler in different version.
* Please use \a GetRequestHandlerEx instead.
*
* \sa RegisterRequestHandler
*/
MG_EXPORT REQ_HANDLER_V1 GUIAPI GetRequestHandlerV1 (int req_id);
/**
* \fn void* GUIAPI GetRequestHandlerEx (int req_id, int* version)
* \brief Get the request handler and the version by request identifier.
*
* This function returns the request handler and the version of
* the specified request identifier \a req_id.
*
* \param req_id The request identifier.
* \param version The pointer to an integer to store the version number of
* the request handler.
*
* \return The pointer to the handler on success, NULL on error.
*
* \note Only used by the server to retrieve the current request handler.
*
* \sa RegisterRequestHandler, RegisterRequestHandlerV1
*
* Since 5.0.0
*/
MG_EXPORT void* GUIAPI GetRequestHandlerEx (int req_id, int* version);
/** @} 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 ssize_t sock_write_t (int fd, const void* buff,
size_t 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 ssize_t sock_write_t (int fd, const void* buff, size_t count,
DWORD timeout);
/**
* \fn ssize_t sock_read_t (int fd, void* buff, size_t count, DWORD 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 ssize_t sock_read_t (int fd, void* buff, size_t count,
DWORD 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 */
/**
* \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 /* _USE_MINIGUIENTRY */
/**
* \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) (HDC dc_desktop);
/** 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);
#ifndef _MGRM_PROCESSES
#define DUMMY_LAYER_HANDLE (GHANDLE)(-1)
/**
* \fn GHANDLE GUIAPI JoinLayer (const char* layer_name,
const char* client_name,
int max_nr_highers, int max_nr_normals)
* \brief The dummy replacement of the same function for MiniGUI-Processes.
*
* This function is a replacment of the same function for MiniGUI-Processes
* runtime mode. We provide this function for MiniGUI-Threads and
* MiniGUI-Standalone runtime modes, in order to avoid using the
* conditional compilation instructions in your source code.
*
* \return Always returns DUMMY_LAYER_HANDLE to indicate success.
*/
static inline GHANDLE GUIAPI JoinLayer (const char* layer_name,
const char* client_name, int max_nr_highers, int max_nr_normals)
{
return DUMMY_LAYER_HANDLE;
}
#endif /* not defined _MGRM_PROCESSES */
/** @} end of init_fns */
#ifdef _MGHAVE_MOUSECALIBRATE
/**
* \defgroup mouse_calibrate Mouse calibration.
* @{
*/
/**
* \fn BOOL GUIAPI SetMouseCalibrationParameters (const POINT* src_pts,
const POINT* dst_pts)
* \brief Set 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 Get 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);
/** @} end of mouse_calibrate */
#endif /* _MGHAVE_MOUSECALIBRATE */
#ifdef _MGMISC_ABOUTDLG
/**
* \defgroup about_dlg About MiniGUI dialog
* @{
*/
#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 /* _MGRM_THREADS */
/**
* \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 */
/** @} end of about_dlg */
#endif /* _MGMISC_ABOUTDLG */
/**
* \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 Get 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 Get 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 Get 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 Get 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 Set 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 Set 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 Get 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 Get 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 Set 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 Get 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 Get 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 Get 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 Set 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 Get 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 Get 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 Get 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 Get 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 Set 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 Get 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 Get 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 /* !_MGINCORE_RES */
return GetValueFromEtc (hMgEtc, pSection, pKey, pValue, iLen);
}
/**
* \fn static inline int GetMgEtcIntValue (const char *pSection,
const char* pKey, int *value)
* \brief Get 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 /* !_MGINCORE_RES */
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 Set 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 Get 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 Get 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 Get 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 DWORD GUIAPI GetTickCount (void)
* \brief Retrieve the tick counts that have elapsed since MiniGUI was started.
*
* This function retrieves the tick counts that have elapsed since MiniGUI
* was started. It is limited to the resolution of the system timer, i.e.
* for a general Linux box, the returned tick count value is in unit of 10ms.
*
* \return The tick counts value that have elapsed since MiniGUI was started.
*
* \note The prototype had changed since MiniGUI v3.2; The old one:
* unsinged int GUIAPI GetTickCount (void);
*/
MG_EXPORT DWORD GUIAPI GetTickCount (void);
/**
* \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 Get \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
* @{
*/
#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 This function 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 This function does not support 256-color or animation cursor.
*
* \sa SetCursor
*/
MG_EXPORT HCURSOR GUIAPI LoadCursorFromMem (const void* area);
#ifdef _MGSCHEMA_COMPOSITING
/**
* \fn HCURSOR GUIAPI LoadCursorFromPNGFile (const char* filename,
int hotspot_x, int hotspot_y)
* \brief Loads a cursor from a PNG file.
*
* This function loads a cursor from a PNG 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 PNG file.
* \param hotspot_x The x-coordinate of the hot spot.
* \param hotspot_y The y-coordinate of the hot spot.
*
* \return Handle to the cursor, zero on error.
*
* \note This function only available when using compoisting schema.
*
* \sa SetCursor
*
* Since 5.0.0.
*/
MG_EXPORT HCURSOR GUIAPI LoadCursorFromPNGFile (const char* filename,
int hotspot_x, int hotspot_y);
/**
* \fn HCURSOR GUIAPI LoadCursorFromPNGMem (const void* area, size_t size,
int hotspot_x, int hotspot_y)
* \brief Loads a cursor from a memory area in PNG layout.
*
* This function loads a cursor from a memory area pointed to by \a area.
* The memory has the same layout as a PNG file.
* The returned handle can be used by \a SetCursor to set new mouse cursor.
*
* \param area The pointer to the PNG data.
* \param size The size of the PNG data in bytes.
* \param hotspot_x The x-coordinate of the hot spot.
* \param hotspot_y The y-coordinate of the hot spot.
*
* \return Handle to the cursor, zero on error.
*
* \note This function only available when using compoisting schema.
*
* \sa SetCursor
*
* Since 5.0.0.
*/
MG_EXPORT HCURSOR GUIAPI LoadCursorFromPNGMem (const void* area, size_t size,
int hotspot_x, int hotspot_y);
#endif /* _MGSCHEMA_COMPOSITING */
/**
* \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 This function only supports 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 Get 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 Get 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 /* _MGHAVE_CURSOR */
static inline HCURSOR LoadCursorFromFile (const char* filename) {
return (HCURSOR)0;
}
static inline HCURSOR GUIAPI LoadCursorFromMem (const void* area) {
return (HCURSOR)0;
}
#ifdef _MGSCHEMA_COMPOSITING
static inline
HCURSOR LoadCursorFromPNGFile(const char* filename,
int hotspot_x, int hotspot_y) {
return (HCURSOR)0;
}
static inline
HCURSOR GUIAPI LoadCursorFromPNGMem(const void* area, size_t size,
int hotspot_x, int hotspot_y) {
return (HCURSOR)0;
}
#endif
static inline
HCURSOR CreateCursor (int xhotspot, int yhotspot, int w, int h,
const BYTE* pANDBits, const BYTE* pXORBits, int colornum) {
return (HCURSOR)0;
}
static inline HCURSOR GUIAPI CopyCursor (HCURSOR hcsr) {
return (HCURSOR)0;
}
static inline BOOL DestroyCursor (HCURSOR hcsr) {
return TRUE;
}
static inline HCURSOR GetSystemCursor (int csrid) {
return (HCURSOR)0;
}
static inline HCURSOR GUIAPI GetCurrentCursor (void) {
return (HCURSOR)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 Get 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 Get 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 Set 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);
/**
* \fn HCURSOR GUIAPI GetDefaultCursor (void)
* \brief Get 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);
/**
* \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 /* _MGHAVE_CURSOR */
static inline HCURSOR SetCursorEx(HCURSOR hcsr, BOOL set_def) {
return (HCURSOR)0;
}
static inline HCURSOR GetDefaultCursor(void) {
return (HCURSOR)0;
}
static inline int GUIAPI ShowCursor (BOOL fShow) {
return 0;
}
#endif /* !_MGHAVE_CURSOR */
/**
* \fn HCURSOR SetCursor(HCURSOR 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
*/
static inline HCURSOR SetCursor(HCURSOR hcsr) {
return SetCursorEx (hcsr, FALSE);
}
/**
* \fn HCURSOR SetDefaultCursor(HCURSOR 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
*/
static inline HCURSOR SetDefaultCursor(HCURSOR hcsr) {
return SetCursorEx (hcsr, TRUE);
}
/** @} end of cursor_fns */
/**
* \defgroup key_status Asynchronous key status functions
* @{
*/
/**
* \fn BOOL GUIAPI GetKeyStatus (UINT uKey)
* \brief Get 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 Get 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 Get 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 Get 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 */
/**
* \defgroup slices_allocator_fns Slice Memory Allocator
*
* An efficient way to allocate groups of equal-sized chunks of memory.
*
* Memory slices provide a space-efficient and multi-processing scalable
* way to allocate equal-sized pieces of memory, just like the
* MiniGUI's block data heap (\a block_heap_fns). Relative to the
* standard malloc function and block data heap, this allocator can
* avoid excessive memory-waste, scalability and performance problems.
*
* Note that this implementation is derived from LGPL'd glib.
*
* To achieve these goals, the slice allocator uses a sophisticated,
* layered design that has been inspired by Bonwick's slab allocator
* ([Bonwick94](http://citeseer.ist.psu.edu/bonwick94slab.html)
* Jeff Bonwick, The slab allocator: An object-caching kernel
* memory allocator. USENIX 1994, and
* [Bonwick01](http://citeseer.ist.psu.edu/bonwick01magazines.html)
* Bonwick and Jonathan Adams, Magazines and vmem: Extending the
* slab allocator to many cpu's and arbitrary resources. USENIX 2001)
*
* It uses posix_memalign() to optimize allocations of many equally-sized
* chunks, and has per-thread free lists (the so-called magazine layer)
* to quickly satisfy allocation requests of already known structure sizes.
* This is accompanied by extra caching logic to keep freed memory around
* for some time before returning it to the system. Memory that is unused
* due to alignment constraints is used for cache colorization (random
* distribution of chunk addresses) to improve CPU cache utilization. The
* caching layer of the slice allocator adapts itself to high lock
* contention to improve scalability.
*
* The slice allocator can allocate blocks as small as two pointers, and
* unlike malloc(), it does not reserve extra space per block. For large
* block sizes, mg_slice_new() and mg_slice_alloc() will automatically
* delegate to the system malloc() implementation. For newly written code
* it is recommended to use the new `mg_slice` API instead of malloc() and
* friends, as long as objects are not resized during their lifetime and
* the object size used at allocation time is still available when freeing.
*
* Here is an example for using the slice allocator:
*
* \code
* char *mem[10000];
* int i;
*
* // Allocate 10000 blocks.
* for (i = 0; i < 10000; i++)
* {
* mem[i] = mg_slice_alloc (50);
*
* // Fill in the memory with some junk.
* for (j = 0; j < 50; j++)
* mem[i][j] = i * j;
* }
*
* // Now free all of the blocks.
* for (i = 0; i < 10000; i++)
* mg_slice_free (50, mem[i]);
* \endcode
*
* And here is an example for using the slice allocator
* with data structures:
*
* \code
* MyStruct *array;
*
* // Allocate one block, using the mg_slice_new() macro.
* array = mg_slice_new (MyStruct);
*
* // We can now use array just like a normal pointer to a structure.
* array->data = NULL;
* array->len = 0;
* array->alloc = 0;
* array->zero_terminated = (zero_terminated ? 1 : 0);
* array->clear = (clear ? 1 : 0);
* array->elt_size = elt_size;
*
* // We can free the block, so it can be reused.
* mg_slice_delete (MyStruct, array);
* \endcode
*
* @{
*/
/**
* \fn void *mg_slice_alloc(size_t block_size)
* \brief Allocate a slice memory.
*
* Allocates a block of memory from the slice allocator.
* The block address handed out can be expected to be aligned
* to at least 1 * sizeof (void*),
* though in general slices are 2 * sizeof (void*) bytes aligned,
* if a malloc() fallback implementation is used instead,
* the alignment may be reduced in a libc dependent fashion.
* Note that the underlying slice allocation mechanism can
* be changed with the [`MG_SLICE=always-malloc`][MG_SLICE]
* environment variable.
*
* \param block_size The number of bytes to allocate.
*
* \return A pointer to the allocated memory block, which will be NULL
* if and only if \a mem_size is 0.
*
* Since: 4.0.0
*/
MG_EXPORT void *mg_slice_alloc(size_t block_size);
/**
* \fn void *mg_slice_alloc0(size_t block_size)
* \brief Allocate a slice memory and initialize the memory to zero.
*
* Allocates a block of memory via mg_slice_alloc() and initializes
* the returned memory to 0. Note that the underlying slice allocation
* mechanism can be changed with the [`MG_SLICE=always-malloc`][MG_SLICE]
* environment variable.
*
* \param block_size The number of bytes to allocate.
*
* \return A pointer to the allocated block, which will be NULL
* if and only if \a mem_size is 0.
*
* Since: 4.0.0
*/
MG_EXPORT void *mg_slice_alloc0(size_t block_size);
/**
* \fn void *mg_slice_copy(size_t block_size, const void *mem_block)
* \brief Allocate and copy a slice.
*
* Allocates a block of memory from the slice allocator
* and copies \a block_size bytes into it from \a mem_block.
*
* \param block_size The number of bytes to allocate.
* \param mem_block The memory to copy.
*
* \return A pointer to the allocated memory block, which will be NULL
* if and only if \a mem_size is 0.
*
* \note \a mem_block must be non-NULL if \a block_size is non-zero.
*
* Since: 4.0.0
*/
MG_EXPORT void *mg_slice_copy(size_t block_size, const void *mem_block);
/**
* \fn void mg_slice_free(size_t block_size, void *mem_block)
* \brief Free a block of memory.
*
* This function frees a block of memory. The memory must have been
* allocated via \a mg_slice_alloc or
* \a mg_slice_alloc0 and the \a block_size has to match the size
* specified upon allocation. Note that the exact release behaviour
* can be changed with the [`MG_DEBUG=gc-friendly`][MG_DEBUG] environment
* variable, also see [`MG_SLICE`][MG_SLICE] for related debugging options.
*
* If \a mem_block is NULL, this function does nothing.
*
* \param block_size The size of the block.
* \param mem_block A pointer to the block to free.
*
* Since: 4.0.0
*/
MG_EXPORT void mg_slice_free(size_t block_size, void *mem_block);
/**
* \fn void mg_slice_free_chain_with_offset(size_t block_size,
void *mem_chain, size_t next_offset)
* \brief Free a linked list of memory blocks.
*
* The memory blocks must be equal-sized, allocated via
* mg_slice_alloc() or mg_slice_alloc0() and linked together by a
* next pointer. The offset of the next field in each block is passed
* as the third argument \a next_offset.
*
* Note that the exact release behaviour can be changed with the
* [`MG_DEBUG=gc-friendly`][MG_DEBUG] environment variable, also see
* [`MG_SLICE`][MG_SLICE] for related debugging options.
*
* If \a mem_chain is NULL, this function does nothing.
*
* \param block_size The size of the blocks.
* \param mem_chain A pointer to the first block of the chain.
* \param next_offset The offset of the next field in the blocks.
*
* Since: 4.0.0
*/
MG_EXPORT void mg_slice_free_chain_with_offset(size_t block_size,
void *mem_chain, size_t next_offset);
/**
* \def mg_slice_new(type)
* \brief The macro to allocate a slice memory for a structure.
*
* This is a convenience macro to allocate a block of memory from the
* slice allocator.
*
* It calls mg_slice_alloc() with `sizeof(type)` and casts the
* returned pointer to a pointer of the given type, avoiding a type
* cast in the source code. Note that the underlying slice allocation
* mechanism can be changed with the [`MG_SLICE=always-malloc`][MG_SLICE]
* environment variable.
*
* This can never return NULL as the minimum allocation size from
* `sizeof(type)` is 1 byte.
*
* \param type the type to allocate, typically a structure name.
*
* \return A pointer to the allocated block, cast to a pointer
* to \a type.
*
* Since: 4.0.0
*/
#define mg_slice_new(type) ((type*)mg_slice_alloc(sizeof (type)))
/**
* \def mg_slice_new0(type)
* \brief The macro to allocate a zero'd slice memory for a structure.
*
* This is a convenience macro to allocate a block of memory from the
* slice allocator and set the memory to 0.
*
* It calls mg_slice_alloc0() with `sizeof(type)`
* and casts the returned pointer to a pointer of the given type,
* avoiding a type cast in the source code.
*
* Note that the underlying slice allocation mechanism can
* be changed with the [`MG_SLICE=always-malloc`][MG_SLICE]
* environment variable.
*
* This can never return NULL as the minimum allocation size from
* `sizeof(type)` is 1 byte.
*
* \param type The type to allocate, typically a structure name.
*
* \return A pointer to the allocated block, cast to a pointer
* to \a type.
*
* Since: 4.0.0
*/
#define mg_slice_new0(type) ((type*)mg_slice_alloc0(sizeof (type)))
/* MemoryBlockType *
* mg_slice_dup (MemoryBlockType,
* MemoryBlockType *mem_block);
* mg_slice_delete (MemoryBlockType,
* MemoryBlockType *mem_block);
* mg_slice_delete_chain (MemoryBlockType,
* MemoryBlockType *first_chain_block,
* memory_block_next_field);
* pseudo prototypes for the macro definitions following below.
*/
/**
* \def mg_slice_dup(type, mem)
* \brief Duplicate a structure.
*
* This is a convenience macro to duplicate a block of memory using
* the slice allocator.
*
* It calls mg_slice_copy() with `sizeof(type)`
* and casts the returned pointer to a pointer of the given type,
* avoiding a type cast in the source code.
* Note that the underlying slice allocation mechanism can
* be changed with the [`MG_SLICE=always-malloc`][MG_SLICE]
* environment variable.
*
* This can never return NULL.
*
* \param type The type to duplicate, typically a structure name.
* \param mem The memory to copy into the allocated block.
*
* \return A pointer to the allocated block, cast to a pointer to \a type.
*
* Since: 4.0.0
*/
#define mg_slice_dup(type, mem) \
(1 ? (type*) mg_slice_copy (sizeof (type), (mem)) \
: ((void) ((type*) 0 == (mem)), (type*) 0))
/**
* \def mg_slice_delete(type, mem)
* \brief Free a block of memory.
*
* This is a convenience macro to free a block of memory that has
* been allocated from the slice allocator.
*
* It calls mg_slice_free() using `sizeof(type)` as the block size.
*
* Note that the exact release behaviour can be changed with the
* [`MG_DEBUG=gc-friendly`][MG_DEBUG] environment variable, also see
* [`MG_SLICE`][MG_SLICE] for related debugging options.
*
* If \a mem is NULL, this macro does nothing.
*
* \param type The type of the block to free, typically a structure name.
* \param mem A pointer to the block to free.
*
* \return None.
*
* Since: 4.0.0
*/
#define mg_slice_delete(type, mem) \
do { \
if (1) mg_slice_free (sizeof (type), (mem)); \
else (void) ((type*) 0 == (mem)); \
} while(0)
/**
* \def mg_slice_delete_chain(type, mem_chain, next)
* \brief Free a linked list of memory blocks.
*
* This function frees a linked list of memory blocks of
* structure type \a type.
*
* The memory blocks must be equal-sized, allocated via
* mg_slice_alloc() or mg_slice_alloc0() and linked together by
* a \a next pointer. The name of the
* \a next field in \a type is passed as third argument.
*
* Note that the exact release behaviour can be changed with the
* [`MG_DEBUG=gc-friendly`][MG_DEBUG] environment variable, also see
* [`MG_SLICE`][MG_SLICE] for related debugging options.
*
* If \a mem_chain is NULL, this function does nothing.
*
* \param type The type of the \a mem_chain blocks.
* \param mem_chain A pointer to the first block of the chain.
* \param next The field name of the next pointer in \a type.
*
* Since: 4.0.0
*/
#define mg_slice_delete_chain(type, mem_chain, next) \
do { \
if (1) mg_slice_free_chain_with_offset (sizeof (type), \
(mem_chain), G_STRUCT_OFFSET (type, next)); \
else (void) ((type*) 0 == (mem_chain)); \
} while(0)
#ifdef _MGDEVEL_MODE
MG_EXPORT void mg_slice_debug_tree_statistics(void);
#endif
/** @} end of slices_allocator_fns */
/** @} end of global_fns */
/** @} end of fns */
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _MGUI_MINIGUI_H */