12 // === STRUCTURES ===
\r
13 typedef struct sWINDOW_LIST {
\r
14 struct sWINDOW_LIST *next;
\r
19 extern int giScreenWidth,giScreenHeight;
\r
22 static tWINDOW *hwndRootWindow = NULL;
\r
23 static tWINDOW_LIST *windowList = NULL;
\r
26 void wmDrawWindow(tWINDOW *wnd);
\r
27 void wmRepaintWindow(tWINDOW *wnd);
\r
28 void wmRepaintScreen(tWINDOW_LIST *ent);
\r
29 void wmInvalidateWindow(tWINDOW *wnd);
\r
32 void wmUpdateWindows()
\r
34 if(windowList == NULL) return;
\r
35 wmRepaintScreen(windowList);
\r
36 //wmRepaintWindow(hwndRootWindow);
\r
39 EXPORT void *WM_CreateWindow(int x, int y, int w, int h, wndproc_t wndProc, Uint flags)
\r
42 tWINDOW_LIST *tmpListEnt;
\r
46 //k_printf("WM_CreateWindow: (x=%i,y=%i,w=%i,h=%i,wndProc=0x%x,flags=0x%x)\n", x,y,w,h,wndProc,flags);
\r
49 if(x < 0 || y < 0 || wndProc == NULL)
\r
52 tmpWindow = (tWINDOW*)malloc(sizeof(tWINDOW));
\r
53 if(tmpWindow == NULL)
\r
57 //k_printf(" WM_CreateWindow: tmpWindow = 0x%x\n", tmpWindow);
\r
60 tmpWindow->handle = tmpWindow;
\r
61 tmpWindow->flags = flags;
\r
62 tmpWindow->wndproc = wndProc;
\r
63 tmpWindow->bmp.bpp = 32;
\r
64 tmpWindow->bmp.width = (w==-1?giScreenWidth:w);
\r
65 tmpWindow->bmp.height = (h==-1?giScreenHeight:h);
\r
66 tmpWindow->bmp.data = (void *) malloc(4*tmpWindow->bmp.width*tmpWindow->bmp.height);
\r
67 if(tmpWindow->bmp.data == NULL)
\r
72 tmpWindow->rc.x1 = x;
\r
73 tmpWindow->rc.y1 = y;
\r
74 tmpWindow->rc.x2 = x + tmpWindow->bmp.width;
\r
75 tmpWindow->rc.y2 = y + tmpWindow->bmp.height;
\r
76 tmpWindow->next = NULL;
\r
77 tmpWindow->prev = NULL;
\r
78 tmpWindow->first_child = NULL;
\r
79 tmpWindow->last_child = NULL;
\r
80 tmpWindow->parent = NULL;
\r
82 if(flags & WNDFLAG_SHOW)
\r
84 tmpListEnt = malloc(sizeof(tWINDOW_LIST));
\r
85 tmpListEnt->wnd = tmpWindow;
\r
86 tmpListEnt->next = windowList;
\r
87 windowList = tmpListEnt;
\r
90 if(hwndRootWindow == NULL)
\r
92 hwndRootWindow = tmpWindow;
\r
96 if(hwndRootWindow->first_child == NULL)
\r
98 hwndRootWindow->last_child = tmpWindow;
\r
99 hwndRootWindow->first_child = tmpWindow;
\r
103 hwndRootWindow->last_child->next = tmpWindow;
\r
104 tmpWindow->prev = hwndRootWindow->last_child;
\r
105 tmpWindow->prev->next = tmpWindow;
\r
106 hwndRootWindow->last_child = tmpWindow;
\r
108 tmpWindow->parent = hwndRootWindow;
\r
111 wmInvalidateWindow(tmpWindow);
\r
116 EXPORT int WM_SendMessage(void *hwnd, int msg, int a1, int a2)
\r
118 if(hwnd == NULL || ((tWINDOW*)hwnd)->wndproc == NULL)
\r
120 //k_printf("WM_SendMessage: ERROR - Window is undefined\n");
\r
123 return ((tWINDOW*)hwnd)->wndproc( ((tWINDOW*)hwnd)->handle, msg, a1, a2 );
\r
126 void wmRepaintWindow(tWINDOW *wnd)
\r
130 if(wnd->repaint == 1)
\r
132 for(child = wnd->first_child; child != NULL; child = child->next) {
\r
133 wmRepaintWindow(child);
\r
135 WM_SendMessage(wnd, WM_REPAINT, (Uint)&wnd->bmp, 0);
\r
140 void wmRepaintScreen(tWINDOW_LIST *ent)
\r
143 //k_printf("wmRepaintScreen: (ent=0x%x)\n", ent);
\r
147 if(ent->wnd->repaint == 1)
\r
150 //k_printf("wmRepaintScreen: ent->wnd=0x%x\n", ent->wnd);
\r
152 WM_SendMessage(ent->wnd, WM_REPAINT, (Uint)&ent->wnd->bmp, 0);
\r
154 //k_printf("wmRepaintScreen: ent->wnd=0x%x\n", ent->wnd);
\r
156 wmDrawWindow(ent->wnd);
\r
158 if(ent->next != NULL)
\r
160 wmRepaintScreen(ent->next);
\r
164 void wmDrawWindow(tWINDOW *wnd)
\r
167 //k_printf("wmDrawWindow: (wnd = 0x%x)\n", wnd);
\r
169 if(wnd->flags & WNDFLAG_SHOW) {
\r
171 //k_printf(" wmDrawWindow: Drawing Window\n");
\r
173 draw_bmp(&wnd->bmp, &wnd->rc);
\r
177 void wmInvalidateWindow(tWINDOW *wnd)
\r
182 while( (parent = wnd->parent) )
\r
183 parent->repaint = 1;
\r