Backup - Adding AxWin0 to git, just so it's backed up
[tpg/acess2.git] / Usermode / Applications / axwin0_src / wm.c
1 /*\r
2 Acess OS GUI\r
3 Window Manager\r
4 */\r
5 #include "header.h"\r
6 #include <stdio.h>\r
7 #include <stdlib.h>\r
8 \r
9 #define DEBUG   0\r
10 #define EXPORT  \r
11 \r
12 // === STRUCTURES ===\r
13 typedef struct sWINDOW_LIST {\r
14         struct sWINDOW_LIST     *next;\r
15         tWINDOW *wnd;\r
16 }       tWINDOW_LIST;\r
17 \r
18 // === IMPORTS ===\r
19 extern int      giScreenWidth,giScreenHeight;\r
20 \r
21 //GLOBALS\r
22 static tWINDOW          *hwndRootWindow = NULL;\r
23 static tWINDOW_LIST     *windowList = NULL;\r
24 \r
25 //PROTOTYPES\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
30 \r
31 //CODE\r
32 void wmUpdateWindows()\r
33 {\r
34         if(windowList == NULL)  return;\r
35         wmRepaintScreen(windowList);\r
36         //wmRepaintWindow(hwndRootWindow);\r
37 }\r
38 \r
39 EXPORT void     *WM_CreateWindow(int x, int y, int w, int h, wndproc_t wndProc, Uint flags)\r
40 {\r
41         tWINDOW *tmpWindow;\r
42         tWINDOW_LIST    *tmpListEnt;\r
43         \r
44         \r
45         #if DEBUG\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
47         #endif\r
48         \r
49         if(x < 0 || y < 0 || wndProc == NULL)\r
50                 return 0;\r
51         \r
52         tmpWindow = (tWINDOW*)malloc(sizeof(tWINDOW));\r
53         if(tmpWindow == NULL)\r
54                 return NULL;\r
55         \r
56         #if DEBUG\r
57                 //k_printf(" WM_CreateWindow: tmpWindow = 0x%x\n", tmpWindow);\r
58         #endif\r
59         \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
68         {\r
69                 free(tmpWindow);\r
70                 return NULL;\r
71         }\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
81         \r
82         if(flags & WNDFLAG_SHOW)\r
83         {\r
84                 tmpListEnt = malloc(sizeof(tWINDOW_LIST));\r
85                 tmpListEnt->wnd = tmpWindow;\r
86                 tmpListEnt->next = windowList;\r
87                 windowList = tmpListEnt;\r
88         }\r
89         \r
90         if(hwndRootWindow == NULL)\r
91         {\r
92                 hwndRootWindow = tmpWindow;\r
93         }\r
94         else\r
95         {\r
96                 if(hwndRootWindow->first_child == NULL)\r
97                 {\r
98                         hwndRootWindow->last_child = tmpWindow;\r
99                         hwndRootWindow->first_child = tmpWindow;\r
100                 }\r
101                 else\r
102                 {\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
107                 }\r
108                 tmpWindow->parent = hwndRootWindow;\r
109         }\r
110         \r
111         wmInvalidateWindow(tmpWindow);\r
112         \r
113         return tmpWindow;\r
114 }\r
115 \r
116 EXPORT int      WM_SendMessage(void *hwnd, int msg, int a1, int a2)\r
117 {\r
118         if(hwnd == NULL || ((tWINDOW*)hwnd)->wndproc == NULL)\r
119         {\r
120                 //k_printf("WM_SendMessage: ERROR - Window is undefined\n");\r
121                 return -1;\r
122         }\r
123         return ((tWINDOW*)hwnd)->wndproc( ((tWINDOW*)hwnd)->handle, msg, a1, a2 );\r
124 }\r
125 \r
126 void wmRepaintWindow(tWINDOW *wnd)\r
127 {\r
128         tWINDOW *child;\r
129         \r
130         if(wnd->repaint == 1)\r
131         {\r
132                 for(child = wnd->first_child; child != NULL; child = child->next) {\r
133                         wmRepaintWindow(child);\r
134                 }\r
135                 WM_SendMessage(wnd, WM_REPAINT, (Uint)&wnd->bmp, 0);\r
136                 wmDrawWindow(wnd);\r
137         }\r
138 }\r
139 \r
140 void wmRepaintScreen(tWINDOW_LIST *ent)\r
141 {\r
142         #if DEBUG\r
143                 //k_printf("wmRepaintScreen: (ent=0x%x)\n", ent);\r
144         #endif\r
145         if(ent == NULL)\r
146                 return;\r
147         if(ent->wnd->repaint == 1)\r
148         {\r
149                 #if DEBUG\r
150                         //k_printf("wmRepaintScreen: ent->wnd=0x%x\n", ent->wnd);\r
151                 #endif\r
152                 WM_SendMessage(ent->wnd, WM_REPAINT, (Uint)&ent->wnd->bmp, 0);\r
153                 #if DEBUG\r
154                         //k_printf("wmRepaintScreen: ent->wnd=0x%x\n", ent->wnd);\r
155                 #endif\r
156                 wmDrawWindow(ent->wnd);\r
157         }\r
158         if(ent->next != NULL)\r
159         {\r
160                 wmRepaintScreen(ent->next);\r
161         }\r
162 }\r
163 \r
164 void wmDrawWindow(tWINDOW *wnd)\r
165 {\r
166         #if DEBUG\r
167                 //k_printf("wmDrawWindow: (wnd = 0x%x)\n", wnd);\r
168         #endif\r
169         if(wnd->flags & WNDFLAG_SHOW) {\r
170                 #if DEBUG\r
171                         //k_printf(" wmDrawWindow: Drawing Window\n");\r
172                 #endif\r
173                 draw_bmp(&wnd->bmp, &wnd->rc);\r
174         }\r
175 }\r
176 \r
177 void wmInvalidateWindow(tWINDOW *wnd)\r
178 {\r
179         tWINDOW *parent;\r
180         wnd->repaint = 1;\r
181         \r
182         while( (parent = wnd->parent) )\r
183                 parent->repaint = 1;\r
184 }\r

UCC git Repository :: git.ucc.asn.au