📄 xf86vmode.c
字号:
/* $XFree86: xc/programs/Xserver/Xext/xf86vmode.c,v 3.30.2.3 1997/06/11 12:08:44 dawes Exp $ *//*Copyright (c) 1995 Kaleb S. KEITHLEYPermission is hereby granted, free of charge, to any person obtaininga copy of this software and associated documentation files (the"Software"), to deal in the Software without restriction, includingwithout limitation the rights to use, copy, modify, merge, publish,distribute, sublicense, and/or sell copies of the Software, and topermit persons to whom the Software is furnished to do so, subject tothe following conditions:The above copyright notice and this permission notice shall beincluded in all copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OFMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL Kaleb S. KEITHLEY BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OROTHER DEALINGS IN THE SOFTWARE.Except as contained in this notice, the name of Kaleb S. KEITHLEY shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorizationfrom Kaleb S. KEITHLEY*//* $XConsortium: xf86vmode.c /main/24 1996/10/26 21:56:29 kaleb $ *//* THIS IS NOT AN X CONSORTIUM STANDARD */#define NEED_REPLIES#define NEED_EVENTS#include "X.h"#include "Xproto.h"#include "misc.h"#include "dixstruct.h"#include "extnsionst.h"#include "scrnintstr.h"#include "servermd.h"#define _XF86VIDMODE_SERVER_#include "xf86vmstr.h"#include "Xfuncproto.h"#include "../hw/xfree86/common/xf86.h"#include "../hw/xfree86/common/xf86Priv.h"#include <X11/Xtrans.h>#include "../os/osdep.h"#include <X11/Xauth.h>#ifndef ESIX#ifndef Lynx#include <sys/socket.h>#else#include <socket.h>#endif#else#include <lan/socket.h>#endif#include "swaprep.h"extern int xf86ScreenIndex;extern Bool xf86VidModeEnabled;extern Bool xf86VidModeAllowNonLocal;static int vidmodeErrorBase;static void XF86VidModeResetProc(#if NeedFunctionPrototypes ExtensionEntry* /* extEntry */#endif);static DISPATCH_PROC(ProcXF86VidModeDispatch);static DISPATCH_PROC(ProcXF86VidModeGetAllModeLines);static DISPATCH_PROC(ProcXF86VidModeGetModeLine);static DISPATCH_PROC(ProcXF86VidModeGetMonitor);static DISPATCH_PROC(ProcXF86VidModeLockModeSwitch);static DISPATCH_PROC(ProcXF86VidModeAddModeLine);static DISPATCH_PROC(ProcXF86VidModeDeleteModeLine);static DISPATCH_PROC(ProcXF86VidModeModModeLine);static DISPATCH_PROC(ProcXF86VidModeValidateModeLine);static DISPATCH_PROC(ProcXF86VidModeQueryVersion);static DISPATCH_PROC(ProcXF86VidModeSwitchMode);static DISPATCH_PROC(ProcXF86VidModeSwitchToMode);static DISPATCH_PROC(ProcXF86VidModeGetViewPort);static DISPATCH_PROC(ProcXF86VidModeSetViewPort);static DISPATCH_PROC(SProcXF86VidModeDispatch);static DISPATCH_PROC(SProcXF86VidModeGetAllModeLines);static DISPATCH_PROC(SProcXF86VidModeGetModeLine);static DISPATCH_PROC(SProcXF86VidModeGetMonitor);static DISPATCH_PROC(SProcXF86VidModeLockModeSwitch);static DISPATCH_PROC(SProcXF86VidModeAddModeLine);static DISPATCH_PROC(SProcXF86VidModeDeleteModeLine);static DISPATCH_PROC(SProcXF86VidModeModModeLine);static DISPATCH_PROC(SProcXF86VidModeValidateModeLine);static DISPATCH_PROC(SProcXF86VidModeQueryVersion);static DISPATCH_PROC(SProcXF86VidModeSwitchMode);static DISPATCH_PROC(SProcXF86VidModeSwitchToMode);static DISPATCH_PROC(SProcXF86VidModeGetViewPort);static DISPATCH_PROC(SProcXF86VidModeSetViewPort);static unsigned char XF86VidModeReqCode = 0;/* The XF86VIDMODE_EVENTS code is far from complete */#ifdef XF86VIDMODE_EVENTSstatic int XF86VidModeEventBase = 0;static void SXF86VidModeNotifyEvent();#if NeedFunctionPrototypes xXF86VidModeNotifyEvent * /* from */, xXF86VidModeNotifyEvent * /* to */#endif);extern WindowPtr *WindowTable;static RESTYPE EventType; /* resource type for event masks */typedef struct _XF86VidModeEvent *XF86VidModeEventPtr;typedef struct _XF86VidModeEvent { XF86VidModeEventPtr next; ClientPtr client; ScreenPtr screen; XID resource; CARD32 mask;} XF86VidModeEventRec;static int XF86VidModeFreeEvents();typedef struct _XF86VidModeScreenPrivate { XF86VidModeEventPtr events; Bool hasWindow;} XF86VidModeScreenPrivateRec, *XF86VidModeScreenPrivatePtr; static int ScreenPrivateIndex;#define GetScreenPrivate(s) ((ScreenSaverScreenPrivatePtr)(s)->devPrivates[ScreenPrivateIndex].ptr)#define SetScreenPrivate(s,v) ((s)->devPrivates[ScreenPrivateIndex].ptr = (pointer) v);#define SetupScreen(s) ScreenSaverScreenPrivatePtr pPriv = GetScreenPrivate(s)#define New(t) ((t *) xalloc (sizeof (t)))#endifvoidXFree86VidModeExtensionInit(){ ExtensionEntry* extEntry;#ifdef XF86VIDMODE_EVENTS int i; ScreenPtr pScreen; EventType = CreateNewResourceType(XF86VidModeFreeEvents); ScreenPrivateIndex = AllocateScreenPrivateIndex (); for (i = 0; i < screenInfo.numScreens; i++) { pScreen = screenInfo.screens[i]; SetScreenPrivate (pScreen, NULL); }#endif if (#ifdef XF86VIDMODE_EVENTS EventType && ScreenPrivateIndex != -1 &&#endif (extEntry = AddExtension(XF86VIDMODENAME, XF86VidModeNumberEvents, XF86VidModeNumberErrors, ProcXF86VidModeDispatch, SProcXF86VidModeDispatch, XF86VidModeResetProc, StandardMinorOpcode))) { XF86VidModeReqCode = (unsigned char)extEntry->base; vidmodeErrorBase = extEntry->errorBase;#ifdef XF86VIDMODE_EVENTS XF86VidModeEventBase = extEntry->eventBase; EventSwapVector[XF86VidModeEventBase] = SXF86VidModeNotifyEvent;#endif }}/*ARGSUSED*/static voidXF86VidModeResetProc (extEntry) ExtensionEntry* extEntry;{}#ifdef XF86VIDMODE_EVENTSstatic voidCheckScreenPrivate (pScreen) ScreenPtr pScreen;{ SetupScreen (pScreen); if (!pPriv) return; if (!pPriv->events && !pPriv->hasWindow) { xfree (pPriv); SetScreenPrivate (pScreen, NULL); }} static XF86VidModeScreenPrivatePtrMakeScreenPrivate (pScreen) ScreenPtr pScreen;{ SetupScreen (pScreen); if (pPriv) return pPriv; pPriv = New (XF86VidModeScreenPrivateRec); if (!pPriv) return 0; pPriv->events = 0; pPriv->hasWindow = FALSE; SetScreenPrivate (pScreen, pPriv); return pPriv;}static unsigned longgetEventMask (pScreen, client) ScreenPtr pScreen; ClientPtr client;{ SetupScreen(pScreen); XF86VidModeEventPtr pEv; if (!pPriv) return 0; for (pEv = pPriv->events; pEv; pEv = pEv->next) if (pEv->client == client) return pEv->mask; return 0;}static BoolsetEventMask (pScreen, client, mask) ScreenPtr pScreen; ClientPtr client; unsigned long mask;{ SetupScreen(pScreen); XF86VidModeEventPtr pEv, *pPrev; if (getEventMask (pScreen, client) == mask) return TRUE; if (!pPriv) { pPriv = MakeScreenPrivate (pScreen); if (!pPriv) return FALSE; } for (pPrev = &pPriv->events; pEv = *pPrev; pPrev = &pEv->next) if (pEv->client == client) break; if (mask == 0) { *pPrev = pEv->next; xfree (pEv); CheckScreenPrivate (pScreen); } else { if (!pEv) { pEv = New (ScreenSaverEventRec); if (!pEv) { CheckScreenPrivate (pScreen); return FALSE; } *pPrev = pEv; pEv->next = NULL; pEv->client = client; pEv->screen = pScreen; pEv->resource = FakeClientID (client->index); } pEv->mask = mask; } return TRUE;}static intXF86VidModeFreeEvents (value, id) pointer value; XID id;{ XF86VidModeEventPtr pOld = (XF86VidModeEventPtr)value; ScreenPtr pScreen = pOld->screen; SetupScreen (pScreen); XF86VidModeEventPtr pEv, *pPrev; if (!pPriv) return TRUE; for (pPrev = &pPriv->events; pEv = *pPrev; pPrev = &pEv->next) if (pEv == pOld) break; if (!pEv) return TRUE; *pPrev = pEv->next; xfree (pEv); CheckScreenPrivate (pScreen); return TRUE;}static voidSendXF86VidModeNotify (pScreen, state, forced) ScreenPtr pScreen; int state; Bool forced;{ XF86VidModeScreenPrivatePtr pPriv; XF86VidModeEventPtr pEv; unsigned long mask; xXF86VidModeNotifyEvent ev; ClientPtr client; int kind; UpdateCurrentTimeIf (); mask = XF86VidModeNotifyMask; pScreen = screenInfo.screens[pScreen->myNum]; pPriv = GetScreenPrivate(pScreen); if (!pPriv) return; kind = XF86VidModeModeChange; for (pEv = pPriv->events; pEv; pEv = pEv->next) { client = pEv->client; if (client->clientGone) continue; if (!(pEv->mask & mask)) continue; ev.type = XF86VidModeNotify + XF86VidModeEventBase; ev.state = state; ev.sequenceNumber = client->sequence; ev.timestamp = currentTime.milliseconds; ev.root = WindowTable[pScreen->myNum]->drawable.id; ev.kind = kind; ev.forced = forced; WriteEventsToClient (client, 1, (xEvent *) &ev); }}static voidSXF86VidModeNotifyEvent (from, to) xXF86VidModeNotifyEvent *from, *to;{ to->type = from->type; to->state = from->state; cpswaps (from->sequenceNumber, to->sequenceNumber); cpswapl (from->timestamp, to->timestamp); cpswapl (from->root, to->root); to->kind = from->kind; to->forced = from->forced;}#endif static intProcXF86VidModeQueryVersion(client) register ClientPtr client;{ xXF86VidModeQueryVersionReply rep; register int n; REQUEST_SIZE_MATCH(xXF86VidModeQueryVersionReq); rep.type = X_Reply; rep.length = 0; rep.sequenceNumber = client->sequence; rep.majorVersion = XF86VIDMODE_MAJOR_VERSION; rep.minorVersion = XF86VIDMODE_MINOR_VERSION; if (client->swapped) { swaps(&rep.sequenceNumber, n); swapl(&rep.length, n); swaps(&rep.majorVersion, n); swaps(&rep.minorVersion, n); } WriteToClient(client, sizeof(xXF86VidModeQueryVersionReply), (char *)&rep); return (client->noClientException);}static intProcXF86VidModeGetModeLine(client) register ClientPtr client;{ REQUEST(xXF86VidModeGetModeLineReq); xXF86VidModeGetModeLineReply rep; register int n; ScrnInfoPtr vptr; DisplayModePtr mptr; int privsize; if (stuff->screen > screenInfo.numScreens) return BadValue; vptr = (ScrnInfoPtr) screenInfo.screens[stuff->screen]->devPrivates[xf86ScreenIndex].ptr; mptr = vptr->modes; if (!mptr->Private) privsize = 0; else privsize = mptr->PrivSize; REQUEST_SIZE_MATCH(xXF86VidModeGetModeLineReq); rep.type = X_Reply;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -