diff options
author | Reinhard Tartler <siretart@tauware.de> | 2011-10-10 18:02:52 +0200 |
---|---|---|
committer | Reinhard Tartler <siretart@tauware.de> | 2011-10-10 18:02:52 +0200 |
commit | 5b4ca0f93c44d7bbc8d6a3eebdd5c458e3a84c14 (patch) | |
tree | b6f59ec830436134aaccf47aa71a070aa2ad2992 /nx-X11/programs/Xserver/hw/nxagent/Init.c | |
parent | e29a112097fa74b520ba619eb07e2e0e0a7f2f3e (diff) | |
parent | e01b9177b41f7d27a934d41fa38d550fa0026b45 (diff) | |
download | nx-libs-5b4ca0f93c44d7bbc8d6a3eebdd5c458e3a84c14.tar.gz nx-libs-5b4ca0f93c44d7bbc8d6a3eebdd5c458e3a84c14.tar.bz2 nx-libs-5b4ca0f93c44d7bbc8d6a3eebdd5c458e3a84c14.zip |
Merge branch 'nxagent'
Diffstat (limited to 'nx-X11/programs/Xserver/hw/nxagent/Init.c')
-rw-r--r-- | nx-X11/programs/Xserver/hw/nxagent/Init.c | 518 |
1 files changed, 518 insertions, 0 deletions
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Init.c b/nx-X11/programs/Xserver/hw/nxagent/Init.c new file mode 100644 index 000000000..f4fc3c7e5 --- /dev/null +++ b/nx-X11/programs/Xserver/hw/nxagent/Init.c @@ -0,0 +1,518 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) 2001, 2011 NoMachine, http://www.nomachine.com/. */ +/* */ +/* NXAGENT, NX protocol compression and NX extensions to this software */ +/* are copyright of NoMachine. Redistribution and use of the present */ +/* software is allowed according to terms specified in the file LICENSE */ +/* which comes in the source distribution. */ +/* */ +/* Check http://www.nomachine.com/licensing.html for applicability. */ +/* */ +/* NX and NoMachine are trademarks of Medialogic S.p.A. */ +/* */ +/* All rights reserved. */ +/* */ +/**************************************************************************/ + +/* + +Copyright 1993 by Davor Matic + +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. Davor Matic makes no representations about +the suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. + +*/ + +#include <sys/types.h> +#include <unistd.h> +#include <stdarg.h> + +#include "X.h" +#include "Xproto.h" +#include "screenint.h" +#include "input.h" +#include "misc.h" +#include "scrnintstr.h" +#include "windowstr.h" +#include "servermd.h" +#include "mi.h" +#include "fontstruct.h" + +#include "Agent.h" +#include "Display.h" +#include "Screen.h" +#include "Pointer.h" +#include "Keyboard.h" +#include "Handlers.h" +#include "Init.h" +#include "Args.h" +#include "Client.h" +#include "Options.h" +#include "Drawable.h" +#include "Pixmaps.h" +#include "GCs.h" +#include "Font.h" +#include "Millis.h" +#include "Error.h" + +#include "NX.h" +#include "NXlib.h" + +/* + * Set here the required log level. + */ + +#define PANIC +#define WARNING +#undef TEST +#undef DEBUG +#undef DUMP + +#define NXAGENT_VERSION "3.5.0" + +/* + * ProcVector array defined in tables.c. + */ + +extern int (*ProcVector[256])(ClientPtr); + +/* + * From the fb code. + */ + +extern int fbGCPrivateIndex; + +/* + * Stubs for the DPMS extension. + */ + +#ifdef DPMSExtension + +void DPMSSet(int level); +int DPMSGet(int *level); +Bool DPMSSupported(void); + +#endif + +/* + * Our error logging function. + */ + +void OsVendorVErrorFFunction(const char *f, va_list args); + +/* + * True if this is a fatal error. + */ + +extern int OsVendorVErrorFFatal; + +/* + * Redirect the error output to a + * different file + */ + +extern void (*OsVendorStartRedirectErrorFProc)(); +extern void (*OsVendorEndRedirectErrorFProc)(); + +void OsVendorStartRedirectErrorFFunction(); +void OsVendorEndRedirectErrorFFunction(); + +/* + * Called by InitGlobals() in the + * new X server tree. + */ + + +static void nxagentGrabServerCallback(CallbackListPtr *callbacks, pointer data, + pointer args); + +#ifdef NXAGENT_UPGRADE + +void ddxInitGlobals(void) +{ + /* + * Install our error logging function. + */ + + OsVendorVErrorFProc = OsVendorVErrorFFunction; + + OsVendorStartRedirectErrorFProc = OsVendorStartRedirectErrorFFunction; + OsVendorEndRedirectErrorFProc = OsVendorEndRedirectErrorFFunction; +} + +#endif + +/* + * Set if the remote display supports + * backing store. + */ +/* +FIXME: These, if not removed, should at least + be moved to Display.h and Display.c. +*/ +int nxagentBackingStore; +int nxagentSaveUnder; + +/* + * This is true at startup and set to the value of + * nxagentFullGeneration at the end of InitInput. + * + * InitOutput + * nxagentOpenDisplay (if nxagentDoFullGeneration) + * nxagentCloseDisplay (if (nxagentDoFullGeneration && nxagentDisplay)) + * nxagentFree* + * nxagentListRemoteFonts + * AddScreen + * nxagentOpenScreen + * InitInput + */ + +int nxagentDoFullGeneration = 1; + +/* + * Called at X server's initialization. + */ + +void InitOutput(ScreenInfo *screenInfo, int argc, char *argv[]) +{ + char *authority; + int i; + + #ifdef __sun + + char *environment; + + #endif + + /* + * Print our pid and version information. + */ + + if (serverGeneration <= 1) + { + fprintf(stderr, "\nNXAGENT - Version " NXAGENT_VERSION "\n\n"); + fprintf(stderr, "Copyright (C) 2001, 2011 NoMachine.\n"); + fprintf(stderr, "See http://www.nomachine.com/ for more information.\n\n"); + + fprintf(stderr, "Info: Agent running with pid '%d'.\n", getpid()); + + fprintf(stderr, "Session: Starting session at '%s'.\n", GetTimeAsString()); + } + + /* + * Unset the LD_LIBRARY_PATH variable in + * Popen() before calling execl() in the + * child process. + */ + + NXUnsetLibraryPath(1); + + if (serverGeneration == 1) + { + AddCallback(&ServerGrabCallback, nxagentGrabServerCallback, NULL); + } + + if (nxagentUserDefinedFontPath == 0) + { + #ifdef TEST + fprintf(stderr, "InitOutput: Calling nxagentVerifyDefaultFontPath.\n"); + #endif + + nxagentVerifyDefaultFontPath(); + } + #ifdef TEST + else + { + fprintf(stderr, "InitOutput: User defined font path. Skipping the check on the fonts dir.\n"); + } + #endif + + if ((authority = getenv("NX_XAUTHORITY"))) + { + #ifdef __sun + + environment = malloc(15 + strlen(authority)); + + sprintf(environment, "XAUTHORITY=%s", authority); + + if (putenv(environment) < 0) + + #else + + if (setenv("XAUTHORITY", authority, True) < 0) + + #endif + + { + fprintf(stderr, "Warning: Couldn't set the XAUTHORITY environment to [%s]\n", + authority); + } + } + + nxagentInitBSPixmapList(); + + /* + * Open the display. We are at the early startup and + * the information we'll get from the remote X server + * will mandate some of the characteristics of the + * session, like the screen depth. Note that this re- + * liance on the remote display at session startup + * should be removed. We should always operate at 32 + * bpp, internally, and do the required translations + * as soon as the graphic operation needs to be real- + * ized on the remote display. + */ + + nxagentOpenDisplay(argc, argv); + +/* +FIXME: These variables, if not removed at all because have probably + become useless, should be moved to Display.h and Display.c. +*/ + nxagentBackingStore = XDoesBackingStore(DefaultScreenOfDisplay(nxagentDisplay)); + + #ifdef TEST + fprintf(stderr, "InitOutput: Remote display backing store support [%d].\n", + nxagentBackingStore); + #endif + + nxagentSaveUnder = XDoesSaveUnders(DefaultScreenOfDisplay(nxagentDisplay)); + + #ifdef TEST + fprintf(stderr, "InitOutput: Remote display save under support [%d].\n", + nxagentSaveUnder); + #endif + + /* + * Initialize the basic screen info. + */ + + nxagentSetScreenInfo(screenInfo); + + /* + * Initialize pixmap formats for this screen. + */ + + nxagentSetPixmapFormats(screenInfo); + + /* + * Get our own privates' index. + */ + + nxagentWindowPrivateIndex = AllocateWindowPrivateIndex(); + nxagentGCPrivateIndex = AllocateGCPrivateIndex(); + RT_NX_GC = CreateNewResourceType(nxagentDestroyNewGCResourceType); + nxagentFontPrivateIndex = AllocateFontPrivateIndex(); + RT_NX_FONT = CreateNewResourceType(nxagentDestroyNewFontResourceType); + nxagentClientPrivateIndex = AllocateClientPrivateIndex(); + nxagentPixmapPrivateIndex = AllocatePixmapPrivateIndex(); + RT_NX_PIXMAP = CreateNewResourceType(nxagentDestroyNewPixmapResourceType); + + RT_NX_CORR_BACKGROUND = CreateNewResourceType(nxagentDestroyCorruptedBackgroundResource); + RT_NX_CORR_WINDOW = CreateNewResourceType(nxagentDestroyCorruptedWindowResource); + RT_NX_CORR_PIXMAP = CreateNewResourceType(nxagentDestroyCorruptedPixmapResource); + + fbGCPrivateIndex = AllocateGCPrivateIndex(); + + if (nxagentNumScreens == 0) + { + nxagentNumScreens = 1; + } + + for (i = 0; i < nxagentNumScreens; i++) + { + AddScreen(nxagentOpenScreen, argc, argv); + } + + nxagentNumScreens = screenInfo->numScreens; + + /* + * Initialize the GCs used by the synchro- + * nization put images. We do it here beca- + * use we use the nxagentDefaultScreen. + */ + + nxagentAllocateGraphicContexts(); + + nxagentDoFullGeneration = nxagentFullGeneration; + + /* + * Use a solid black root window + * background. + */ + + blackRoot = TRUE; +} + +void InitInput(argc, argv) + int argc; + char *argv[]; +{ + pointer ptr, kbd; + + ptr = AddInputDevice(nxagentPointerProc, True); + kbd = AddInputDevice(nxagentKeyboardProc, True); + + RegisterPointerDevice(ptr); + RegisterKeyboardDevice(kbd); + + mieqInit(kbd, ptr); + + /* + * Add the display descriptor to the + * set of descriptors awaited by the + * dispatcher. + */ + + nxagentAddXConnection(); + + if (nxagentOption(Shadow)) + { + RegisterBlockAndWakeupHandlers(nxagentShadowBlockHandler, nxagentShadowWakeupHandler, NULL); + } + else + { + RegisterBlockAndWakeupHandlers(nxagentBlockHandler, nxagentWakeupHandler, NULL); + } + + /* + * We let the proxy flush the link on our behalf + * after having opened the display. We are now + * entering the dispatcher. From now on we'll + * flush the proxy link explicitly. + */ + + #ifdef TEST + fprintf(stderr, "InitInput: Setting the NX flush policy to deferred.\n"); + #endif + + NXSetDisplayPolicy(nxagentDisplay, NXPolicyDeferred); +} + +/* + * DDX specific abort routine. This is called + * by AbortServer() that, in turn, is called + * by FatalError(). + */ + +void AbortDDX() +{ + nxagentDoFullGeneration = True; + + nxagentCloseDisplay(); + + /* + * Do the required finalization if we + * are not going through the normal + * X server shutdown. + */ + + if ((dispatchException & DE_TERMINATE) == 0) + { + nxagentAbortDisplay(); + } +} + +/* + * Called by GiveUp(). + */ + +void ddxGiveUp() +{ + AbortDDX(); +} + +#ifdef NXAGENT_UPGRADE + +void ddxBeforeReset(void) +{ +} + +#endif + +void OsVendorInit() +{ + return; +} + +void OsVendorFatalError() +{ + /* + * Let the session terminate gracely + * from an user's standpoint. + */ + + fprintf(stderr, "Session: Aborting session at '%s'.\n", GetTimeAsString()); + + fprintf(stderr, "Session: Session aborted at '%s'.\n", GetTimeAsString()); +} + +void OsVendorVErrorFFunction(const char *f, va_list args) +{ + if (OsVendorVErrorFFatal == 0) + { + char buffer[1024]; + + vsnprintf(buffer, sizeof(buffer), f, args); + + nxagentStartRedirectToClientsLog(); + + fprintf(stderr, buffer); + + nxagentEndRedirectToClientsLog(); + } + else + { + LogVWrite(-1, f, args); + } +} + +void OsVendorStartRedirectErrorFFunction() +{ + nxagentStartRedirectToClientsLog(); +} + +void OsVendorEndRedirectErrorFFunction() +{ + nxagentEndRedirectToClientsLog(); +} + +/* this is just to get the server to link on AIX */ +#ifdef AIXV3 +int SelectWaitTime = 10000; /* usec */ +#endif + +ServerGrabInfoRec nxagentGrabServerInfo; + +static void nxagentGrabServerCallback(CallbackListPtr *callbacks, pointer data, + pointer args) +{ + ServerGrabInfoRec *grab = (ServerGrabInfoRec*)args; + + nxagentGrabServerInfo.client = grab->client; + nxagentGrabServerInfo.grabstate = grab->grabstate; +} + +#ifdef DPMSExtension + +void DPMSSet(int level) +{ +} + +int DPMSGet(int *level) +{ + return -1; +} + +Bool DPMSSupported(void) +{ + return 1; +} + +#endif |