- added support of DGA-2.0 events
[wine] / windows / ttydrv / wnd.c
1 /*
2  * TTY window driver
3  *
4  * Copyright 1998,1999 Patrik Stridvall
5  */
6
7 #include "config.h"
8
9 #include "class.h"
10 #include "dc.h"
11 #include "heap.h"
12 #include "ttydrv.h"
13 #include "win.h"
14 #include "debugtools.h"
15
16 DEFAULT_DEBUG_CHANNEL(ttydrv)
17
18 /***********************************************************************
19  *              TTYDRV_WND_GetCursesWindow
20  *
21  * Return the Curses window associated to a window.
22  */
23 #ifdef HAVE_LIBCURSES
24 WINDOW *TTYDRV_WND_GetCursesWindow(WND *wndPtr)
25 {
26     return wndPtr && wndPtr->pDriverData ? 
27       ((TTYDRV_WND_DATA *) wndPtr->pDriverData)->window : 0;
28 }
29 #endif /* defined(HAVE_LIBCURSES) */
30
31 /***********************************************************************
32  *              TTYDRV_WND_GetCursesRootWindow
33  *
34  * Return the Curses root window of the Curses window associated 
35  * to a window.
36  */
37 #ifdef HAVE_LIBCURSES
38 WINDOW *TTYDRV_WND_GetCursesRootWindow(WND *wndPtr)
39 {
40   while(wndPtr->parent) wndPtr = wndPtr->parent;
41   return TTYDRV_DESKTOP_GetCursesRootWindow((struct tagDESKTOP *) wndPtr->wExtra);
42 }
43 #endif /* defined(HAVE_LIBCURSES) */
44
45 /**********************************************************************
46  *              TTYDRV_WND_Initialize
47  */
48 void TTYDRV_WND_Initialize(WND *wndPtr)
49 {
50   TTYDRV_WND_DATA *pWndDriverData = 
51     (TTYDRV_WND_DATA *) HeapAlloc(SystemHeap, 0, sizeof(TTYDRV_WND_DATA));
52
53   TRACE("(%p)\n", wndPtr);
54
55   wndPtr->pDriverData = (void *) pWndDriverData;
56
57 #ifdef HAVE_LIBCURSES
58   pWndDriverData->window = NULL;
59 #endif /* defined(HAVE_LIBCURSES) */
60 }
61
62 /**********************************************************************
63  *              TTYDRV_WND_Finalize
64  */
65 void TTYDRV_WND_Finalize(WND *wndPtr)
66 {
67   TTYDRV_WND_DATA *pWndDriverData =
68     (TTYDRV_WND_DATA *) wndPtr->pDriverData;
69
70   TRACE("(%p)\n", wndPtr);
71
72   if(!pWndDriverData) {
73     ERR("WND already destroyed\n");
74     return;
75   }
76
77 #ifdef HAVE_LIBCURSES
78   if(pWndDriverData->window) {
79     ERR("WND destroyed without destroying the associated Curses Windows");
80   }
81 #endif /* defined(HAVE_LIBCURSES) */
82
83   HeapFree(SystemHeap, 0, pWndDriverData);
84   wndPtr->pDriverData = NULL;
85 }
86
87 /**********************************************************************
88  *              TTYDRV_WND_CreateDesktopWindow
89  */
90 BOOL TTYDRV_WND_CreateDesktopWindow(WND *wndPtr, CLASS *classPtr, BOOL bUnicode)
91 {
92   TTYDRV_WND_DATA *pWndDriverData =
93     (TTYDRV_WND_DATA *) wndPtr->pDriverData;
94
95   TRACE("(%p, %p, %d)\n", wndPtr, classPtr, bUnicode);
96
97   if(!pWndDriverData) { ERR("WND never initialized\n"); return FALSE; }
98
99 #ifdef HAVE_LIBCURSES
100   pWndDriverData->window = TTYDRV_WND_GetCursesRootWindow(wndPtr);
101 #endif /* defined(HAVE_LIBCURSES) */
102
103   return TRUE;
104 }
105
106 /**********************************************************************
107  *              TTYDRV_WND_CreateWindow
108  */
109 BOOL TTYDRV_WND_CreateWindow(WND *wndPtr, CLASS *classPtr, CREATESTRUCTA *cs, BOOL bUnicode)
110 {
111 #ifdef HAVE_LIBCURSES
112   WINDOW *window, *rootWindow;
113   INT cellWidth=8, cellHeight=8; /* FIXME: Hardcoded */
114
115   TRACE("(%p, %p, %p, %d)\n", wndPtr, classPtr, cs, bUnicode);
116
117   /* Only create top-level windows */
118   if(cs->style & WS_CHILD)
119     return TRUE;
120
121   if(!(rootWindow = TTYDRV_WND_GetCursesRootWindow(wndPtr)))
122     return FALSE;
123
124   window = subwin(rootWindow, cs->cy/cellHeight, cs->cx/cellWidth,
125                   cs->y/cellHeight, cs->x/cellWidth);
126   werase(window);
127   wrefresh(window);
128                   
129   return TRUE;
130 #else /* defined(HAVE_LIBCURSES) */
131   FIXME("(%p, %p, %p, %d): stub\n", wndPtr, classPtr, cs, bUnicode);
132
133   return TRUE;
134 #endif /* defined(HAVE_LIBCURSES) */
135 }
136
137 /***********************************************************************
138  *              TTYDRV_WND_DestroyWindow
139  */
140 BOOL TTYDRV_WND_DestroyWindow(WND *wndPtr)
141 {
142 #ifdef HAVE_LIBCURSES
143   WINDOW *window;
144
145   TRACE("(%p)\n", wndPtr);
146
147   window = TTYDRV_WND_GetCursesWindow(wndPtr);
148   if(window && window != TTYDRV_WND_GetCursesRootWindow(wndPtr)) {
149     delwin(window);
150   }
151
152   return TRUE;
153 #else /* defined(HAVE_LIBCURSES) */
154   FIXME("(%p): stub\n", wndPtr);
155
156   return TRUE;
157 #endif /* defined(HAVE_LIBCURSES) */
158 }
159
160 /*****************************************************************
161  *              TTYDRV_WND_SetParent
162  */
163 WND *TTYDRV_WND_SetParent(WND *wndPtr, WND *pWndParent)
164 {
165   FIXME("(%p, %p): stub\n", wndPtr, pWndParent);
166
167   return NULL;
168 }
169
170 /***********************************************************************
171  *              TTYDRV_WND_ForceWindowRaise
172  */
173 void TTYDRV_WND_ForceWindowRaise(WND *wndPtr)
174 {
175   FIXME("(%p): stub\n", wndPtr);
176 }
177
178 /***********************************************************************
179  *           TTYDRV_WINPOS_SetWindowPos
180  */
181 void TTYDRV_WND_SetWindowPos(WND *wndPtr, const WINDOWPOS *winpos, BOOL bSMC_SETXPOS)
182 {
183   FIXME("(%p, %p, %d): stub\n", wndPtr, winpos, bSMC_SETXPOS);
184 }
185
186 /*****************************************************************
187  *              TTYDRV_WND_SetText
188  */
189 void TTYDRV_WND_SetText(WND *wndPtr, LPCSTR text)
190 {
191   FIXME("(%p, %s): stub\n", wndPtr, debugstr_a(text));
192 }
193
194 /*****************************************************************
195  *              TTYDRV_WND_SetFocus
196  */
197 void TTYDRV_WND_SetFocus(WND *wndPtr)
198 {
199   FIXME("(%p): stub\n", wndPtr);
200 }
201
202 /*****************************************************************
203  *              TTYDRV_WND_PreSizeMove
204  */
205 void TTYDRV_WND_PreSizeMove(WND *wndPtr)
206 {
207   FIXME("(%p): stub\n", wndPtr);
208 }
209
210 /*****************************************************************
211  *               TTYDRV_WND_PostSizeMove
212  */
213 void TTYDRV_WND_PostSizeMove(WND *wndPtr)
214 {
215   FIXME("(%p): stub\n", wndPtr);
216 }
217
218 /*****************************************************************
219  *               TTYDRV_WND_ScrollWindow
220  */
221 void TTYDRV_WND_ScrollWindow(
222   WND *wndPtr, DC *dcPtr, INT dx, INT dy, 
223   const RECT *clipRect, BOOL bUpdate)
224 {
225   FIXME("(%p, %p, %d, %d, %p, %d): stub\n", 
226         wndPtr, dcPtr, dx, dy, clipRect, bUpdate);
227 }
228
229 /***********************************************************************
230  *              TTYDRV_WND_SetDrawable
231  */
232 void TTYDRV_WND_SetDrawable(WND *wndPtr, DC *dc, WORD flags, BOOL bSetClipOrigin)
233 {
234   TRACE("(%p, %p, %d, %d)\n", wndPtr, dc, flags, bSetClipOrigin);
235
236   /* FIXME: Should be done in the common code instead */
237   if(!wndPtr)  {
238     dc->w.DCOrgX = 0;
239     dc->w.DCOrgY = 0;
240   } else {
241     if(flags & DCX_WINDOW) {
242       dc->w.DCOrgX = wndPtr->rectWindow.left;
243       dc->w.DCOrgY = wndPtr->rectWindow.top;
244     } else {
245       dc->w.DCOrgX = wndPtr->rectClient.left;
246       dc->w.DCOrgY = wndPtr->rectClient.top;
247     }
248   }
249 }
250
251 /***********************************************************************
252  *              TTYDRV_WND_SetHostAttr
253  */
254 BOOL TTYDRV_WND_SetHostAttr(WND *wndPtr, INT attr, INT value)
255 {
256   FIXME("(%p): stub\n", wndPtr);
257
258   return TRUE;
259 }
260
261 /***********************************************************************
262  *              TTYDRV_WND_IsSelfClipping
263  */
264 BOOL TTYDRV_WND_IsSelfClipping(WND *wndPtr)
265 {
266   FIXME("(%p): semistub\n", wndPtr);
267
268   return FALSE;
269 }