Imported Upstream version 1.15.1
[deb_xorg-server.git] / hw / kdrive / ephyr / ephyrinit.c
CommitLineData
a09e091a
JB
1/*
2 * Xephyr - A kdrive X server thats runs in a host X window.
3 * Authored by Matthew Allum <mallum@o-hand.com>
4 *
5 * Copyright © 2004 Nokia
6 *
7 * Permission to use, copy, modify, distribute, and sell this software and its
8 * documentation for any purpose is hereby granted without fee, provided that
9 * the above copyright notice appear in all copies and that both that
10 * copyright notice and this permission notice appear in supporting
11 * documentation, and that the name of Nokia not be used in
12 * advertising or publicity pertaining to distribution of the software without
13 * specific, written prior permission. Nokia makes no
14 * representations about the suitability of this software for any purpose. It
15 * is provided "as is" without express or implied warranty.
16 *
17 * NOKIA DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
18 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
19 * EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT OR
20 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
21 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
22 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
23 * PERFORMANCE OF THIS SOFTWARE.
24 */
25
26#ifdef HAVE_CONFIG_H
27#include <kdrive-config.h>
28#endif
29#include "ephyr.h"
30#include "ephyrlog.h"
31#include "glx_extinit.h"
32
33extern Window EphyrPreExistingHostWin;
34extern Bool EphyrWantGrayScale;
35extern Bool EphyrWantResize;
36extern Bool kdHasPointer;
37extern Bool kdHasKbd;
38
39#ifdef GLXEXT
40extern Bool ephyrNoDRI;
41#endif
42extern Bool ephyrNoXV;
43
44#ifdef KDRIVE_EVDEV
45extern KdPointerDriver LinuxEvdevMouseDriver;
46extern KdKeyboardDriver LinuxEvdevKeyboardDriver;
47#endif
48
49void processScreenArg(const char *screen_size, char *parent_id);
50
51void
52InitCard(char *name)
53{
54 EPHYR_DBG("mark");
55 KdCardInfoAdd(&ephyrFuncs, 0);
56}
57
58static const ExtensionModule ephyrExtensions[] = {
59#ifdef GLXEXT
60 { GlxExtensionInit, "GLX", &noGlxExtension },
61#endif
62};
63
64static
65void ephyrExtensionInit(void)
66{
67 int i;
68
69 for (i = 0; i < ARRAY_SIZE(ephyrExtensions); i++)
70 LoadExtension(&ephyrExtensions[i], TRUE);
71}
72
73
74void
75InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
76{
77 if (serverGeneration == 1)
78 ephyrExtensionInit();
79
80 KdInitOutput(pScreenInfo, argc, argv);
81}
82
83void
84InitInput(int argc, char **argv)
85{
86 KdKeyboardInfo *ki;
87 KdPointerInfo *pi;
88
89 KdAddKeyboardDriver(&EphyrKeyboardDriver);
90#ifdef KDRIVE_EVDEV
91 KdAddKeyboardDriver(&LinuxEvdevKeyboardDriver);
92#endif
93 KdAddPointerDriver(&EphyrMouseDriver);
94#ifdef KDRIVE_EVDEV
95 KdAddPointerDriver(&LinuxEvdevMouseDriver);
96#endif
97
98 if (!kdHasKbd) {
99 ki = KdNewKeyboard();
100 if (!ki)
101 FatalError("Couldn't create Xephyr keyboard\n");
102 ki->driver = &EphyrKeyboardDriver;
103 KdAddKeyboard(ki);
104 }
105
106 if (!kdHasPointer) {
107 pi = KdNewPointer();
108 if (!pi)
109 FatalError("Couldn't create Xephyr pointer\n");
110 pi->driver = &EphyrMouseDriver;
111 KdAddPointer(pi);
112 }
113
114 KdInitInput();
115}
116
117void
118CloseInput(void)
119{
120 KdCloseInput();
121}
122
123#ifdef DDXBEFORERESET
124void
125ddxBeforeReset(void)
126{
127}
128#endif
129
130void
131ddxUseMsg(void)
132{
133 KdUseMsg();
134
135 ErrorF("\nXephyr Option Usage:\n");
136 ErrorF("-parent <XID> Use existing window as Xephyr root win\n");
137 ErrorF("-sw-cursor Render cursors in software in Xephyr\n");
138 ErrorF("-fullscreen Attempt to run Xephyr fullscreen\n");
139 ErrorF("-grayscale Simulate 8bit grayscale\n");
140 ErrorF("-resizeable Make Xephyr windows resizeable\n");
141 ErrorF
142 ("-fakexa Simulate acceleration using software rendering\n");
143 ErrorF("-verbosity <level> Set log verbosity level\n");
144#ifdef GLXEXT
145 ErrorF("-nodri do not use DRI\n");
146#endif
147 ErrorF("-noxv do not use XV\n");
148 ErrorF("-name [name] define the name in the WM_CLASS property\n");
149 ErrorF
150 ("-title [title] set the window title in the WM_NAME property\n");
151 ErrorF("\n");
152
153 exit(1);
154}
155
156void
157processScreenArg(const char *screen_size, char *parent_id)
158{
159 KdCardInfo *card;
160
161 InitCard(0); /*Put each screen on a separate card */
162 card = KdCardInfoLast();
163
164 if (card) {
165 KdScreenInfo *screen;
166 unsigned long p_id = 0;
167
168 screen = KdScreenInfoAdd(card);
169 KdParseScreen(screen, screen_size);
170 screen->driver = calloc(1, sizeof(EphyrScrPriv));
171 if (!screen->driver)
172 FatalError("Couldn't alloc screen private\n");
173
174 if (parent_id) {
175 p_id = strtol(parent_id, NULL, 0);
176 }
177 EPHYR_DBG("screen number:%d\n", screen->mynum);
178 hostx_add_screen(screen, p_id, screen->mynum);
179 }
180 else {
181 ErrorF("No matching card found!\n");
182 }
183}
184
185int
186ddxProcessArgument(int argc, char **argv, int i)
187{
188 static char *parent = NULL;
189
190 EPHYR_DBG("mark argv[%d]='%s'", i, argv[i]);
191
192 if (i == 1) {
193 hostx_use_resname(basename(argv[0]), 0);
194 }
195
196 if (!strcmp(argv[i], "-parent")) {
197 if (i + 1 < argc) {
198 int j;
199
200 /* If parent is specified and a screen argument follows, don't do
201 * anything, let the -screen handling init the rest */
202 for (j = i; j < argc; j++) {
203 if (!strcmp(argv[j], "-screen")) {
204 parent = argv[i + 1];
205 return 2;
206 }
207 }
208
209 processScreenArg("100x100", argv[i + 1]);
210 return 2;
211 }
212
213 UseMsg();
214 exit(1);
215 }
216 else if (!strcmp(argv[i], "-screen")) {
217 if ((i + 1) < argc) {
218 processScreenArg(argv[i + 1], parent);
219 parent = NULL;
220 return 2;
221 }
222
223 UseMsg();
224 exit(1);
225 }
226 else if (!strcmp(argv[i], "-sw-cursor")) {
227 hostx_use_sw_cursor();
228 return 1;
229 }
230 else if (!strcmp(argv[i], "-host-cursor")) {
231 /* Compatibility with the old command line argument, now the default. */
232 return 1;
233 }
234 else if (!strcmp(argv[i], "-fullscreen")) {
235 hostx_use_fullscreen();
236 return 1;
237 }
238 else if (!strcmp(argv[i], "-grayscale")) {
239 EphyrWantGrayScale = 1;
240 return 1;
241 }
242 else if (!strcmp(argv[i], "-resizeable")) {
243 EphyrWantResize = 1;
244 return 1;
245 }
246 else if (!strcmp(argv[i], "-fakexa")) {
247 ephyrFuncs.initAccel = ephyrDrawInit;
248 ephyrFuncs.enableAccel = ephyrDrawEnable;
249 ephyrFuncs.disableAccel = ephyrDrawDisable;
250 ephyrFuncs.finiAccel = ephyrDrawFini;
251 return 1;
252 }
253 else if (!strcmp(argv[i], "-verbosity")) {
254 if (i + 1 < argc && argv[i + 1][0] != '-') {
255 int verbosity = atoi(argv[i + 1]);
256
257 LogSetParameter(XLOG_VERBOSITY, verbosity);
258 EPHYR_LOG("set verbosiry to %d\n", verbosity);
259 return 2;
260 }
261 else {
262 UseMsg();
263 exit(1);
264 }
265 }
266#ifdef GLXEXT
267 else if (!strcmp(argv[i], "-nodri")) {
268 ephyrNoDRI = TRUE;
269 EPHYR_LOG("no direct rendering enabled\n");
270 return 1;
271 }
272#endif
273 else if (!strcmp(argv[i], "-noxv")) {
274 ephyrNoXV = TRUE;
275 EPHYR_LOG("no XVideo enabled\n");
276 return 1;
277 }
278 else if (!strcmp(argv[i], "-name")) {
279 if (i + 1 < argc && argv[i + 1][0] != '-') {
280 hostx_use_resname(argv[i + 1], 1);
281 return 2;
282 }
283 else {
284 UseMsg();
285 return 0;
286 }
287 }
288 else if (!strcmp(argv[i], "-title")) {
289 if (i + 1 < argc && argv[i + 1][0] != '-') {
290 hostx_set_title(argv[i + 1]);
291 return 2;
292 }
293 else {
294 UseMsg();
295 return 0;
296 }
297 }
298 else if (argv[i][0] == ':') {
299 hostx_set_display_name(argv[i]);
300 }
301 /* Xnest compatibility */
302 else if (!strcmp(argv[i], "-display")) {
303 hostx_set_display_name(argv[i + 1]);
304 return 2;
305 }
306 else if (!strcmp(argv[i], "-sync") ||
307 !strcmp(argv[i], "-full") ||
308 !strcmp(argv[i], "-sss") || !strcmp(argv[i], "-install")) {
309 return 1;
310 }
311 else if (!strcmp(argv[i], "-bw") ||
312 !strcmp(argv[i], "-class") ||
313 !strcmp(argv[i], "-geometry") || !strcmp(argv[i], "-scrns")) {
314 return 2;
315 }
316 /* end Xnest compat */
317
318 return KdProcessArgument(argc, argv, i);
319}
320
321void
322OsVendorInit(void)
323{
324 EPHYR_DBG("mark");
325
326 if (hostx_want_host_cursor()) {
327 ephyrFuncs.initCursor = &ephyrCursorInit;
328 ephyrFuncs.enableCursor = &ephyrCursorEnable;
329 }
330
331 KdOsInit(&EphyrOsFuncs);
332}
333
334/* 'Fake' cursor stuff, could be improved */
335
336static Bool
337ephyrRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
338{
339 return TRUE;
340}
341
342static Bool
343ephyrUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
344{
345 return TRUE;
346}
347
348static void
349ephyrSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor, int x,
350 int y)
351{
352 ;
353}
354
355static void
356ephyrMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
357{
358 ;
359}
360
361static Bool
362ephyrDeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
363{
364 return TRUE;
365}
366
367static void
368ephyrDeviceCursorCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
369{
370}
371
372miPointerSpriteFuncRec EphyrPointerSpriteFuncs = {
373 ephyrRealizeCursor,
374 ephyrUnrealizeCursor,
375 ephyrSetCursor,
376 ephyrMoveCursor,
377 ephyrDeviceCursorInitialize,
378 ephyrDeviceCursorCleanup
379};
380
381Bool
382ephyrCursorInit(ScreenPtr pScreen)
383{
384 miPointerInitialize(pScreen,
385 &EphyrPointerSpriteFuncs,
386 &ephyrPointerScreenFuncs, FALSE);
387
388 return TRUE;
389}
390
391void
392ephyrCursorEnable(ScreenPtr pScreen)
393{
394 ;
395}
396
397KdCardFuncs ephyrFuncs = {
398 ephyrCardInit, /* cardinit */
399 ephyrScreenInitialize, /* scrinit */
400 ephyrInitScreen, /* initScreen */
401 ephyrFinishInitScreen, /* finishInitScreen */
402 ephyrCreateResources, /* createRes */
403 ephyrPreserve, /* preserve */
404 ephyrEnable, /* enable */
405 ephyrDPMS, /* dpms */
406 ephyrDisable, /* disable */
407 ephyrRestore, /* restore */
408 ephyrScreenFini, /* scrfini */
409 ephyrCardFini, /* cardfini */
410
411 0, /* initCursor */
412 0, /* enableCursor */
413 0, /* disableCursor */
414 0, /* finiCursor */
415 0, /* recolorCursor */
416
417 0, /* initAccel */
418 0, /* enableAccel */
419 0, /* disableAccel */
420 0, /* finiAccel */
421
422 ephyrGetColors, /* getColors */
423 ephyrPutColors, /* putColors */
424};