diff --git a/reactos/include/rosky/structs.h b/reactos/include/rosky/structs.h index 8d3b0627168..47dc3ed7f21 100644 --- a/reactos/include/rosky/structs.h +++ b/reactos/include/rosky/structs.h @@ -191,7 +191,7 @@ typedef struct s_window unsigned int width; unsigned int orgx; unsigned int orgy; - unsigned long (*win_func)(HANDLE win, s_gi_msg *m); + unsigned long (__cdecl *win_func)(HANDLE win, s_gi_msg *m); HANDLE handle; struct s_window *parent; @@ -211,10 +211,10 @@ typedef struct s_window typedef struct sCreateApplication { unsigned char ucApplicationName[255]; - unsigned int uiX; - unsigned int uiY; - unsigned int uiWidth; - unsigned int uiHeight; + unsigned int uiX; + unsigned int uiY; + unsigned int uiWidth; + unsigned int uiHeight; void *fwndClient; unsigned int uiStyleApplication; diff --git a/reactos/lib/rosky/libskygi/Makefile b/reactos/lib/rosky/libskygi/Makefile index 6a2cbf9e190..2c6b83c5790 100644 --- a/reactos/lib/rosky/libskygi/Makefile +++ b/reactos/lib/rosky/libskygi/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.1 2004/08/12 02:50:35 weiden Exp $ +# $Id: Makefile,v 1.2 2004/08/12 19:27:12 weiden Exp $ PATH_TO_TOP = ../../.. @@ -18,7 +18,7 @@ TARGET_CFLAGS = \ TARGET_LFLAGS = -nostartfiles -nostdlib -TARGET_SDKLIBS = ntdll.a kernel32.a +TARGET_SDKLIBS = ntdll.a kernel32.a user32.a TARGET_ENTRY = 0x00000000 diff --git a/reactos/lib/rosky/libskygi/libskygi.c b/reactos/lib/rosky/libskygi/libskygi.c index 9937ca00a6b..f4a731ca136 100644 --- a/reactos/lib/rosky/libskygi/libskygi.c +++ b/reactos/lib/rosky/libskygi/libskygi.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: libskygi.c,v 1.1 2004/08/12 02:50:35 weiden Exp $ +/* $Id: libskygi.c,v 1.2 2004/08/12 19:27:12 weiden Exp $ * * PROJECT: SkyOS GI library * FILE: lib/libskygi/libskygi.c @@ -30,5 +30,222 @@ #include "libskygi.h" #include "resource.h" +typedef struct +{ + s_window Window; + MSG LastMsg; + HWND hWnd; + s_gi_msg DispatchMsg; +} SKY_WINDOW, *PSKY_WINDOW; + +static ATOM SkyClassAtom; +static BOOL SkyClassRegistered = FALSE; + +LRESULT CALLBACK +SkyWndDefaultWin32Proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + PSKY_WINDOW skw = (PSKY_WINDOW)GetWindowLong(hWnd, GWL_USERDATA); + + if(skw != NULL) + { + switch(msg) + { + case WM_CLOSE: + PostQuitMessage(0); + break; + case WM_NCDESTROY: + /* free the SKY_WINDOW structure */ + HeapFree(GetProcessHeap(), 0, skw); + break; + } + } + return DefWindowProc(hWnd, msg, wParam, lParam); +} + +ATOM +SkyWndRegisterClass(void) +{ + WNDCLASS wc; + + wc.lpszClassName = "ROSkyWindow"; + wc.lpfnWndProc = SkyWndDefaultWin32Proc; + wc.style = CS_VREDRAW | CS_HREDRAW; + wc.hInstance = GetModuleHandle(NULL); + wc.hIcon = LoadIcon(NULL, (LPCTSTR)IDI_APPLICATION); + wc.hCursor = LoadCursor(NULL, (LPCTSTR)IDC_ARROW); + wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); + wc.lpszMenuName = NULL; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + + return RegisterClass(&wc); +} + + +/* + * @implemented + */ +s_window* __cdecl +GI_create_app(app_para *p) +{ + PSKY_WINDOW skw; + + DBG("GI_create_app(0x%x)\n", p); + + /* FIXME - lock */ + if(!SkyClassRegistered) + { + SkyClassAtom = SkyWndRegisterClass(); + SkyClassRegistered = SkyClassAtom != 0; + + if(!SkyClassRegistered) + { + DBG("Unable to register the ROSkyWindow class\n"); + return NULL; + } + } + /* FIXME - unlock */ + + skw = (PSKY_WINDOW)HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(SKY_WINDOW)); + if(skw == NULL) + { + DBG("Not enough memory to allocate a SKY_WINDOW structure!\n"); + return NULL; + } + + skw->hWnd = CreateWindow("ROSkyWindow", + (p->cpName[0] != '\0' ? (char*)p->cpName : ""), + WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL, + p->ulX, + p->ulY, + p->ulWidth, + p->ulHeight, + NULL, + NULL, + GetModuleHandle(NULL), + NULL); + + if(skw->hWnd == NULL) + { + DBG("CreateWindow() failed!\n"); + HeapFree(GetProcessHeap(), 0, skw); + return NULL; + } + + skw->Window.win_func = p->win_func; + /* FIXME - fill the window structure */ + + /* save the pointer to the structure so we can access it later when dispatching + the win32 messages so we know which sky window it is and dispatch the right + messages */ + SetWindowLong(skw->hWnd, GWL_USERDATA, (LONG)skw); + + DBG("Created Win32 window: 0x%x\n", skw->hWnd); + + return &skw->Window; +} + +/* + * @implemented + */ +int __cdecl +GI_destroy_window(s_window *win) +{ + PSKY_WINDOW skw = (PSKY_WINDOW)win; + + DBG("GI_destroy_window(0x%x)\n", win); + + return (int)DestroyWindow(skw->hWnd); +} + + +/* + * @implemented + */ +unsigned int __cdecl +GI_wait_message(s_gi_msg *m, + s_window* w) +{ + MSG Msg; + BOOL Ret; + HWND hwndFilter; + PSKY_WINDOW msgwnd, filterwnd; + + DBG("GI_wait_message(0x%x, 0x%x)\n", m, w); + + filterwnd = (w != NULL ? (PSKY_WINDOW)w : NULL); + + hwndFilter = (w != NULL ? filterwnd->hWnd : NULL); + Ret = GetMessage(&Msg, hwndFilter, 0, 0); + if(Ret) + { + if(Msg.hwnd != NULL) + { + msgwnd = (PSKY_WINDOW)GetWindowLong(Msg.hwnd, GWL_USERDATA); + msgwnd->LastMsg = Msg; + } + else + { + msgwnd = NULL; + } + } + + RtlZeroMemory(m, sizeof(s_gi_msg)); + m->win = (msgwnd != NULL ? &msgwnd->Window : NULL); + /* FIXME - fill in the other messags */ + + return (int)Ret; +} + + +/* + * @implemented + */ +int __cdecl +GI_dispatch_message(s_window *win, + s_gi_msg *m) +{ + PSKY_WINDOW skywnd = (PSKY_WINDOW)win; + DBG("GI_dispatch_message(0x%x, 0x%x)\n", win, m); + + skywnd->DispatchMsg = *m; + DispatchMessage(&skywnd->LastMsg); + + return 1; +} + + +/* + * @implemented + */ +HRESULT __cdecl +GI_ShowApplicationWindow(s_window *win) +{ + PSKY_WINDOW skywnd = (PSKY_WINDOW)win; + DBG("GI_ShowApplicationWindow(0x%x)\n", win); + + DBG("->0x%x\n", skywnd->hWnd); + ShowWindow(skywnd->hWnd, SW_SHOW); + return 1; +} + + +/* + * @implemented + */ +sCreateApplication* __cdecl +GI_CreateApplicationStruct(void) +{ + sCreateApplication *app; + + app = (sCreateApplication*)HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(sCreateApplication)); + STUB("GI_CreateApplicationStruct() returns 0x%x (allocated structure on the heap)!\n", app); + + return app; +} /* EOF */ diff --git a/reactos/lib/rosky/libskygi/stubs.c b/reactos/lib/rosky/libskygi/stubs.c index 020842a69f0..82cc0429573 100644 --- a/reactos/lib/rosky/libskygi/stubs.c +++ b/reactos/lib/rosky/libskygi/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.2 2004/08/12 15:41:36 weiden Exp $ +/* $Id: stubs.c,v 1.3 2004/08/12 19:27:12 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: SkyOS GI library @@ -116,17 +116,6 @@ GC_set_bg_color(GC *gc, } -/* - * @unimplemented - */ -HRESULT __cdecl -GI_ShowApplicationWindow(HANDLE hWnd) -{ - STUB("GI_ShowApplicationWindow(0x%x) returns 0!\n", hWnd); - return 0; -} - - /* * @unimplemented */ @@ -163,17 +152,6 @@ GI_create_DDB_from_DIB(DIB *dib) } -/* - * @unimplemented - */ -HANDLE __cdecl -GI_create_app(app_para *p) -{ - STUB("GI_create_app(0x%x) returns NULL!\n", p); - return NULL; -} - - /* * @unimplemented */ @@ -199,29 +177,6 @@ GI_create_menu_item(unsigned char *text, } -/* - * @unimplemented - */ -int __cdecl -GI_destroy_window(s_window *win) -{ - STUB("GI_destroy_window(0x%x) returns 0!\n", win); - return 0; -} - - -/* - * @unimplemented - */ -int __cdecl -GI_dispatch_message(s_window *win, - s_gi_msg *m) -{ - STUB("GI_dispatch_message(0x%x, 0x%x) returns 0!\n", win, m); - return 0; -} - - /* * @unimplemented */ @@ -280,18 +235,6 @@ GI_set_high_timer(HANDLE w, } -/* - * @unimplemented - */ -unsigned int __cdecl -GI_wait_message(s_gi_msg *m, - s_window* w) -{ - STUB("GI_wait_message(0x%x, 0x%x) returns 0!\n", m, w); - return 0; -} - - /* * @unimplemented */ @@ -368,17 +311,6 @@ GC_set_font_param(GC *gc, } -/* - * @unimplemented - */ -sCreateApplication* __cdecl -GI_CreateApplicationStruct(void) -{ - STUB("GI_CreateApplicationStruct() returns NULL!\n"); - return NULL; -} - - /* * @unimplemented */