Sync with trunk (r47116), hopefully without breaking anything.
[reactos.git] / subsystems / win32 / win32k / ntuser / guicheck.c
1 /*
2 * ReactOS W32 Subsystem
3 * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19 /* $Id$
20 *
21 * COPYRIGHT: See COPYING in the top level directory
22 * PROJECT: ReactOS kernel
23 * PURPOSE: GUI state check
24 * FILE: subsys/win32k/ntuser/guicheck.c
25 * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
26 * NOTES: The GuiCheck() function performs a few delayed operations:
27 * 1) A GUI process is assigned a window station
28 * 2) A message queue is created for a GUI thread before use
29 * 3) The system window classes are registered for a process
30 * REVISION HISTORY:
31 * 06-06-2001 CSH Created
32 */
33
34 /* INCLUDES ******************************************************************/
35
36 #include <win32k.h>
37
38 #define NDEBUG
39 #include <debug.h>
40
41 /* GLOBALS *******************************************************************/
42
43 static LONG NrGuiAppsRunning = 0;
44
45 /* FUNCTIONS *****************************************************************/
46
47 static BOOL FASTCALL
48 co_AddGuiApp(PPROCESSINFO W32Data)
49 {
50 W32Data->W32PF_flags |= W32PF_CREATEDWINORDC;
51 if (InterlockedIncrement(&NrGuiAppsRunning) == 1)
52 {
53 BOOL Initialized;
54
55 Initialized = co_IntInitializeDesktopGraphics();
56
57 if (!Initialized)
58 {
59 W32Data->W32PF_flags &= ~W32PF_CREATEDWINORDC;
60 InterlockedDecrement(&NrGuiAppsRunning);
61 return FALSE;
62 }
63 }
64 return TRUE;
65 }
66
67 static void FASTCALL
68 RemoveGuiApp(PPROCESSINFO W32Data)
69 {
70 W32Data->W32PF_flags &= ~W32PF_CREATEDWINORDC;
71 if (InterlockedDecrement(&NrGuiAppsRunning) == 0)
72 {
73 IntEndDesktopGraphics();
74 }
75 }
76
77 BOOL FASTCALL
78 co_IntGraphicsCheck(BOOL Create)
79 {
80 PPROCESSINFO W32Data;
81
82 W32Data = PsGetCurrentProcessWin32Process();
83 if (Create)
84 {
85 if (! (W32Data->W32PF_flags & W32PF_CREATEDWINORDC) && ! (W32Data->W32PF_flags & W32PF_MANUALGUICHECK))
86 {
87 return co_AddGuiApp(W32Data);
88 }
89 }
90 else
91 {
92 if ((W32Data->W32PF_flags & W32PF_CREATEDWINORDC) && ! (W32Data->W32PF_flags & W32PF_MANUALGUICHECK))
93 {
94 RemoveGuiApp(W32Data);
95 }
96 }
97
98 return TRUE;
99 }
100
101 VOID
102 FASTCALL
103 IntUserManualGuiCheck(LONG Check)
104 {
105 PPROCESSINFO W32Data;
106
107 DPRINT("Enter IntUserManualGuiCheck\n");
108
109 W32Data = PsGetCurrentProcessWin32Process();
110 if (0 == Check)
111 {
112 W32Data->W32PF_flags |= W32PF_MANUALGUICHECK;
113 }
114 else if (0 < Check)
115 {
116 if (! (W32Data->W32PF_flags & W32PF_CREATEDWINORDC))
117 {
118 co_AddGuiApp(W32Data);
119 }
120 }
121 else
122 {
123 if (W32Data->W32PF_flags & W32PF_CREATEDWINORDC)
124 {
125 RemoveGuiApp(W32Data);
126 }
127 }
128
129 DPRINT("Leave IntUserManualGuiCheck\n");
130
131 }
132
133 NTSTATUS FASTCALL
134 InitGuiCheckImpl (VOID)
135 {
136 return STATUS_SUCCESS;
137 }
138
139 /* EOF */