mirror of
https://github.com/VincentWei/MiniGUI.git
synced 2026-02-06 10:21:57 +08:00
tune and implement ServerReleaseZNodeHeader and ServerReleasePopupMenuZNodeHeader
This commit is contained in:
@@ -68,6 +68,7 @@
|
||||
#include "sharedres.h"
|
||||
#include "drawsemop.h"
|
||||
#include "misc.h"
|
||||
#include "dc.h"
|
||||
|
||||
#define SEM_PARAM 0666
|
||||
MG_Layer* mgLayers = NULL;
|
||||
@@ -636,8 +637,7 @@ int GUIAPI ServerGetNextZNode (MG_Layer* layer, int idx_znode, int* cli)
|
||||
|
||||
if (layer == NULL)
|
||||
layer = mgTopmostLayer;
|
||||
|
||||
if (!__mg_is_valid_layer (layer))
|
||||
else if (!__mg_is_valid_layer (layer))
|
||||
return -1;
|
||||
|
||||
zi = (ZORDERINFO*)layer->zorder_info;
|
||||
@@ -670,8 +670,7 @@ int GUIAPI ServerGetPrevZNode (MG_Layer* layer, int idx_znode, int* cli)
|
||||
|
||||
if (layer == NULL)
|
||||
layer = mgTopmostLayer;
|
||||
|
||||
if (!__mg_is_valid_layer (layer))
|
||||
else if (!__mg_is_valid_layer (layer))
|
||||
return -1;
|
||||
|
||||
zi = (ZORDERINFO*)layer->zorder_info;
|
||||
@@ -707,8 +706,7 @@ BOOL GUIAPI ServerGetZNodeInfo (MG_Layer* layer, int idx_znode,
|
||||
|
||||
if (layer == NULL)
|
||||
layer = mgTopmostLayer;
|
||||
|
||||
if (!__mg_is_valid_layer (layer))
|
||||
else if (!__mg_is_valid_layer (layer))
|
||||
return FALSE;
|
||||
|
||||
zi = (ZORDERINFO*)layer->zorder_info;
|
||||
@@ -726,7 +724,8 @@ BOOL GUIAPI ServerGetZNodeInfo (MG_Layer* layer, int idx_znode,
|
||||
znode_info->hwnd = nodes [idx_znode].hwnd;
|
||||
znode_info->main_win = nodes [idx_znode].main_win;
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
znode_info->mem_dc = nodes [idx_znode].mem_dc;
|
||||
// do not return mem_dc for this function
|
||||
// znode_info->mem_dc = nodes [idx_znode].mem_dc;
|
||||
znode_info->ct = nodes [idx_znode].ct;
|
||||
znode_info->ct_arg = nodes [idx_znode].ct_arg;
|
||||
#endif
|
||||
@@ -734,15 +733,17 @@ BOOL GUIAPI ServerGetZNodeInfo (MG_Layer* layer, int idx_znode,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
const ZNODEHEADER* GUIAPI ServerGetZNodeHeader (MG_Layer* layer, int idx_znode)
|
||||
const ZNODEHEADER* GUIAPI ServerGetZNodeHeader (MG_Layer* layer,
|
||||
int idx_znode, BOOL lock)
|
||||
{
|
||||
ZORDERINFO* zi;
|
||||
ZORDERNODE* nodes;
|
||||
ZNODEHEADER* hdr;
|
||||
PDC pdc;
|
||||
|
||||
if (layer == NULL)
|
||||
layer = mgTopmostLayer;
|
||||
|
||||
if (!__mg_is_valid_layer (layer))
|
||||
else if (!__mg_is_valid_layer (layer))
|
||||
return NULL;
|
||||
|
||||
zi = (ZORDERINFO*)layer->zorder_info;
|
||||
@@ -752,7 +753,29 @@ const ZNODEHEADER* GUIAPI ServerGetZNodeHeader (MG_Layer* layer, int idx_znode)
|
||||
}
|
||||
|
||||
nodes = GET_ZORDERNODE(zi);
|
||||
return (ZNODEHEADER*)(nodes + idx_znode);
|
||||
hdr = (ZNODEHEADER*)(nodes + idx_znode);
|
||||
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
if (lock && (pdc = dc_HDC2PDC (hdr->mem_dc)) &&
|
||||
pdc->surface->shared_header) {
|
||||
|
||||
// XXX use sem_timedwait
|
||||
if (hdr->dirty_rcs == NULL) {
|
||||
sem_wait (&pdc->surface->shared_header->sem_lock);
|
||||
|
||||
hdr->dirty_age = pdc->surface->shared_header->dirty_age;
|
||||
hdr->nr_dirty_rcs = pdc->surface->shared_header->nr_dirty_rcs;
|
||||
hdr->dirty_rcs = pdc->surface->shared_header->dirty_rcs;
|
||||
}
|
||||
}
|
||||
else {
|
||||
hdr->dirty_age = 0;
|
||||
hdr->nr_dirty_rcs = 0;
|
||||
hdr->dirty_rcs = NULL;
|
||||
}
|
||||
#endif /* defined _MGSCHEMA_COMPOSITING */
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int GUIAPI ServerGetPopupMenusCount (void)
|
||||
@@ -763,10 +786,12 @@ int GUIAPI ServerGetPopupMenusCount (void)
|
||||
return zi->nr_popupmenus;
|
||||
}
|
||||
|
||||
const ZNODEHEADER* GUIAPI ServerGetPopupMenuZNodeHeader (int idx)
|
||||
const ZNODEHEADER* GUIAPI ServerGetPopupMenuZNodeHeader (int idx, BOOL lock)
|
||||
{
|
||||
ZORDERINFO* zi;
|
||||
ZORDERNODE* menu_nodes;
|
||||
ZNODEHEADER* hdr;
|
||||
PDC pdc;
|
||||
|
||||
zi = (ZORDERINFO*)mgTopmostLayer->zorder_info;
|
||||
|
||||
@@ -774,9 +799,93 @@ const ZNODEHEADER* GUIAPI ServerGetPopupMenuZNodeHeader (int idx)
|
||||
return NULL;
|
||||
|
||||
menu_nodes = GET_MENUNODE(zi);
|
||||
return (ZNODEHEADER*)(menu_nodes + idx);
|
||||
hdr = (ZNODEHEADER*)(menu_nodes + idx);
|
||||
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
if (lock && (pdc = dc_HDC2PDC (hdr->mem_dc)) &&
|
||||
pdc->surface->shared_header) {
|
||||
|
||||
// XXX use sem_timedwait
|
||||
if (hdr->dirty_rcs == NULL) {
|
||||
sem_wait (&pdc->surface->shared_header->sem_lock);
|
||||
|
||||
hdr->dirty_age = pdc->surface->shared_header->dirty_age;
|
||||
hdr->nr_dirty_rcs = pdc->surface->shared_header->nr_dirty_rcs;
|
||||
hdr->dirty_rcs = pdc->surface->shared_header->dirty_rcs;
|
||||
}
|
||||
}
|
||||
else {
|
||||
hdr->dirty_age = 0;
|
||||
hdr->nr_dirty_rcs = 0;
|
||||
hdr->dirty_rcs = NULL;
|
||||
}
|
||||
#endif /* defined _MGSCHEMA_COMPOSITING */
|
||||
|
||||
return hdr;
|
||||
}
|
||||
|
||||
#ifdef _MGSCHEMA_COMPOSITING
|
||||
BOOL GUIAPI ServerReleaseZNodeHeader (MG_Layer* layer, int idx_znode)
|
||||
{
|
||||
ZORDERINFO* zi;
|
||||
ZORDERNODE* nodes;
|
||||
ZNODEHEADER* hdr;
|
||||
PDC pdc;
|
||||
|
||||
if (layer == NULL)
|
||||
layer = mgTopmostLayer;
|
||||
else if (!__mg_is_valid_layer (layer))
|
||||
return FALSE;
|
||||
|
||||
zi = (ZORDERINFO*)layer->zorder_info;
|
||||
if (idx_znode > zi->max_nr_globals
|
||||
+ zi->max_nr_topmosts + zi->max_nr_normals) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
nodes = GET_ZORDERNODE(zi);
|
||||
hdr = (ZNODEHEADER*)(nodes + idx_znode);
|
||||
if ((pdc = dc_HDC2PDC (hdr->mem_dc)) &&
|
||||
pdc->surface->shared_header && hdr->dirty_rcs) {
|
||||
|
||||
// XXX use sem_timedwait
|
||||
sem_post (&pdc->surface->shared_header->sem_lock);
|
||||
|
||||
hdr->dirty_age = 0;
|
||||
hdr->nr_dirty_rcs = 0;
|
||||
hdr->dirty_rcs = NULL;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL GUIAPI ServerReleasePopupMenuZNodeHeader (int idx)
|
||||
{
|
||||
ZORDERINFO* zi;
|
||||
ZORDERNODE* menu_nodes;
|
||||
ZNODEHEADER* hdr;
|
||||
PDC pdc;
|
||||
|
||||
zi = (ZORDERINFO*)mgTopmostLayer->zorder_info;
|
||||
if (idx >= zi->nr_popupmenus)
|
||||
return FALSE;
|
||||
|
||||
menu_nodes = GET_MENUNODE(zi);
|
||||
hdr = (ZNODEHEADER*)(menu_nodes + idx);
|
||||
if ((pdc = dc_HDC2PDC (hdr->mem_dc)) &&
|
||||
pdc->surface->shared_header && hdr->dirty_rcs) {
|
||||
|
||||
sem_post (&pdc->surface->shared_header->sem_lock);
|
||||
hdr->dirty_age = 0;
|
||||
hdr->nr_dirty_rcs = 0;
|
||||
hdr->dirty_rcs = NULL;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#endif /* defined _MGSCHEMA_COMPOSITING */
|
||||
|
||||
BOOL GUIAPI ServerDoZNodeOperation (MG_Layer* layer,
|
||||
int idx_znode, int op_code, void* op_data, BOOL notify)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user