2 * Copyright (c) 2005 Pat Thoyts <patthoyts@users.sourceforge.net>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 #define WIN32_LEAN_AND_MEAN
43 #pragma comment(lib, "shell32")
44 #pragma comment(lib, "user32")
45 #pragma comment(lib, "advapi32")
46 #pragma comment(lib, "psapi")
47 #endif /* _MSC_VER >= 1000 */
49 static HINSTANCE g_hInstance
= 0;
52 DllMain(HINSTANCE hInstance
, DWORD dwReason
, LPVOID reserved
)
54 JIM_NOTUSED(reserved
);
55 if (dwReason
== DLL_PROCESS_ATTACH
) {
56 g_hInstance
= hInstance
;
62 Win32ErrorObj(Jim_Interp
*interp
, const char * szPrefix
, DWORD dwError
)
64 Jim_Obj
*msgObj
= NULL
;
65 char * lpBuffer
= NULL
;
68 dwLen
= FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER
69 | FORMAT_MESSAGE_FROM_SYSTEM
, NULL
, dwError
, LANG_NEUTRAL
,
70 (char *)&lpBuffer
, 0, NULL
);
72 dwLen
= FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER
73 | FORMAT_MESSAGE_FROM_STRING
| FORMAT_MESSAGE_ARGUMENT_ARRAY
,
74 "code 0x%1!08X!%n", 0, LANG_NEUTRAL
,
75 (char *)&lpBuffer
, 0, (va_list *)&dwError
);
78 msgObj
= Jim_NewStringObj(interp
, szPrefix
, -1);
80 char *p
= lpBuffer
+ dwLen
- 1; /* remove cr-lf at end */
81 for ( ; p
&& *p
&& isspace(*p
); p
--)
84 Jim_AppendString(interp
, msgObj
, ": ", 2);
85 Jim_AppendString(interp
, msgObj
, lpBuffer
, -1);
87 LocalFree((HLOCAL
)lpBuffer
);
91 /* win32.ShellExecute verb file args */
93 Win32_ShellExecute(Jim_Interp
*interp
, int objc
, Jim_Obj
*const *objv
)
96 const char *verb
, *file
, *parm
= NULL
;
97 char cwd
[MAX_PATH
+ 1];
99 if (objc
< 3 || objc
> 4) {
100 Jim_WrongNumArgs(interp
, 1, objv
, "verb path ?parameters?");
103 verb
= Jim_GetString(objv
[1], NULL
);
104 file
= Jim_GetString(objv
[2], NULL
);
105 GetCurrentDirectoryA(MAX_PATH
+ 1, cwd
);
107 parm
= Jim_GetString(objv
[3], NULL
);
108 r
= (int)ShellExecuteA(NULL
, verb
, file
, parm
, cwd
, SW_SHOWNORMAL
);
110 Jim_SetResult(interp
,
111 Win32ErrorObj(interp
, "ShellExecute", GetLastError()));
112 return (r
< 33) ? JIM_ERR
: JIM_OK
;
116 /* win32.FindWindow title ?class? */
118 Win32_FindWindow(Jim_Interp
*interp
, int objc
, Jim_Obj
*const *objv
)
120 const char *title
= NULL
, *class = NULL
;
124 if (objc
< 2 || objc
> 3) {
125 Jim_WrongNumArgs(interp
, 1, objv
, "title ?class?");
128 title
= Jim_GetString(objv
[1], NULL
);
130 class = Jim_GetString(objv
[2], NULL
);
131 hwnd
= FindWindowA(class, title
);
134 Jim_SetResult(interp
,
135 Win32ErrorObj(interp
, "FindWindow", GetLastError()));
138 Jim_SetResult(interp
, Jim_NewIntObj(interp
, (long)hwnd
));
143 /* win32.CloseWindow windowHandle */
145 Win32_CloseWindow(Jim_Interp
*interp
, int objc
, Jim_Obj
*const *objv
)
150 Jim_WrongNumArgs(interp
, 1, objv
, "?windowHandle?");
153 if (Jim_GetLong(interp
, objv
[1], &hwnd
) != JIM_OK
)
155 if (!CloseWindow((HWND
)hwnd
)) {
156 Jim_SetResult(interp
,
157 Win32ErrorObj(interp
, "CloseWindow", GetLastError()));
164 Win32_DestroyWindow(Jim_Interp
*interp
, int objc
, Jim_Obj
*const *objv
)
169 Jim_WrongNumArgs(interp
, 1, objv
, "?windowHandle?");
172 if (Jim_GetLong(interp
, objv
[1], &hwnd
) != JIM_OK
)
174 if (!DestroyWindow((HWND
)hwnd
)) {
175 Jim_SetResult(interp
,
176 Win32ErrorObj(interp
, "DestroyWindow", GetLastError()));
182 static LRESULT CALLBACK
183 JimWin32WindowProc(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
187 Jim_Interp
*interp
= (Jim_Interp
*)GetWindowLongPtr(hwnd
, GWLP_USERDATA
);
190 objv
[objc
++] = Jim_NewStringObj(interp
, "WndProc", -1);
193 //Jim_EvalObjVector(interp, objc, objv);
196 objv
[objc
++] = Jim_NewIntObj(interp
, HIWORD(wParam
));
197 objv
[objc
++] = Jim_NewIntObj(interp
, LOWORD(wParam
));
198 objv
[objc
++] = Jim_NewIntObj(interp
, lParam
);
199 r
= Jim_EvalObjVector(interp
, objc
, objv
);
200 if (r
== JIM_BREAK
) return 0L;
204 return DefWindowProc(hwnd
, uMsg
, wParam
, lParam
);
208 Win32_RegisterClass(Jim_Interp
*interp
, int objc
, Jim_Obj
*const objv
[])
212 if (objc
< 2 || objc
> 3) {
213 Jim_WrongNumArgs(interp
, 1, objv
, "classname ?windowproc?");
217 // FIX ME: deal with the windowproc
219 wc
.cbSize
= sizeof(WNDCLASSEX
);
220 wc
.style
= CS_HREDRAW
| CS_VREDRAW
;
221 wc
.lpfnWndProc
= DefWindowProc
;
224 wc
.hInstance
= g_hInstance
;
225 wc
.hIcon
= LoadIcon(NULL
, IDI_APPLICATION
);
226 wc
.hIconSm
= LoadIcon(NULL
, IDI_APPLICATION
);
227 wc
.hCursor
= LoadCursor(NULL
, IDC_ARROW
);
228 wc
.hbrBackground
= (HBRUSH
)(COLOR_BTNFACE
+1);
229 wc
.lpszMenuName
= wc
.lpszClassName
= Jim_GetString(objv
[1], NULL
);
232 wc
.lpfnWndProc
= JimWin32WindowProc
;
235 if (!RegisterClassExA(&wc
)) {
236 Jim_SetResult(interp
,
237 Win32ErrorObj(interp
, "RegisterClassEx", GetLastError()));
245 Win32_CreateWindow(Jim_Interp
*interp
, int objc
, Jim_Obj
*const objv
[])
248 HWND hwnd
, hwndParent
= HWND_DESKTOP
;
249 DWORD style
= WS_VISIBLE
| WS_OVERLAPPEDWINDOW
;
251 const char *class, *title
;
253 if (objc
< 3 || objc
> 5) {
254 Jim_WrongNumArgs(interp
, 1, objv
, "class title ?parent? ?id?");
258 class = Jim_GetString(objv
[1], NULL
);
259 title
= Jim_GetString(objv
[2], NULL
);
261 if (Jim_GetLong(interp
, objv
[3], (long *)&hwndParent
) != JIM_OK
)
263 style
= WS_VISIBLE
| WS_CHILD
| WS_CLIPCHILDREN
| WS_CLIPSIBLINGS
;
266 if (Jim_GetLong(interp
, objv
[4], (long *)&id
) != JIM_OK
)
270 hwnd
= CreateWindowA(class, title
, style
,
271 CW_USEDEFAULT
, CW_USEDEFAULT
, CW_USEDEFAULT
, CW_USEDEFAULT
,
272 hwndParent
, (HMENU
)id
, g_hInstance
, NULL
);
274 SetWindowLongPtr(hwnd
, GWLP_USERDATA
, (LONG_PTR
)interp
);
275 Jim_SetResult(interp
, Jim_NewIntObj(interp
, (DWORD
)hwnd
));
278 Jim_SetResult(interp
,
279 Win32ErrorObj(interp
, "CreateWindow", GetLastError()));
287 Win32_UpdateWindow(Jim_Interp
*interp
, int objc
, Jim_Obj
*const objv
[])
292 Jim_WrongNumArgs(interp
, 1, objv
, "hwnd");
295 if (Jim_GetLong(interp
, objv
[1], (long *)&hwnd
) != JIM_OK
)
297 if (!UpdateWindow(hwnd
)) {
298 Jim_SetResult(interp
,
299 Win32ErrorObj(interp
, "UpdateWindow", GetLastError()));
306 Win32_MoveWindow(Jim_Interp
*interp
, int objc
, Jim_Obj
*const objv
[])
312 Jim_WrongNumArgs(interp
, 1, objv
, "hwnd x y width height");
315 if (Jim_GetLong(interp
, objv
[1], (long *)&hwnd
) != JIM_OK
)
317 for (n
= 2; n
< 6; n
++) {
318 if (Jim_GetLong(interp
, objv
[n
], (long*)¶m
[n
-2]) != JIM_OK
)
322 if (!MoveWindow(hwnd
, param
[0], param
[1], param
[2], param
[3], TRUE
)) {
323 Jim_SetResult(interp
,
324 Win32ErrorObj(interp
, "MoveWindow", GetLastError()));
331 Win32_ShowWindow(Jim_Interp
*interp
, int objc
, Jim_Obj
*const objv
[])
335 const char *cmds
[] = {
336 "SW_HIDE", "SW_SHOWNORMAL", "SW_SHOWMINIMIZED", "SW_MAXIMIZE",
337 "SW_SHOWNOACTIVATE", "SW_SHOW", "SW_MINIMIZE", "SW_SHOWMINNOACTIVE",
338 "SW_SHOWNA", "SW_RESTORE", "SW_SHOWDEFAULT", "SW_FORCEMINIMIZE",
342 Jim_WrongNumArgs(interp
, 1, objv
, "windowhandle option");
345 if (Jim_GetLong(interp
, objv
[1], (long *)&hwnd
) != JIM_OK
)
347 if (Jim_GetEnum(interp
, objv
[2], cmds
, &cmd
, "command", JIM_ERRMSG
) != JIM_OK
)
351 if (!ShowWindow(hwnd
, cmd
)) {
352 Jim_SetResult(interp
,
353 Win32ErrorObj(interp
, "ShowWindow", GetLastError()));
360 Win32_GetActiveWindow(Jim_Interp
*interp
, int objc
, Jim_Obj
*const objv
[])
365 Jim_SetResult(interp
, Jim_NewIntObj(interp
, (DWORD
)GetActiveWindow()));
370 Win32_SetActiveWindow(Jim_Interp
*interp
, int objc
, Jim_Obj
*const *objv
)
376 Jim_WrongNumArgs(interp
, 1, objv
, "windowHandle");
379 r
= Jim_GetLong(interp
, objv
[1], (long *)&hwnd
);
381 old
= SetActiveWindow(hwnd
);
383 Jim_SetResult(interp
,
384 Win32ErrorObj(interp
, "SetActiveWindow", GetLastError()));
387 Jim_SetResult(interp
, Jim_NewIntObj(interp
, (long)old
));
394 Win32_SetForegroundWindow(Jim_Interp
*interp
, int objc
, Jim_Obj
*const *objv
)
400 Jim_WrongNumArgs(interp
, 1, objv
, "windowHandle");
403 r
= Jim_GetLong(interp
, objv
[1], (long *)&hwnd
);
405 if (!SetForegroundWindow(hwnd
)) {
406 Jim_SetResult(interp
,
407 Win32ErrorObj(interp
, "SetForegroundWindow", GetLastError()));
415 Win32_Beep(Jim_Interp
*interp
, int objc
, Jim_Obj
*const *objv
)
421 Jim_WrongNumArgs(interp
, 1, objv
, "freq duration");
424 r
= Jim_GetLong(interp
, objv
[1], &freq
);
426 r
= Jim_GetLong(interp
, objv
[2], &duration
);
427 if (freq
< 0x25) freq
= 0x25;
428 if (freq
> 0x7fff) freq
= 0x7fff;
430 if (!Beep(freq
, duration
)) {
431 Jim_SetResult(interp
,
432 Win32ErrorObj(interp
, "Beep", GetLastError()));
440 Win32_GetComputerName(Jim_Interp
*interp
, int objc
, Jim_Obj
*const *objv
)
442 char name
[MAX_COMPUTERNAME_LENGTH
+ 1];
443 DWORD size
= MAX_COMPUTERNAME_LENGTH
;
447 Jim_WrongNumArgs(interp
, 1, objv
, "");
451 if (GetComputerNameA(name
, &size
)) {
452 Jim_Obj
*nameObj
= Jim_NewStringObj(interp
, name
, size
);
453 Jim_SetResult(interp
, nameObj
);
455 Jim_SetResult(interp
,
456 Win32ErrorObj(interp
, "GetComputerName", GetLastError()));
464 Win32_GetUserName(Jim_Interp
*interp
, int objc
, Jim_Obj
*const *objv
)
466 char name
[UNLEN
+ 1];
471 Jim_WrongNumArgs(interp
, 1, objv
, "");
475 if (GetUserNameA(name
, &size
)) {
476 Jim_Obj
*nameObj
= Jim_NewStringObj(interp
, name
, size
);
477 Jim_SetResult(interp
, nameObj
);
479 Jim_SetResult(interp
,
480 Win32ErrorObj(interp
, "GetUserName", GetLastError()));
488 Win32_GetModuleFileName(Jim_Interp
*interp
, int objc
, Jim_Obj
*const *objv
)
490 HMODULE hModule
= NULL
;
495 Jim_WrongNumArgs(interp
, 1, objv
, "?moduleid?");
500 if (Jim_GetLong(interp
, objv
[1], (long *)&hModule
) != JIM_OK
) {
505 len
= GetModuleFileNameA(hModule
, path
, MAX_PATH
);
507 Jim_Obj
*pathObj
= Jim_NewStringObj(interp
, path
, len
);
508 Jim_SetResult(interp
, pathObj
);
510 Jim_SetResult(interp
,
511 Win32ErrorObj(interp
, "GetModuleFileName", GetLastError()));
519 Win32_GetVersion(Jim_Interp
*interp
, int objc
, Jim_Obj
*const *objv
)
524 Jim_SetResult(interp
, Jim_NewIntObj(interp
, GetVersion()));
529 Win32_GetTickCount(Jim_Interp
*interp
, int objc
, Jim_Obj
*const *objv
)
534 Jim_SetResult(interp
, Jim_NewIntObj(interp
, GetTickCount()));
539 Win32_GetSystemTime(Jim_Interp
*interp
, int objc
, Jim_Obj
*const *objv
)
549 #define JIMADD(name) \
550 a[n++] = Jim_NewStringObj(interp, #name, -1); \
551 a[n++] = Jim_NewIntObj(interp, t.w ## name )
560 JIMADD(Milliseconds
);
563 Jim_SetResult(interp
, Jim_NewListObj(interp
, a
, n
));
568 Win32_GetSystemInfo(Jim_Interp
*interp
, int objc
, Jim_Obj
*const *objv
)
573 struct pa_map
{ int arch
; const char *name
; };
574 struct pa_map
*p
, map
[] = {
575 { PROCESSOR_ARCHITECTURE_INTEL
, "intel" },
576 { PROCESSOR_ARCHITECTURE_MIPS
, "mips" },
577 { PROCESSOR_ARCHITECTURE_ALPHA
, "alpha" },
578 { PROCESSOR_ARCHITECTURE_PPC
, "ppc" },
579 { PROCESSOR_ARCHITECTURE_SHX
, "shx" },
580 { PROCESSOR_ARCHITECTURE_ARM
, "arm" },
581 { PROCESSOR_ARCHITECTURE_IA64
, "ia64" },
582 { PROCESSOR_ARCHITECTURE_ALPHA64
,"alpha64" },
583 { PROCESSOR_ARCHITECTURE_MSIL
, "msil" },
584 { PROCESSOR_ARCHITECTURE_AMD64
, "amd64"},
585 { PROCESSOR_ARCHITECTURE_IA32_ON_WIN64
, "ia32onwin64" },
586 { PROCESSOR_ARCHITECTURE_UNKNOWN
,"unknown" }
593 a
[n
++] = Jim_NewStringObj(interp
, "ProcessorArchitecture", -1);
594 for (p
= map
; p
->arch
!= PROCESSOR_ARCHITECTURE_UNKNOWN
; ++p
) {
595 if (p
->arch
== si
.wProcessorArchitecture
) {
599 a
[n
++] = Jim_NewStringObj(interp
, p
->name
, -1);
601 #define JIMADD(name,element) \
602 a[n++] = Jim_NewStringObj(interp, #name, -1); \
603 a[n++] = Jim_NewIntObj(interp, (jim_wide)si. ## element )
605 JIMADD(PageSize
, dwPageSize
);
606 JIMADD(MinimumApplicationAddress
, lpMinimumApplicationAddress
);
607 JIMADD(MaximumApplicationAddress
, lpMaximumApplicationAddress
);
608 JIMADD(ActiveProcessorMask
, dwActiveProcessorMask
);
609 JIMADD(NumberOfProcessors
, dwNumberOfProcessors
);
610 JIMADD(ProcessorType
, dwProcessorType
);
611 JIMADD(AllocationGranularity
, dwAllocationGranularity
);
612 JIMADD(ProcessorLevel
, wProcessorLevel
);
613 JIMADD(ProcessorRevision
, wProcessorRevision
);
616 Jim_SetResult(interp
, Jim_NewListObj(interp
, a
, n
));
620 // Declared here because its not available without recent versions of the
621 // Platform SDK. mingw32 doesn't declare it all either.
622 typedef struct _PERFORMANCE_INFORMATION
{
627 SIZE_T PhysicalTotal
;
628 SIZE_T PhysicalAvailable
;
632 SIZE_T KernelNonpaged
;
637 } PERFORMANCE_INFORMATION
;
638 typedef BOOL (__stdcall
*LPFNGETPERFORMANCEINFO
)(PERFORMANCE_INFORMATION
*, DWORD
);
641 Win32_GetPerformanceInfo(Jim_Interp
*interp
, int objc
, Jim_Obj
*const *objv
)
645 PERFORMANCE_INFORMATION pi
;
646 LPFNGETPERFORMANCEINFO lpfnGetPerformanceInfo
= NULL
;
647 HMODULE hLib
= (HMODULE
)Jim_CmdPrivData(interp
);
652 lpfnGetPerformanceInfo
= (LPFNGETPERFORMANCEINFO
)GetProcAddress(hLib
, "GetPerformanceInfo");
653 if (lpfnGetPerformanceInfo
== NULL
) {
654 /* should never happen */
655 Jim_SetResultString(interp
, "argh!", -1);
660 if (!lpfnGetPerformanceInfo(&pi
, sizeof(pi
))) {
661 Jim_SetResult(interp
,
662 Win32ErrorObj(interp
, "GetPerformanceInfo", GetLastError()));
666 #define JIMADD(name) \
667 a[n++] = Jim_NewStringObj(interp, #name, -1); \
668 a[n++] = Jim_NewIntObj(interp, pi.name )
673 JIMADD(PhysicalTotal
);
674 JIMADD(PhysicalAvailable
);
678 JIMADD(KernelNonpaged
);
681 JIMADD(ProcessCount
);
685 Jim_SetResult(interp
, Jim_NewListObj(interp
, a
, n
));
691 Win32_GetCursorInfo(Jim_Interp
*interp
, int objc
, Jim_Obj
*const objv
[])
700 ci
.cbSize
= sizeof(ci
);
701 if (!GetCursorInfo(&ci
)) {
702 Jim_SetResult(interp
,
703 Win32ErrorObj(interp
, "GetCursorInfo", GetLastError()));
707 #define JIMADDN(name) a[n++] = Jim_NewStringObj(interp, #name, -1);
708 #define JIMADDV(v) a[n++] = Jim_NewIntObj(interp, (v));
709 JIMADDN(flags
); JIMADDV(ci
.flags
);
710 JIMADDN(hCursor
); JIMADDV((DWORD
)ci
.hCursor
);
711 JIMADDN(x
); JIMADDV(ci
.ptScreenPos
.x
);
712 JIMADDN(y
); JIMADDV(ci
.ptScreenPos
.y
);
716 Jim_SetResult(interp
, Jim_NewListObj(interp
, a
, n
));
721 Win32_GetLastInputInfo(Jim_Interp
*interp
, int objc
, Jim_Obj
*const objv
[])
723 struct lastinputinfo_t
{
727 typedef BOOL (__stdcall
*LPFNGETLASTINPUTINFO
)(struct lastinputinfo_t
*);
728 LPFNGETLASTINPUTINFO lpfnGetLastInputInfo
= NULL
;
729 HMODULE hLib
= (HMODULE
)Jim_CmdPrivData(interp
);
734 lpfnGetLastInputInfo
= (LPFNGETLASTINPUTINFO
)GetProcAddress(hLib
, "GetLastInputInfo");
735 if (lpfnGetLastInputInfo
== NULL
) {
736 Jim_SetResultString(interp
, "command not available on this platform", -1);
740 lii
.cbSize
= sizeof(lii
);
741 if (!lpfnGetLastInputInfo(&lii
)) {
742 Jim_SetResult(interp
,
743 Win32ErrorObj(interp
, "GetLastInputInfo", GetLastError()));
746 Jim_SetResult(interp
, Jim_NewIntObj(interp
, lii
.dwTime
));
750 #define F(x) { #x , x }
751 typedef struct { const char *s
; unsigned long f
; } ANIMATEWINDOWFLAGSMAP
;
752 static ANIMATEWINDOWFLAGSMAP AnimateWindowFlagsMap
[] = {
753 F(AW_SLIDE
), F(AW_ACTIVATE
), F(AW_BLEND
), F(AW_HIDE
), F(AW_CENTER
),
754 F(AW_HOR_POSITIVE
), F(AW_HOR_NEGATIVE
), F(AW_VER_POSITIVE
),
755 F(AW_VER_NEGATIVE
), { NULL
, 0 }
760 GetAnimateWindowFlagsFromObj(Jim_Interp
*interp
, Jim_Obj
*listObj
, DWORD
*flags
)
762 int r
= JIM_OK
, n
, nLength
;
764 Jim_ListLength(interp
, listObj
, &nLength
);
766 for (n
= 0; n
< nLength
; n
++) {
767 ANIMATEWINDOWFLAGSMAP
*p
;
769 r
= Jim_ListIndex(interp
, listObj
, n
, &obj
, 1);
770 for (p
= AnimateWindowFlagsMap
; r
== JIM_OK
&& p
->s
!= NULL
; p
++) {
772 const char *name
= Jim_GetString(obj
, &len
);
773 if (strncmp(p
->s
, name
, len
) == 0) {
779 Jim_SetResultString(interp
, "invalid option", -1);
789 Win32_AnimateWindow(Jim_Interp
*interp
, int objc
, Jim_Obj
*const objv
[])
792 DWORD dwTime
= 0, dwFlags
= 0;
793 struct map_t
{ const char* s
; DWORD f
; };
796 Jim_WrongNumArgs(interp
, 1, objv
, "windowhandle time flags");
800 if (Jim_GetLong(interp
, objv
[1], (long *)&hwnd
) != JIM_OK
)
802 if (Jim_GetLong(interp
, objv
[2], &dwTime
) != JIM_OK
)
804 if (GetAnimateWindowFlagsFromObj(interp
, objv
[3], &dwFlags
) != JIM_OK
)
807 if (!AnimateWindow(hwnd
, dwTime
, dwFlags
)) {
808 DWORD err
= GetLastError();
810 if (err
== ERROR_SUCCESS
)
811 errObj
= Jim_NewStringObj(interp
, "error: "
812 " calling thread does not own the window", -1);
814 errObj
= Win32ErrorObj(interp
, "AnimateWindow", err
);
815 Jim_SetResult(interp
, errObj
);
821 #endif /* WINVER >= 0x0500 */
824 Win32_GetCursorPos(Jim_Interp
*interp
, int objc
, Jim_Obj
*const objv
[])
831 if (!GetCursorPos(&pt
)) {
832 Jim_SetResult(interp
,
833 Win32ErrorObj(interp
, "GetCursorPos", GetLastError()));
836 a
[0] = Jim_NewIntObj(interp
, pt
.x
);
837 a
[1] = Jim_NewIntObj(interp
, pt
.y
);
838 Jim_SetResult(interp
, Jim_NewListObj(interp
, a
, 2));
843 Win32_SetCursorPos(Jim_Interp
*interp
, int objc
, Jim_Obj
*const objv
[])
849 Jim_WrongNumArgs(interp
, 1, objv
, "x y");
853 r
= Jim_GetLong(interp
, objv
[1], &pt
.x
);
855 r
= Jim_GetLong(interp
, objv
[2], &pt
.y
);
857 if (!SetCursorPos(pt
.x
, pt
.y
)) {
858 Jim_SetResult(interp
,
859 Win32ErrorObj(interp
, "SetCursorPos", GetLastError()));
867 Win32_GetCursor(Jim_Interp
*interp
, int objc
, Jim_Obj
*const objv
[])
873 hCursor
= GetCursor();
874 Jim_SetResult(interp
, Jim_NewIntObj(interp
, (DWORD
)hCursor
));
879 Win32_SetCursor(Jim_Interp
*interp
, int objc
, Jim_Obj
*const objv
[])
885 Jim_WrongNumArgs(interp
, 1, objv
, "hCursor");
889 r
= Jim_GetLong(interp
, objv
[1], (long *)&hCursor
);
891 hCursor
= SetCursor(hCursor
);
892 Jim_SetResult(interp
, Jim_NewIntObj(interp
, (DWORD
)hCursor
));
898 #define IDC_HAND MAKEINTRESOURCE(32649)
902 Win32_LoadCursor(Jim_Interp
*interp
, int objc
, Jim_Obj
*const objv
[])
906 static const char *name
[] = {
907 "appstarting", "arrow", "cross", "hand", "help", "ibeam",
908 "icon", "no", "size", "sizeall", "sizenesw", "sizens",
909 "sizenwse", "sizewe", "uparrow", "wait", NULL
911 static LPCTSTR id
[] = {
912 IDC_APPSTARTING
, IDC_ARROW
, IDC_CROSS
, IDC_HAND
, IDC_HELP
, IDC_IBEAM
,
913 IDC_ICON
, IDC_NO
, IDC_SIZEALL
, IDC_SIZEALL
, IDC_SIZENESW
, IDC_SIZENS
,
914 IDC_SIZENWSE
, IDC_UPARROW
, IDC_WAIT
, NULL
918 Jim_WrongNumArgs(interp
, 1, objv
, "name");
922 if (Jim_GetEnum(interp
, objv
[1], name
, &ndx
, "cursor name", JIM_ERRMSG
) != JIM_OK
)
925 hCursor
= LoadCursor((HINSTANCE
)NULL
, id
[ndx
]);
926 if (hCursor
== NULL
) {
927 Jim_SetResult(interp
,
928 Win32ErrorObj(interp
, "LoadCursor", GetLastError()));
932 Jim_SetResult(interp
, Jim_NewIntObj(interp
, (DWORD
)hCursor
));
937 Win32_SetComputerName(Jim_Interp
*interp
, int objc
, Jim_Obj
*const *objv
)
942 Jim_WrongNumArgs(interp
, 1, objv
, "computername");
945 name
= Jim_GetString(objv
[1], NULL
);
946 if (!SetComputerNameA(name
)) {
947 Jim_SetResult(interp
,
948 Win32ErrorObj(interp
, "SetComputerName", GetLastError()));
955 Win32_GetModuleHandle(Jim_Interp
*interp
, int objc
, Jim_Obj
*const *objv
)
957 HMODULE hModule
= NULL
;
958 const char *name
= NULL
;
960 if (objc
< 1 || objc
> 2) {
961 Jim_WrongNumArgs(interp
, 1, objv
, "?name?");
965 name
= Jim_GetString(objv
[1], NULL
);
966 hModule
= GetModuleHandleA(name
);
967 if (hModule
== NULL
) {
968 Jim_SetResult(interp
,
969 Win32ErrorObj(interp
, "GetModuleHandle", GetLastError()));
972 Jim_SetResult(interp
, Jim_NewIntObj(interp
, (unsigned long)hModule
));
977 Win32_LoadLibrary(Jim_Interp
*interp
, int objc
, Jim_Obj
*const *objv
)
981 Jim_WrongNumArgs(interp
, 1, objv
, "path");
984 hLib
= LoadLibraryA(Jim_GetString(objv
[1], NULL
));
986 Jim_SetResult(interp
,
987 Win32ErrorObj(interp
, "LoadLibrary", GetLastError()));
990 Jim_SetResult(interp
, Jim_NewIntObj(interp
, (unsigned long)hLib
));
995 Win32_FreeLibrary(Jim_Interp
*interp
, int objc
, Jim_Obj
*const *objv
)
997 HMODULE hModule
= NULL
;
1001 Jim_WrongNumArgs(interp
, 1, objv
, "hmodule");
1005 r
= Jim_GetLong(interp
, objv
[1], (long *)&hModule
);
1007 if (!FreeLibrary(hModule
)) {
1008 Jim_SetResult(interp
,
1009 Win32ErrorObj(interp
, "FreeLibrary", GetLastError()));
1018 /* ----------------------------------------------------------------------
1023 Win32_CreateDirectory(Jim_Interp
*interp
, int objc
, Jim_Obj
*const *objv
)
1028 Jim_WrongNumArgs(interp
, 1, objv
, "path");
1032 path
= Jim_GetString(objv
[1], NULL
);
1033 if (!CreateDirectoryA(path
, NULL
)) {
1034 Jim_SetResult(interp
,
1035 Win32ErrorObj(interp
, "CreateDirectory", GetLastError()));
1043 Win32_RemoveDirectory(Jim_Interp
*interp
, int objc
, Jim_Obj
*const *objv
)
1048 Jim_WrongNumArgs(interp
, 1, objv
, "path");
1052 path
= Jim_GetString(objv
[1], NULL
);
1053 if (!RemoveDirectoryA(path
)) {
1054 Jim_SetResult(interp
,
1055 Win32ErrorObj(interp
, "RemoveDirectory", GetLastError()));
1063 * CopyFile, MoveFile, CreateFile, DeleteFile, LockFile,
1064 * ReadFile and WriteFile should get rolled into a stream/channel thing.
1067 /* ----------------------------------------------------------------------
1068 * Cleanup for dynamically loaded commands.
1072 Win32_ReleasePrivLib(Jim_Interp
*interp
, void *clientData
)
1074 HMODULE hLib
= (HMODULE
)clientData
;
1075 JIM_NOTUSED(interp
);
1080 /* ----------------------------------------------------------------------
1081 * package load function.
1085 Jim_OnLoad(Jim_Interp
*interp
)
1089 Jim_InitExtension(interp
);
1090 if (Jim_PackageProvide(interp
, "win32", "1.0", JIM_ERRMSG
) != JIM_OK
)
1094 Jim_CreateCommand(interp, "win32." #name , Win32_ ## name , NULL, NULL)
1105 CMD(GetActiveWindow
);
1106 CMD(SetActiveWindow
);
1107 CMD(SetForegroundWindow
);
1114 CMD(GetComputerName
);
1115 CMD(SetComputerName
);
1117 CMD(GetModuleFileName
);
1122 CMD(GetModuleHandle
);
1125 CMD(CreateDirectory
);
1126 CMD(RemoveDirectory
);
1128 #if WINVER >= 0x0500
1133 /* Check that this DLL is available before creating the command. */
1134 hLib
= LoadLibrary(_T("psapi"));
1136 Jim_CreateCommand(interp
, "win32.GetPerformanceInfo",
1137 Win32_GetPerformanceInfo
, hLib
, Win32_ReleasePrivLib
);
1139 #if WINVER >= 0x0500
1140 hLib
= LoadLibrary(_T("user32"));
1142 Jim_CreateCommand(interp
, "win32.GetLastInputInfo",
1143 Win32_GetLastInputInfo
, hLib
, Win32_ReleasePrivLib
);
1145 #endif /* WINVER >= 0x0500 */