/* * Xephyr - A kdrive X server thats runs in a host X window. * Authored by Matthew Allum * * Copyright © 2004 Nokia * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Nokia not be used in * advertising or publicity pertaining to distribution of the software without * specific, written prior permission. Nokia makes no * representations about the suitability of this software for any purpose. It * is provided "as is" without express or implied warranty. * * NOKIA DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ #ifdef HAVE_CONFIG_H #include #endif #include "ephyr.h" #include "ephyrlog.h" extern Window EphyrPreExistingHostWin; extern Bool EphyrWantGrayScale; extern Bool kdHasPointer; extern Bool kdHasKbd; void processScreenArg (char *screen_size, char *parent_id) ; void InitCard (char *name) { KdCardAttr attr; EPHYR_DBG("mark"); KdCardInfoAdd (&ephyrFuncs, &attr, 0); } void InitOutput (ScreenInfo *pScreenInfo, int argc, char **argv) { KdInitOutput (pScreenInfo, argc, argv); } void InitInput (int argc, char **argv) { KdKeyboardInfo *ki; KdPointerInfo *pi; KdAddKeyboardDriver(&EphyrKeyboardDriver); #ifdef linux KdAddKeyboardDriver(&LinuxEvdevKeyboardDriver); #endif KdAddPointerDriver(&EphyrMouseDriver); #ifdef linux KdAddPointerDriver(&LinuxEvdevMouseDriver); #endif if (!kdHasKbd) { ki = KdNewKeyboard(); if (!ki) FatalError("Couldn't create Xephyr keyboard\n"); ki->driver = &EphyrKeyboardDriver; KdAddKeyboard(ki); } if (!kdHasPointer) { pi = KdNewPointer(); if (!pi) FatalError("Couldn't create Xephyr pointer\n"); pi->driver = &EphyrMouseDriver; KdAddPointer(pi); } KdInitInput(); } void ddxUseMsg (void) { KdUseMsg(); ErrorF("\nXephyr Option Usage:\n"); ErrorF("-parent Use existing window as Xephyr root win\n"); ErrorF("-host-cursor Re-use exisiting X host server cursor\n"); ErrorF("-fullscreen Attempt to run Xephyr fullscreen\n"); ErrorF("-grayscale Simulate 8bit grayscale\n"); ErrorF("-fakexa Simulate acceleration using software rendering\n"); ErrorF("-verbosity Set log verbosity level\n"); ErrorF("\n"); exit(1); } void processScreenArg (char *screen_size, char *parent_id) { KdCardInfo *card; static int card_exists; InitCard (0); /*Put each screen on a separate card*/ card = KdCardInfoLast (); if (card) { KdScreenInfo *screen; unsigned long p_id = 0; screen = KdScreenInfoAdd (card); KdParseScreen (screen, screen_size); if (parent_id) { p_id = strtol (parent_id, NULL, 0); } EPHYR_DBG ("screen number:%d\n", screen->mynum) ; hostx_add_screen (screen, p_id, screen->mynum); } else { ErrorF("No matching card found!\n"); } } int ddxProcessArgument (int argc, char **argv, int i) { EPHYR_DBG("mark argv[%d]='%s'", i, argv[i] ); if (!strcmp (argv[i], "-parent")) { if(i+1 < argc) { processScreenArg ("100x100", argv[i+1]); return 2; } UseMsg(); exit(1); } else if (!strcmp (argv[i], "-screen")) { if ((i+1) < argc) { processScreenArg (argv[i+1], NULL); return 2; } UseMsg(); exit(1); } else if (!strcmp (argv[i], "-host-cursor")) { hostx_use_host_cursor(); return 1; } else if (!strcmp (argv[i], "-fullscreen")) { hostx_use_fullscreen(); return 1; } else if (!strcmp (argv[i], "-grayscale")) { EphyrWantGrayScale = 1; return 1; } else if (!strcmp (argv[i], "-fakexa")) { ephyrFuncs.initAccel = ephyrDrawInit; ephyrFuncs.enableAccel = ephyrDrawEnable; ephyrFuncs.disableAccel = ephyrDrawDisable; ephyrFuncs.finiAccel = ephyrDrawFini; return 1; } else if (!strcmp (argv[i], "-verbosity")) { if(i+1 < argc && argv[i+1][0] != '-') { int verbosity=atoi (argv[i+1]) ; LogSetParameter (XLOG_VERBOSITY, verbosity) ; EPHYR_LOG ("set verbosiry to %d\n", verbosity) ; return 2 ; } else { UseMsg() ; exit(1) ; } } else if (argv[i][0] == ':') { hostx_set_display_name(argv[i]); } return KdProcessArgument (argc, argv, i); } void OsVendorInit (void) { EPHYR_DBG("mark"); if (hostx_want_host_cursor()) { ephyrFuncs.initCursor = &ephyrCursorInit; ephyrFuncs.enableCursor = &ephyrCursorEnable; } KdOsInit (&EphyrOsFuncs); } /* 'Fake' cursor stuff, could be improved */ static Bool ephyrRealizeCursor(ScreenPtr pScreen, CursorPtr pCursor) { return TRUE; } static Bool ephyrUnrealizeCursor(ScreenPtr pScreen, CursorPtr pCursor) { return TRUE; } static void ephyrSetCursor(ScreenPtr pScreen, CursorPtr pCursor, int x, int y) { ; } static void ephyrMoveCursor(ScreenPtr pScreen, int x, int y) { ; } miPointerSpriteFuncRec EphyrPointerSpriteFuncs = { ephyrRealizeCursor, ephyrUnrealizeCursor, ephyrSetCursor, ephyrMoveCursor, }; Bool ephyrCursorInit(ScreenPtr pScreen) { miPointerInitialize(pScreen, &EphyrPointerSpriteFuncs, &ephyrPointerScreenFuncs, FALSE); return TRUE; } void ephyrCursorEnable(ScreenPtr pScreen) { ; } KdCardFuncs ephyrFuncs = { ephyrCardInit, /* cardinit */ ephyrScreenInit, /* scrinit */ ephyrInitScreen, /* initScreen */ ephyrFinishInitScreen, /* finishInitScreen */ ephyrCreateResources, /* createRes */ ephyrPreserve, /* preserve */ ephyrEnable, /* enable */ ephyrDPMS, /* dpms */ ephyrDisable, /* disable */ ephyrRestore, /* restore */ ephyrScreenFini, /* scrfini */ ephyrCardFini, /* cardfini */ 0, /* initCursor */ 0, /* enableCursor */ 0, /* disableCursor */ 0, /* finiCursor */ 0, /* recolorCursor */ 0, /* initAccel */ 0, /* enableAccel */ 0, /* disableAccel */ 0, /* finiAccel */ ephyrGetColors, /* getColors */ ephyrPutColors, /* putColors */ };