mirror of
https://github.com/VincentWei/MiniGUI.git
synced 2026-09-25 19:13:46 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
59a6a1369d |
+2
-2
@@ -1,6 +1,6 @@
|
||||
Version 5.2.0 (2023/09/30)
|
||||
Version 5.0.13 (2023/08/31)
|
||||
|
||||
This is a minor enhancement and bugfix release of MiniGUI 5.2.x, the stable version.
|
||||
This is a minor enhancement and bugfix release of MiniGUI 5.0.x, the stable version.
|
||||
|
||||
Other packages for MiniGUI resource, tools, components, and samples:
|
||||
|
||||
|
||||
+4
-4
@@ -1,6 +1,6 @@
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
AC_PREREQ(2.60)
|
||||
AC_INIT(libminigui, 5.2.0)
|
||||
AC_INIT(libminigui, 5.0.14)
|
||||
AC_CONFIG_SRCDIR(src/main/main.c)
|
||||
|
||||
dnl Set various version strings - taken gratefully from the SDL sources
|
||||
@@ -15,8 +15,8 @@ dnl Set various version strings - taken gratefully from the SDL sources
|
||||
# set MINIGUI_BINARY_AGE and MINIGUI_INTERFACE_AGE to 0.
|
||||
#
|
||||
MINIGUI_MAJOR_VERSION=5
|
||||
MINIGUI_MINOR_VERSION=2
|
||||
MINIGUI_MICRO_VERSION=0
|
||||
MINIGUI_MINOR_VERSION=0
|
||||
MINIGUI_MICRO_VERSION=14
|
||||
MINIGUI_INTERFACE_AGE=0
|
||||
MINIGUI_BINARY_AGE=0
|
||||
MINIGUI_VERSION=$MINIGUI_MAJOR_VERSION.$MINIGUI_MINOR_VERSION.$MINIGUI_MICRO_VERSION
|
||||
@@ -62,7 +62,7 @@ dnl ========================================================================
|
||||
dnl Checks for header files.
|
||||
AC_HEADER_STDC
|
||||
AC_HEADER_DIRENT
|
||||
AC_CHECK_HEADERS(limits.h math.h stdatomic.h locale.h unistd.h termio.h sys/types.h sys/time.h sys/select.h sys/memfd.h)
|
||||
AC_CHECK_HEADERS(limits.h math.h locale.h unistd.h termio.h sys/types.h sys/time.h sys/select.h sys/memfd.h)
|
||||
|
||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_C_CONST
|
||||
|
||||
@@ -268,8 +268,6 @@ MGUI_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8);
|
||||
#define MG_UNLIKELY(expr) (expr)
|
||||
#endif
|
||||
|
||||
#define HAVE(FEATURE) (defined HAVE_##FEATURE && HAVE_##FEATURE)
|
||||
|
||||
/**
|
||||
* \defgroup endian_info Endianness information
|
||||
* @{
|
||||
|
||||
+58
-99
@@ -1704,13 +1704,12 @@ MG_EXPORT BOOL GUIAPI IsScreenDC (HDC hdc);
|
||||
*/
|
||||
MG_EXPORT BOOL GUIAPI IsWindowDC (HDC hdc);
|
||||
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
struct GAL_Surface;
|
||||
typedef struct GAL_Surface *HSURF;
|
||||
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
/**
|
||||
* \fn HSURF GUIAPI CreateSharedSurface (GHANDLE video,
|
||||
* const char *name, DWORD flags,
|
||||
* \fn HSURF GUIAPI CreateSharedSurface (const char *name, DWORD flags,
|
||||
* int width, int height, int depth,
|
||||
* Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask)
|
||||
* \brief Creates a shared surface for specified size and pixel format.
|
||||
@@ -1718,8 +1717,8 @@ typedef struct GAL_Surface *HSURF;
|
||||
* This function creates a shared surface on the current video device with
|
||||
* the specified size and pixel format. This function also registers
|
||||
* the shared surface by using the specified name \a name to the server
|
||||
* if \a name is not NULL. Another client can use the name to get
|
||||
* the shared surface by calling \a GetSharedSurfaceFDByName().
|
||||
* if \a name is not NULL. Another client can use the name to retrieve
|
||||
* the shared surface by calling \a RetrieveSharedSurfaceFDByName().
|
||||
|
||||
* \param video The handle to the video; NULL for the current default video.
|
||||
* \param name The gobal unique name for the shared surface.
|
||||
@@ -1741,12 +1740,11 @@ typedef struct GAL_Surface *HSURF;
|
||||
*
|
||||
* \note This function only available when _MGSCHEMA_COMPOSITING is defined.
|
||||
*
|
||||
* \sa DestroySharedSurface, GetSharedSurfaceFDByName
|
||||
* \sa DestroySharedSurface, RetrieveSharedSurfaceFDByName
|
||||
*
|
||||
* Since 5.2.0
|
||||
*/
|
||||
MG_EXPORT HSURF GUIAPI CreateSharedSurface (GHANDLE video,
|
||||
const char *name, DWORD flags,
|
||||
MG_EXPORT HSURF GUIAPI CreateSharedSurface (const char *name, DWORD flags,
|
||||
int width, int height, int depth,
|
||||
Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask);
|
||||
|
||||
@@ -1772,7 +1770,7 @@ MG_EXPORT BOOL GUIAPI DestroySharedSurface (HSURF surf);
|
||||
|
||||
/**
|
||||
* \fn int GUIAPI GetSharedSurfaceFDByClientWindow (int client,
|
||||
* HWND hwnd, size_t *map_size, DWORD *flags)
|
||||
* HWND hwnd)
|
||||
* \brief Gets the file descriptor of the shared surface of a window created
|
||||
* by another client.
|
||||
*
|
||||
@@ -1783,26 +1781,21 @@ MG_EXPORT BOOL GUIAPI DestroySharedSurface (HSURF surf);
|
||||
*
|
||||
* \param client The client identifier.
|
||||
* \param hwnd The handle to the window created by the client.
|
||||
* \param map_size The pointer to a buffer of size_t to receive the whole size
|
||||
* of the shared surface in bytes; nullable.
|
||||
* \param flags The pointer to a buffer of DWORD to receive the flags of
|
||||
* the shared surface; nullable.
|
||||
*
|
||||
* \return The file descriptor which represents the shared surface on success;
|
||||
* a value less than 0 for failure.
|
||||
*
|
||||
* \note This function only available when _MGSCHEMA_COMPOSITING is defined.
|
||||
*
|
||||
* \sa AttachToSharedSurface, GetWindowSharedSurfaceFD
|
||||
* \sa CreateSharedSurface
|
||||
*
|
||||
* Since 5.2.0
|
||||
*/
|
||||
MG_EXPORT int GUIAPI GetSharedSurfaceFDByClientWindow (int client,
|
||||
HWND hwnd, size_t *map_size, DWORD *flags);
|
||||
HWND hwnd);
|
||||
|
||||
/**
|
||||
* \fn int GUIAPI GetSharedSurfaceFDByName (const char *name,
|
||||
* size_t *map_size, DWORD *flags)
|
||||
* \fn int GUIAPI GetSharedSurfaceFDByName (const char *name)
|
||||
* \brief Gets the file descriptor of a shared surface by name.
|
||||
*
|
||||
* This function gets the file descriptor of the shared surface created
|
||||
@@ -1811,10 +1804,6 @@ MG_EXPORT int GUIAPI GetSharedSurfaceFDByClientWindow (int client,
|
||||
* the shared surface.
|
||||
*
|
||||
* \param name The gobal unique name for the shared surface.
|
||||
* \param map_size The pointer to a buffer of size_t to receive the whole size
|
||||
* of the shared surface in bytes; nullable.
|
||||
* \param flags The pointer to a buffer of DWORD to receive the flags of
|
||||
* the shared surface; nullable.
|
||||
*
|
||||
* \return The file descriptor which represents the shared surface on success;
|
||||
* a value less than 0 for failure.
|
||||
@@ -1825,12 +1814,10 @@ MG_EXPORT int GUIAPI GetSharedSurfaceFDByClientWindow (int client,
|
||||
*
|
||||
* Since 5.2.0
|
||||
*/
|
||||
MG_EXPORT int GUIAPI GetSharedSurfaceFDByName (const char *name,
|
||||
size_t *map_size, DWORD *flags);
|
||||
MG_EXPORT int GUIAPI GetSharedSurfaceFDByName (const char *name);
|
||||
|
||||
/**
|
||||
* \fn HSURF GUIAPI AttachToSharedSurface (GHANDLE video, int fd,
|
||||
* size_t map_size, DWORD flags)
|
||||
* \fn HSURF GUIAPI AttachToSharedSurface (GHANDLE video, int fd)
|
||||
* \brief Attaches to a shared surface.
|
||||
*
|
||||
* This function attaches to the shared surface which is represents by
|
||||
@@ -1847,22 +1834,18 @@ MG_EXPORT int GUIAPI GetSharedSurfaceFDByName (const char *name,
|
||||
*
|
||||
* Since 5.2.0
|
||||
*/
|
||||
MG_EXPORT HSURF GUIAPI AttachToSharedSurface (GHANDLE video, int fd,
|
||||
size_t map_size, DWORD flags);
|
||||
MG_EXPORT HSURF GUIAPI AttachToSharedSurface (GHANDLE video, int fd);
|
||||
|
||||
/**
|
||||
* \fn const char *GUIAPI GetSharedSurfaceInfo (HSURF surf, int *fd,
|
||||
* SIZE *size, int *pitch, size_t *map_size, off_t *pixels_off)
|
||||
* \brief Gets the basic information of a shared surface.
|
||||
* \fn int GUIAPI GetSharedSurfaceInfo (HSURF surf, SIZE *size, int *pitch,
|
||||
* size_t *file_size, size_t *pixel_off)
|
||||
* \brief Gets the file descriptor of a shared surface.
|
||||
*
|
||||
* This function gets the name and other information of
|
||||
* the given shared surface \a surf. It also returns the file descriptor,
|
||||
* the size, or the pitch of the surface if \a fd, \a size or \a pitch
|
||||
* is not NULL.
|
||||
* This function gets the file descriptor of the shared surface. It also
|
||||
* returns the size and the pitch of the surface if \a size or \a pitch is
|
||||
* not NULL.
|
||||
*
|
||||
* \param surf The handle to the shared surface.
|
||||
* \param fd The pointer to a buffer of int to return the file descriptor of
|
||||
* the shared surface; nullable.
|
||||
* \param size The pointer to a buffer of SIZE to return the size of
|
||||
* the shared surface; nullable.
|
||||
* \param pitch The pointer to a buffer of int for value of pitch; nullable.
|
||||
@@ -1871,8 +1854,8 @@ MG_EXPORT HSURF GUIAPI AttachToSharedSurface (GHANDLE video, int fd,
|
||||
* \param pixel_off The pointer to a buffer of size_t for the offset of
|
||||
* pixel data; nullable.
|
||||
*
|
||||
* \return The name of the shared surface on success; NULL for failure.
|
||||
* Note that if the name is an empty string, it is an anonymous surface.
|
||||
* \return The file descriptor of the shared surface on success;
|
||||
* a value less than zero for failure.
|
||||
*
|
||||
* \note This function only available when _MGSCHEMA_COMPOSITING is defined.
|
||||
*
|
||||
@@ -1880,48 +1863,30 @@ MG_EXPORT HSURF GUIAPI AttachToSharedSurface (GHANDLE video, int fd,
|
||||
*
|
||||
* Since 5.2.0
|
||||
*/
|
||||
MG_EXPORT const char *GUIAPI GetSharedSurfaceInfo (HSURF surf, int *fd,
|
||||
SIZE *size, int *pitch, size_t *map_size, off_t *pixels_off);
|
||||
MG_EXPORT int GUIAPI GetSharedSurfaceInfo (HSURF surf, SIZE *size, int *pitch,
|
||||
size_t *file_size, size_t *pixel_off);
|
||||
|
||||
/**
|
||||
* \fn BOOL GUIAPI TestIfSharedSurfaceChanged (HSURF surf,
|
||||
* unsigned dirty_age)
|
||||
* \brief Tests if a shared surface changed.
|
||||
* \fn BOOL GUIAPI LockSharedSurfaceIfDirty (HSURF surf,
|
||||
* unsigned old_dirty_age, unsigned *dirty_age,
|
||||
* int *nr_dirty_rects, RECT *const *dirty_rects)
|
||||
* \brief Locks the shared surface if it is dirty.
|
||||
*
|
||||
* This function tests if the given shared surface \a surf had changed, i.e.,
|
||||
* it has a different dirty age value against the specified value \a dirty_age.
|
||||
* This function compares the dirty age of the shared surface with the value
|
||||
* containing in \a dirty_age, and lock the shared surface if it has
|
||||
* a larger dirty age value.
|
||||
*
|
||||
* \param surf The handle to the shared surface.
|
||||
* \param dirty_age The dirty age to compare.
|
||||
*
|
||||
* \return TRUE for changed; FALSE for no change or failure.
|
||||
*
|
||||
* \note This function only available when _MGSCHEMA_COMPOSITING is defined.
|
||||
*
|
||||
* \sa LockSharedSurface
|
||||
*
|
||||
* Since 5.2.0
|
||||
*/
|
||||
MG_EXPORT BOOL GUIAPI TestIfSharedSurfaceChanged (HSURF surf,
|
||||
unsigned dirty_age);
|
||||
|
||||
/**
|
||||
* \fn BOOL GUIAPI LockSharedSurface (HSURF surf,
|
||||
* unsigned *dirty_age, int *nr_dirty_rects, const RECT **dirty_rects)
|
||||
* \brief Locks the shared surface for read.
|
||||
*
|
||||
* This function locks the given shared surface \a surf and returns
|
||||
* the dirty information.
|
||||
*
|
||||
* \param surf The handle to the shared surface.
|
||||
* \param dirty_age The pointer to a buffer of unsigned integer to
|
||||
* return the latest dirty age of the shared surface; nullable.
|
||||
* \param old_dirty_age The old dirty age.
|
||||
* \param dirty_age The pointer to a buffer of unsigned integer to return
|
||||
* the current dirty age of the shared surface.
|
||||
* \param nr_dirty_rects The pointer to a buffer of integer to return the valid
|
||||
* dirty rectangles; nullable.
|
||||
* \param dirty_rects The pointer to a buffer of (const RECT *) for the array
|
||||
* of dirty rectangles; nullable.
|
||||
*
|
||||
* \return TRUE for locked; FALSE for failure.
|
||||
* \return TRUE for success and if the value contains in \a dirty_age is larger
|
||||
* than \a old_dirty_age, the surface was locked; otherwise failure.
|
||||
*
|
||||
* \note This function only available when _MGSCHEMA_COMPOSITING is defined.
|
||||
*
|
||||
@@ -1929,26 +1894,31 @@ MG_EXPORT BOOL GUIAPI TestIfSharedSurfaceChanged (HSURF surf,
|
||||
*
|
||||
* Since 5.2.0
|
||||
*/
|
||||
MG_EXPORT BOOL GUIAPI LockSharedSurface (HSURF surf,
|
||||
unsigned *dirty_age, int *nr_dirty_rects, const RECT **dirty_rects);
|
||||
MG_EXPORT BOOL GUIAPI LockSharedSurfaceIfDirty (HSURF surf,
|
||||
unsigned old_dirty_age, unsigned *dirty_age,
|
||||
int *nr_dirty_rects, RECT *const *dirty_rects);
|
||||
|
||||
/**
|
||||
* \fn BOOL GUIAPI UnlockSharedSurface (HSURF surf)
|
||||
* \brief Unlocks the shared surface.
|
||||
* \fn BOOL GUIAPI UnlockSharedSurface (HSURF surf, BOOL clear_dirty)
|
||||
* \brief Unocks the shared surface and clears the dirty information.
|
||||
*
|
||||
* This function unlocks the given shared surface \a surf.
|
||||
* This function compares the dirty age of the shared surface with the value
|
||||
* containing in \a dirty_age, and lock the shared surface if it has
|
||||
* a larger dirty age value.
|
||||
*
|
||||
* \param surf The handle to the shared surface.
|
||||
* \param clear_dirty A boolean value indicates whether to clear the dirty
|
||||
* information of the shared surface.
|
||||
*
|
||||
* \return TRUE on success; otherwise failure.
|
||||
*
|
||||
* \note This function only available when _MGSCHEMA_COMPOSITING is defined.
|
||||
*
|
||||
* \sa LockSharedSurface
|
||||
* \sa LockSharedSurfaceIfDirty
|
||||
*
|
||||
* Since 5.2.0
|
||||
*/
|
||||
MG_EXPORT BOOL GUIAPI UnlockSharedSurface (HSURF surf);
|
||||
MG_EXPORT BOOL GUIAPI UnlockSharedSurface (HSURF surf, BOOL clear_dirty);
|
||||
|
||||
/**
|
||||
* \fn BOOL GUIAPI DetachFromSharedSurface (HSURF surf)
|
||||
@@ -1968,39 +1938,28 @@ MG_EXPORT BOOL GUIAPI UnlockSharedSurface (HSURF surf);
|
||||
* Since 5.2.0
|
||||
*/
|
||||
MG_EXPORT BOOL GUIAPI DetachFromSharedSurface (HSURF surf);
|
||||
#endif /* _MGSCHEMA_COMPOSITING */
|
||||
|
||||
/**
|
||||
* \fn HDC GUIAPI CreateMemDCFromSurface (HSURF surf);
|
||||
* \brief Creates a memory DC from a surface.
|
||||
* \fn HDC GUIAPI CreateMemDCOnSharedSurface (HSURF surf, const RECT *rect);
|
||||
* \brief Creates a memory DC on a shared surface.
|
||||
*
|
||||
* This function creates a memory DC on the specified surface \a surf.
|
||||
* This function creates a memory DC on the specified shared surface \a surf
|
||||
* within the specified rectangle \a rect on the surface.
|
||||
*
|
||||
* \param surf The handle to the shared surface.
|
||||
* \param rect A rectangle in the surface which defines the bounds of memory DC;
|
||||
* NULL for whole surface.
|
||||
*
|
||||
* \return The handle to a new memory DC, HDC_INVALID indicates an error.
|
||||
*
|
||||
* \note This function only available when _MGSCHEMA_COMPOSITING is defined.
|
||||
*
|
||||
* \sa DeleteMemDC
|
||||
*
|
||||
* Since 5.2.0
|
||||
* Since 5.0.13
|
||||
*/
|
||||
MG_EXPORT HDC GUIAPI CreateMemDCFromSurface(HSURF surf);
|
||||
|
||||
/**
|
||||
* \fn HSURF GUIAPI GetSurfaceFromDC(HDC hdc);
|
||||
* \brief Gets surface handle from a DC.
|
||||
*
|
||||
* This function returns the handle to the surface of the given DC \a hdc.
|
||||
*
|
||||
* \param hdc The handle to the DC.
|
||||
*
|
||||
* \return The handle to the surface, NULL for failure.
|
||||
*
|
||||
* \sa CreateMemDCFromSurface
|
||||
*
|
||||
* Since 5.2.0
|
||||
*/
|
||||
MG_EXPORT HSURF GUIAPI GetSurfaceFromDC(HDC hdc);
|
||||
MG_EXPORT HDC GUIAPI CreateMemDCOnSharedSurface (HSURF surf, const RECT *rect);
|
||||
#endif /* _MGSCHEMA_COMPOSITING */
|
||||
|
||||
/**
|
||||
* \fn HDC GUIAPI CreateMemDCEx (int width, int height, int depth, DWORD flags, \
|
||||
|
||||
+5
-86
@@ -456,45 +456,6 @@ MG_EXPORT void GUIAPI MiniGUIPanic (int exitcode);
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn GHANDLE GUIAPI JoinLayerEx (const char* layer_name,
|
||||
const char* client_name,
|
||||
int max_nr_highers, int max_nr_normals, int *cli_id)
|
||||
* \brief Joins to a layer and returns the client identifier if success.
|
||||
*
|
||||
* 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.
|
||||
* \param cli_id The pointer to a buffer of int to return the client identifier.
|
||||
*
|
||||
* \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 JoinLayerEx (const char* layer_name,
|
||||
const char* client_name,
|
||||
int max_nr_highers, int max_nr_normals, int *cli_id);
|
||||
|
||||
/**
|
||||
* \fn GHANDLE GUIAPI JoinLayer (const char* layer_name,
|
||||
const char* client_name,
|
||||
@@ -529,30 +490,9 @@ MG_EXPORT GHANDLE GUIAPI JoinLayerEx (const char* layer_name,
|
||||
*
|
||||
* \sa GetLayerInfo, ServerStartup, ServerCreateLayer
|
||||
*/
|
||||
static inline GHANDLE GUIAPI JoinLayer (const char* layer_name,
|
||||
MG_EXPORT GHANDLE GUIAPI JoinLayer (const char* layer_name,
|
||||
const char* client_name,
|
||||
int max_nr_highers, int max_nr_normals)
|
||||
{
|
||||
return JoinLayerEx (layer_name, client_name,
|
||||
max_nr_highers, max_nr_normals, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn int GUIAPI GetClientId (void)
|
||||
* \brief Gets the client identifier.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* \return Returns the client identifier of the current process.
|
||||
* Note that the server always returns 0.
|
||||
*
|
||||
* \sa JoinLayerEx
|
||||
*
|
||||
* Since 5.2.0
|
||||
*/
|
||||
MG_EXPORT int GUIAPI GetClientId (void);
|
||||
int max_nr_highers, int max_nr_normals);
|
||||
|
||||
/**
|
||||
* \fn GHANDLE GUIAPI GetLayerInfo (const char* layer_name,
|
||||
@@ -2018,7 +1958,7 @@ const CompositorOps* __ex_compositor_get (const char* name,
|
||||
*
|
||||
* \sa RegisterRequestHandler
|
||||
*/
|
||||
#define MAX_SYS_REQID 0x0023
|
||||
#define MAX_SYS_REQID 0x0024
|
||||
|
||||
/**
|
||||
* \def MAX_REQID
|
||||
@@ -2185,7 +2125,7 @@ MG_EXPORT int GUIAPI ServerSendReplyEx (int clifd,
|
||||
* \fn int GUIAPI ServerSendReply (int clifd, const void* reply, int len)
|
||||
* \brief Sends the reply to the client.
|
||||
*
|
||||
* This function sends a reply pointed to by \a reply which is
|
||||
* 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.
|
||||
@@ -2733,26 +2673,6 @@ MG_EXPORT void GUIAPI DesktopUpdateAllWindow (void);
|
||||
|
||||
#define DUMMY_LAYER_HANDLE (GHANDLE)(-1)
|
||||
|
||||
/**
|
||||
* \fn GHANDLE GUIAPI JoinLayerEx (const char* layer_name,
|
||||
const char* client_name,
|
||||
int max_nr_highers, int max_nr_normals, int *cli_fd)
|
||||
* \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 JoinLayerEx (const char* layer_name,
|
||||
const char* client_name,
|
||||
int max_nr_highers, int max_nr_normals, int *cli_fd)
|
||||
{
|
||||
return DUMMY_LAYER_HANDLE;
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn GHANDLE GUIAPI JoinLayer (const char* layer_name,
|
||||
const char* client_name,
|
||||
@@ -2767,8 +2687,7 @@ static inline GHANDLE GUIAPI JoinLayerEx (const char* layer_name,
|
||||
* \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)
|
||||
const char* client_name, int max_nr_highers, int max_nr_normals)
|
||||
{
|
||||
return DUMMY_LAYER_HANDLE;
|
||||
}
|
||||
|
||||
+5
-11
@@ -2990,22 +2990,18 @@ typedef struct _WINMASKINFO {
|
||||
if the client moved to a new layer */
|
||||
#define MSG_LAYERCHANGED 0x0149
|
||||
|
||||
/* Since 5.2.0; the server send this message to the client
|
||||
if a window has been composited to the screen. */
|
||||
#define MSG_WINCOMPOSITED 0x014A
|
||||
|
||||
#endif /* defined _MGRM_PROCESSES */
|
||||
|
||||
/* Since 5.0.0: for managing message thread */
|
||||
#define MSG_MANAGE_MSGTHREAD 0x014B
|
||||
#define MSG_MANAGE_MSGTHREAD 0x014A
|
||||
#define MSGTHREAD_SIGNIN 0x00
|
||||
#define MSGTHREAD_SIGNOUT 0x01
|
||||
|
||||
/* Since 5.0.0: for calculating the default position */
|
||||
#define MSG_CALC_POSITION 0x014C
|
||||
#define MSG_CALC_POSITION 0x014B
|
||||
|
||||
/* Since 5.0.6: for waking up the client */
|
||||
#define MSG_WAKEUP_CLIENT 0x014D
|
||||
#define MSG_WAKEUP_CLIENT 0x014C
|
||||
|
||||
/**
|
||||
* \def MSG_DOESNEEDIME
|
||||
@@ -7242,8 +7238,7 @@ MG_EXPORT BOOL GUIAPI SetMainWindowGestureFlags (HWND hWnd, DWORD dwFlags);
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
|
||||
/**
|
||||
* \fn int GUIAPI GetWindowSharedSurfaceFD (HWND hwnd, size_t *map_size,
|
||||
* DWORD *flags)
|
||||
* \fn int GUIAPI GetWindowSharedSurfaceFD (HWND hwnd)
|
||||
* \brief Gets the file descriptor of the surface buffer for a window or
|
||||
* the main window it locates.
|
||||
*
|
||||
@@ -7263,8 +7258,7 @@ MG_EXPORT BOOL GUIAPI SetMainWindowGestureFlags (HWND hWnd, DWORD dwFlags);
|
||||
*
|
||||
* Since 5.0.13
|
||||
*/
|
||||
MG_EXPORT int GUIAPI GetWindowSharedSurfaceFD (HWND hWnd, size_t *map_size,
|
||||
DWORD *flags);
|
||||
MG_EXPORT int GUIAPI GetWindowSharedSurfaceFD (HWND hWnd);
|
||||
|
||||
/**
|
||||
* \fn BOOL GUIAPI SetMainWindowCompositing (HWND hWnd,
|
||||
|
||||
+3
-32
@@ -184,23 +184,6 @@ static void process_socket_message (MSG *msg)
|
||||
LOSWORD(msg->wParam), HISWORD(msg->wParam),
|
||||
LOSWORD(msg->lParam), HISWORD(msg->lParam));
|
||||
}
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
else if (msg->message == MSG_WINCOMPOSITED) {
|
||||
/* Since 5.2.0 */
|
||||
int slot = (int)msg->wParam;
|
||||
HWND hwnd = (HWND)msg->lParam;
|
||||
unsigned dirty_age = (unsigned)msg->time;
|
||||
if (__mg_client_check_znode_hwnd(slot, hwnd, __mg_client_id)) {
|
||||
GAL_Surface *ssurf = ((PMAINWIN)hwnd)->surf;
|
||||
assert(ssurf->shared_header);
|
||||
__mg_lock_file_for_write(ssurf->fd);
|
||||
if (ssurf->dirty_info->dirty_age == dirty_age) {
|
||||
ssurf->dirty_info->nr_dirty_rcs = 0;
|
||||
}
|
||||
__mg_unlock_file_for_write(ssurf->fd);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
else {
|
||||
if (msg->hwnd == HWND_NULL) {
|
||||
msg->hwnd = HWND_DESKTOP;
|
||||
@@ -535,8 +518,8 @@ BOOL client_IdleHandler4Client (PMSGQUEUE msg_queue, BOOL wait)
|
||||
return (n > 0);
|
||||
}
|
||||
|
||||
GHANDLE GUIAPI JoinLayerEx (const char* layer_name, const char* client_name,
|
||||
int max_nr_topmosts, int max_nr_normals, int *cli_id)
|
||||
GHANDLE GUIAPI JoinLayer (const char* layer_name, const char* client_name,
|
||||
int max_nr_topmosts, int max_nr_normals)
|
||||
{
|
||||
GHANDLE layer_handle = INV_LAYER_HANDLE;
|
||||
REQUEST req;
|
||||
@@ -546,12 +529,8 @@ GHANDLE GUIAPI JoinLayerEx (const char* layer_name, const char* client_name,
|
||||
if (mgIsServer)
|
||||
return layer_handle;
|
||||
|
||||
if (__mg_client_id != 0) {
|
||||
/* Already joined, return the handle */
|
||||
if (cli_id)
|
||||
*cli_id = __mg_client_id;
|
||||
if (__mg_client_id != 0) /* Already joined, return the handle */
|
||||
return GetLayerInfo (NAME_SELF_LAYER, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
if (layer_name) {
|
||||
strncpy (info.layer_name, layer_name, LEN_LAYER_NAME);
|
||||
@@ -614,18 +593,10 @@ GHANDLE GUIAPI JoinLayerEx (const char* layer_name, const char* client_name,
|
||||
|
||||
__mg_start_client_desktop ();
|
||||
|
||||
if (cli_id)
|
||||
*cli_id = __mg_client_id;
|
||||
|
||||
ret:
|
||||
return layer_handle;
|
||||
}
|
||||
|
||||
int GUIAPI GetClientId (void)
|
||||
{
|
||||
return __mg_client_id;
|
||||
}
|
||||
|
||||
GHANDLE GUIAPI GetLayerInfo (const char* layer_name,
|
||||
int* nr_clients, BOOL* is_topmost, int* cli_active)
|
||||
{
|
||||
|
||||
+1
-1
@@ -2185,7 +2185,7 @@ static int create_memdc_for_menu (TRACKMENUINFO* ptmi)
|
||||
return -1;
|
||||
}
|
||||
|
||||
ptmi->dc = __mg_create_memdc_for_surface (surf);
|
||||
ptmi->dc = CreateMemDCFromSurface (surf);
|
||||
if (ptmi->dc == HDC_INVALID) {
|
||||
GAL_FreeSurface (surf);
|
||||
return -1;
|
||||
|
||||
+13
-24
@@ -4476,10 +4476,10 @@ HWND GUIAPI CreateMainWindowEx2 (PMAINWINCREATE pCreateInfo, LINT id,
|
||||
#endif
|
||||
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
/* Since 5.2.0: keep fd available. */
|
||||
if (0 && pWin->surf->shared_header) {
|
||||
close (pWin->surf->fd);
|
||||
pWin->surf->fd = -1;
|
||||
// Close file descriptor to free kernel memory?
|
||||
if (pWin->surf->shared_header) {
|
||||
close (pWin->surf->shared_header->fd);
|
||||
pWin->surf->shared_header->fd = -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -5585,13 +5585,11 @@ BOOL GUIAPI ValidateRegion (HWND hWnd, const CLIPRGN* pRgn)
|
||||
BOOL GUIAPI GetUpdateRect (HWND hWnd, RECT* update_rect)
|
||||
{
|
||||
PMAINWIN pWin;
|
||||
RECT rcClient;
|
||||
|
||||
MG_CHECK_RET (MG_IS_NORMAL_WINDOW(hWnd), FALSE);
|
||||
pWin = MG_GET_WINDOW_PTR (hWnd);
|
||||
|
||||
GetClientRect(hWnd, &rcClient);
|
||||
IntersectRect(update_rect, &pWin->InvRgn.rgn.rcBound, &rcClient);
|
||||
*update_rect = pWin->InvRgn.rgn.rcBound;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -6038,10 +6036,10 @@ HWND GUIAPI CreateWindowEx2 (const char* spClassName,
|
||||
}
|
||||
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
/* Since 5.2.0: keep fd available. */
|
||||
if (0 && dwExStyle & WS_EX_CTRLASMAINWIN && pNewCtrl->surf->shared_header) {
|
||||
close (pNewCtrl->surf->fd);
|
||||
pNewCtrl->surf->fd = -1;
|
||||
// Close file descriptor to free kernel memory?
|
||||
if (dwExStyle & WS_EX_CTRLASMAINWIN && pNewCtrl->surf->shared_header) {
|
||||
close (pNewCtrl->surf->shared_header->fd);
|
||||
pNewCtrl->surf->shared_header->fd = -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -6069,22 +6067,13 @@ error:
|
||||
}
|
||||
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
int GUIAPI GetWindowSharedSurfaceFD (HWND hWnd, size_t *map_size, DWORD *flags)
|
||||
int GUIAPI GetWindowSharedSurfaceFD (HWND hWnd)
|
||||
{
|
||||
MG_CHECK_RET (MG_IS_NORMAL_WINDOW (hWnd), -1);
|
||||
MG_CHECK_RET (MG_IS_APP_WINDOW (hWnd), -1);
|
||||
|
||||
PMAINWIN pWin = (PMAINWIN)hWnd;
|
||||
if (pWin->surf->shared_header) {
|
||||
if (map_size)
|
||||
*map_size = pWin->surf->shared_header->map_size;
|
||||
if (flags) {
|
||||
*flags = MEMDC_FLAG_SWSURFACE;
|
||||
if (pWin->surf->shared_header->byhw)
|
||||
*flags |= MEMDC_FLAG_HWSURFACE;
|
||||
}
|
||||
|
||||
return pWin->surf->fd;
|
||||
}
|
||||
if (pWin->surf->shared_header)
|
||||
return pWin->surf->shared_header->fd;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
+50
-11
@@ -46,6 +46,7 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
@@ -65,14 +66,18 @@
|
||||
|
||||
#define LEN_TOUCH_DEV 127
|
||||
|
||||
#define AUTO_MOUSE_UP_TICKCOUNT 20
|
||||
|
||||
static int sg_tp_event_fd = -1, sg_key_event_fd = -1;
|
||||
static short MOUSEX = 0, MOUSEY = 0, MOUSEBUTTON = 0;
|
||||
static DWORD g_last_tickcount = 0;
|
||||
static bool g_has_auto_event = false;
|
||||
|
||||
static int get_touch_data (short *x, short *y, short *button)
|
||||
{
|
||||
struct input_event data;
|
||||
|
||||
while (read (sg_tp_event_fd, &data, sizeof (data)) == sizeof (data)) {
|
||||
if (read (sg_tp_event_fd, &data, sizeof (data)) == sizeof (data)) {
|
||||
|
||||
/* do nothing for EV_SYN due to non-blocking read.
|
||||
if (data.type == EV_SYN) {
|
||||
@@ -91,10 +96,12 @@ static int get_touch_data (short *x, short *y, short *button)
|
||||
if (data.type == EV_KEY) {
|
||||
switch (data.code) {
|
||||
case BTN_TOUCH:
|
||||
if (data.value > 0)
|
||||
*button = IAL_MOUSE_LEFTBUTTON;
|
||||
else
|
||||
if (data.value == 0) {
|
||||
*button = 0;
|
||||
g_last_tickcount = 0;
|
||||
return 0;
|
||||
}
|
||||
g_last_tickcount = GetTickCount();
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -103,6 +110,7 @@ static int get_touch_data (short *x, short *y, short *button)
|
||||
}
|
||||
}
|
||||
else if (data.type == EV_ABS) {
|
||||
g_last_tickcount = GetTickCount();
|
||||
switch (data.code) {
|
||||
case ABS_X:
|
||||
*x = data.value;
|
||||
@@ -110,7 +118,8 @@ static int get_touch_data (short *x, short *y, short *button)
|
||||
|
||||
case ABS_Y:
|
||||
*y = data.value;
|
||||
break;
|
||||
*button = IAL_MOUSE_LEFTBUTTON;
|
||||
return 0;
|
||||
|
||||
case ABS_MT_POSITION_X:
|
||||
*x = data.value;
|
||||
@@ -118,7 +127,8 @@ static int get_touch_data (short *x, short *y, short *button)
|
||||
|
||||
case ABS_MT_POSITION_Y:
|
||||
*y = data.value;
|
||||
break;
|
||||
*button = IAL_MOUSE_LEFTBUTTON;
|
||||
return 0;
|
||||
|
||||
case ABS_MT_TOUCH_MAJOR:
|
||||
break;
|
||||
@@ -136,13 +146,20 @@ static int get_touch_data (short *x, short *y, short *button)
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
if (g_has_auto_event) {
|
||||
g_has_auto_event = false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int mouse_update (void)
|
||||
{
|
||||
if (get_touch_data (&MOUSEX, &MOUSEY, &MOUSEBUTTON) == 0)
|
||||
static int idx = 0;
|
||||
if (get_touch_data (&MOUSEX, &MOUSEY, &MOUSEBUTTON) == 0) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -193,10 +210,32 @@ static int wait_event (int which, int maxfd, fd_set *in, fd_set *out, fd_set *ex
|
||||
}
|
||||
}
|
||||
else if (e < 0) {
|
||||
retvalue = -1;
|
||||
if (g_last_tickcount > 0) {
|
||||
DWORD tickcount = GetTickCount();
|
||||
if (tickcount - g_last_tickcount >= AUTO_MOUSE_UP_TICKCOUNT) {
|
||||
MOUSEBUTTON = 0;
|
||||
retvalue |= IAL_MOUSEEVENT;
|
||||
g_last_tickcount = 0;
|
||||
g_has_auto_event = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
retvalue = -1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
retvalue = 0;
|
||||
if (g_last_tickcount > 0) {
|
||||
DWORD tickcount = GetTickCount();
|
||||
if (tickcount - g_last_tickcount >= AUTO_MOUSE_UP_TICKCOUNT) {
|
||||
MOUSEBUTTON = 0;
|
||||
retvalue |= IAL_MOUSEEVENT;
|
||||
g_last_tickcount = 0;
|
||||
g_has_auto_event = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
retvalue = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return retvalue;
|
||||
@@ -214,7 +253,7 @@ BOOL ial_InitSingleTouchKey (INPUT* input, const char* mdev, const char* mtype)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
sg_tp_event_fd = open (touch_dev, O_RDONLY | O_NONBLOCK);
|
||||
sg_tp_event_fd = open (touch_dev, O_RDONLY);
|
||||
if (sg_tp_event_fd < 0) {
|
||||
_WRN_PRINTF ("failed when opening touch event device: %s\n", touch_dev);
|
||||
return FALSE;
|
||||
|
||||
+10
-16
@@ -117,22 +117,10 @@
|
||||
#define REQID_LOADCURSOR_PNG 0x001D
|
||||
// Load cursor from in-memory PNG
|
||||
#define REQID_LOADCURSOR_PNG_MEM 0x001E
|
||||
|
||||
#if 0 // Deprecated since 5.2.0
|
||||
// allocate semaphore for shared surface
|
||||
#define REQID_ALLOC_SURF_SEM 0x001F
|
||||
// free semaphore of shared surface
|
||||
#define REQID_FREE_SURF_SEM 0x0020
|
||||
#endif
|
||||
|
||||
/* Since 5.2.0 */
|
||||
// Operate a shared surface to register/revoke the name and set the fd
|
||||
#define REQID_OPERATENAMEDSSURF 0x001F
|
||||
#define ID_NAMEDSSURFOP_REGISTER 1
|
||||
#define ID_NAMEDSSURFOP_SET 2
|
||||
#define ID_NAMEDSSURFOP_REVOKE 3
|
||||
|
||||
#define REQID_RESERVED 0x0020
|
||||
|
||||
// Move the current client to another layer
|
||||
#define REQID_MOVETOLAYER 0x0021
|
||||
@@ -142,7 +130,14 @@
|
||||
// Authenticate client
|
||||
#define REQID_AUTHCLIENT 0x0023
|
||||
|
||||
#define REQID_SYS_LAST REQID_AUTHCLIENT
|
||||
/* Since 5.2.0 */
|
||||
// Operate a shared surface to register/revoke the name and set the fd
|
||||
#define REQID_OPERATENAMEDSSURF 0x0024
|
||||
#define ID_NAMEDSSURFOP_REGISTER 1
|
||||
#define ID_NAMEDSSURFOP_SET 2
|
||||
#define ID_NAMEDSSURFOP_REVOKE 3
|
||||
|
||||
#define REQID_SYS_LAST REQID_OPERATENAMEDSSURF
|
||||
|
||||
/*
|
||||
* XXX: To fellows who need to add a new REQID,
|
||||
@@ -168,13 +163,13 @@ typedef struct OperateNSSurfInfo
|
||||
|
||||
/* Since 5.0.0 */
|
||||
typedef struct _SharedSurfInfo {
|
||||
size_t size; // whole size of the surface
|
||||
off_t offset; // offset of pixel data
|
||||
uint32_t flags; // the flags of the surface
|
||||
uint32_t width, height;
|
||||
uint32_t pitch;
|
||||
uint32_t name; // when use flink name
|
||||
uint32_t drm_format; // DRM pixel format
|
||||
size_t size; // whole size of the surface
|
||||
off_t offset; // offset of pixel data
|
||||
} SHAREDSURFINFO;
|
||||
|
||||
typedef struct JoinLayerInfo {
|
||||
@@ -383,7 +378,6 @@ void __mg_start_client_desktop (void);
|
||||
|
||||
void __mg_update_window (HWND hwnd, int left, int top, int right, int bottom);
|
||||
|
||||
BOOL __mg_client_check_znode_hwnd (int slot, HWND hwnd, int cli);
|
||||
BOOL __mg_client_check_hwnd (HWND hwnd, int cli);
|
||||
BOOL __mg_client_on_layer_changed (GHANDLE layer_handle, int zi_shmid);
|
||||
|
||||
|
||||
+4
-6
@@ -521,16 +521,14 @@ static inline void _dc_step_y (PDC pdc, int step)
|
||||
|
||||
# define BLOCK_DRAW_SEM(pdc) \
|
||||
do { \
|
||||
if (pdc->surface->shared_header) { \
|
||||
__mg_lock_file_for_write(pdc->surface->fd); \
|
||||
} \
|
||||
if (pdc->surface->shared_header) \
|
||||
LOCK_SURFACE_SEM (pdc->surface->shared_header->sem_num); \
|
||||
} while (0)
|
||||
|
||||
# define UNBLOCK_DRAW_SEM(pdc) \
|
||||
do { \
|
||||
if (pdc->surface->shared_header) { \
|
||||
__mg_unlock_file_for_write(pdc->surface->fd); \
|
||||
} \
|
||||
if (pdc->surface->shared_header) \
|
||||
UNLOCK_SURFACE_SEM (pdc->surface->shared_header->sem_num); \
|
||||
} while (0)
|
||||
|
||||
# define IS_SCREEN_SURFACE(pdc) \
|
||||
|
||||
+8
-10
@@ -51,9 +51,11 @@
|
||||
#ifndef GUI_DRAWSEMOP_H
|
||||
#define GUI_DRAWSEMOP_H
|
||||
|
||||
#include <errno.h>
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#include "misc.h"
|
||||
#include <errno.h>
|
||||
|
||||
static inline void my_sem_op (int semid, int num, int op)
|
||||
{
|
||||
@@ -68,9 +70,6 @@ again:
|
||||
if (errno == EINTR) {
|
||||
goto again;
|
||||
}
|
||||
else {
|
||||
_ERR_PRINTF("Failed semop: %m\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,7 +79,10 @@ again:
|
||||
#define LOCK_SCREEN_SEM() my_sem_op(SHAREDRES_SEMID, _IDX_SEM_SCR, -1)
|
||||
#define UNLOCK_SCREEN_SEM() my_sem_op(SHAREDRES_SEMID, _IDX_SEM_SCR, 1)
|
||||
|
||||
extern int __mg_client_id;
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
# define LOCK_SURFACE_SEM(num) my_sem_op(SHAREDRES_SEMID_SHARED_SURF, num, -1)
|
||||
# define UNLOCK_SURFACE_SEM(num) my_sem_op(SHAREDRES_SEMID_SHARED_SURF, num, 1)
|
||||
#endif
|
||||
|
||||
#ifdef _MGHAVE_CURSOR
|
||||
|
||||
@@ -155,10 +157,6 @@ again:
|
||||
# define UNLOCK_MOUSEMOVE_SEM() my_sem_op(SHAREDRES_SEMID, _IDX_SEM_MOUSEMOVE, 1)
|
||||
#endif /* _MGRM_PROCESSES */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
@@ -958,7 +958,9 @@ BOOL gui_LoadIconRes(HDC hdc, const char* rdr_name, char* file);
|
||||
void gui_WndRect(HWND hWnd, PRECT prc);
|
||||
void gui_WndClientRect(HWND hWnd, PRECT prc);
|
||||
|
||||
HDC __mg_create_memdc_for_surface (struct GAL_Surface* surface);
|
||||
/* Undisclosed APIs */
|
||||
HDC CreateMemDCFromSurface (struct GAL_Surface* surface);
|
||||
struct GAL_Surface* GetSurfaceFromDC (HDC hdc);
|
||||
|
||||
/* Since 5.0.0 */
|
||||
#ifdef _MGRM_PROCESSES
|
||||
|
||||
+2
-9
@@ -105,15 +105,8 @@ int __mg_map_get_size (map_t* map);
|
||||
|
||||
map_entry_t* __mg_map_find (map_t* map, const void* key);
|
||||
|
||||
map_entry_t* __mg_map_insert_ex2 (map_t* map, const void* key,
|
||||
int __mg_map_insert_ex (map_t* map, const void* key,
|
||||
const void* val, free_val_fn free_val_alt);
|
||||
|
||||
static int __mg_map_insert_ex (map_t* map, const void* key,
|
||||
const void* val, free_val_fn free_val_alt)
|
||||
{
|
||||
return __mg_map_insert_ex2(map, key, val, NULL) ? 0 : -1;
|
||||
}
|
||||
|
||||
static inline int __mg_map_insert (map_t* map, const void* key,
|
||||
const void* val)
|
||||
{
|
||||
@@ -126,7 +119,7 @@ int __mg_map_find_replace_or_insert (map_t* map, const void* key,
|
||||
int __mg_map_replace (map_t* map, const void* key,
|
||||
const void* val, free_val_fn free_val_alt);
|
||||
|
||||
int __mg_map_erase (map_t* map, const void* key);
|
||||
int __mg_map_erase (map_t* map, void* key);
|
||||
int __mg_map_get_size (map_t* map);
|
||||
|
||||
#if 0 /* deprecated code */
|
||||
|
||||
+1
-7
@@ -79,11 +79,6 @@ struct timezone {
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
void __mg_lock_file_for_read(int fd);
|
||||
void __mg_unlock_file_for_read(int fd);
|
||||
void __mg_lock_file_for_write(int fd);
|
||||
void __mg_unlock_file_for_write(int fd);
|
||||
|
||||
unsigned int __mg_os_get_random_seed (void);
|
||||
void __mg_os_time_delay (int ms);
|
||||
void __mg_os_start_time (void);
|
||||
@@ -120,11 +115,10 @@ void mg_TerminateMisc (void);
|
||||
BOOL mg_InitSystemRes (void);
|
||||
void mg_TerminateSystemRes (void);
|
||||
|
||||
/* Deprecated since 5.2.0
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
int __mg_alloc_sem_for_shared_surf (void);
|
||||
int __mg_free_sem_for_shared_surf (int sem_num);
|
||||
#endif _MGSCHEMA_COMPOSITING */
|
||||
#endif /* _MGSCHEMA_COMPOSITING */
|
||||
|
||||
size_t __mg_lookfor_unused_slot (unsigned char* bitmap, size_t len_bmp, int set);
|
||||
|
||||
|
||||
@@ -396,10 +396,10 @@ char * __mg_msgstr3 [] =
|
||||
"MSG_SRVNOTIFY", // 0x0147
|
||||
"MSG_UPDATECLIWIN", // 0x0148
|
||||
"MSG_LAYERCHANGED", // 0x0149
|
||||
"MSG_WINCOMPOSITED", // 0x014A
|
||||
"MSG_MANAGE_MSGTHREAD", // 0x014B
|
||||
"MSG_CALC_POSITION", // 0x014C
|
||||
"MSG_WAKEUP_CLIENT", // 0x014D
|
||||
"MSG_MANAGE_MSGTHREAD", // 0x014A
|
||||
"MSG_CALC_POSITION", // 0x014B
|
||||
"", // 0x014C
|
||||
"", // 0x014D
|
||||
"", // 0x014E
|
||||
"", // 0x014F
|
||||
|
||||
|
||||
+14
-31
@@ -139,25 +139,20 @@ typedef struct _DirtyInfo {
|
||||
* than the creator.
|
||||
*/
|
||||
typedef struct _SharedSurfaceHeader {
|
||||
/* the name of the shared surface; since 5.2.0. */
|
||||
char name[NAME_MAX + 1];
|
||||
/* The number of semphore for this surface.
|
||||
The SysV semaphore set id for synchronizing this shared surface:
|
||||
SHAREDRES_SEMID_SHARED_SURF. */
|
||||
int sem_num;
|
||||
|
||||
/* The client identifier of the creator. */
|
||||
int create_cli;
|
||||
/* The pid of the creator */
|
||||
pid_t creator;
|
||||
|
||||
/* The file descriptor in context of the creator. */
|
||||
int fd;
|
||||
/* Not zero for hardware surface. */
|
||||
int byhw;
|
||||
|
||||
/* Deprecated since 5.2.0.
|
||||
The number of semphore for this surface.
|
||||
The SysV semaphore set id for synchronizing this shared surface:
|
||||
SHAREDRES_SEMID_SHARED_SURF.
|
||||
int sem_num; */
|
||||
|
||||
/* Deprecated since 5.2.0.
|
||||
The file descriptor in context of the creator.
|
||||
int fd; */
|
||||
|
||||
/* The dirty information */
|
||||
GAL_DirtyInfo dirty_info;
|
||||
/* the size of the surface */
|
||||
int width, height;
|
||||
/* the pitch of the surface */
|
||||
@@ -171,9 +166,6 @@ typedef struct _SharedSurfaceHeader {
|
||||
size_t map_size;
|
||||
/* the offset of pixels data */
|
||||
off_t pixels_off;
|
||||
|
||||
/* The dirty information */
|
||||
GAL_DirtyInfo dirty_info;
|
||||
} GAL_SharedSurfaceHeader;
|
||||
#endif /* IS_COMPOSITING_SCHEMA */
|
||||
|
||||
@@ -238,8 +230,6 @@ typedef struct GAL_Surface {
|
||||
GAL_SharedSurfaceHeader *shared_header; /* Private */
|
||||
/* The dirty info for non-shared surface. */
|
||||
GAL_DirtyInfo *dirty_info; /* Private */
|
||||
/* The file descriptor if the surface is a shared surface. */
|
||||
int fd; /* Private; since 5.2.0. */
|
||||
#endif
|
||||
} GAL_Surface;
|
||||
|
||||
@@ -262,8 +252,6 @@ typedef struct GAL_Surface {
|
||||
|
||||
#define GAL_PREALLOC 0x01000000 /* Surface uses preallocated memory */
|
||||
#define GAL_FORMAT_CHECKED 0x02000000 /* Pixman format checked */
|
||||
#define GAL_SSURF_ATTACHED 0x04000000 /* The shared surface is attached to. */
|
||||
#define GAL_SSURF_LOCKED 0x08000000 /* The shared surface is locked. */
|
||||
|
||||
/* Available for GAL_SetVideoMode() */
|
||||
#define GAL_ANYFORMAT 0x10000000 /* Allow any video depth/pixel-format */
|
||||
@@ -583,11 +571,6 @@ GAL_Surface *GAL_CreateRGBSurface
|
||||
GAL_Surface *GAL_CreateRGBSurfaceFrom (void *pixels,
|
||||
int width, int height, int depth, int pitch,
|
||||
Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask);
|
||||
/* Since 5.2.0 */
|
||||
static GAL_Surface *GAL_RefSurface (GAL_Surface *surface) {
|
||||
surface->refcount++;
|
||||
return surface;
|
||||
}
|
||||
void GAL_FreeSurface (GAL_Surface *surface);
|
||||
|
||||
typedef struct REQ_HWSURFACE {
|
||||
@@ -668,11 +651,11 @@ GAL_Surface *GAL_CreateSurfaceForZNodeAs (const GAL_Surface* ref_surf,
|
||||
void GAL_FreeSharedSurfaceData (GAL_Surface *surface);
|
||||
|
||||
/* Attach to a shared RGB surface. */
|
||||
GAL_Surface *GAL_AttachSharedRGBSurface (GAL_VideoDevice* video,
|
||||
int fd, size_t map_size, Uint32 flags, BOOL with_wr);
|
||||
GAL_Surface *GAL_AttachSharedRGBSurface (int fd, size_t map_size,
|
||||
Uint32 flags, BOOL with_wr);
|
||||
|
||||
/* Detach from a shared RGB surface from the specific video device. */
|
||||
void GAL_DetachSharedSurfaceData (GAL_Surface *surface);
|
||||
/* Dettach from a shared RGB surface from the specific video device. */
|
||||
void GAL_DettachSharedSurfaceData (GAL_Surface *surface);
|
||||
|
||||
/* Create a cursor surface from the specific video device. */
|
||||
GAL_Surface* GAL_CreateCursorSurface (GAL_VideoDevice* video,
|
||||
|
||||
@@ -135,9 +135,6 @@ void __mg_release_global_res (int cli);
|
||||
/* Since 5.2.0 */
|
||||
int __mg_nssurf_map_new(void);
|
||||
void __mg_nssurf_map_delete(void);
|
||||
int __mg_nssurf_map_operate_srv(const OPERATENSSURFINFO* req_info,
|
||||
int cli, int fd);
|
||||
int __mg_get_shared_surface_srv(const char *itn_name, SHAREDSURFINFO *info);
|
||||
|
||||
void __mg_remove_client (int cli, int clifd);
|
||||
|
||||
|
||||
@@ -112,7 +112,7 @@ typedef struct tagG_RES {
|
||||
|
||||
int nr_layers;
|
||||
int semid_layer;
|
||||
#if 0 && defined(_MGSCHEMA_COMPOSITING) // deprecated since 5.2.0
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
int semid_shared_surf; /* the id of semaphore set for shared surfaces */
|
||||
#endif
|
||||
|
||||
@@ -208,7 +208,7 @@ typedef G_RES* PG_RES;
|
||||
#define SHAREDRES_NR_LAYSERS (((PG_RES)mgSharedRes)->nr_layers)
|
||||
#define SHAREDRES_SEMID_LAYER (((PG_RES)mgSharedRes)->semid_layer)
|
||||
|
||||
#if 0 && defined(_MGSCHEMA_COMPOSITING) // Deprecated since 5.2.0
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
# define SHAREDRES_SEMID_SHARED_SURF (((PG_RES)mgSharedRes)->semid_shared_surf)
|
||||
#endif
|
||||
|
||||
|
||||
@@ -679,19 +679,6 @@ static BOOL merge_dirty_ppp (CompositorCtxt* ctxt, MG_Layer* layer, int zidx)
|
||||
return rc;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void dump_dirty_region(CompositorCtxt* ctxt, const char *prefix, int zidx)
|
||||
{
|
||||
CLIPRGN* rgn = &ctxt->dirty_rgn;
|
||||
_WRN_PRINTF("%s (%d): dirty region on screen: (%d, %d) %d x %d; "
|
||||
"highest dirty win: %d; lowest dirty win: %d\n",
|
||||
prefix, zidx,
|
||||
rgn->rcBound.left, rgn->rcBound.top,
|
||||
RECTW (rgn->rcBound), RECTH (rgn->rcBound),
|
||||
ctxt->highest_dirty_win, ctxt->lowest_dirty_win);
|
||||
}
|
||||
#endif
|
||||
|
||||
static BOOL merge_dirty_win (CompositorCtxt* ctxt, MG_Layer* layer, int zidx)
|
||||
{
|
||||
BOOL rc = FALSE;
|
||||
@@ -735,13 +722,9 @@ static BOOL merge_dirty_wpp (CompositorCtxt* ctxt, MG_Layer* layer)
|
||||
static BOOL refresh_dirty_region (CompositorCtxt* ctxt, MG_Layer* layer)
|
||||
{
|
||||
/* the fallback compositor only manages znodes on the topmost layer. */
|
||||
if (layer != mgTopmostLayer)
|
||||
if (layer != mgTopmostLayer || IsEmptyClipRgn (&ctxt->dirty_rgn))
|
||||
return FALSE;
|
||||
|
||||
if (IsEmptyClipRgn (&ctxt->dirty_rgn)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (ctxt->highest_dirty_ppp >= 0) {
|
||||
composite_ppp_znodes (ctxt);
|
||||
}
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#define _DEBUG
|
||||
#include "common.h"
|
||||
|
||||
#if defined(_MGRM_PROCESSES) && defined(_MGSCHEMA_COMPOSITING)
|
||||
@@ -68,7 +69,6 @@
|
||||
#include "constants.h"
|
||||
#include "zorder.h"
|
||||
#include "dc.h"
|
||||
#include "server.h"
|
||||
|
||||
#define MAX_NR_COMPOSITORS 8
|
||||
#define LEN_COMPOSITOR_NAME 15
|
||||
@@ -133,51 +133,31 @@ static void lock_znode_surface (PDC pdc, ZORDERNODE* node)
|
||||
{
|
||||
if (node->lock_count == 0) {
|
||||
if (pdc->surface->shared_header) {
|
||||
__mg_lock_file_for_read(pdc->surface->fd);
|
||||
LOCK_SURFACE_SEM (pdc->surface->shared_header->sem_num);
|
||||
}
|
||||
|
||||
node->dirty_age = pdc->surface->dirty_info->dirty_age;
|
||||
node->nr_dirty_rcs = pdc->surface->dirty_info->nr_dirty_rcs;
|
||||
node->dirty_rcs = pdc->surface->dirty_info->dirty_rcs;
|
||||
|
||||
}
|
||||
|
||||
node->lock_count++;
|
||||
}
|
||||
|
||||
static BOOL unlock_znode_surface (PDC pdc, ZORDERNODE* node)
|
||||
static void unlock_znode_surface (PDC pdc, ZORDERNODE* node)
|
||||
{
|
||||
BOOL need_reset = FALSE;
|
||||
if (node->lock_count > 0) {
|
||||
node->lock_count--;
|
||||
if (node->lock_count == 0) {
|
||||
if (node->changes != pdc->surface->dirty_info->dirty_age) {
|
||||
node->changes = pdc->surface->dirty_info->dirty_age;
|
||||
need_reset = TRUE;
|
||||
}
|
||||
|
||||
if (pdc->surface->shared_header) {
|
||||
__mg_unlock_file_for_read(pdc->surface->fd);
|
||||
}
|
||||
if (pdc->surface->shared_header)
|
||||
UNLOCK_SURFACE_SEM (pdc->surface->shared_header->sem_num);
|
||||
|
||||
node->dirty_age = 0;
|
||||
node->nr_dirty_rcs = 0;
|
||||
node->dirty_rcs = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return need_reset;
|
||||
}
|
||||
|
||||
static void reset_znode_surface_dirty (PDC pdc, ZORDERNODE* node, int slot)
|
||||
{
|
||||
if (node->cli == 0 || slot == 0) {
|
||||
pdc->surface->dirty_info->nr_dirty_rcs = 0;
|
||||
}
|
||||
else if (node->hwnd) {
|
||||
MSG msg = { HWND_NULL, MSG_WINCOMPOSITED,
|
||||
slot, (LPARAM)node->hwnd, (DWORD)node->changes };
|
||||
__mg_send2client(&msg, mgClients + node->cli);
|
||||
}
|
||||
}
|
||||
|
||||
#if 0 /* not optimized */
|
||||
@@ -342,8 +322,10 @@ static void composite_layer (MG_Layer* layer, CompositorCtxt* ctxt,
|
||||
nodes = GET_MENUNODE(zi);
|
||||
for (i = 0; i < zi->nr_popupmenus; i++) {
|
||||
pdc = dc_HDC2PDC (nodes[i].mem_dc);
|
||||
if (unlock_znode_surface (pdc, nodes + i))
|
||||
reset_znode_surface_dirty (pdc, nodes + i, i);
|
||||
|
||||
nodes[i].changes = pdc->surface->dirty_info->dirty_age;
|
||||
pdc->surface->dirty_info->nr_dirty_rcs = 0;
|
||||
unlock_znode_surface (pdc, nodes + i);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -353,8 +335,9 @@ static void composite_layer (MG_Layer* layer, CompositorCtxt* ctxt,
|
||||
while ((next = __kernel_get_next_znode (zi, next)) > 0) {
|
||||
if (nodes [next].flags & ZOF_VISIBLE) {
|
||||
pdc = dc_HDC2PDC (nodes[next].mem_dc);
|
||||
if (unlock_znode_surface (pdc, nodes + next))
|
||||
reset_znode_surface_dirty (pdc, nodes + next, next);
|
||||
nodes[next].changes = pdc->surface->dirty_info->dirty_age;
|
||||
pdc->surface->dirty_info->nr_dirty_rcs = 0;
|
||||
unlock_znode_surface (pdc, nodes + next);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -363,8 +346,9 @@ static void composite_layer (MG_Layer* layer, CompositorCtxt* ctxt,
|
||||
if (layer == mgTopmostLayer) {
|
||||
pdc = dc_HDC2PDC (HDC_SCREEN);
|
||||
if (pdc->surface->w > 0 && pdc->surface->h > 0) {
|
||||
if (unlock_znode_surface (pdc, nodes))
|
||||
reset_znode_surface_dirty (pdc, nodes, 0);
|
||||
nodes[0].changes = pdc->surface->dirty_info->dirty_age;
|
||||
pdc->surface->dirty_info->nr_dirty_rcs = 0;
|
||||
unlock_znode_surface (pdc, nodes);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+16
-36
@@ -365,7 +365,7 @@ static intptr_t cliAllocZOrderNode (PMAINWIN pWin, const COMPOSITINGINFO* ct_inf
|
||||
}
|
||||
|
||||
if (ClientRequestEx2 (&req, caption, strlen(caption) + 1,
|
||||
pWin->surf->fd,
|
||||
pWin->surf->shared_header->fd,
|
||||
&ret, sizeof (intptr_t), NULL) < 0)
|
||||
return -1;
|
||||
#else /* ndef _MGSCHEMA_COMPOSITING */
|
||||
@@ -524,7 +524,7 @@ static intptr_t cliStartTrackPopupMenu (PTRACKMENUINFO ptmi)
|
||||
|
||||
info.surf_flags = surf->flags;
|
||||
info.surf_size = surf->shared_header->map_size;
|
||||
if (ClientRequestEx2 (&req, NULL, 0, surf->fd,
|
||||
if (ClientRequestEx2 (&req, NULL, 0, surf->shared_header->fd,
|
||||
&ret, sizeof (intptr_t), NULL) < 0)
|
||||
return -1;
|
||||
}
|
||||
@@ -837,10 +837,8 @@ static int srvAllocZOrderNode (int cli, HWND hwnd, HWND main_win,
|
||||
surf->refcount++;
|
||||
}
|
||||
else if (fd >= 0) {
|
||||
surf = GAL_AttachSharedRGBSurface (NULL, fd,
|
||||
surf_size, surf_flags, TRUE);
|
||||
/* Since 5.2.0: keep fd available.
|
||||
close (fd); */
|
||||
surf = GAL_AttachSharedRGBSurface (fd, surf_size, surf_flags, TRUE);
|
||||
close (fd);
|
||||
}
|
||||
else {
|
||||
_ERR_PRINTF("KERNEL: not server but fd for shared surface is invalid\n");
|
||||
@@ -848,7 +846,7 @@ static int srvAllocZOrderNode (int cli, HWND hwnd, HWND main_win,
|
||||
}
|
||||
|
||||
if (surf) {
|
||||
memdc = __mg_create_memdc_for_surface (surf);
|
||||
memdc = CreateMemDCFromSurface (surf);
|
||||
if (memdc == HDC_INVALID) {
|
||||
if (cli > 0) {
|
||||
GAL_FreeSurface (surf);
|
||||
@@ -996,14 +994,12 @@ static int srvMoveWindow (int cli, int idx_znode, const RECT* rcWin,
|
||||
surf->refcount++;
|
||||
}
|
||||
else {
|
||||
surf = GAL_AttachSharedRGBSurface (NULL, fd,
|
||||
surf_size, surf_flags, TRUE);
|
||||
/* Since 5.2.0: keep fd available.
|
||||
close (fd); */
|
||||
surf = GAL_AttachSharedRGBSurface (fd, surf_size, surf_flags, TRUE);
|
||||
close (fd);
|
||||
}
|
||||
|
||||
if (surf) {
|
||||
memdc = __mg_create_memdc_for_surface (surf);
|
||||
memdc = CreateMemDCFromSurface (surf);
|
||||
if (memdc == HDC_INVALID) {
|
||||
if (cli > 0) {
|
||||
GAL_FreeSurface (surf);
|
||||
@@ -1018,6 +1014,7 @@ static int srvMoveWindow (int cli, int idx_znode, const RECT* rcWin,
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* def _MGSCHEMA_COMPOSITING */
|
||||
|
||||
ret = dskMoveWindow (cli, idx_znode, memdc, rcWin);
|
||||
@@ -2211,7 +2208,7 @@ static int resize_window_surface (PMAINWIN pWin, const RECT* prcResult)
|
||||
|
||||
pWin->surf = new_surf;
|
||||
if (pWin->surf->shared_header)
|
||||
return pWin->surf->fd;
|
||||
return pWin->surf->shared_header->fd;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
@@ -2256,10 +2253,9 @@ static int dskMoveGlobalControl (PMAINWIN pCtrl, RECT* prcExpect)
|
||||
}
|
||||
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
/* Since 5.2.0: keep fd available. */
|
||||
if (0 && pCtrl->surf->shared_header && pCtrl->surf->fd >= 0) {
|
||||
close (pCtrl->surf->fd);
|
||||
pCtrl->surf->fd = -1;
|
||||
if (pCtrl->surf->shared_header && pCtrl->surf->shared_header->fd >= 0) {
|
||||
close (pCtrl->surf->shared_header->fd);
|
||||
pCtrl->surf->shared_header->fd = -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -2288,10 +2284,9 @@ static int dskMoveMainWindow (PMAINWIN pWin, RECT* prcExpect)
|
||||
__mg_update_dc_on_surface_changed ((HWND)pWin, pWin->surf);
|
||||
}
|
||||
|
||||
/* Since 5.2.0: keep fd available. */
|
||||
if (0 && pWin->surf->shared_header && pWin->surf->fd >= 0) {
|
||||
close (pWin->surf->fd);
|
||||
pWin->surf->fd = -1;
|
||||
if (pWin->surf->shared_header && pWin->surf->shared_header->fd >= 0) {
|
||||
close (pWin->surf->shared_header->fd);
|
||||
pWin->surf->shared_header->fd = -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -2907,21 +2902,6 @@ int __mg_handle_mouse_hook (int message, WPARAM wParam, LPARAM lParam)
|
||||
}
|
||||
#endif /* deprecated code */
|
||||
|
||||
/* used by client to check the validation of a hwnd in the given znode slot. */
|
||||
BOOL __mg_client_check_znode_hwnd (int slot, HWND hwnd, int cli)
|
||||
{
|
||||
BOOL ret = FALSE;
|
||||
ZORDERINFO* zi = __mg_zorder_info;
|
||||
ZORDERNODE* nodes;
|
||||
|
||||
nodes = GET_ZORDERNODE(zi);
|
||||
lock_zi_for_read (zi);
|
||||
if (nodes[slot].hwnd == hwnd && nodes[slot].cli == cli)
|
||||
ret = TRUE;
|
||||
unlock_zi_for_read (zi);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* used by client to check the validation of a hwnd */
|
||||
BOOL __mg_client_check_hwnd (HWND hwnd, int cli)
|
||||
{
|
||||
|
||||
+3
-10
@@ -1603,10 +1603,8 @@ static int srvStartTrackPopupMenu (int cli, const RECT* rc, HWND ptmi,
|
||||
surf->refcount++;
|
||||
}
|
||||
else if (fd >= 0) {
|
||||
surf = GAL_AttachSharedRGBSurface (NULL, fd,
|
||||
surf_size, surf_flags, TRUE);
|
||||
/* Since 5.2.0: keep fd available.
|
||||
close (fd); */
|
||||
surf = GAL_AttachSharedRGBSurface (fd, surf_size, surf_flags, TRUE);
|
||||
close (fd);
|
||||
}
|
||||
else {
|
||||
_WRN_PRINTF("not server but fd for shared surface is invalid\n");
|
||||
@@ -1614,7 +1612,7 @@ static int srvStartTrackPopupMenu (int cli, const RECT* rc, HWND ptmi,
|
||||
}
|
||||
|
||||
if (surf) {
|
||||
memdc = __mg_create_memdc_for_surface (surf);
|
||||
memdc = CreateMemDCFromSurface (surf);
|
||||
if (memdc == HDC_INVALID) {
|
||||
GAL_FreeSurface (surf);
|
||||
_WRN_PRINTF("failed to create memory dc for znode\n");
|
||||
@@ -1648,14 +1646,11 @@ static int srvStartTrackPopupMenu (int cli, const RECT* rc, HWND ptmi,
|
||||
menu_nodes [zi->nr_popupmenus].flags = ZOF_TYPE_POPUPMENU;
|
||||
menu_nodes [zi->nr_popupmenus].rc = *rc;
|
||||
menu_nodes [zi->nr_popupmenus].hwnd = ptmi;
|
||||
menu_nodes [zi->nr_popupmenus].cli = 0;
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
menu_nodes [zi->nr_popupmenus].changes = 0;
|
||||
menu_nodes [zi->nr_popupmenus].ct = CT_OPAQUE;
|
||||
menu_nodes [zi->nr_popupmenus].ct_arg = 0;
|
||||
menu_nodes [zi->nr_popupmenus].mem_dc = memdc;
|
||||
menu_nodes [zi->nr_popupmenus].dirty_age = 0;
|
||||
menu_nodes [zi->nr_popupmenus].nr_dirty_rcs = 0;
|
||||
menu_nodes [zi->nr_popupmenus].dirty_rcs = NULL;
|
||||
#endif
|
||||
menu_nodes [zi->nr_popupmenus].priv_data = NULL;
|
||||
@@ -2361,8 +2356,6 @@ static int AllocZOrderNodeEx (ZORDERINFO* zi, int cli, HWND hwnd, HWND main_win,
|
||||
nodes [free_slot].ct = validate_compositing_type (flags, ct);
|
||||
nodes [free_slot].ct_arg = ct_arg;
|
||||
nodes [free_slot].mem_dc = mem_dc;
|
||||
nodes [free_slot].dirty_age = 0;
|
||||
nodes [free_slot].nr_dirty_rcs = 0;
|
||||
nodes [free_slot].dirty_rcs = NULL;
|
||||
#else
|
||||
nodes [free_slot].age = 1;
|
||||
|
||||
@@ -7,7 +7,7 @@ EXTRA_DIST= misc.c systext.c rwops.c endianrw.c nposix.c clipboard.c \
|
||||
|
||||
libmisc_la_SOURCES = misc.c systext.c rwops.c endianrw.c nposix.c clipboard.c \
|
||||
math.c about.c license.c anon_file.c rbtree.c map.c \
|
||||
error.c sockio.c lock_file.c
|
||||
error.c sockio.c
|
||||
|
||||
SRC_FILES = $(libmisc_la_SOURCES)
|
||||
LIB_NAME=libmisc
|
||||
|
||||
+1
-1
@@ -114,7 +114,7 @@ static LRESULT AboutWinProc (HWND hWnd, UINT message,
|
||||
DrawText (hdc,
|
||||
"MiniGUI -- a mature cross-platform windowing system "
|
||||
"and GUI support system for embedded or IoT devices.\n\n"
|
||||
"Copyright (C) 2002 ~ 2023 FMSoft Co., Ltd.",
|
||||
"Copyright (C) 2002 ~ 2020 FMSoft Co., Ltd.",
|
||||
-1, &rcClient, DT_WORDBREAK | DT_CENTER);
|
||||
|
||||
EndPaint (hWnd, hdc);
|
||||
|
||||
@@ -1,112 +0,0 @@
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
/*
|
||||
* 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) 2023, Beijing FMSoft Technologies Co., Ltd.
|
||||
*
|
||||
* 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/>.
|
||||
*/
|
||||
/*
|
||||
** lock_file.c: This file include functions for locking/unlocking a file.
|
||||
**
|
||||
** Create date: 2023/09/10
|
||||
**
|
||||
** Current maintainer: Wei Yongming.
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#ifndef __NOUNIX__
|
||||
|
||||
#include "misc.h"
|
||||
|
||||
#include <unistd.h>
|
||||
#include <sys/file.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
|
||||
void __mg_lock_file_for_read(int fd)
|
||||
{
|
||||
struct flock lock;
|
||||
|
||||
lock.l_type = F_RDLCK;
|
||||
lock.l_whence = SEEK_SET;
|
||||
lock.l_start = 0;
|
||||
lock.l_len = 0;
|
||||
|
||||
while (fcntl(fd, F_SETLKW, &lock) == -1 && errno == EINTR);
|
||||
}
|
||||
|
||||
void __mg_unlock_file_for_read(int fd)
|
||||
{
|
||||
struct flock lock;
|
||||
|
||||
lock.l_type = F_UNLCK;
|
||||
lock.l_whence = SEEK_SET;
|
||||
lock.l_start = 0;
|
||||
lock.l_len = 0;
|
||||
|
||||
fcntl(fd, F_SETLK, &lock);
|
||||
}
|
||||
|
||||
void __mg_lock_file_for_write(int fd)
|
||||
{
|
||||
struct flock lock;
|
||||
|
||||
lock.l_type = F_WRLCK;
|
||||
lock.l_whence = SEEK_SET;
|
||||
lock.l_start = 0;
|
||||
lock.l_len = 0;
|
||||
|
||||
while (fcntl(fd, F_SETLKW, &lock) == -1 && errno == EINTR);
|
||||
}
|
||||
|
||||
void __mg_unlock_file_for_write(int fd)
|
||||
{
|
||||
struct flock lock;
|
||||
|
||||
lock.l_type = F_UNLCK;
|
||||
lock.l_whence = SEEK_SET;
|
||||
lock.l_start = 0;
|
||||
lock.l_len = 0;
|
||||
|
||||
fcntl(fd, F_SETLK, &lock);
|
||||
}
|
||||
|
||||
#endif /* __NOUNIX__ */
|
||||
+4
-4
@@ -243,7 +243,7 @@ map_entry_t* __mg_map_find (map_t* map, const void* key)
|
||||
return entry;
|
||||
}
|
||||
|
||||
int __mg_map_erase (map_t* map, const void* key)
|
||||
int __mg_map_erase (map_t* map, void* key)
|
||||
{
|
||||
int retval = -1;
|
||||
map_entry_t* entry = NULL;
|
||||
@@ -299,7 +299,7 @@ ret:
|
||||
return retval;
|
||||
}
|
||||
|
||||
map_entry_t* __mg_map_insert_ex2 (map_t* map, const void* key,
|
||||
int __mg_map_insert_ex (map_t* map, const void* key,
|
||||
const void* val, free_val_fn free_val_alt)
|
||||
{
|
||||
map_entry_t **pentry;
|
||||
@@ -307,7 +307,7 @@ map_entry_t* __mg_map_insert_ex2 (map_t* map, const void* key,
|
||||
map_entry_t *parent;
|
||||
|
||||
if (map == NULL)
|
||||
return NULL;
|
||||
return -1;
|
||||
|
||||
WRLOCK_MAP (map);
|
||||
|
||||
@@ -354,7 +354,7 @@ map_entry_t* __mg_map_insert_ex2 (map_t* map, const void* key,
|
||||
}
|
||||
|
||||
UNLOCK_MAP (map);
|
||||
return entry;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __mg_map_find_replace_or_insert (map_t* map, const void* key,
|
||||
|
||||
@@ -96,12 +96,8 @@ static BITMAP_TYPE_INFO bitmap_types [MAX_BITMAP_TYPES] =
|
||||
{ "jpeg", __mg_init_jpg, __mg_load_jpg, __mg_cleanup_jpg, __mg_save_jpg, __mg_check_jpg },
|
||||
#endif
|
||||
#ifdef _MGIMAGE_PNG
|
||||
#if _MGLIBPNG_VER == 16
|
||||
{ "png", __mg_init_png, __mg_load_png, __mg_cleanup_png, __mg_save_png, __mg_check_png },
|
||||
#else
|
||||
{ "png", __mg_init_png, __mg_load_png, __mg_cleanup_png, NULL, __mg_check_png },
|
||||
#endif
|
||||
#endif
|
||||
#ifdef _MGIMAGE_WEBP
|
||||
{ "webp", __mg_init_webp, __mg_load_webp, __mg_cleanup_webp, NULL, __mg_check_webp },
|
||||
#endif
|
||||
|
||||
@@ -381,287 +381,6 @@ BOOL __mg_check_png (MG_RWops* fp)
|
||||
return png_check_sig (sig, 8);
|
||||
}
|
||||
|
||||
static void png_error_callback (png_structp png, png_const_charp error_msg)
|
||||
{
|
||||
int *error = png_get_error_ptr (png);
|
||||
|
||||
*error = ERR_BMP_CANT_SAVE;
|
||||
|
||||
#ifdef PNG_SETJMP_SUPPORTED
|
||||
longjmp (png_jmpbuf (png), 1);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void png_warning_callback (png_structp png, png_const_charp error_msg)
|
||||
{
|
||||
}
|
||||
|
||||
static void png_output_flush_fn (png_structp png_ptr)
|
||||
{
|
||||
}
|
||||
|
||||
static void my_write_data_fn (png_structp png_ptr, png_bytep data,
|
||||
png_size_t length)
|
||||
{
|
||||
png_size_t check;
|
||||
png_voidp io_ptr = png_get_io_ptr(png_ptr);
|
||||
|
||||
if (MGUI_RWwrite((MG_RWops*)io_ptr, data, 1, length) !=
|
||||
(size_t) length) {
|
||||
png_error(png_ptr, "Write Error");
|
||||
}
|
||||
}
|
||||
|
||||
typedef BYTE* (*MYBITMAP_get_pixel_row)(unsigned int cinfo,
|
||||
MYBITMAP* mybmp,RGB* pal);
|
||||
|
||||
static BYTE* MYBITMAP_get_pixel_row_pal16(unsigned int next_scanline,
|
||||
MYBITMAP* mybmp, RGB* pal)
|
||||
{
|
||||
RGB rgb0, rgb1;
|
||||
|
||||
BYTE *bits = mybmp->bits + next_scanline * mybmp->pitch;
|
||||
int nr_data = mybmp->w * 4;
|
||||
BYTE *data = (BYTE *)malloc(nr_data);
|
||||
uint8_t alpha = 0xFF;
|
||||
|
||||
for (int i = 0, j = 0, end_i = (mybmp->w + 1) >> 1; i < end_i; ++i) {
|
||||
|
||||
rgb0 = pal[ (bits[ i ] & 0XF0) >> 4 ];
|
||||
rgb1 = pal[ bits[ i ] & 0X0F ];
|
||||
|
||||
data[ j ++ ] = rgb0.r;
|
||||
data[ j ++ ] = rgb0.g;
|
||||
data[ j ++ ] = rgb0.b;
|
||||
data[ j ++ ] = alpha;
|
||||
|
||||
data[ j ++ ] = rgb1.r;
|
||||
data[ j ++ ] = rgb1.g;
|
||||
data[ j ++ ] = rgb1.b;
|
||||
data[ j ++ ] = alpha;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
static BYTE* MYBITMAP_get_pixel_row_pal256(unsigned int next_scanline,
|
||||
MYBITMAP* mybmp, RGB* pal)
|
||||
{
|
||||
RGB rgb;
|
||||
BYTE *bits = mybmp->bits + next_scanline * mybmp->pitch;
|
||||
|
||||
int nr_data = mybmp->w * 4;
|
||||
BYTE *data = (BYTE *)malloc(nr_data);
|
||||
uint8_t alpha = 0xFF;
|
||||
|
||||
for (int i = 0, j = 0; i < mybmp->w; i++, j += 4) {
|
||||
rgb = pal [bits[i] ];
|
||||
|
||||
data[0] = rgb.r;
|
||||
data[1] = rgb.g;
|
||||
data[2] = rgb.b;
|
||||
data[3] = alpha;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
#define RGB_FROM_RGB565(pixel, r, g, b) \
|
||||
{ \
|
||||
r = (((pixel&0xF800)>>11)<<3); \
|
||||
g = (((pixel&0x07E0)>>5)<<2); \
|
||||
b = ((pixel&0x001F)<<3); \
|
||||
}
|
||||
|
||||
static BYTE* MYBITMAP_get_pixel_row_RGB565(unsigned int next_scanline,
|
||||
MYBITMAP* mybmp, RGB* pal)
|
||||
{
|
||||
Uint16* bits = (Uint16*)(mybmp->bits + next_scanline * mybmp->pitch);
|
||||
|
||||
int nr_data = mybmp->w * 4;
|
||||
BYTE* data = (BYTE *)malloc(nr_data);
|
||||
uint8_t alpha = 0xFF;
|
||||
for (int i = 0, j = 0; i < nr_data; i += 4, j++) {
|
||||
uint8_t *b = data + i;
|
||||
Uint16 *pixel = bits + j;
|
||||
RGB_FROM_RGB565(pixel[j], b[0], b[1], b[2])
|
||||
b[3] = alpha;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
static BYTE* MYBITMAP_get_pixel_row_RGB(unsigned int next_scanline,
|
||||
MYBITMAP* mybmp, RGB* pal)
|
||||
{
|
||||
BYTE *bits = mybmp->bits + next_scanline * mybmp->pitch;
|
||||
|
||||
int nr_data = mybmp->w * 4;
|
||||
BYTE *data = (BYTE *)malloc(nr_data);
|
||||
uint8_t alpha = 0xFF;
|
||||
|
||||
for (int i = 0, j = 0; i < nr_data; i += 4, j += 3) {
|
||||
uint8_t *b = data + i;
|
||||
BYTE *pixel = bits + j;
|
||||
b[0] = pixel[2];
|
||||
b[1] = pixel[1];
|
||||
b[2] = pixel[0];
|
||||
b[3] = alpha;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
static BYTE* MYBITMAP_get_pixel_row_BGR(unsigned int next_scanline,
|
||||
MYBITMAP* mybmp, RGB* pal)
|
||||
{
|
||||
BYTE *bits = mybmp->bits + next_scanline * mybmp->pitch;
|
||||
|
||||
int nr_data = mybmp->w * 4;
|
||||
BYTE *data = (BYTE *)malloc(nr_data);
|
||||
uint8_t alpha = 0xFF;
|
||||
|
||||
for (int i = 0, j = 0; i < nr_data; i += 4, j += 3) {
|
||||
uint8_t *b = data + i;
|
||||
BYTE *pixel = bits + j;
|
||||
b[0] = pixel[0];
|
||||
b[1] = pixel[1];
|
||||
b[2] = pixel[2];
|
||||
b[3] = alpha;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
static BYTE* MYBITMAP_get_pixel_row_RGBA(unsigned int next_scanline,
|
||||
MYBITMAP* mybmp, RGB* pal)
|
||||
{
|
||||
BYTE *bits = mybmp->bits + next_scanline * mybmp->pitch;
|
||||
|
||||
int nr_data = mybmp->w * 4;
|
||||
BYTE *data = (BYTE *)malloc(nr_data);
|
||||
|
||||
for (int i = 0; i < nr_data; i += 4) {
|
||||
uint8_t *b = data + i;
|
||||
BYTE *pixel = bits + i;
|
||||
|
||||
uint8_t alpha = pixel[3];
|
||||
if (alpha == 0) {
|
||||
b[0] = b[1] = b[2] = b[3] = 0;
|
||||
} else {
|
||||
b[0] = (pixel[2] * 255 + alpha / 2) / alpha; /* red */
|
||||
b[1] = (pixel[1] * 255 + alpha / 2) / alpha; /* green */
|
||||
b[2] = (pixel[0] * 255 + alpha / 2) / alpha; /* blue */
|
||||
b[3] = alpha;
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
int __mg_save_png (MG_RWops* fp, MYBITMAP* bmp, RGB* pal)
|
||||
{
|
||||
png_struct *png;
|
||||
png_info *info;
|
||||
png_byte **volatile rows = NULL;
|
||||
MYBITMAP_get_pixel_row get_row;
|
||||
png_color_16 white;
|
||||
int png_color_type;
|
||||
int retcode = ERR_BMP_CANT_SAVE;
|
||||
int bpc;
|
||||
int bmp_type;
|
||||
|
||||
rows = calloc(bmp->h, sizeof(png_byte*));
|
||||
if (rows == NULL) {
|
||||
retcode = ERR_BMP_CANT_SAVE;
|
||||
goto failed;
|
||||
}
|
||||
|
||||
png = png_create_write_struct (PNG_LIBPNG_VER_STRING, &retcode,
|
||||
png_error_callback, png_warning_callback);
|
||||
if (png == NULL) {
|
||||
retcode = ERR_BMP_MEM;
|
||||
goto failed_clear_rows;
|
||||
}
|
||||
|
||||
info = png_create_info_struct (png);
|
||||
if (info == NULL) {
|
||||
retcode = ERR_BMP_MEM;
|
||||
goto failed_clear_struct;
|
||||
}
|
||||
|
||||
#ifdef PNG_SETJMP_SUPPORTED
|
||||
if (setjmp (png_jmpbuf (png))) {
|
||||
goto failed_clear_struct;
|
||||
}
|
||||
#endif
|
||||
|
||||
png_set_write_fn (png, fp, my_write_data_fn, png_output_flush_fn);
|
||||
|
||||
bmp_type = bmp->flags & MYBMP_TYPE_MASK;
|
||||
|
||||
switch(bmp->depth) {
|
||||
case 4:
|
||||
get_row = MYBITMAP_get_pixel_row_pal16;
|
||||
break;
|
||||
case 8:
|
||||
get_row = MYBITMAP_get_pixel_row_pal256;
|
||||
break;
|
||||
case 16:
|
||||
get_row = MYBITMAP_get_pixel_row_RGB565;
|
||||
break;
|
||||
case 24:
|
||||
if(MYBMP_TYPE_RGB == bmp_type)
|
||||
get_row = MYBITMAP_get_pixel_row_RGB;
|
||||
else
|
||||
get_row = MYBITMAP_get_pixel_row_BGR;
|
||||
break;
|
||||
case 32:
|
||||
get_row = MYBITMAP_get_pixel_row_RGBA;
|
||||
break;
|
||||
default:
|
||||
_ERR_PRINTF("MYBMP>PNG: invalid MYBITMAP.depth = %d\n", bmp->depth);
|
||||
goto failed_clear_struct;
|
||||
}
|
||||
|
||||
for (int i = 0; i < bmp->h; i++) {
|
||||
rows[i] = get_row(i, bmp, pal);
|
||||
}
|
||||
bpc = 8;
|
||||
png_color_type = PNG_COLOR_TYPE_RGB_ALPHA;
|
||||
|
||||
png_set_IHDR (png, info,
|
||||
bmp->w,
|
||||
bmp->h, bpc,
|
||||
png_color_type,
|
||||
PNG_INTERLACE_NONE,
|
||||
PNG_COMPRESSION_TYPE_DEFAULT,
|
||||
PNG_FILTER_TYPE_DEFAULT);
|
||||
|
||||
white.gray = (1 << bpc) - 1;
|
||||
white.red = white.blue = white.green = white.gray;
|
||||
png_set_bKGD (png, info, &white);
|
||||
|
||||
png_write_info (png, info);
|
||||
|
||||
png_write_image (png, rows);
|
||||
png_write_end (png, info);
|
||||
|
||||
retcode = ERR_BMP_OK;
|
||||
|
||||
failed_clear_struct:
|
||||
png_destroy_write_struct (&png, &info);
|
||||
failed_clear_rows:
|
||||
for (int i = 0; i < bmp->h; i++) {
|
||||
if (rows[i]) {
|
||||
free(rows[i]);
|
||||
}
|
||||
}
|
||||
free (rows);
|
||||
failed:
|
||||
return retcode;
|
||||
}
|
||||
|
||||
#endif /* _MGLIBPNG_VER == 16 */
|
||||
#endif /* _MGIMAGE_PNG */
|
||||
|
||||
|
||||
@@ -144,7 +144,7 @@ static int DRM_AllocSharedHWSurface(_THIS, GAL_Surface *surface,
|
||||
static int DRM_FreeSharedHWSurface(_THIS, GAL_Surface *surface);
|
||||
static int DRM_AttachSharedHWSurface(_THIS, GAL_Surface *surface,
|
||||
int prime_fd, size_t mapsize, BOOL with_rw);
|
||||
static int DRM_DetachSharedHWSurface(_THIS, GAL_Surface *surface);
|
||||
static int DRM_DettachSharedHWSurface(_THIS, GAL_Surface *surface);
|
||||
|
||||
static int DRM_SetCursor(_THIS, GAL_Surface *surface, int hot_x, int hot_y);
|
||||
static int DRM_MoveCursor(_THIS, int x, int y);
|
||||
@@ -1410,7 +1410,7 @@ static GAL_VideoDevice *DRM_CreateDevice(int devindex)
|
||||
device->AllocSharedHWSurface = DRM_AllocSharedHWSurface;
|
||||
device->FreeSharedHWSurface = DRM_FreeSharedHWSurface;
|
||||
device->AttachSharedHWSurface = DRM_AttachSharedHWSurface;
|
||||
device->DetachSharedHWSurface = DRM_DetachSharedHWSurface;
|
||||
device->DettachSharedHWSurface = DRM_DettachSharedHWSurface;
|
||||
}
|
||||
#endif /* IS_COMPOSITING_SCHEMA */
|
||||
|
||||
@@ -3127,7 +3127,7 @@ error:
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int DRM_DetachSharedHWSurface(_THIS, GAL_Surface *surface)
|
||||
static int DRM_DettachSharedHWSurface(_THIS, GAL_Surface *surface)
|
||||
{
|
||||
int retval = -1;
|
||||
DrmVideoData* vdata = this->hidden;
|
||||
|
||||
+1
-1
@@ -247,7 +247,7 @@ static GAL_Surface* create_wp_surface(GAL_Surface* screen)
|
||||
|
||||
_DBG_PRINTF ("REQID_GETSHAREDSURFACE: size (%lu), flags (0x%x), fd: %d\n",
|
||||
info.size, info.flags, fd);
|
||||
wp_surf = GAL_AttachSharedRGBSurface (NULL, fd, info.size,
|
||||
wp_surf = GAL_AttachSharedRGBSurface (fd, info.size,
|
||||
info.flags, TRUE);
|
||||
close (fd);
|
||||
|
||||
|
||||
+35
-41
@@ -15,7 +15,7 @@
|
||||
* and Graphics User Interface (GUI) support system for embedded systems
|
||||
* and smart IoT devices.
|
||||
*
|
||||
* Copyright (C) 2002~2023, Beijing FMSoft Technologies Co., Ltd.
|
||||
* 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
|
||||
@@ -59,7 +59,6 @@
|
||||
#include <sys/mman.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "internals.h"
|
||||
#include "misc.h"
|
||||
#include "newgal.h"
|
||||
#include "sysvideo.h"
|
||||
@@ -69,7 +68,7 @@
|
||||
/*
|
||||
* Create a shared empty RGB surface of the appropriate depth and pixel format
|
||||
*/
|
||||
GAL_Surface *GAL_CreateSharedRGBSurface (GAL_VideoDevice *video,
|
||||
GAL_Surface * GAL_CreateSharedRGBSurface (GAL_VideoDevice *video,
|
||||
Uint32 flags, Uint32 rw_modes, int width, int height, int depth,
|
||||
Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask)
|
||||
{
|
||||
@@ -143,7 +142,6 @@ GAL_Surface *GAL_CreateSharedRGBSurface (GAL_VideoDevice *video,
|
||||
#endif
|
||||
surface->shared_header = NULL;
|
||||
surface->dirty_info = NULL;
|
||||
surface->fd = -1;
|
||||
GAL_SetClipRect (surface, NULL);
|
||||
|
||||
#ifdef _MGUSE_UPDATE_REGION
|
||||
@@ -203,12 +201,10 @@ GAL_Surface *GAL_CreateSharedRGBSurface (GAL_VideoDevice *video,
|
||||
surface->shared_header = hdr = (GAL_SharedSurfaceHeader*)data_map;
|
||||
}
|
||||
|
||||
surface->fd = fd; /* Since 5.2.0 */
|
||||
|
||||
/* fill fileds of shared header */
|
||||
memset (hdr, 0, sizeof(GAL_SharedSurfaceHeader));
|
||||
hdr->create_cli = __mg_client_id;
|
||||
// hdr->fd = fd;
|
||||
hdr->creator = getpid();
|
||||
hdr->fd = fd;
|
||||
hdr->byhw = byhw;
|
||||
hdr->width = surface->w;
|
||||
hdr->height = surface->h;
|
||||
@@ -225,8 +221,7 @@ GAL_Surface *GAL_CreateSharedRGBSurface (GAL_VideoDevice *video,
|
||||
surface->dirty_info->dirty_age = 0;
|
||||
surface->dirty_info->nr_dirty_rcs = 0;
|
||||
|
||||
/* Deprecated since 5.2.0.
|
||||
allocate semaphore from semaphore for shared surface
|
||||
/* allocate semaphore from semaphore for shared surface */
|
||||
if (IsServer() && __gal_fake_screen == NULL) {
|
||||
// use 0 for wallpaper pattern,
|
||||
// because the semaphore set manager is not ready.
|
||||
@@ -237,7 +232,7 @@ GAL_Surface *GAL_CreateSharedRGBSurface (GAL_VideoDevice *video,
|
||||
if (hdr->sem_num < 0) {
|
||||
goto error;
|
||||
}
|
||||
} */
|
||||
}
|
||||
|
||||
surface->pixels = (uint8_t*)surface->shared_header + pixels_off;
|
||||
|
||||
@@ -259,16 +254,16 @@ GAL_Surface *GAL_CreateSharedRGBSurface (GAL_VideoDevice *video,
|
||||
|
||||
error:
|
||||
if (surface) {
|
||||
if (surface->fd >= 0) {
|
||||
close(surface->fd);
|
||||
surface->fd = -1;
|
||||
}
|
||||
|
||||
if (surface->shared_header) {
|
||||
/* Deprecated since 5.2.0
|
||||
#if 0
|
||||
if (sem_inited) {
|
||||
sem_destroy (&surface->shared_header->sem_lock);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (surface->shared_header->sem_num >= 0) {
|
||||
__mg_free_sem_for_shared_surf (surface->shared_header->sem_num);
|
||||
} */
|
||||
}
|
||||
|
||||
if (surface->shared_header->byhw) {
|
||||
assert(video->FreeSharedHWSurface);
|
||||
@@ -276,6 +271,7 @@ error:
|
||||
surface->hwdata = NULL; /* set to NULL for GAL_FreeSurface */
|
||||
}
|
||||
else {
|
||||
close (surface->shared_header->fd);
|
||||
munmap (surface->shared_header,
|
||||
surface->shared_header->map_size);
|
||||
}
|
||||
@@ -304,16 +300,20 @@ void GAL_FreeSharedSurfaceData (GAL_Surface *surface)
|
||||
GAL_VideoDevice *video = surface->video;
|
||||
|
||||
assert (surface->shared_header);
|
||||
assert (surface->fd >= 0);
|
||||
|
||||
#if 0
|
||||
sem_destroy (&surface->shared_header->sem_lock);
|
||||
#endif
|
||||
|
||||
/* Deprecated since 5.2.0
|
||||
if (surface->shared_header->sem_num >= 0) {
|
||||
__mg_free_sem_for_shared_surf (surface->shared_header->sem_num);
|
||||
} */
|
||||
}
|
||||
|
||||
// the file descriptor may have been closed.
|
||||
if (surface->shared_header->fd >= 0) {
|
||||
close (surface->shared_header->fd);
|
||||
surface->shared_header->fd = -1;
|
||||
}
|
||||
|
||||
if (surface->shared_header->byhw) {
|
||||
assert (video->FreeSharedHWSurface);
|
||||
@@ -325,8 +325,6 @@ void GAL_FreeSharedSurfaceData (GAL_Surface *surface)
|
||||
surface->shared_header->map_size);
|
||||
}
|
||||
|
||||
close(surface->fd);
|
||||
|
||||
surface->pixels = NULL;
|
||||
#ifdef _MGUSE_PIXMAN
|
||||
surface->pix_img = NULL;
|
||||
@@ -334,15 +332,15 @@ void GAL_FreeSharedSurfaceData (GAL_Surface *surface)
|
||||
#endif
|
||||
surface->shared_header = NULL;
|
||||
surface->dirty_info = NULL;
|
||||
surface->fd = -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Attach to a shared RGB surface
|
||||
*/
|
||||
GAL_Surface * GAL_AttachSharedRGBSurface (GAL_VideoDevice *video,
|
||||
int fd, size_t map_size, Uint32 flags, BOOL with_wr)
|
||||
GAL_Surface * GAL_AttachSharedRGBSurface (int fd, size_t map_size,
|
||||
Uint32 flags, BOOL with_wr)
|
||||
{
|
||||
GAL_VideoDevice *video = NULL;
|
||||
GAL_Surface *surface;
|
||||
void* data_map = MAP_FAILED;
|
||||
GAL_SharedSurfaceHeader* hdr;
|
||||
@@ -364,10 +362,11 @@ GAL_Surface * GAL_AttachSharedRGBSurface (GAL_VideoDevice *video,
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (video == NULL) {
|
||||
if ((flags & GAL_HWSURFACE) == GAL_HWSURFACE) {
|
||||
video = __mg_current_video;
|
||||
}
|
||||
if ((flags & GAL_HWSURFACE) == GAL_HWSURFACE) {
|
||||
video = __mg_current_video;
|
||||
}
|
||||
else {
|
||||
video = NULL;
|
||||
}
|
||||
|
||||
surface->video = video;
|
||||
@@ -375,8 +374,6 @@ GAL_Surface * GAL_AttachSharedRGBSurface (GAL_VideoDevice *video,
|
||||
|
||||
surface->shared_header = NULL;
|
||||
surface->hwdata = NULL;
|
||||
surface->fd = fd;
|
||||
|
||||
if (video && video->AttachSharedHWSurface) {
|
||||
// this method should fill hwdata and shared_header fields if success
|
||||
video->AttachSharedHWSurface (video, surface, fd, map_size, with_wr);
|
||||
@@ -392,7 +389,7 @@ GAL_Surface * GAL_AttachSharedRGBSurface (GAL_VideoDevice *video,
|
||||
|
||||
data_map = mmap (NULL, map_size, prot, MAP_SHARED, fd, 0);
|
||||
if (data_map == MAP_FAILED) {
|
||||
_ERR_PRINTF("NEWGAL: Failed to map shared RGB surface: %d (%m)\n", fd);
|
||||
_ERR_PRINTF("NEWGAL: Failed to map shared RGB surface: %d\n", fd);
|
||||
goto error;
|
||||
}
|
||||
|
||||
@@ -442,17 +439,14 @@ GAL_Surface * GAL_AttachSharedRGBSurface (GAL_VideoDevice *video,
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Since 5.2.0 */
|
||||
surface->flags |= GAL_SSURF_ATTACHED;
|
||||
|
||||
/* The surface is ready to go */
|
||||
surface->refcount = 1;
|
||||
return (surface);
|
||||
|
||||
error:
|
||||
if (video && surface && surface->hwdata) {
|
||||
assert (video->DetachSharedHWSurface);
|
||||
video->DetachSharedHWSurface (video, surface);
|
||||
assert (video->DettachSharedHWSurface);
|
||||
video->DettachSharedHWSurface (video, surface);
|
||||
}
|
||||
else if (data_map != MAP_FAILED) {
|
||||
munmap (data_map, map_size);
|
||||
@@ -468,15 +462,15 @@ error:
|
||||
/*
|
||||
* Free data of a shared surface created by the above function.
|
||||
*/
|
||||
void GAL_DetachSharedSurfaceData (GAL_Surface *surface)
|
||||
void GAL_DettachSharedSurfaceData (GAL_Surface *surface)
|
||||
{
|
||||
GAL_VideoDevice *video = surface->video;
|
||||
|
||||
assert (surface->shared_header);
|
||||
|
||||
if (video && surface->hwdata) {
|
||||
assert (video->DetachSharedHWSurface);
|
||||
video->DetachSharedHWSurface (video, surface);
|
||||
assert (video->DettachSharedHWSurface);
|
||||
video->DettachSharedHWSurface (video, surface);
|
||||
surface->hwdata = NULL;
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -1836,15 +1836,10 @@ void GAL_FreeSurface (GAL_Surface *surface)
|
||||
}
|
||||
|
||||
if (surface->shared_header) {
|
||||
if (surface->flags & GAL_SSURF_ATTACHED)
|
||||
GAL_DetachSharedSurfaceData(surface);
|
||||
else
|
||||
if (surface->shared_header->creator == getpid())
|
||||
GAL_FreeSharedSurfaceData(surface);
|
||||
|
||||
if (surface->fd >= 0) {
|
||||
close(surface->fd);
|
||||
surface->fd = -1;
|
||||
}
|
||||
else
|
||||
GAL_DettachSharedSurfaceData(surface);
|
||||
|
||||
surface->hwdata = NULL;
|
||||
surface->pixels = NULL;
|
||||
|
||||
@@ -174,10 +174,10 @@ struct GAL_VideoDevice {
|
||||
int (*AttachSharedHWSurface)(_THIS, GAL_Surface *surface,
|
||||
int prime_fd, size_t mapsize, BOOL with_rw);
|
||||
|
||||
/* Detach from a shared surface in hardware video memory.
|
||||
/* Dettach from a shared surface in hardware video memory.
|
||||
Set to NULL if no hardware shared surface supported.
|
||||
Return 0 if success, otherwise -1. */
|
||||
int (*DetachSharedHWSurface)(_THIS, GAL_Surface *surface);
|
||||
int (*DettachSharedHWSurface)(_THIS, GAL_Surface *surface);
|
||||
|
||||
/* Allocate a dumb surface from hardware.
|
||||
Set to NULL if dumb surface is not supported.
|
||||
|
||||
+2
-2
@@ -918,9 +918,9 @@ BOOL GAL_SyncUpdate (GAL_Surface *surface)
|
||||
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
if (surface->shared_header) {
|
||||
__mg_lock_file_for_write (surface->fd);
|
||||
LOCK_SURFACE_SEM (surface->shared_header->sem_num);
|
||||
mark_surface_dirty (surface, numrects, rects);
|
||||
__mg_unlock_file_for_write (surface->fd);
|
||||
UNLOCK_SURFACE_SEM (surface->shared_header->sem_num);
|
||||
}
|
||||
else if (surface->dirty_info) {
|
||||
mark_surface_dirty (surface, numrects, rects);
|
||||
|
||||
@@ -14,8 +14,7 @@ SRC_FILES = gdi.c attr.c clip.c map.c coor.c rect.c \
|
||||
simple-glyph-renderer.c glyph-shaped.c \
|
||||
textruns.c \
|
||||
shape-glyphs-basic.c shape-glyphs-complex.c \
|
||||
layout.c layout-utils.c layout-ellipsize.c \
|
||||
shared-surface.c
|
||||
layout.c layout-utils.c layout-ellipsize.c
|
||||
|
||||
HDR_FILES = glyph.h drawtext.h mi.h midc.h mistruct.h miwideline.h \
|
||||
pixel_ops.h mifillarc.h mispans.h polygon.h mifpoly.h \
|
||||
|
||||
+29
-18
@@ -3346,7 +3346,8 @@ HDC GUIAPI CreateMemDCEx (int width, int height, int depth, DWORD flags,
|
||||
return (HDC)pmem_dc;
|
||||
}
|
||||
|
||||
static HDC create_memdc_from_surface(HSURF surface, BOOL take_owner)
|
||||
/* Since 5.0.0 */
|
||||
HDC CreateMemDCFromSurface (GAL_Surface* surface)
|
||||
{
|
||||
PDC pmem_dc = NULL;
|
||||
|
||||
@@ -3359,10 +3360,7 @@ static HDC create_memdc_from_surface(HSURF surface, BOOL take_owner)
|
||||
pmem_dc->DataType = TYPE_HDC;
|
||||
pmem_dc->DCType = TYPE_MEMDC;
|
||||
pmem_dc->bInUse = TRUE;
|
||||
if (take_owner)
|
||||
pmem_dc->surface = surface;
|
||||
else
|
||||
pmem_dc->surface = GAL_RefSurface(surface);
|
||||
pmem_dc->surface = surface;
|
||||
|
||||
dc_InitDC (pmem_dc, HWND_NULL, FALSE);
|
||||
|
||||
@@ -3386,24 +3384,36 @@ static HDC create_memdc_from_surface(HSURF surface, BOOL take_owner)
|
||||
return (HDC)pmem_dc;
|
||||
}
|
||||
|
||||
/* Since 5.2.0 */
|
||||
HDC GUIAPI CreateMemDCFromSurface (HSURF surface)
|
||||
{
|
||||
return create_memdc_from_surface(surface, FALSE);
|
||||
}
|
||||
|
||||
HDC __mg_create_memdc_for_surface (HSURF surface)
|
||||
{
|
||||
return create_memdc_from_surface(surface, TRUE);
|
||||
}
|
||||
|
||||
HSURF GUIAPI GetSurfaceFromDC (HDC hdc)
|
||||
struct GAL_Surface* GetSurfaceFromDC (HDC hdc)
|
||||
{
|
||||
PDC pdc;
|
||||
pdc = dc_HDC2PDC(hdc);
|
||||
pdc = dc_HDC2PDC (hdc);
|
||||
return pdc->surface;
|
||||
}
|
||||
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
HDC GUIAPI CreateMemDCFromSharedSurfaceFD (int fd)
|
||||
{
|
||||
HDC memdc = HDC_INVALID;
|
||||
GAL_Surface* surf;
|
||||
|
||||
surf = GAL_AttachSharedRGBSurface (fd, 0, GAL_HWSURFACE, TRUE);
|
||||
if (surf) {
|
||||
memdc = CreateMemDCFromSurface (surf);
|
||||
if (memdc == HDC_INVALID) {
|
||||
GAL_FreeSurface(surf);
|
||||
|
||||
_ERR_PRINTF("failed to create memory dc from surface: %p\n", surf);
|
||||
}
|
||||
}
|
||||
else {
|
||||
_ERR_PRINTF("failed to attach to surface buffer via fd: %d\n", fd);
|
||||
}
|
||||
|
||||
return memdc;
|
||||
}
|
||||
#endif /* _MGSCHEMA_COMPOSITING */
|
||||
|
||||
HDC GUIAPI CreateSubMemDC (HDC parent, int off_x, int off_y,
|
||||
int width, int height, BOOL comp_to_parent)
|
||||
{
|
||||
@@ -3428,6 +3438,7 @@ HDC GUIAPI CreateSubMemDC (HDC parent, int off_x, int off_y,
|
||||
if (width < 0) width = 0;
|
||||
if (height < 0) height = 0;
|
||||
|
||||
|
||||
if (off_x + width > pdc_parent->DevRC.right)
|
||||
width = pdc_parent->DevRC.right - off_x;
|
||||
if (off_y + height > pdc_parent->DevRC.bottom)
|
||||
|
||||
+1
-1
@@ -269,7 +269,7 @@ void GUIAPI GetClipRgnBoundRect (PCLIPRGN pRgn, PRECT pRect)
|
||||
|
||||
BOOL GUIAPI IsEmptyClipRgn (const CLIPRGN* pRgn)
|
||||
{
|
||||
if (pRgn->head == NULL || IsRectEmpty (&pRgn->rcBound))
|
||||
if (pRgn->head == NULL)
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
|
||||
@@ -1,407 +0,0 @@
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
/*
|
||||
* 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) 2023, Beijing FMSoft Technologies Co., Ltd.
|
||||
*
|
||||
* 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/>.
|
||||
*/
|
||||
/*
|
||||
** The graphics display interface module of MiniGUI.
|
||||
**
|
||||
** Current maintainer: Wei Yongming.
|
||||
**
|
||||
** Create date: 1999.01.03
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
|
||||
#include "minigui.h"
|
||||
#include "gdi.h"
|
||||
#include "window.h"
|
||||
#include "cliprect.h"
|
||||
#include "gal.h"
|
||||
#include "cursor.h"
|
||||
#include "internals.h"
|
||||
#include "inline.h"
|
||||
#include "dc.h"
|
||||
#include "debug.h"
|
||||
#include "client.h"
|
||||
#include "server.h"
|
||||
|
||||
HSURF GUIAPI CreateSharedSurface(GHANDLE video, const char *name, DWORD flags,
|
||||
int width, int height, int depth,
|
||||
Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask)
|
||||
{
|
||||
GAL_Surface *nssurf = NULL;
|
||||
|
||||
if (name) {
|
||||
OPERATENSSURFINFO nssurf_req = {};
|
||||
|
||||
if (strlen(name) + 1 > sizeof(nssurf_req.name)) {
|
||||
_ERR_PRINTF("TOOLONG: too long name for shared surface: %s\n",
|
||||
name);
|
||||
goto failed;
|
||||
}
|
||||
|
||||
strcpy(nssurf_req.name, name);
|
||||
nssurf_req.id_op = ID_NAMEDSSURFOP_REGISTER;
|
||||
|
||||
int result;
|
||||
if (IsServer()) {
|
||||
result = __mg_nssurf_map_operate_srv(&nssurf_req, 0, -1);
|
||||
}
|
||||
else {
|
||||
REQUEST req;
|
||||
|
||||
req.id = REQID_OPERATENAMEDSSURF;
|
||||
req.data = &nssurf_req;
|
||||
req.len_data = sizeof(OPERATENSSURFINFO);
|
||||
|
||||
if (ClientRequest(&req, &result, sizeof(result))) {
|
||||
_ERR_PRINTF("BAD_REQUEST: when registering name for a new shared surface\n");
|
||||
goto failed;
|
||||
}
|
||||
}
|
||||
|
||||
if (result) {
|
||||
_ERR_PRINTF("FAILED_REQUEST: when registering name of shared surface\n");
|
||||
goto failed;
|
||||
}
|
||||
}
|
||||
|
||||
nssurf = GAL_CreateSharedRGBSurface(video, flags, 0666, width, height, depth,
|
||||
Rmask, Gmask, Bmask, Amask);
|
||||
if (nssurf == NULL) {
|
||||
goto failed;
|
||||
}
|
||||
|
||||
if (name) {
|
||||
strcpy(nssurf->shared_header->name, name);
|
||||
|
||||
OPERATENSSURFINFO nssurf_req = {};
|
||||
strcpy(nssurf_req.name, name);
|
||||
nssurf_req.id_op = ID_NAMEDSSURFOP_SET;
|
||||
nssurf_req.map_size = nssurf->shared_header->map_size;
|
||||
|
||||
int result;
|
||||
if (IsServer()) {
|
||||
result = __mg_nssurf_map_operate_srv(&nssurf_req, 0, nssurf->fd);
|
||||
}
|
||||
else {
|
||||
REQUEST req;
|
||||
|
||||
req.id = REQID_OPERATENAMEDSSURF;
|
||||
req.data = &nssurf_req;
|
||||
req.len_data = sizeof(OPERATENSSURFINFO);
|
||||
|
||||
if (ClientRequestEx2(&req, NULL, 0, nssurf->fd,
|
||||
&result, sizeof(result), NULL)) {
|
||||
_ERR_PRINTF("BAD_REQUEST: when setting fd of the new shared surface.\n");
|
||||
goto failed;
|
||||
}
|
||||
}
|
||||
|
||||
if (result) {
|
||||
_ERR_PRINTF("FAILED_REQUEST: when setting fd of the shared surface\n");
|
||||
goto failed;
|
||||
}
|
||||
}
|
||||
else {
|
||||
nssurf->shared_header->name[0] = 0;
|
||||
}
|
||||
|
||||
return nssurf;
|
||||
|
||||
failed:
|
||||
if (nssurf)
|
||||
GAL_FreeSurface(nssurf);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
BOOL GUIAPI DestroySharedSurface(HSURF surf)
|
||||
{
|
||||
if (surf->shared_header == NULL) {
|
||||
_ERR_PRINTF("INVALID_ARG: surface handle: %p\n", surf);
|
||||
goto failed;
|
||||
}
|
||||
|
||||
if (surf->flags & GAL_SSURF_ATTACHED) {
|
||||
_ERR_PRINTF("INVALID_CALL: surface is created by attaching: %p\n", surf);
|
||||
goto failed;
|
||||
}
|
||||
|
||||
if (surf->shared_header->create_cli != __mg_client_id) {
|
||||
_ERR_PRINTF("INVALID_CALL: surface is not created by current process: %p\n", surf);
|
||||
goto failed;
|
||||
}
|
||||
|
||||
if (surf->shared_header->name[0]) {
|
||||
/* This is a named shared surface created by this client */
|
||||
|
||||
OPERATENSSURFINFO nssurf_req = {};
|
||||
strcpy(nssurf_req.name, surf->shared_header->name);
|
||||
nssurf_req.id_op = ID_NAMEDSSURFOP_REVOKE;
|
||||
|
||||
int result;
|
||||
if (IsServer()) {
|
||||
result = __mg_nssurf_map_operate_srv(&nssurf_req, 0, -1);
|
||||
}
|
||||
else {
|
||||
REQUEST req;
|
||||
|
||||
req.id = REQID_OPERATENAMEDSSURF;
|
||||
req.data = &nssurf_req;
|
||||
req.len_data = sizeof(OPERATENSSURFINFO);
|
||||
|
||||
if (ClientRequest(&req, &result, sizeof(result))) {
|
||||
_ERR_PRINTF("BAD_REQUEST: when revoking name of a shared surface.\n");
|
||||
goto failed;
|
||||
}
|
||||
}
|
||||
|
||||
if (result) {
|
||||
_ERR_PRINTF("FAILED_REQUEST: when revoking name of a shared surface\n");
|
||||
goto failed;
|
||||
}
|
||||
}
|
||||
|
||||
GAL_FreeSurface(surf);
|
||||
return TRUE;
|
||||
|
||||
failed:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static int get_shared_surface(const char *name, size_t *map_size, DWORD *flags)
|
||||
{
|
||||
int fd = -1;
|
||||
SHAREDSURFINFO info;
|
||||
|
||||
if (IsServer()) {
|
||||
fd = __mg_get_shared_surface_srv(name, &info);
|
||||
}
|
||||
else {
|
||||
REQUEST req;
|
||||
|
||||
req.id = REQID_GETSHAREDSURFACE;
|
||||
req.data = name;
|
||||
req.len_data = strlen(name) + 1;
|
||||
|
||||
if (ClientRequestEx2(&req, NULL, 0, -1,
|
||||
&info, sizeof(SHAREDSURFINFO), &fd) < 0) {
|
||||
_ERR_PRINTF("BAD_REQUEST: when getting shared surface: %s\n", name);
|
||||
goto failed;
|
||||
}
|
||||
|
||||
if (fd < 0) {
|
||||
_ERR_PRINTF("FAILED_REQUEST: when getting shared surface: %s\n", name);
|
||||
goto failed;
|
||||
}
|
||||
|
||||
_DBG_PRINTF("REQID_GETSHAREDSURFACE: size (%lu), flags (0x%x), fd: %d\n",
|
||||
info.size, info.flags, fd);
|
||||
|
||||
}
|
||||
|
||||
if (fd >= 0) {
|
||||
if (map_size)
|
||||
*map_size = info.size;
|
||||
if (flags)
|
||||
*flags = info.flags;
|
||||
}
|
||||
return fd;
|
||||
|
||||
failed:
|
||||
return -1;
|
||||
}
|
||||
|
||||
int GUIAPI GetSharedSurfaceFDByClientWindow(int client, HWND hwnd,
|
||||
size_t *map_size, DWORD *flags)
|
||||
{
|
||||
char itn_name[sizeof(APPSF_NAME_PREFIX) + NAME_MAX + 1];
|
||||
|
||||
int ret = snprintf(itn_name, sizeof(itn_name), APPSF_HWND_PATTER,
|
||||
client, hwnd);
|
||||
if (ret <= 0 || (size_t)ret >= sizeof(itn_name)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return get_shared_surface(itn_name, map_size, flags);
|
||||
}
|
||||
|
||||
int GUIAPI GetSharedSurfaceFDByName(const char *name,
|
||||
size_t *map_size, DWORD *flags)
|
||||
{
|
||||
char itn_name[sizeof(APPSF_NAME_PREFIX) + NAME_MAX + 1];
|
||||
|
||||
int ret = snprintf(itn_name, sizeof(itn_name), APPSF_NAME_PATTER, name);
|
||||
if (ret <= 0 || (size_t)ret >= sizeof(itn_name)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return get_shared_surface(itn_name, map_size, flags);
|
||||
}
|
||||
|
||||
HSURF GUIAPI AttachToSharedSurface(GHANDLE video, int fd,
|
||||
size_t map_size, DWORD flags)
|
||||
{
|
||||
return GAL_AttachSharedRGBSurface(video, fd, map_size, flags, TRUE);
|
||||
}
|
||||
|
||||
const char *GUIAPI GetSharedSurfaceInfo(HSURF surf, int *fd,
|
||||
SIZE *size, int *pitch, size_t *map_size, off_t *pixels_off)
|
||||
{
|
||||
if (surf->shared_header == NULL) {
|
||||
_ERR_PRINTF("INVALID_ARG: surface handle: %p\n", surf);
|
||||
goto failed;
|
||||
}
|
||||
|
||||
if (fd) {
|
||||
*fd = surf->fd;
|
||||
}
|
||||
|
||||
if (size) {
|
||||
size->cx = surf->shared_header->width;
|
||||
size->cy = surf->shared_header->height;
|
||||
}
|
||||
|
||||
if (pitch) {
|
||||
*pitch = surf->shared_header->pitch;
|
||||
}
|
||||
|
||||
if (map_size) {
|
||||
*map_size = surf->shared_header->map_size;
|
||||
}
|
||||
|
||||
if (pixels_off) {
|
||||
*pixels_off = surf->shared_header->pixels_off;
|
||||
}
|
||||
|
||||
return surf->shared_header->name;
|
||||
|
||||
failed:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
BOOL GUIAPI TestIfSharedSurfaceChanged(HSURF surf, unsigned dirty_age)
|
||||
{
|
||||
if (surf->shared_header == NULL) {
|
||||
_WRN_PRINTF("INVALID_ARG: surface handle: %p\n", surf);
|
||||
goto failed;
|
||||
}
|
||||
|
||||
/* TODO: use atomic comparison */
|
||||
if (dirty_age != surf->shared_header->dirty_info.dirty_age)
|
||||
return TRUE;
|
||||
|
||||
failed:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL GUIAPI LockSharedSurface(HSURF surf, unsigned *dirty_age,
|
||||
int *nr_dirty_rcs, const RECT **dirty_rcs)
|
||||
{
|
||||
if (surf->shared_header == NULL) {
|
||||
_WRN_PRINTF("INVALID_ARG: surface handle: %p\n", surf);
|
||||
goto failed;
|
||||
}
|
||||
|
||||
__mg_lock_file_for_read(surf->fd);
|
||||
|
||||
if (dirty_age) {
|
||||
*dirty_age = surf->shared_header->dirty_info.dirty_age;
|
||||
}
|
||||
|
||||
if (nr_dirty_rcs) {
|
||||
*nr_dirty_rcs = surf->shared_header->dirty_info.nr_dirty_rcs;
|
||||
}
|
||||
|
||||
if (dirty_rcs) {
|
||||
*dirty_rcs = surf->shared_header->dirty_info.dirty_rcs;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
failed:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL GUIAPI UnlockSharedSurface(HSURF surf)
|
||||
{
|
||||
if (surf->shared_header == NULL) {
|
||||
_WRN_PRINTF("INVALID_ARG: surface handle: %p\n", surf);
|
||||
goto failed;
|
||||
}
|
||||
|
||||
__mg_unlock_file_for_read(surf->fd);
|
||||
return TRUE;
|
||||
|
||||
failed:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL GUIAPI DetachFromSharedSurface(HSURF surf)
|
||||
{
|
||||
if (surf->shared_header == NULL) {
|
||||
_WRN_PRINTF("INVALID_ARG: not a shared surface: %p\n", surf);
|
||||
goto failed;
|
||||
}
|
||||
|
||||
if (!(surf->flags & GAL_SSURF_ATTACHED)) {
|
||||
_WRN_PRINTF("INVALID_CALL: surface was not created by attaching: %p\n", surf);
|
||||
goto failed;
|
||||
}
|
||||
|
||||
GAL_FreeSurface(surf);
|
||||
return TRUE;
|
||||
|
||||
failed:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#endif /* defined _MGSCHEMA_COMPOSITING */
|
||||
|
||||
+5
-7
@@ -309,7 +309,7 @@ BOOL GUIAPI ServerDeleteLayer (MG_Layer* layer)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#if 0 // Deprecated since 5.2.0 def _MGSCHEMA_COMPOSITING
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
|
||||
static SemSetManager* _ssm_shared_surf;
|
||||
|
||||
@@ -395,7 +395,6 @@ int __mg_init_layers ()
|
||||
|
||||
memset (sem_usage, 0xFF, sizeof (sem_usage));
|
||||
|
||||
#if 0 // Deprecated since 5.2.0
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
if ((sem_key = get_sem_key_for_shared_surf ()) == -1) {
|
||||
return -1;
|
||||
@@ -416,7 +415,6 @@ int __mg_init_layers ()
|
||||
__mg_alloc_mutual_sem (_ssm_shared_surf, NULL);
|
||||
|
||||
on_exit (__mg_delete_sem_set_manager, _ssm_shared_surf);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
if ((sem_key = get_sem_key_for_layers ()) == -1) {
|
||||
@@ -912,7 +910,7 @@ const ZNODEHEADER* GUIAPI ServerGetWinZNodeHeader (MG_Layer* layer,
|
||||
if (hdr->lock_count == 0) {
|
||||
if (pdc->surface->shared_header) {
|
||||
// XXX: consider timeout.
|
||||
__mg_lock_file_for_read(pdc->surface->fd);
|
||||
LOCK_SURFACE_SEM (pdc->surface->shared_header->sem_num);
|
||||
}
|
||||
|
||||
hdr->dirty_age = pdc->surface->dirty_info->dirty_age;
|
||||
@@ -964,7 +962,7 @@ const ZNODEHEADER* GUIAPI ServerGetPopupMenuZNodeHeader (int idx,
|
||||
if (hdr->lock_count == 0) {
|
||||
if (pdc->surface->shared_header) {
|
||||
// XXX: consider timeout
|
||||
__mg_lock_file_for_read(pdc->surface->fd);
|
||||
LOCK_SURFACE_SEM (pdc->surface->shared_header->sem_num);
|
||||
}
|
||||
|
||||
hdr->dirty_age = pdc->surface->dirty_info->dirty_age;
|
||||
@@ -1008,7 +1006,7 @@ BOOL GUIAPI ServerReleaseWinZNodeHeader (MG_Layer* layer, int idx_znode)
|
||||
hdr->lock_count--;
|
||||
if (hdr->lock_count == 0) {
|
||||
if (pdc->surface->shared_header)
|
||||
__mg_unlock_file_for_read(pdc->surface->fd);
|
||||
UNLOCK_SURFACE_SEM (pdc->surface->shared_header->sem_num);
|
||||
|
||||
hdr->dirty_age = 0;
|
||||
hdr->nr_dirty_rcs = 0;
|
||||
@@ -1037,7 +1035,7 @@ BOOL GUIAPI ServerReleasePopupMenuZNodeHeader (int idx)
|
||||
hdr->lock_count--;
|
||||
if (hdr->lock_count == 0) {
|
||||
if (pdc->surface->shared_header)
|
||||
__mg_unlock_file_for_read(pdc->surface->fd);
|
||||
UNLOCK_SURFACE_SEM (pdc->surface->shared_header->sem_num);
|
||||
|
||||
hdr->dirty_age = 0;
|
||||
hdr->nr_dirty_rcs = 0;
|
||||
|
||||
+69
-104
@@ -277,7 +277,6 @@ ret:
|
||||
return ServerSendReply (clifd, &hcsr, sizeof (HCURSOR));
|
||||
}
|
||||
|
||||
#if 0 // Deprecated since 5.2.0
|
||||
static void my_release_sem_for_shared_surf (void* res)
|
||||
{
|
||||
int sem_num = (int)(intptr_t)res;
|
||||
@@ -313,7 +312,6 @@ static int free_sem_for_shared_surf (int cli, int clifd, void* buff, size_t len)
|
||||
|
||||
return ServerSendReply (clifd, &ret_value, sizeof (int));
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* IS_COMPOSITING_SCHEMA */
|
||||
|
||||
@@ -790,10 +788,18 @@ struct nssurf_info {
|
||||
size_t map_size;
|
||||
};
|
||||
|
||||
static void my_free_val(void *val)
|
||||
{
|
||||
struct nssurf_info *nssurf_info = val;
|
||||
if (nssurf_info->fd >= 0)
|
||||
close(nssurf_info->fd);
|
||||
free(val);
|
||||
}
|
||||
|
||||
int __mg_nssurf_map_new(void)
|
||||
{
|
||||
__nssurf_map = __mg_map_create(copy_key_string,
|
||||
free_key_string, NULL, NULL, comp_key_string);
|
||||
free_key_string, NULL, my_free_val, comp_key_string);
|
||||
if (__nssurf_map == NULL)
|
||||
return -1;
|
||||
|
||||
@@ -803,37 +809,73 @@ int __mg_nssurf_map_new(void)
|
||||
void __mg_nssurf_map_delete(void)
|
||||
{
|
||||
assert(__nssurf_map);
|
||||
int sz = __mg_map_get_size(__nssurf_map);
|
||||
if (sz > 0) {
|
||||
_WRN_PRINTF("There are still not freed named shared surface(s): %d\n", sz);
|
||||
}
|
||||
__mg_map_destroy(__nssurf_map);
|
||||
}
|
||||
|
||||
static void release_nssurf_info(void *res)
|
||||
/* get the fake screen surface (wallpaper pattern surface) */
|
||||
static int get_shared_surface (int cli, int clifd, void* buff, size_t len)
|
||||
{
|
||||
map_entry_t *entry;
|
||||
entry = __mg_map_find(__nssurf_map, res);
|
||||
if (entry) {
|
||||
struct nssurf_info *nssurf_info = entry->val;
|
||||
if (nssurf_info->fd >= 0)
|
||||
close(nssurf_info->fd);
|
||||
free(nssurf_info);
|
||||
SHAREDSURFINFO info = {};
|
||||
int fd = -1;
|
||||
|
||||
__mg_map_erase(__nssurf_map, res);
|
||||
assert (__gal_fake_screen);
|
||||
|
||||
if (strcmp(buff, SYSSF_WALLPAPER_PATTER) == 0 &&
|
||||
__gal_fake_screen->shared_header) {
|
||||
info.flags = __gal_fake_screen->flags;
|
||||
info.size = __gal_fake_screen->shared_header->map_size;
|
||||
fd = __gal_fake_screen->shared_header->fd;
|
||||
}
|
||||
else if (strncmp(buff, APPSF_NAME_PREFIX,
|
||||
sizeof(APPSF_NAME_PREFIX) - 1) == 0) {
|
||||
const char *name = buff + sizeof(APPSF_NAME_PREFIX) - 1;
|
||||
map_entry_t *entry = __mg_map_find(__nssurf_map, name);
|
||||
if (entry == NULL)
|
||||
goto failed;
|
||||
|
||||
struct nssurf_info *nssurf_info = entry->val;
|
||||
assert(nssurf_info);
|
||||
info.size = nssurf_info->map_size;
|
||||
fd = nssurf_info->fd;
|
||||
}
|
||||
else if (strncmp(buff, APPSF_HWND_PREFIX,
|
||||
sizeof(APPSF_HWND_PREFIX) - 1) == 0) {
|
||||
int client;
|
||||
HWND hwnd;
|
||||
int ret = sscanf(buff, APPSF_HWND_PATTER, &client, &hwnd);
|
||||
if (ret != 2)
|
||||
goto failed;
|
||||
|
||||
ZORDERNODE *znode = __mg_find_znode_by_client_hwnd(client, hwnd);
|
||||
if (znode == NULL)
|
||||
goto failed;
|
||||
|
||||
PDC pdc = dc_HDC2PDC(znode->mem_dc);
|
||||
assert(pdc->surface->shared_header);
|
||||
info.size = pdc->surface->shared_header->map_size;
|
||||
info.width = pdc->surface->shared_header->width;
|
||||
info.height = pdc->surface->shared_header->height;
|
||||
info.pitch = pdc->surface->shared_header->pitch;
|
||||
info.offset = pdc->surface->shared_header->pixels_off;
|
||||
fd = pdc->surface->shared_header->fd;
|
||||
}
|
||||
|
||||
return ServerSendReplyEx (clifd, &info, sizeof (SHAREDSURFINFO), fd);
|
||||
|
||||
failed:
|
||||
return ServerSendReplyEx (clifd, &info, sizeof (SHAREDSURFINFO), -1);
|
||||
}
|
||||
|
||||
int __mg_nssurf_map_operate_srv(const OPERATENSSURFINFO* req_info,
|
||||
int cli, int fd)
|
||||
static int
|
||||
operate_nssurface(int cli, int clifd, void* buff, size_t len, int fd)
|
||||
{
|
||||
int result = -1;
|
||||
map_entry_t *entry;
|
||||
struct nssurf_info *nssurf_info;
|
||||
|
||||
OPERATENSSURFINFO* req_info = (OPERATENSSURFINFO*)buff;
|
||||
switch (req_info->id_op) {
|
||||
case ID_NAMEDSSURFOP_REGISTER:
|
||||
_DBG_PRINTF("Registering name: %s from client: %d\n", req_info->name, cli);
|
||||
entry = __mg_map_find(__nssurf_map, req_info->name);
|
||||
if (entry)
|
||||
goto done;
|
||||
@@ -844,15 +886,10 @@ int __mg_nssurf_map_operate_srv(const OPERATENSSURFINFO* req_info,
|
||||
nssurf_info->creator = cli;
|
||||
nssurf_info->fd = -1;
|
||||
nssurf_info->map_size = 0;
|
||||
entry = __mg_map_insert_ex2(__nssurf_map, req_info->name,
|
||||
nssurf_info, NULL);
|
||||
if (entry == NULL) {
|
||||
if (__mg_map_insert(__nssurf_map, req_info->name, nssurf_info)) {
|
||||
free(nssurf_info);
|
||||
goto done;
|
||||
}
|
||||
|
||||
add_global_res(cli, __nssurf_map, entry->key, release_nssurf_info);
|
||||
result = 0;
|
||||
break;
|
||||
|
||||
case ID_NAMEDSSURFOP_SET:
|
||||
@@ -870,7 +907,6 @@ int __mg_nssurf_map_operate_srv(const OPERATENSSURFINFO* req_info,
|
||||
|
||||
nssurf_info->fd = fd;
|
||||
nssurf_info->map_size = req_info->map_size;
|
||||
_DBG_PRINTF("fd set for named ssurf %s: %d\n", req_info->name, fd);
|
||||
result = 0;
|
||||
break;
|
||||
|
||||
@@ -884,7 +920,8 @@ int __mg_nssurf_map_operate_srv(const OPERATENSSURFINFO* req_info,
|
||||
if (nssurf_info->creator != cli)
|
||||
goto done;
|
||||
|
||||
del_global_res(cli, __nssurf_map, entry->key);
|
||||
if (__mg_map_erase(__nssurf_map, req_info->name))
|
||||
goto done;
|
||||
result = 0;
|
||||
break;
|
||||
|
||||
@@ -893,79 +930,6 @@ int __mg_nssurf_map_operate_srv(const OPERATENSSURFINFO* req_info,
|
||||
}
|
||||
|
||||
done:
|
||||
return result;
|
||||
}
|
||||
|
||||
int __mg_get_shared_surface_srv(const char *itn_name, SHAREDSURFINFO *info)
|
||||
{
|
||||
int fd = -1;
|
||||
assert (__gal_fake_screen);
|
||||
|
||||
if (strcmp(itn_name, SYSSF_WALLPAPER_PATTER) == 0 &&
|
||||
__gal_fake_screen->shared_header) {
|
||||
info->flags = __gal_fake_screen->flags;
|
||||
info->size = __gal_fake_screen->shared_header->map_size;
|
||||
fd = __gal_fake_screen->fd;
|
||||
}
|
||||
else if (strncmp(itn_name, APPSF_NAME_PREFIX,
|
||||
sizeof(APPSF_NAME_PREFIX) - 1) == 0) {
|
||||
const char *name = itn_name + sizeof(APPSF_NAME_PREFIX) - 1;
|
||||
map_entry_t *entry = __mg_map_find(__nssurf_map, name);
|
||||
if (entry == NULL) {
|
||||
_DBG_PRINTF("Not found named ssurf: %s\n", name);
|
||||
goto done;
|
||||
}
|
||||
|
||||
struct nssurf_info *nssurf_info = entry->val;
|
||||
assert(nssurf_info);
|
||||
info->size = nssurf_info->map_size;
|
||||
fd = nssurf_info->fd;
|
||||
}
|
||||
else if (strncmp(itn_name, APPSF_HWND_PREFIX,
|
||||
sizeof(APPSF_HWND_PREFIX) - 1) == 0) {
|
||||
int client;
|
||||
HWND hwnd;
|
||||
int ret = sscanf(itn_name, APPSF_HWND_PATTER, &client, &hwnd);
|
||||
if (ret != 2) {
|
||||
_WRN_PRINTF("Failed sscanf: %s\n", itn_name);
|
||||
goto done;
|
||||
}
|
||||
|
||||
ZORDERNODE *znode = __mg_find_znode_by_client_hwnd(client, hwnd);
|
||||
if (znode == NULL)
|
||||
goto done;
|
||||
|
||||
PDC pdc = dc_HDC2PDC(znode->mem_dc);
|
||||
assert(pdc->surface->shared_header);
|
||||
info->size = pdc->surface->shared_header->map_size;
|
||||
info->width = pdc->surface->shared_header->width;
|
||||
info->height = pdc->surface->shared_header->height;
|
||||
info->pitch = pdc->surface->shared_header->pitch;
|
||||
info->offset = pdc->surface->shared_header->pixels_off;
|
||||
fd = pdc->surface->fd;
|
||||
}
|
||||
|
||||
done:
|
||||
return fd;
|
||||
}
|
||||
|
||||
/* get the fake screen surface (wallpaper pattern surface) */
|
||||
static int get_shared_surface (int cli, int clifd, void* buff, size_t len)
|
||||
{
|
||||
SHAREDSURFINFO info = {};
|
||||
int fd = __mg_get_shared_surface_srv(buff, &info);
|
||||
|
||||
return ServerSendReplyEx (clifd, &info, sizeof (SHAREDSURFINFO), fd);
|
||||
}
|
||||
|
||||
static int
|
||||
operate_nssurface(int cli, int clifd, void* buff, size_t len, int fd)
|
||||
{
|
||||
int result = -1;
|
||||
|
||||
assert(len >= sizeof(OPERATENSSURFINFO));
|
||||
OPERATENSSURFINFO* req_info = (OPERATENSSURFINFO*)buff;
|
||||
result = __mg_nssurf_map_operate_srv(req_info, cli, fd);
|
||||
return ServerSendReply(clifd, &result, sizeof(int));
|
||||
}
|
||||
|
||||
@@ -1055,12 +1019,8 @@ static struct req_request {
|
||||
#if IS_COMPOSITING_SCHEMA
|
||||
{ load_cursor_png_file, 0 }, // REQID_LOADCURSOR_PNG
|
||||
{ load_cursor_png_mem, 0 }, // REQID_LOADCURSOR_PNG_MEM
|
||||
{ operate_nssurface, 1 }, // REQID_OPERATENSSURF
|
||||
{ NULL, 0 },
|
||||
#if 0 // Deprecated since 5.2.0
|
||||
{ alloc_sem_for_shared_surf, 0 }, // REQID_ALLOC_SURF_SEM
|
||||
{ free_sem_for_shared_surf, 0 }, // REQID_FREE_SURF_SEM
|
||||
#endif
|
||||
#else
|
||||
{ NULL, 0 },
|
||||
{ NULL, 0 },
|
||||
@@ -1070,6 +1030,11 @@ static struct req_request {
|
||||
{ move_to_layer, 0 }, // REQID_MOVETOLAYER
|
||||
{ calc_position, 0 }, // REQID_CALCPOSITION
|
||||
{ authenticate_client, 0 }, // REQID_AUTHCLIENT
|
||||
#if IS_COMPOSITING_SCHEMA
|
||||
{ operate_nssurface, 1 }, // REQID_OPERATENSSURF
|
||||
#else
|
||||
{ NULL, 0 },
|
||||
#endif
|
||||
};
|
||||
|
||||
BOOL GUIAPI RegisterRequestHandler (int req_id, REQ_HANDLER your_handler)
|
||||
|
||||
Reference in New Issue
Block a user