ephyrinit.c revision ed6184df
1/*
2 * Xephyr - A kdrive X server that 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_DIX_CONFIG_H
27#include <dix-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 EphyrWantNoHostGrab;
37extern Bool kdHasPointer;
38extern Bool kdHasKbd;
39extern Bool ephyr_glamor, ephyr_glamor_gles2, ephyr_glamor_skip_present;
40
41extern Bool ephyrNoXV;
42
43void processScreenOrOutputArg(const char *screen_size, const char *output, char *parent_id);
44void processOutputArg(const char *output, char *parent_id);
45void processScreenArg(const char *screen_size, char *parent_id);
46
47int
48main(int argc, char *argv[], char *envp[])
49{
50    hostx_use_resname(basename(argv[0]), 0);
51    return dix_main(argc, argv, envp);
52}
53
54void
55InitCard(char *name)
56{
57    EPHYR_DBG("mark");
58    KdCardInfoAdd(&ephyrFuncs, 0);
59}
60
61void
62InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
63{
64    KdInitOutput(pScreenInfo, argc, argv);
65}
66
67void
68InitInput(int argc, char **argv)
69{
70    KdKeyboardInfo *ki;
71    KdPointerInfo *pi;
72
73    if (!SeatId) {
74        KdAddKeyboardDriver(&EphyrKeyboardDriver);
75        KdAddPointerDriver(&EphyrMouseDriver);
76
77        if (!kdHasKbd) {
78            ki = KdNewKeyboard();
79            if (!ki)
80                FatalError("Couldn't create Xephyr keyboard\n");
81            ki->driver = &EphyrKeyboardDriver;
82            KdAddKeyboard(ki);
83        }
84
85        if (!kdHasPointer) {
86            pi = KdNewPointer();
87            if (!pi)
88                FatalError("Couldn't create Xephyr pointer\n");
89            pi->driver = &EphyrMouseDriver;
90            KdAddPointer(pi);
91        }
92    }
93
94    KdInitInput();
95}
96
97void
98CloseInput(void)
99{
100    KdCloseInput();
101}
102
103#if INPUTTHREAD
104/** This function is called in Xserver/os/inputthread.c when starting
105    the input thread. */
106void
107ddxInputThreadInit(void)
108{
109}
110#endif
111
112#ifdef DDXBEFORERESET
113void
114ddxBeforeReset(void)
115{
116}
117#endif
118
119void
120ddxUseMsg(void)
121{
122    KdUseMsg();
123
124    ErrorF("\nXephyr Option Usage:\n");
125    ErrorF("-parent <XID>        Use existing window as Xephyr root win\n");
126    ErrorF("-sw-cursor           Render cursors in software in Xephyr\n");
127    ErrorF("-fullscreen          Attempt to run Xephyr fullscreen\n");
128    ErrorF("-output <NAME>       Attempt to run Xephyr fullscreen (restricted to given output geometry)\n");
129    ErrorF("-grayscale           Simulate 8bit grayscale\n");
130    ErrorF("-resizeable          Make Xephyr windows resizeable\n");
131#ifdef GLAMOR
132    ErrorF("-glamor              Enable 2D acceleration using glamor\n");
133    ErrorF("-glamor_gles2        Enable 2D acceleration using glamor (with GLES2 only)\n");
134    ErrorF("-glamor-skip-present Skip presenting the output when using glamor (for internal testing optimization)\n");
135#endif
136    ErrorF
137        ("-fakexa              Simulate acceleration using software rendering\n");
138    ErrorF("-verbosity <level>   Set log verbosity level\n");
139    ErrorF("-noxv                do not use XV\n");
140    ErrorF("-name [name]         define the name in the WM_CLASS property\n");
141    ErrorF
142        ("-title [title]       set the window title in the WM_NAME property\n");
143    ErrorF("-no-host-grab        Disable grabbing the keyboard and mouse.\n");
144    ErrorF("\n");
145}
146
147void
148processScreenOrOutputArg(const char *screen_size, const char *output, char *parent_id)
149{
150    KdCardInfo *card;
151
152    InitCard(0);                /*Put each screen on a separate card */
153    card = KdCardInfoLast();
154
155    if (card) {
156        KdScreenInfo *screen;
157        unsigned long p_id = 0;
158        Bool use_geometry;
159
160        screen = KdScreenInfoAdd(card);
161        KdParseScreen(screen, screen_size);
162        screen->driver = calloc(1, sizeof(EphyrScrPriv));
163        if (!screen->driver)
164            FatalError("Couldn't alloc screen private\n");
165
166        if (parent_id) {
167            p_id = strtol(parent_id, NULL, 0);
168        }
169
170        use_geometry = (strchr(screen_size, '+') != NULL);
171        EPHYR_DBG("screen number:%d\n", screen->mynum);
172        hostx_add_screen(screen, p_id, screen->mynum, use_geometry, output);
173    }
174    else {
175        ErrorF("No matching card found!\n");
176    }
177}
178
179void
180processScreenArg(const char *screen_size, char *parent_id)
181{
182    processScreenOrOutputArg(screen_size, NULL, parent_id);
183}
184
185void
186processOutputArg(const char *output, char *parent_id)
187{
188    processScreenOrOutputArg("100x100+0+0", output, parent_id);
189}
190
191int
192ddxProcessArgument(int argc, char **argv, int i)
193{
194    static char *parent = NULL;
195
196    EPHYR_DBG("mark argv[%d]='%s'", i, argv[i]);
197
198    if (!strcmp(argv[i], "-parent")) {
199        if (i + 1 < argc) {
200            int j;
201
202            /* If parent is specified and a screen argument follows, don't do
203             * anything, let the -screen handling init the rest */
204            for (j = i; j < argc; j++) {
205                if (!strcmp(argv[j], "-screen")) {
206                    parent = argv[i + 1];
207                    return 2;
208                }
209            }
210
211            processScreenArg("100x100", argv[i + 1]);
212            return 2;
213        }
214
215        UseMsg();
216        exit(1);
217    }
218    else if (!strcmp(argv[i], "-screen")) {
219        if ((i + 1) < argc) {
220            processScreenArg(argv[i + 1], parent);
221            parent = NULL;
222            return 2;
223        }
224
225        UseMsg();
226        exit(1);
227    }
228    else if (!strcmp(argv[i], "-output")) {
229        if (i + 1 < argc) {
230            processOutputArg(argv[i + 1], NULL);
231            return 2;
232        }
233
234        UseMsg();
235        exit(1);
236    }
237    else if (!strcmp(argv[i], "-sw-cursor")) {
238        hostx_use_sw_cursor();
239        return 1;
240    }
241    else if (!strcmp(argv[i], "-host-cursor")) {
242        /* Compatibility with the old command line argument, now the default. */
243        return 1;
244    }
245    else if (!strcmp(argv[i], "-fullscreen")) {
246        hostx_use_fullscreen();
247        return 1;
248    }
249    else if (!strcmp(argv[i], "-grayscale")) {
250        EphyrWantGrayScale = 1;
251        return 1;
252    }
253    else if (!strcmp(argv[i], "-resizeable")) {
254        EphyrWantResize = 1;
255        return 1;
256    }
257#ifdef GLAMOR
258    else if (!strcmp (argv[i], "-glamor")) {
259        ephyr_glamor = TRUE;
260        ephyrFuncs.initAccel = ephyr_glamor_init;
261        ephyrFuncs.enableAccel = ephyr_glamor_enable;
262        ephyrFuncs.disableAccel = ephyr_glamor_disable;
263        ephyrFuncs.finiAccel = ephyr_glamor_fini;
264        return 1;
265    }
266    else if (!strcmp (argv[i], "-glamor_gles2")) {
267        ephyr_glamor = TRUE;
268        ephyr_glamor_gles2 = TRUE;
269        ephyrFuncs.initAccel = ephyr_glamor_init;
270        ephyrFuncs.enableAccel = ephyr_glamor_enable;
271        ephyrFuncs.disableAccel = ephyr_glamor_disable;
272        ephyrFuncs.finiAccel = ephyr_glamor_fini;
273        return 1;
274    }
275    else if (!strcmp (argv[i], "-glamor-skip-present")) {
276        ephyr_glamor_skip_present = TRUE;
277        return 1;
278    }
279#endif
280    else if (!strcmp(argv[i], "-fakexa")) {
281        ephyrFuncs.initAccel = ephyrDrawInit;
282        ephyrFuncs.enableAccel = ephyrDrawEnable;
283        ephyrFuncs.disableAccel = ephyrDrawDisable;
284        ephyrFuncs.finiAccel = ephyrDrawFini;
285        return 1;
286    }
287    else if (!strcmp(argv[i], "-verbosity")) {
288        if (i + 1 < argc && argv[i + 1][0] != '-') {
289            int verbosity = atoi(argv[i + 1]);
290
291            LogSetParameter(XLOG_VERBOSITY, verbosity);
292            EPHYR_LOG("set verbosiry to %d\n", verbosity);
293            return 2;
294        }
295        else {
296            UseMsg();
297            exit(1);
298        }
299    }
300    else if (!strcmp(argv[i], "-noxv")) {
301        ephyrNoXV = TRUE;
302        EPHYR_LOG("no XVideo enabled\n");
303        return 1;
304    }
305    else if (!strcmp(argv[i], "-name")) {
306        if (i + 1 < argc && argv[i + 1][0] != '-') {
307            hostx_use_resname(argv[i + 1], 1);
308            return 2;
309        }
310        else {
311            UseMsg();
312            return 0;
313        }
314    }
315    else if (!strcmp(argv[i], "-title")) {
316        if (i + 1 < argc && argv[i + 1][0] != '-') {
317            hostx_set_title(argv[i + 1]);
318            return 2;
319        }
320        else {
321            UseMsg();
322            return 0;
323        }
324    }
325    else if (argv[i][0] == ':') {
326        hostx_set_display_name(argv[i]);
327    }
328    /* Xnest compatibility */
329    else if (!strcmp(argv[i], "-display")) {
330        hostx_set_display_name(argv[i + 1]);
331        return 2;
332    }
333    else if (!strcmp(argv[i], "-sync") ||
334             !strcmp(argv[i], "-full") ||
335             !strcmp(argv[i], "-sss") || !strcmp(argv[i], "-install")) {
336        return 1;
337    }
338    else if (!strcmp(argv[i], "-bw") ||
339             !strcmp(argv[i], "-class") ||
340             !strcmp(argv[i], "-geometry") || !strcmp(argv[i], "-scrns")) {
341        return 2;
342    }
343    /* end Xnest compat */
344    else if (!strcmp(argv[i], "-no-host-grab")) {
345        EphyrWantNoHostGrab = 1;
346        return 1;
347    }
348    else if (!strcmp(argv[i], "-sharevts") ||
349             !strcmp(argv[i], "-novtswitch")) {
350        return 1;
351    }
352    else if (!strcmp(argv[i], "-layout")) {
353        return 2;
354    }
355
356    return KdProcessArgument(argc, argv, i);
357}
358
359void
360OsVendorInit(void)
361{
362    EPHYR_DBG("mark");
363
364    if (SeatId)
365        hostx_use_sw_cursor();
366
367    if (hostx_want_host_cursor())
368        ephyrFuncs.initCursor = &ephyrCursorInit;
369
370    if (serverGeneration == 1) {
371        if (!KdCardInfoLast()) {
372            processScreenArg("640x480", NULL);
373        }
374        hostx_init();
375    }
376}
377
378KdCardFuncs ephyrFuncs = {
379    ephyrCardInit,              /* cardinit */
380    ephyrScreenInitialize,      /* scrinit */
381    ephyrInitScreen,            /* initScreen */
382    ephyrFinishInitScreen,      /* finishInitScreen */
383    ephyrCreateResources,       /* createRes */
384    ephyrScreenFini,            /* scrfini */
385    ephyrCardFini,              /* cardfini */
386
387    0,                          /* initCursor */
388
389    0,                          /* initAccel */
390    0,                          /* enableAccel */
391    0,                          /* disableAccel */
392    0,                          /* finiAccel */
393
394    ephyrGetColors,             /* getColors */
395    ephyrPutColors,             /* putColors */
396
397    ephyrCloseScreen,           /* closeScreen */
398};
399