346 lines
7.7 KiB
C
346 lines
7.7 KiB
C
/*
|
|
* Xephyr - A kdrive X server thats runs in a host X window.
|
|
* Authored by Matthew Allum <mallum@o-hand.com>
|
|
*
|
|
* 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 <kdrive-config.h>
|
|
#endif
|
|
#include "ephyr.h"
|
|
#include "ephyrlog.h"
|
|
|
|
extern Window EphyrPreExistingHostWin;
|
|
extern Bool EphyrWantGrayScale;
|
|
extern Bool kdHasPointer;
|
|
extern Bool kdHasKbd;
|
|
|
|
#ifdef GLXEXT
|
|
extern Bool ephyrNoDRI;
|
|
extern Bool noGlxVisualInit;
|
|
#endif
|
|
extern Bool ephyrNoXV;
|
|
|
|
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 <XID> 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 <level> Set log verbosity level\n");
|
|
#ifdef GLXEXT
|
|
ErrorF("-nodri do not use DRI\n");
|
|
#endif
|
|
ErrorF("-noxv do not use XV\n");
|
|
ErrorF("-name [name] define the name in the WM_CLASS property\n");
|
|
ErrorF("\n");
|
|
|
|
exit(1);
|
|
}
|
|
|
|
void
|
|
processScreenArg (char *screen_size, char *parent_id)
|
|
{
|
|
KdCardInfo *card;
|
|
|
|
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 (i == 1)
|
|
{
|
|
hostx_use_resname(basename(argv[0]), 0);
|
|
}
|
|
|
|
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) ;
|
|
}
|
|
}
|
|
#ifdef GLXEXT
|
|
else if (!strcmp (argv[i], "-nodri"))
|
|
{
|
|
noGlxVisualInit = FALSE ;
|
|
ephyrNoDRI = TRUE ;
|
|
EPHYR_LOG ("no direct rendering enabled\n") ;
|
|
return 1 ;
|
|
}
|
|
#endif
|
|
else if (!strcmp (argv[i], "-noxv"))
|
|
{
|
|
ephyrNoXV = TRUE ;
|
|
EPHYR_LOG ("no XVideo enabled\n") ;
|
|
return 1 ;
|
|
}
|
|
else if (!strcmp (argv[i], "-name"))
|
|
{
|
|
if (i+1 < argc && argv[i+1][0] != '-')
|
|
{
|
|
hostx_use_resname(argv[i+1], 1);
|
|
return 2;
|
|
}
|
|
else
|
|
{
|
|
UseMsg();
|
|
return 0;
|
|
}
|
|
}
|
|
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 */
|
|
};
|