Mercurial > projects > dwt-win
comparison dwt/internal/win32/OS.d @ 91:b5c6e5033649
debug
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Wed, 06 Feb 2008 23:12:32 +0100 |
parents | be0b130bb29a |
children | 3b6217fd97e9 |
comparison
equal
deleted
inserted
replaced
90:be0b130bb29a | 91:b5c6e5033649 |
---|---|
20 import dwt.internal.Library; | 20 import dwt.internal.Library; |
21 import tango.sys.SharedLib : SharedLib; | 21 import tango.sys.SharedLib : SharedLib; |
22 import tango.util.log.Trace; | 22 import tango.util.log.Trace; |
23 static import tango.stdc.stdlib; | 23 static import tango.stdc.stdlib; |
24 | 24 |
25 void trace(int line ){ | |
26 Trace.formatln( "OS {}", line ); | |
27 } | |
25 | 28 |
26 // declare of Callback functions | 29 // declare of Callback functions |
27 extern (Windows) | 30 extern (Windows) |
28 { | 31 { |
29 alias int function() Function0; | 32 alias int function() Function0; |
218 //IsWinCE = (info.dwPlatformId is VER_PLATFORM_WIN32_CE); | 221 //IsWinCE = (info.dwPlatformId is VER_PLATFORM_WIN32_CE); |
219 //PORTING_CHANGE: made by version | 222 //PORTING_CHANGE: made by version |
220 //IsSP = IsSP(); | 223 //IsSP = IsSP(); |
221 //PORTING_CHANGE: made by version | 224 //PORTING_CHANGE: made by version |
222 //IsPPC = IsPPC(); | 225 //IsPPC = IsPPC(); |
223 | 226 trace(__LINE__); |
224 version(WinCE) { | 227 version(WinCE) { |
225 IsHPC = IsWinCE && !IsPPC && !IsSP; | 228 IsHPC = IsWinCE && !IsPPC && !IsSP; |
226 } | 229 } |
227 WIN32_MAJOR = info.dwMajorVersion; | 230 WIN32_MAJOR = info.dwMajorVersion; |
228 WIN32_MINOR = info.dwMinorVersion; | 231 WIN32_MINOR = info.dwMinorVersion; |
229 WIN32_VERSION = VERSION (WIN32_MAJOR, WIN32_MINOR); | 232 WIN32_VERSION = VERSION (WIN32_MAJOR, WIN32_MINOR); |
230 | 233 |
234 trace(__LINE__); | |
231 // when to load uxtheme | 235 // when to load uxtheme |
232 if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (5, 1)) { | 236 if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (5, 1)) { |
233 loadLib( Symbols_UxTheme, `UxTheme.dll` ); | 237 loadLib( Symbols_UxTheme, `UxTheme.dll` ); |
234 } | 238 } |
235 if (OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (5, 1)) { | 239 if (OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (5, 1)) { |
236 loadLib( Symbols_CoreImm, `Coreimm.dll` ); | 240 loadLib( Symbols_CoreImm, `Coreimm.dll` ); |
237 } | 241 } |
238 if (OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (6, 0)) { | 242 if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (6, 0)) { |
239 loadLib( Symbols_User32, `User32.dll` ); | 243 loadLib( Symbols_User32, `User32.dll` ); |
240 } | 244 } |
241 if (OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (5, 1)) { | 245 if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (5, 1)) { |
242 loadLib( Symbols_Imm32, `Imm32.dll` ); | 246 loadLib( Symbols_Imm32, `Imm32.dll` ); |
243 } | 247 } |
244 if (OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (5, 1)) { | 248 if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (5, 1)) { |
245 loadLib( Symbols_Kernel32, `Kernel32.dll` ); | 249 loadLib( Symbols_Kernel32, `Kernel32.dll` ); |
246 } | 250 } |
247 | 251 |
252 trace(__LINE__); | |
248 //PORTING_CHANGE: made by version | 253 //PORTING_CHANGE: made by version |
249 //IsUnicode = !IsWin32s && !IsWin95; | 254 //IsUnicode = !IsWin32s && !IsWin95; |
250 /* Load the manifest to force the XP Theme */ | 255 /* Load the manifest to force the XP Theme */ |
251 //if (System.getProperty (NO_MANIFEST) is null) { | 256 //if (System.getProperty (NO_MANIFEST) is null) { |
252 if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (5, 1)) { | 257 if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (5, 1)) { |
258 trace(__LINE__); | |
253 TCHAR[] buffer = new TCHAR[ MAX_PATH ]; | 259 TCHAR[] buffer = new TCHAR[ MAX_PATH ]; |
254 HANDLE hModule = OS.GetLibraryHandle (); | 260 HANDLE hModule = OS.GetLibraryHandle (); |
255 while (OS.GetModuleFileName (hModule, buffer.ptr, buffer.length ) is buffer.length ) { | 261 while (OS.GetModuleFileName (hModule, buffer.ptr, buffer.length ) is buffer.length ) { |
256 buffer.length = buffer.length + MAX_PATH; | 262 buffer.length = buffer.length + MAX_PATH; |
257 } | 263 } |
258 auto hHeap = OS.GetProcessHeap (); | 264 auto hHeap = OS.GetProcessHeap (); |
259 int byteCount = buffer.length * TCHAR.sizeof; | 265 int byteCount = buffer.length * TCHAR.sizeof; |
260 TCHAR* pszText = cast(TCHAR*) OS.HeapAlloc (hHeap, HEAP_ZERO_MEMORY, byteCount); | 266 TCHAR* pszText = cast(TCHAR*) OS.HeapAlloc (hHeap, HEAP_ZERO_MEMORY, byteCount); |
261 OS.MoveMemory (pszText, buffer.ptr, byteCount); | 267 OS.MoveMemory (pszText, buffer.ptr, byteCount); |
268 trace(__LINE__); | |
262 ACTCTX pActCtx; | 269 ACTCTX pActCtx; |
263 pActCtx.cbSize = ACTCTX.sizeof; | 270 pActCtx.cbSize = ACTCTX.sizeof; |
264 pActCtx.dwFlags = ACTCTX_FLAG_RESOURCE_NAME_VALID | ACTCTX_FLAG_SET_PROCESS_DEFAULT; | 271 pActCtx.dwFlags = ACTCTX_FLAG_RESOURCE_NAME_VALID | ACTCTX_FLAG_SET_PROCESS_DEFAULT; |
265 pActCtx.lpSource = pszText; | 272 pActCtx.lpSource = pszText; |
266 pActCtx.lpResourceName = cast(TCHAR*)MANIFEST_RESOURCE_ID; | 273 pActCtx.lpResourceName = cast(TCHAR*)MANIFEST_RESOURCE_ID; |
274 trace(__LINE__); | |
275 Trace.formatln( "is loaded {}", ( OS.CreateActCtx !is null )); | |
267 HANDLE hActCtx = OS.CreateActCtx (&pActCtx); | 276 HANDLE hActCtx = OS.CreateActCtx (&pActCtx); |
277 trace(__LINE__); | |
268 if (pszText !is null) OS.HeapFree (hHeap, 0, pszText); | 278 if (pszText !is null) OS.HeapFree (hHeap, 0, pszText); |
269 uint lpCookie; | 279 uint lpCookie; |
270 OS.ActivateActCtx (hActCtx, &lpCookie); | 280 OS.ActivateActCtx (hActCtx, &lpCookie); |
281 trace(__LINE__); | |
271 /* | 282 /* |
272 * NOTE: A single activation context is created and activated | 283 * NOTE: A single activation context is created and activated |
273 * for the entire lifetime of the program. It is deactivated | 284 * for the entire lifetime of the program. It is deactivated |
274 * and released by Windows when the program exits. | 285 * and released by Windows when the program exits. |
275 */ | 286 */ |
281 | 292 |
282 /* Get the DBCS flag */ | 293 /* Get the DBCS flag */ |
283 BOOL dbcsEnabled = OS.GetSystemMetrics (SM_DBCSENABLED) !is 0; | 294 BOOL dbcsEnabled = OS.GetSystemMetrics (SM_DBCSENABLED) !is 0; |
284 BOOL immEnabled = OS.GetSystemMetrics (SM_IMMENABLED) !is 0; | 295 BOOL immEnabled = OS.GetSystemMetrics (SM_IMMENABLED) !is 0; |
285 IsDBLocale = dbcsEnabled || immEnabled; | 296 IsDBLocale = dbcsEnabled || immEnabled; |
297 trace(__LINE__); | |
286 | 298 |
287 /* | 299 /* |
288 * Bug in Windows. On Korean Windows XP when the Text | 300 * Bug in Windows. On Korean Windows XP when the Text |
289 * Services Framework support for legacy applications | 301 * Services Framework support for legacy applications |
290 * is enabled, certain legacy calls segment fault. | 302 * is enabled, certain legacy calls segment fault. |
296 * Note: The bug is fixed in Service Pack 2. | 308 * Note: The bug is fixed in Service Pack 2. |
297 */ | 309 */ |
298 if (!OS.IsWinCE && OS.WIN32_VERSION is OS.VERSION (5, 1)) { | 310 if (!OS.IsWinCE && OS.WIN32_VERSION is OS.VERSION (5, 1)) { |
299 short langID = OS.GetSystemDefaultUILanguage (); | 311 short langID = OS.GetSystemDefaultUILanguage (); |
300 short primaryLang = OS.PRIMARYLANGID (langID); | 312 short primaryLang = OS.PRIMARYLANGID (langID); |
313 trace(__LINE__); | |
301 if (primaryLang is LANG_KOREAN) { | 314 if (primaryLang is LANG_KOREAN) { |
302 OSVERSIONINFOEX infoex; | 315 OSVERSIONINFOEX infoex; |
303 infoex.dwOSVersionInfoSize = OSVERSIONINFOEX.sizeof; | 316 infoex.dwOSVersionInfoSize = OSVERSIONINFOEX.sizeof; |
304 GetVersionEx (cast(OSVERSIONINFO*) &infoex ); | 317 GetVersionEx (cast(OSVERSIONINFO*) &infoex ); |
305 if (infoex.wServicePackMajor < 2) { | 318 if (infoex.wServicePackMajor < 2) { |
319 trace(__LINE__); | |
306 OS.ImmDisableTextFrameService (0); | 320 OS.ImmDisableTextFrameService (0); |
307 } | 321 } |
308 } | 322 } |
309 } | 323 } |
324 trace(__LINE__); | |
310 | 325 |
311 /* Get the COMCTL32.DLL version */ | 326 /* Get the COMCTL32.DLL version */ |
312 DLLVERSIONINFO dvi; | 327 DLLVERSIONINFO dvi; |
313 dvi.cbSize = DLLVERSIONINFO.sizeof; | 328 dvi.cbSize = DLLVERSIONINFO.sizeof; |
314 dvi.dwMajorVersion = 4; | 329 dvi.dwMajorVersion = 4; |
317 //TCHAR lpLibFileName = new TCHAR (0, "comctl32.dll", true); //$NON-NLS-1$ | 332 //TCHAR lpLibFileName = new TCHAR (0, "comctl32.dll", true); //$NON-NLS-1$ |
318 //int /*long*/ hModule = OS.LoadLibrary (lpLibFileName); | 333 //int /*long*/ hModule = OS.LoadLibrary (lpLibFileName); |
319 if (auto lib = SharedLib.load( `comctl32.dll`) ) { | 334 if (auto lib = SharedLib.load( `comctl32.dll`) ) { |
320 char[] name = "DllGetVersion\0"; //$NON-NLS-1$ | 335 char[] name = "DllGetVersion\0"; //$NON-NLS-1$ |
321 void* DllGetVersion = lib.getSymbol(name.ptr); | 336 void* DllGetVersion = lib.getSymbol(name.ptr); |
337 trace(__LINE__); | |
322 if (DllGetVersion !is null){ | 338 if (DllGetVersion !is null){ |
323 alias extern(Windows) void function(DLLVERSIONINFO*) TDllVersion; | 339 alias extern(Windows) void function(DLLVERSIONINFO*) TDllVersion; |
324 TDllVersion f = cast( TDllVersion )DllGetVersion; | 340 TDllVersion f = cast( TDllVersion )DllGetVersion; |
341 trace(__LINE__); | |
325 f(&dvi); | 342 f(&dvi); |
326 } | 343 } |
344 trace(__LINE__); | |
327 lib.unload(); | 345 lib.unload(); |
328 } | 346 } |
347 trace(__LINE__); | |
329 COMCTL32_MAJOR = dvi.dwMajorVersion; | 348 COMCTL32_MAJOR = dvi.dwMajorVersion; |
330 COMCTL32_MINOR = dvi.dwMinorVersion; | 349 COMCTL32_MINOR = dvi.dwMinorVersion; |
331 COMCTL32_VERSION = VERSION (COMCTL32_MAJOR, COMCTL32_MINOR); | 350 COMCTL32_VERSION = VERSION (COMCTL32_MAJOR, COMCTL32_MINOR); |
332 | 351 |
333 /* Get the Shell32.DLL version */ | 352 /* Get the Shell32.DLL version */ |
334 dvi = DLLVERSIONINFO.init; | 353 dvi = DLLVERSIONINFO.init; |
335 dvi.cbSize = DLLVERSIONINFO.sizeof; | 354 dvi.cbSize = DLLVERSIONINFO.sizeof; |
336 dvi.dwMajorVersion = 4; | 355 dvi.dwMajorVersion = 4; |
337 //TCHAR lpLibFileName = new TCHAR (0, "Shell32.dll", true); //$NON-NLS-1$ | 356 //TCHAR lpLibFileName = new TCHAR (0, "Shell32.dll", true); //$NON-NLS-1$ |
338 //int /*long*/ hModule = OS.LoadLibrary (lpLibFileName); | 357 //int /*long*/ hModule = OS.LoadLibrary (lpLibFileName); |
358 trace(__LINE__); | |
339 if ( auto lib = SharedLib.load( `Shell32.dll`)) { | 359 if ( auto lib = SharedLib.load( `Shell32.dll`)) { |
340 char[] name = "DllGetVersion\0"; //$NON-NLS-1$ | 360 char[] name = "DllGetVersion\0"; //$NON-NLS-1$ |
341 void* DllGetVersion = lib.getSymbol(name.ptr); | 361 void* DllGetVersion = lib.getSymbol(name.ptr); |
362 trace(__LINE__); | |
342 if (DllGetVersion !is null){ | 363 if (DllGetVersion !is null){ |
343 alias extern(Windows) void function(DLLVERSIONINFO*) TDllVersion; | 364 alias extern(Windows) void function(DLLVERSIONINFO*) TDllVersion; |
344 TDllVersion f = cast( TDllVersion )DllGetVersion; | 365 TDllVersion f = cast( TDllVersion )DllGetVersion; |
366 trace(__LINE__); | |
345 f(&dvi); | 367 f(&dvi); |
346 } | 368 } |
369 trace(__LINE__); | |
347 lib.unload(); | 370 lib.unload(); |
348 } | 371 } |
349 SHELL32_MAJOR = dvi.dwMajorVersion; | 372 SHELL32_MAJOR = dvi.dwMajorVersion; |
350 SHELL32_MINOR = dvi.dwMinorVersion; | 373 SHELL32_MINOR = dvi.dwMinorVersion; |
351 SHELL32_VERSION = VERSION (SHELL32_MAJOR, SHELL32_MINOR); | 374 SHELL32_VERSION = VERSION (SHELL32_MAJOR, SHELL32_MINOR); |
375 trace(__LINE__); | |
352 } | 376 } |
353 | 377 |
354 /* Flag used on WinCE */ | 378 /* Flag used on WinCE */ |
355 static const int SYS_COLOR_INDEX_FLAG = OS.IsWinCE ? 0x40000000 : 0x0; | 379 static const int SYS_COLOR_INDEX_FLAG = OS.IsWinCE ? 0x40000000 : 0x0; |
356 | 380 |