diff --git a/src/include/dc.h b/src/include/dc.h index 5f218ad5..0fa7336e 100644 --- a/src/include/dc.h +++ b/src/include/dc.h @@ -86,6 +86,7 @@ typedef struct tagDC* PDC; #endif #ifndef _MG_MINIMALGDI + # ifdef _MGSCHEMA_COMPOSITING # define LOCK_GCRINFO(pdc) # define UNLOCK_GCRINFO(pdc) diff --git a/src/include/newgal.h b/src/include/newgal.h index 45a536a2..00c8e255 100644 --- a/src/include/newgal.h +++ b/src/include/newgal.h @@ -579,7 +579,7 @@ void GAL_SetCursor (GAL_Surface* surface, int hot_x, int hot_y); /* Move cursor. */ void GAL_MoveCursor (GAL_Surface* surface, int x, int y); -#else /* _MGUSE_SHAREDFD */ +#else /* defined _MGSCHEMA_COMPOSITING */ typedef struct REQ_HWSURFACE { /* for allocation */ @@ -629,7 +629,7 @@ typedef struct _REP_SIGMA8654_GETSURFACE { #endif void GAL_RequestHWSurface (const REQ_HWSURFACE* request, REP_HWSURFACE* reply); -#endif /* _MGSCHEMA_SHAREDFB */ +#endif /* not defined _MGSCHEMA_COMPOSITING */ #endif /* _MGRM_PROCESSES */ diff --git a/src/kernel/compsor-fallback.c b/src/kernel/compsor-fallback.c index 63dbcb48..a40273f6 100644 --- a/src/kernel/compsor-fallback.c +++ b/src/kernel/compsor-fallback.c @@ -369,16 +369,6 @@ static void composite_opaque_win_znode (CompositorCtxt* ctxt, int from) ServerReleaseWinZNodeHeader (NULL, from); } -static void dump_region (const CLIPRGN* rgn, const char* name) -{ - return; - - _DBG_PRINTF("rcBound of %s: (%d, %d, %d, %d); size (%d x %d)\n", name, - rgn->rcBound.left, rgn->rcBound.top, - rgn->rcBound.right, rgn->rcBound.bottom, - RECTW(rgn->rcBound), RECTH(rgn->rcBound)); -} - static void composite_all_lucent_win_znodes (CompositorCtxt* ctxt, const CLIPRGN* dirty_rgn) { @@ -432,8 +422,6 @@ static void composite_all_lucent_win_znodes (CompositorCtxt* ctxt, break; } - dump_region (&ctxt->inv_rgn, "invalid region"); - SelectClipRegion (HDC_SCREEN_SYS, &ctxt->inv_rgn); //SelectClipRect (HDC_SCREEN_SYS, &znode_hdr->rc); BitBlt (znode_hdr->mem_dc, @@ -478,8 +466,6 @@ static void composite_on_dirty_region (CompositorCtxt* ctxt, int from) if (get_lucent_win_znodes_above (ctxt, from)) CopyRegion (&tmp_rgn, &ctxt->dirty_rgn); - dump_region (&tmp_rgn, "dirty region for lucent win znodes"); - /* compositing the current window znode and the znodes below it */ if (from <= 0) next = ServerGetNextZNode (NULL, 0, NULL); @@ -491,8 +477,6 @@ static void composite_on_dirty_region (CompositorCtxt* ctxt, int from) next = ServerGetNextZNode (NULL, next, NULL); } - dump_region (&ctxt->dirty_rgn, "dirty region for wallpaper"); - /* compositing the wallpaper */ composite_wallpaper (ctxt); diff --git a/src/kernel/desktop.c b/src/kernel/desktop.c index dd1a9ee2..6e2c9bd5 100644 --- a/src/kernel/desktop.c +++ b/src/kernel/desktop.c @@ -571,7 +571,7 @@ static BOOL _cb_intersect_rc (void* context, RECT* rc = (RECT*)context; if (node->flags & ZOF_VISIBLE && DoesIntersect (rc, &node->rc)) { - node->age ++; + node->age++; return TRUE; } @@ -585,7 +585,7 @@ static BOOL _cb_update_rc (void* context, if (node->flags & ZOF_VISIBLE && subtract_rgn_by_node(cliprgn, zi, node)) { - node->age ++; + node->age++; node->flags |= ZOF_IF_REFERENCE; return TRUE; } @@ -938,7 +938,7 @@ void __mg_lock_recalc_gcrinfo (PDC pdc) ZORDERNODE* menu_nodes, *nodes; int i, slot = 0, idx_znode; unsigned short idx; - CLIPRGN unvisible_rgn; + CLIPRGN invisible_rgn; gcrinfo = kernel_GetGCRgnInfo (pdc->hwnd); mainwin = (PMAINWIN)(pdc->hwnd); @@ -960,12 +960,12 @@ void __mg_lock_recalc_gcrinfo (PDC pdc) reset_window (mainwin, &nodes [idx_znode].rc); /* when idx=0, this is HDC_SCREEN_SYS */ if (idx != 0) { - InitClipRgn (&unvisible_rgn, &sg_FreeClipRectList); - SetClipRgn (&unvisible_rgn, &nodes [idx_znode].rc); + InitClipRgn (&invisible_rgn, &sg_FreeClipRectList); + SetClipRgn (&invisible_rgn, &nodes [idx_znode].rc); - subtract_rgn_by_node(&unvisible_rgn, zi, &nodes[idx_znode]); - SubtractRegion (&gcrinfo->crgn, &gcrinfo->crgn, &unvisible_rgn); - EmptyClipRgn(&unvisible_rgn); + subtract_rgn_by_node(&invisible_rgn, zi, &nodes[idx_znode]); + SubtractRegion (&gcrinfo->crgn, &gcrinfo->crgn, &invisible_rgn); + EmptyClipRgn(&invisible_rgn); } /* clip by popup menus */ @@ -1041,12 +1041,12 @@ void __mg_lock_recalc_gcrinfo (PDC pdc) while (slot && slot != idx_znode) { if (nodes [slot].flags & ZOF_VISIBLE) - subtract_rgn_by_node(&gcrinfo->crgn, zi, &nodes[slot]); + subtract_rgn_by_node (&gcrinfo->crgn, zi, &nodes[slot]); slot = nodes [slot].next; } gcrinfo->old_zi_age = nodes [idx_znode].age; - gcrinfo->age ++; + gcrinfo->age++; } #endif /* not defined _MGSCHEMA_COMPOSITING */ @@ -1073,7 +1073,7 @@ static void dskInitGCRInfo (PMAINWIN pWin) IntersectRect (&rcTemp, &rcWin, &rcScr); SetClipRgn (&pWin->pGCRInfo->crgn, &rcTemp); } -#endif /* _MGSCHEMA_COMPOSITING */ +#endif /* not defined _MGSCHEMA_COMPOSITING */ /* * Init a window's invalid region. @@ -1479,7 +1479,7 @@ static int srvForceCloseMenu (int cli) rc_screen = GetScreenRect (); if (SubtractClipRect (&sg_UpdateRgn, &rc_screen)) { - win_nodes [0].age ++; + win_nodes [0].age++; win_nodes [0].flags |= ZOF_IF_REFERENCE; } #else /* defined _MGSCHEMA_COMPOSITING */ @@ -1588,7 +1588,7 @@ static int srvStartTrackPopupMenu (int cli, const RECT* rc, HWND ptmi, rc_screen = GetScreenRect(); if (DoesIntersect (rc, &rc_screen)) { - win_nodes [0].age ++; + win_nodes [0].age++; } #endif /* not defined _MGSCHEMA_COMPOSITING */ @@ -1651,7 +1651,7 @@ static int srvEndTrackPopupMenu (int cli, int idx_znode) rc_screen = GetScreenRect(); if (SubtractClipRect (&sg_UpdateRgn, &rc_screen)) { - win_nodes [0].age ++; + win_nodes [0].age++; win_nodes [0].flags |= ZOF_IF_REFERENCE; } #endif /* not defined _MGSCHEMA_COMPOSITING */ @@ -2205,7 +2205,7 @@ static int AllocZOrderNodeEx (ZORDERINFO* zi, int cli, HWND hwnd, HWND main_win, slot = ZNIDX_LAUNCHER; if (nodes [slot].flags & ZOF_VISIBLE && DoesIntersect (&nodes [free_slot].rc, &nodes [slot].rc)) { - nodes [slot].age ++; + nodes [slot].age++; } } @@ -2214,7 +2214,7 @@ static int AllocZOrderNodeEx (ZORDERINFO* zi, int cli, HWND hwnd, HWND main_win, for (; slot > 0; slot = nodes [slot].next) { if (nodes [slot].flags & ZOF_VISIBLE && DoesIntersect (&nodes [free_slot].rc, &nodes [slot].rc)) { - nodes [slot].age ++; + nodes [slot].age++; } } } @@ -2224,7 +2224,7 @@ static int AllocZOrderNodeEx (ZORDERINFO* zi, int cli, HWND hwnd, HWND main_win, for (; slot > 0; slot = nodes [slot].next) { if (nodes [slot].flags & ZOF_VISIBLE && DoesIntersect (&nodes [free_slot].rc, &nodes [slot].rc)) { - nodes [slot].age ++; + nodes [slot].age++; } } } @@ -2234,7 +2234,7 @@ static int AllocZOrderNodeEx (ZORDERINFO* zi, int cli, HWND hwnd, HWND main_win, for (; slot > 0; slot = nodes [slot].next) { if (nodes [slot].flags & ZOF_VISIBLE && DoesIntersect (&nodes [free_slot].rc, &nodes [slot].rc)) { - nodes [slot].age ++; + nodes [slot].age++; } } } @@ -2243,7 +2243,7 @@ static int AllocZOrderNodeEx (ZORDERINFO* zi, int cli, HWND hwnd, HWND main_win, slot = ZNIDX_DOCKER; if (nodes [slot].flags & ZOF_VISIBLE && DoesIntersect (&nodes [free_slot].rc, &nodes [slot].rc)) { - nodes [slot].age ++; + nodes [slot].age++; } } @@ -2251,13 +2251,13 @@ static int AllocZOrderNodeEx (ZORDERINFO* zi, int cli, HWND hwnd, HWND main_win, slot = ZNIDX_SCREENLOCK; if (nodes [slot].flags & ZOF_VISIBLE && DoesIntersect (&nodes [free_slot].rc, &nodes [slot].rc)) { - nodes [slot].age ++; + nodes [slot].age++; } } /* for destkop */ if (DoesIntersect (&nodes [free_slot].rc, &rc_screen)) { - nodes [0].age ++; + nodes [0].age++; } #else /* not defined _MGSCHEMA_COMPOSITING */ DO_COMPSOR_OP_ARGS (on_showing_win, @@ -2431,7 +2431,7 @@ static int FreeZOrderNodeEx (ZORDERINFO* zi, int idx_znode, HDC* memdc) for (; slot > 0; slot = nodes [slot].next) { if (nodes [slot].flags & ZOF_VISIBLE && subtract_rgn_by_node(&sg_UpdateRgn, zi, &nodes[slot])) { - nodes [slot].age ++; + nodes [slot].age++; nodes [slot].flags |= ZOF_IF_REFERENCE; } } @@ -2441,7 +2441,7 @@ static int FreeZOrderNodeEx (ZORDERINFO* zi, int idx_znode, HDC* memdc) slot = ZNIDX_DOCKER; if (nodes [slot].flags & ZOF_VISIBLE && subtract_rgn_by_node(&sg_UpdateRgn, zi, &nodes[slot])) { - nodes [slot].age ++; + nodes [slot].age++; nodes [slot].flags |= ZOF_IF_REFERENCE; } } @@ -2451,7 +2451,7 @@ static int FreeZOrderNodeEx (ZORDERINFO* zi, int idx_znode, HDC* memdc) for (; slot > 0; slot = nodes [slot].next) { if (nodes [slot].flags & ZOF_VISIBLE && subtract_rgn_by_node(&sg_UpdateRgn, zi, &nodes[slot])) { - nodes [slot].age ++; + nodes [slot].age++; nodes [slot].flags |= ZOF_IF_REFERENCE; } } @@ -2462,7 +2462,7 @@ static int FreeZOrderNodeEx (ZORDERINFO* zi, int idx_znode, HDC* memdc) for (; slot > 0; slot = nodes [slot].next) { if (nodes [slot].flags & ZOF_VISIBLE && subtract_rgn_by_node(&sg_UpdateRgn, zi, &nodes[slot])) { - nodes [slot].age ++; + nodes [slot].age++; nodes [slot].flags |= ZOF_IF_REFERENCE; } } @@ -2473,7 +2473,7 @@ static int FreeZOrderNodeEx (ZORDERINFO* zi, int idx_znode, HDC* memdc) for (; slot > 0; slot = nodes [slot].next) { if (nodes [slot].flags & ZOF_VISIBLE && subtract_rgn_by_node(&sg_UpdateRgn, zi, &nodes[slot])) { - nodes [slot].age ++; + nodes [slot].age++; nodes [slot].flags |= ZOF_IF_REFERENCE; } } @@ -2483,13 +2483,13 @@ static int FreeZOrderNodeEx (ZORDERINFO* zi, int idx_znode, HDC* memdc) slot = ZNIDX_LAUNCHER; if (nodes [slot].flags & ZOF_VISIBLE && subtract_rgn_by_node(&sg_UpdateRgn, zi, &nodes[slot])) { - nodes [slot].age ++; + nodes [slot].age++; nodes [slot].flags |= ZOF_IF_REFERENCE; } } if (SubtractClipRect (&sg_UpdateRgn, &rc_screen)) { - nodes [0].age ++; + nodes [0].age++; nodes [0].flags |= ZOF_IF_REFERENCE; } } @@ -2982,7 +2982,7 @@ static int dskMove2Top (int cli, int idx_znode) for (; slot != idx_znode; slot = nodes [slot].next) { if (nodes [slot].flags & ZOF_VISIBLE && DoesIntersect (&rc, &nodes [slot].rc)) { - nodes [slot].age ++; + nodes [slot].age++; AddClipRect(&sg_UpdateRgn, &nodes [slot].rc); } } @@ -2992,7 +2992,7 @@ static int dskMove2Top (int cli, int idx_znode) for (; slot != idx_znode; slot = nodes [slot].next) { if (nodes [slot].flags & ZOF_VISIBLE && DoesIntersect (&rc, &nodes [slot].rc)) { - nodes [slot].age ++; + nodes [slot].age++; AddClipRect (&sg_UpdateRgn, &nodes [slot].rc); } } @@ -3002,7 +3002,7 @@ static int dskMove2Top (int cli, int idx_znode) for (; slot != idx_znode; slot = nodes [slot].next) { if (nodes [slot].flags & ZOF_VISIBLE && DoesIntersect (&rc, &nodes [slot].rc)) { - nodes [slot].age ++; + nodes [slot].age++; AddClipRect (&sg_UpdateRgn, &nodes [slot].rc); } } @@ -3056,7 +3056,7 @@ static int dskMove2Top (int cli, int idx_znode) #ifdef _MGSCHEMA_COMPOSITING DO_COMPSOR_OP_ARGS (on_raised_win, get_layer_from_client (cli), idx_znode); #else - nodes [idx_znode].age ++; + nodes [idx_znode].age++; #endif /* unlock zi for change */ @@ -3158,14 +3158,14 @@ static int dskShowWindow (int cli, int idx_znode) for (; slot != 0; slot = nodes [slot].next) { if (nodes [slot].flags & ZOF_VISIBLE && DoesIntersect (&rc, &nodes [slot].rc)) { - nodes [slot].age ++; + nodes [slot].age++; } } if (DoesIntersect (&rc, &rc_screen)) { - nodes [0].age ++; + nodes [0].age++; } - nodes [idx_znode].age ++; + nodes [idx_znode].age++; nodes [idx_znode].flags |= ZOF_VISIBLE; } #else /* defined _MGSCHEMA_COMPOSITING */ @@ -3246,7 +3246,7 @@ static int dskHideWindow (int cli, int idx_znode) for (; slot > 0; slot = nodes [slot].next) { if (nodes [slot].flags & ZOF_VISIBLE && subtract_rgn_by_node(&sg_UpdateRgn, zi, &nodes[slot])) { - nodes [slot].age ++; + nodes [slot].age++; nodes [slot].flags |= ZOF_IF_REFERENCE; } } @@ -3268,7 +3268,7 @@ static int dskHideWindow (int cli, int idx_znode) } if (SubtractClipRect (&sg_UpdateRgn, &rcScr)) { - nodes [0].age ++; + nodes [0].age++; nodes [0].flags |= ZOF_IF_REFERENCE; } } @@ -3410,6 +3410,9 @@ static int dskMoveWindow (int cli, int idx_znode, HDC memdc, const RECT* rcWin) /* lock zi for change */ lock_zi_for_change (zi); + if (type > ZOF_TYPE_LAUNCHER) { + do_for_all_znodes ((void*)rcWin, zi, _cb_intersect_rc, ZT_LAUNCHER); + } if (type > ZOF_TYPE_NORMAL) { do_for_all_znodes ((void*)rcWin, zi, _cb_intersect_rc, ZT_NORMAL); } @@ -3427,12 +3430,12 @@ static int dskMoveWindow (int cli, int idx_znode, HDC memdc, const RECT* rcWin) for (; slot != 0; slot = nodes [slot].next) { if (nodes [slot].flags & ZOF_VISIBLE && DoesIntersect (rcWin, &nodes [slot].rc)) { - nodes [slot].age ++; + nodes [slot].age++; } } if (DoesIntersect (rcWin, &rcScr)) { - nodes [0].age ++; + nodes [0].age++; } /* check influenced zorder nodes */ @@ -3444,18 +3447,40 @@ static int dskMoveWindow (int cli, int idx_znode, HDC memdc, const RECT* rcWin) if (nodes [slot].flags & ZOF_VISIBLE && !(nodes [slot].flags & ZOF_IF_REFERENCE) && subtract_rgn_by_node(&sg_UpdateRgn, zi, &nodes[slot])) { - nodes [slot].age ++; + nodes [slot].age++; nodes [slot].flags |= ZOF_IF_REFERENCE; } } + if (type > ZOF_TYPE_DOCKER) { + slot = ZNIDX_DOCKER; + if (nodes [slot].flags & ZOF_VISIBLE && + !(nodes [slot].flags & ZOF_IF_REFERENCE) && + subtract_rgn_by_node(&sg_UpdateRgn, zi, &nodes[slot])) { + nodes [slot].age++; + nodes [slot].flags |= ZOF_IF_REFERENCE; + } + } + + if (type > ZOF_TYPE_GLOBAL) { + slot = zi->first_global; + for (; slot > 0; slot = nodes [slot].next) { + if (nodes [slot].flags & ZOF_VISIBLE && + !(nodes [slot].flags & ZOF_IF_REFERENCE) && + subtract_rgn_by_node(&sg_UpdateRgn, zi, &nodes[slot])) { + nodes [slot].age++; + nodes [slot].flags |= ZOF_IF_REFERENCE; + } + } + } + if (type > ZOF_TYPE_TOPMOST) { slot = zi->first_topmost; for (; slot > 0; slot = nodes [slot].next) { if (nodes [slot].flags & ZOF_VISIBLE && !(nodes [slot].flags & ZOF_IF_REFERENCE) && subtract_rgn_by_node(&sg_UpdateRgn, zi, &nodes[slot])) { - nodes [slot].age ++; + nodes [slot].age++; nodes [slot].flags |= ZOF_IF_REFERENCE; } } @@ -3467,7 +3492,7 @@ static int dskMoveWindow (int cli, int idx_znode, HDC memdc, const RECT* rcWin) if (nodes [slot].flags & ZOF_VISIBLE && !(nodes [slot].flags & ZOF_IF_REFERENCE) && subtract_rgn_by_node(&sg_UpdateRgn, zi, &nodes[slot])) { - nodes [slot].age ++; + nodes [slot].age++; nodes [slot].flags |= ZOF_IF_REFERENCE; } } @@ -3475,13 +3500,13 @@ static int dskMoveWindow (int cli, int idx_znode, HDC memdc, const RECT* rcWin) if (!(nodes [0].flags & ZOF_IF_REFERENCE) && SubtractClipRect (&sg_UpdateRgn, &rcScr)) { - nodes [0].age ++; + nodes [0].age++; nodes [0].flags |= ZOF_IF_REFERENCE; } rcOld = nodes [idx_znode].rc; nodes [idx_znode].rc = *rcWin; - nodes [idx_znode].age ++; + nodes [idx_znode].age++; #if defined (_MGRM_PROCESSES) if (cli == 0 || mgClients [cli].layer == SHAREDRES_TOPMOST_LAYER) { @@ -3681,7 +3706,7 @@ static int dskMoveWindow (int cli, int idx_znode, HDC memdc, const RECT* rcWin) lock_zi_for_change (zi); nodes [idx_znode].rc = *rcWin; - nodes [idx_znode].age ++; + nodes [idx_znode].age++; unlock_zi_for_change (zi); } diff --git a/src/kernel/zorder.c b/src/kernel/zorder.c index e0cbb53a..c40d6531 100644 --- a/src/kernel/zorder.c +++ b/src/kernel/zorder.c @@ -188,10 +188,9 @@ int __kernel_alloc_z_order_info (int nr_topmosts, int nr_normals) __mg_slot_set_use ((unsigned char*)(__mg_zorder_info + 1), 0); __mg_slot_set_use ((unsigned char*)(maskrect_usage_bmp), 0); - /* Since 4.2.0; init null znode for other fixed main windows */ + /* Since 4.2.0; allocate znodes for other fixed main windows */ { int i; - static int fixed_ztypes [] = { ZNIT_SCREENLOCK, ZNIT_DOCKER, ZNIT_LAUNCHER }; diff --git a/src/newgdi/gdi.c b/src/newgdi/gdi.c index 7ab2a0e9..4a759dc6 100644 --- a/src/newgdi/gdi.c +++ b/src/newgdi/gdi.c @@ -659,8 +659,9 @@ int __mg_enter_drawing (PDC pdc) { BLOCK_DRAW_SEM (pdc); - if (WITHOUT_DRAWING (pdc)) + if (WITHOUT_DRAWING (pdc)) { goto fail; + } if (!IntersectRect (&pdc->rc_output, &pdc->rc_output, &pdc->ecrgn.rcBound)) { goto fail; @@ -1876,6 +1877,7 @@ static void dc_InitDC (PDC pdc, HWND hWnd, BOOL bIsClient) RECT minimal; pdc->pGCRInfo = kernel_GetGCRgnInfo (hWnd); + LOCK_GCRINFO (pdc); pdc->oldage = pdc->pGCRInfo->age; diff --git a/src/server/layer.c b/src/server/layer.c index 2a0ea5be..bde13865 100644 --- a/src/server/layer.c +++ b/src/server/layer.c @@ -195,7 +195,7 @@ static BOOL do_alloc_layer (MG_Layer* layer, const char* name, __mg_slot_set_use ((unsigned char*)(zi + 1), 0); __mg_slot_set_use ((unsigned char*)(maskrect_usage_bmp), 0); - /* Since 4.2.0; init null znode for other fixed main windows */ + /* Since 4.2.0; allocate znodes for other fixed main windows */ { int i; static int fixed_ztypes [] = {