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