static void AddSeatId(CallbackListPtr *pcbl, void *data, void *screen) { ScreenPtr pScreen = screen; Atom SeatAtom = MakeAtom(SEAT_ATOM_NAME, sizeof(SEAT_ATOM_NAME) - 1, TRUE); int err; err = dixChangeWindowProperty(serverClient, pScreen->root, SeatAtom, XA_STRING, 8, PropModeReplace, strlen(data) + 1, data, FALSE); if (err != Success) xf86DrvMsg(pScreen->myNum, X_WARNING, "Failed to register seat property\n"); }
static void imxOutputCreateResources(xf86OutputPtr output) { /* Access the associated screen info. */ ScrnInfoPtr pScrn = output->scrn; /* Access driver private screen data */ ImxPtr imxPtr = IMXPTR(pScrn); /* Access driver private screen display data */ ImxDisplayPtr fPtr = IMXDISPLAYPTR(imxPtr); /* Create atom for accessing EDID data */ static const char AtomNameEdid[] = "EDID"; fPtr->atomEdid = MakeAtom(AtomNameEdid, strlen(AtomNameEdid), TRUE); }
char * PsGetFontName(FontPtr pFont) { int i; int nprops = pFont->info.nprops; FontPropPtr props = pFont->info.props; Atom name = MakeAtom("FONT", 4, True); Atom value = (Atom)0; for( i=0 ; i<nprops ; i++ ) { if( props[i].name==name ) { value = props[i].value; break; } } if( !value ) return (char *)0; return NameForAtom(value); }
char * PsGetPSFontName(FontPtr pFont) { int i; int nprops = pFont->info.nprops; FontPropPtr props = pFont->info.props; Atom name = MakeAtom("_ADOBE_POSTSCRIPT_FONTNAME", 26, True); Atom value = (Atom)0; for( i=0 ; i<nprops ; i++ ) { if( props[i].name==name ) { value = props[i].value; break; } } if( !value ) return "Times-Roman"; return NameForAtom(value); }
/* * GetPropString searches the window heirarchy from pWin up looking for * a property by the name of propName. If found, returns the property's * value. If not, it returns NULL. */ char * GetPropString( WindowPtr pWin, char *propName) { Atom atom; PropertyPtr pProp = (PropertyPtr)NULL; char *retVal; atom = MakeAtom(propName, strlen(propName), FALSE); if(atom != BAD_RESOURCE) { WindowPtr pPropWin; int n; /* * The atom has been defined, but it might only exist as a * property on an unrelated window. */ for(pPropWin = pWin; pPropWin != (WindowPtr)NULL; pPropWin = pPropWin->parent) { for(pProp = (PropertyPtr)(wUserProps(pPropWin)); pProp != (PropertyPtr)NULL; pProp = pProp->next) { if (pProp->propertyName == atom) break; } if(pProp != (PropertyPtr)NULL) break; } if(pProp == (PropertyPtr)NULL) return (char *)NULL; n = (pProp->format/8) * pProp->size; /* size (bytes) of prop */ retVal = (char *)xalloc(n + 1); (void)memcpy((void *)retVal, (void *)pProp->data, n); retVal[n] = '\0'; return retVal; } return (char *)NULL; }
void XvExtensionInit(void) { ExtensionEntry *extEntry; /* LOOK TO SEE IF ANY SCREENS WERE INITIALIZED; IF NOT THEN INIT GLOBAL VARIABLES SO THE EXTENSION CAN FUNCTION */ if (XvScreenGeneration != serverGeneration) { if (!CreateResourceTypes()) { ErrorF("XvExtensionInit: Unable to allocate resource types\n"); return; } #ifdef PANORAMIX XineramaRegisterConnectionBlockCallback(XineramifyXv); #endif XvScreenGeneration = serverGeneration; } if (XvExtensionGeneration != serverGeneration) { XvExtensionGeneration = serverGeneration; extEntry = AddExtension(XvName, XvNumEvents, XvNumErrors, ProcXvDispatch, SProcXvDispatch, XvResetProc, StandardMinorOpcode); if (!extEntry) { FatalError("XvExtensionInit: AddExtensions failed\n"); } XvReqCode = extEntry->base; XvEventBase = extEntry->eventBase; XvErrorBase = extEntry->errorBase; EventSwapVector[XvEventBase+XvVideoNotify] = (EventSwapPtr)WriteSwappedVideoNotifyEvent; EventSwapVector[XvEventBase+XvPortNotify] = (EventSwapPtr)WriteSwappedPortNotifyEvent; (void)MakeAtom(XvName, strlen(XvName), xTrue); } }
static Atom InitTypedAtom(DeviceIntPtr dev, char *name, Atom type, int format, int nvalues, int *values) { int i; Atom atom; uint8_t val_8[9]; /* we never have more than 9 values in an atom */ uint16_t val_16[9]; uint32_t val_32[9]; pointer converted; for (i = 0; i < nvalues; i++) { switch (format) { case 8: val_8[i] = values[i]; break; case 16: val_16[i] = values[i]; break; case 32: val_32[i] = values[i]; break; } } switch (format) { case 8: converted = val_8; break; case 16: converted = val_16; break; case 32: default: converted = val_32; break; } atom = MakeAtom(name, strlen(name), TRUE); XIChangeDeviceProperty(dev, atom, type, format, PropModeReplace, nvalues, converted, FALSE); XISetDevicePropertyDeletable(dev, atom, FALSE); return atom; }
Bool xnestRealizeFont(ScreenPtr pScreen, FontPtr pFont) { pointer priv; Atom name_atom, value_atom; int nprops; FontPropPtr props; int i; char *name; FontSetPrivate(pFont, xnestFontPrivateIndex, NULL); if (requestingClient && XpClientIsPrintClient(requestingClient, NULL)) return True; name_atom = MakeAtom("FONT", 4, True); value_atom = 0L; nprops = pFont->info.nprops; props = pFont->info.props; for (i = 0; i < nprops; i++) if (props[i].name == name_atom) { value_atom = props[i].value; break; } if (!value_atom) return False; name = (char *)NameForAtom(value_atom); if (!name) return False; priv = (pointer)xalloc(sizeof(xnestPrivFont)); FontSetPrivate(pFont, xnestFontPrivateIndex, priv); xnestFontPriv(pFont)->font_struct = XLoadQueryFont(xnestDisplay, name); if (!xnestFontStruct(pFont)) return False; return True; }
static void cfb8_32SetupVisuals (ScreenPtr pScreen) { cfb8_32ScreenPtr pScreenPriv = CFB8_32_GET_SCREEN_PRIVATE(pScreen); char atomString[] = {"SERVER_OVERLAY_VISUALS"}; overlayVisualRec *overlayVisuals; VisualID *visuals = NULL; int numVisuals = 0; DepthPtr pDepth = pScreen->allowedDepths; int numDepths = pScreen->numDepths; int i; /* find depth 8 visuals */ for(i = 0; i < numDepths; i++, pDepth++) { if(pDepth->depth == 8) { numVisuals = pDepth->numVids; visuals = pDepth->vids; break; } } if(!numVisuals || !visuals) { ErrorF("No overlay visuals found!\n"); return; } if(!(overlayVisuals = xalloc(numVisuals * sizeof(overlayVisualRec)))) return; for(i = 0; i < numVisuals; i++) { overlayVisuals[i].overlay_visual = visuals[i]; overlayVisuals[i].transparent_type = 1; /* transparent pixel */ overlayVisuals[i].value = pScreenPriv->key; overlayVisuals[i].layer = 1; } overlayVisualsAtom = MakeAtom(atomString, sizeof(atomString) - 1, TRUE); xf86RegisterRootWindowProperty(pScreen->myNum, overlayVisualsAtom, overlayVisualsAtom, 32, numVisuals * 4, overlayVisuals); pScreenPriv->visualData = (pointer)overlayVisuals; }
static Atom _fbdevVideoGetPortAtom (FBDevPortAttrAtom paa) { int i; return_val_if_fail (paa > PAA_MIN && paa < PAA_MAX, None); for (i = 0; i < NUM_ATOMS; i++) { if (paa == atom_list[i].paa) { if (atom_list[i].atom == None) atom_list[i].atom = MakeAtom (atom_list[i].name, strlen (atom_list[i].name), TRUE); return atom_list[i].atom; } } ErrorF ("Error: Unknown Port Attribute Name!\n"); return None; }
void vncSelectionInit(void) { xaPRIMARY = MakeAtom("PRIMARY", 7, TRUE); xaCLIPBOARD = MakeAtom("CLIPBOARD", 9, TRUE); xaTARGETS = MakeAtom("TARGETS", 7, TRUE); xaTIMESTAMP = MakeAtom("TIMESTAMP", 9, TRUE); xaSTRING = MakeAtom("STRING", 6, TRUE); xaTEXT = MakeAtom("TEXT", 4, TRUE); xaUTF8_STRING = MakeAtom("UTF8_STRING", 11, TRUE); /* There are no hooks for when these are internal windows, so * override the relevant handlers. */ origProcConvertSelection = ProcVector[X_ConvertSelection]; ProcVector[X_ConvertSelection] = vncProcConvertSelection; origProcSendEvent = ProcVector[X_SendEvent]; ProcVector[X_SendEvent] = vncProcSendEvent; if (!AddCallback(&SelectionCallback, vncSelectionCallback, 0)) FatalError("Add VNC SelectionCallback failed\n"); }
static void GetWindowName (void *pWin, char **ppName) { Atom reqAtom; char atom_NET_WM_NAME[] = "_NET_WM_NAME"; /* XTextProperty xtpName; */ #if CYGMULTIWINDOW_DEBUG ErrorF ("GetWindowName\n"); #endif /* Intialize ppName to NULL */ *ppName = NULL; /* TRY with ATOM WM_NAME */ reqAtom = XA_WM_NAME; if( privateGetWindowName(pWin, ppName, reqAtom) == Success ) return; reqAtom = MakeAtom(atom_NET_WM_NAME, sizeof(atom_NET_WM_NAME) - 1, True); privateGetWindowName(pWin, ppName, reqAtom); }
static int ProcXResQueryClientResources (ClientPtr client) { REQUEST(xXResQueryClientResourcesReq); xXResQueryClientResourcesReply rep; int i, clientID, num_types; int *counts; REQUEST_SIZE_MATCH(xXResQueryClientResourcesReq); clientID = CLIENT_ID(stuff->xid); if((clientID >= currentMaxClients) || !clients[clientID]) { client->errorValue = stuff->xid; return BadValue; } counts = xcalloc(lastResourceType + 1, sizeof(int)); FindAllClientResources(clients[clientID], ResFindAllRes, counts); num_types = 0; for(i = 0; i <= lastResourceType; i++) { if(counts[i]) num_types++; } rep.type = X_Reply; rep.sequenceNumber = client->sequence; rep.num_types = num_types; rep.length = bytes_to_int32(rep.num_types * sz_xXResType); if (client->swapped) { int n; swaps (&rep.sequenceNumber, n); swapl (&rep.length, n); swapl (&rep.num_types, n); } WriteToClient (client,sizeof(xXResQueryClientResourcesReply),(char*)&rep); if(num_types) { xXResType scratch; char *name; for(i = 0; i < lastResourceType; i++) { if(!counts[i]) continue; name = (char *)LookupResourceName(i + 1); if (strcmp(name, XREGISTRY_UNKNOWN)) scratch.resource_type = MakeAtom(name, strlen(name), TRUE); else { char buf[40]; snprintf(buf, sizeof(buf), "Unregistered resource %i", i + 1); scratch.resource_type = MakeAtom(buf, strlen(buf), TRUE); } scratch.count = counts[i]; if(client->swapped) { int n; swapl (&scratch.resource_type, n); swapl (&scratch.count, n); } WriteToClient (client, sz_xXResType, (char *) &scratch); } } xfree(counts); return (client->noClientException); }
void RegisterResourceName (RESTYPE type, char *name) { ResourceNames[type & TypeMask] = MakeAtom(name, strlen(name), TRUE); }
int winProcSetSelectionOwner (ClientPtr client) { int i; DrawablePtr pDrawable; WindowPtr pWindow = None; Bool fOwnedToNotOwned = FALSE; static Window s_iOwners[CLIP_NUM_SELECTIONS] = {None}; static unsigned long s_ulServerGeneration = 0; REQUEST(xSetSelectionOwnerReq); REQUEST_SIZE_MATCH(xSetSelectionOwnerReq); #if 0 ErrorF ("winProcSetSelectionOwner - Hello.\n"); #endif /* Watch for server reset */ if (s_ulServerGeneration != serverGeneration) { /* Save new generation number */ s_ulServerGeneration = serverGeneration; /* Initialize static variables */ for (i = 0; i < CLIP_NUM_SELECTIONS; ++i) s_iOwners[i] = None; } /* Abort if clipboard not completely initialized yet */ if (!g_fClipboardStarted) { ErrorF ("winProcSetSelectionOwner - Clipboard not yet started, " "aborting.\n"); goto winProcSetSelectionOwner_Done; } /* Grab window if we have one */ if (None != stuff->window) { /* Grab the Window from the request */ int rc = dixLookupWindow(&pWindow, stuff->window, client, DixReadAccess); if (rc != Success) { ErrorF ("winProcSetSelectionOwner - Found BadWindow, aborting.\n"); goto winProcSetSelectionOwner_Done; } } /* Now we either have a valid window or None */ /* Save selection owners for monitored selections, ignore other selections */ if (XA_PRIMARY == stuff->selection) { /* Look for owned -> not owned transition */ if (None == stuff->window && None != s_iOwners[CLIP_OWN_PRIMARY]) { fOwnedToNotOwned = TRUE; #if 0 ErrorF ("winProcSetSelectionOwner - PRIMARY - Going from " "owned to not owned.\n"); #endif /* Adjust last owned selection */ if (None != s_iOwners[CLIP_OWN_CLIPBOARD]) g_atomLastOwnedSelection = MakeAtom ("CLIPBOARD", 9, TRUE); else g_atomLastOwnedSelection = None; } /* Save new selection owner or None */ s_iOwners[CLIP_OWN_PRIMARY] = stuff->window; #if 0 ErrorF ("winProcSetSelectionOwner - PRIMARY - Now owned by: %d\n", stuff->window); #endif } else if (MakeAtom ("CLIPBOARD", 9, TRUE) == stuff->selection) { /* Look for owned -> not owned transition */ if (None == stuff->window && None != s_iOwners[CLIP_OWN_CLIPBOARD]) { fOwnedToNotOwned = TRUE; #if 0 ErrorF ("winProcSetSelectionOwner - CLIPBOARD - Going from " "owned to not owned.\n"); #endif /* Adjust last owned selection */ if (None != s_iOwners[CLIP_OWN_PRIMARY]) g_atomLastOwnedSelection = XA_PRIMARY; else g_atomLastOwnedSelection = None; } /* Save new selection owner or None */ s_iOwners[CLIP_OWN_CLIPBOARD] = stuff->window; #if 0 ErrorF ("winProcSetSelectionOwner - CLIPBOARD - Now owned by: %d\n", stuff->window); #endif } else goto winProcSetSelectionOwner_Done; /* * At this point, if one of the selections is still owned by the * clipboard manager then it should be marked as unowned since * we will be taking ownership of the Win32 clipboard. */ if (g_iClipboardWindow == s_iOwners[CLIP_OWN_PRIMARY]) s_iOwners[CLIP_OWN_PRIMARY] = None; if (g_iClipboardWindow == s_iOwners[CLIP_OWN_CLIPBOARD]) s_iOwners[CLIP_OWN_CLIPBOARD] = None; /* * Handle case when selection is being disowned, * WM_DRAWCLIPBOARD did not do the disowning, * both monitored selections are no longer owned, * an owned to not owned transition was detected, * and we currently own the Win32 clipboard. */ if (None == stuff->window && g_iClipboardWindow != client->lastDrawableID && (None == s_iOwners[CLIP_OWN_PRIMARY] || g_iClipboardWindow == s_iOwners[CLIP_OWN_PRIMARY]) && (None == s_iOwners[CLIP_OWN_CLIPBOARD] || g_iClipboardWindow == s_iOwners[CLIP_OWN_CLIPBOARD]) && fOwnedToNotOwned && g_hwndClipboard != NULL && g_hwndClipboard == GetClipboardOwner ()) { #if 0 ErrorF ("winProcSetSelectionOwner - We currently own the " "clipboard and neither the PRIMARY nor the CLIPBOARD " "selections are owned, releasing ownership of Win32 " "clipboard.\n"); #endif /* Release ownership of the Windows clipboard */ OpenClipboard (NULL); EmptyClipboard (); CloseClipboard (); /* Clear X selection ownership (might still be marked as us owning) */ s_iOwners[CLIP_OWN_PRIMARY] = None; s_iOwners[CLIP_OWN_CLIPBOARD] = None; goto winProcSetSelectionOwner_Done; } /* Abort if no window at this point */ if (None == stuff->window) { #if 0 ErrorF ("winProcSetSelectionOwner - No window, returning.\n"); #endif goto winProcSetSelectionOwner_Done; } /* Abort if invalid selection */ if (!ValidAtom (stuff->selection)) { ErrorF ("winProcSetSelectionOwner - Found BadAtom, aborting.\n"); goto winProcSetSelectionOwner_Done; } /* Cast Window to Drawable */ pDrawable = (DrawablePtr) pWindow; /* Abort if clipboard manager is owning the selection */ if (pDrawable->id == g_iClipboardWindow) { #if 0 ErrorF ("winProcSetSelectionOwner - We changed ownership, " "aborting.\n"); #endif goto winProcSetSelectionOwner_Done; } /* Abort if root window is taking ownership */ if (pDrawable->id == 0) { ErrorF ("winProcSetSelectionOwner - Root window taking ownership, " "aborting\n"); goto winProcSetSelectionOwner_Done; } /* Close clipboard if we have it open already */ if (GetOpenClipboardWindow () == g_hwndClipboard) { CloseClipboard (); } /* Access the Windows clipboard */ if (!OpenClipboard (g_hwndClipboard)) { ErrorF ("winProcSetSelectionOwner - OpenClipboard () failed: %08x\n", (int) GetLastError ()); goto winProcSetSelectionOwner_Done; } /* Take ownership of the Windows clipboard */ if (!EmptyClipboard ()) { ErrorF ("winProcSetSelectionOwner - EmptyClipboard () failed: %08x\n", (int) GetLastError ()); goto winProcSetSelectionOwner_Done; } /* Advertise Unicode if we support it */ if (g_fUnicodeSupport) SetClipboardData (CF_UNICODETEXT, NULL); /* Always advertise regular text */ SetClipboardData (CF_TEXT, NULL); /* Save handle to last owned selection */ g_atomLastOwnedSelection = stuff->selection; /* Release the clipboard */ if (!CloseClipboard ()) { ErrorF ("winProcSetSelectionOwner - CloseClipboard () failed: " "%08x\n", (int) GetLastError ()); goto winProcSetSelectionOwner_Done; } winProcSetSelectionOwner_Done: return (*winProcSetSelectionOwnerOrig) (client); }
MakePredeclaredAtoms() { if (MakeAtom("PRIMARY", 7, 1) != XA_PRIMARY) AtomError(); if (MakeAtom("SECONDARY", 9, 1) != XA_SECONDARY) AtomError(); if (MakeAtom("ARC", 3, 1) != XA_ARC) AtomError(); if (MakeAtom("ATOM", 4, 1) != XA_ATOM) AtomError(); if (MakeAtom("BITMAP", 6, 1) != XA_BITMAP) AtomError(); if (MakeAtom("CARDINAL", 8, 1) != XA_CARDINAL) AtomError(); if (MakeAtom("COLORMAP", 8, 1) != XA_COLORMAP) AtomError(); if (MakeAtom("CURSOR", 6, 1) != XA_CURSOR) AtomError(); if (MakeAtom("CUT_BUFFER0", 11, 1) != XA_CUT_BUFFER0) AtomError(); if (MakeAtom("CUT_BUFFER1", 11, 1) != XA_CUT_BUFFER1) AtomError(); if (MakeAtom("CUT_BUFFER2", 11, 1) != XA_CUT_BUFFER2) AtomError(); if (MakeAtom("CUT_BUFFER3", 11, 1) != XA_CUT_BUFFER3) AtomError(); if (MakeAtom("CUT_BUFFER4", 11, 1) != XA_CUT_BUFFER4) AtomError(); if (MakeAtom("CUT_BUFFER5", 11, 1) != XA_CUT_BUFFER5) AtomError(); if (MakeAtom("CUT_BUFFER6", 11, 1) != XA_CUT_BUFFER6) AtomError(); if (MakeAtom("CUT_BUFFER7", 11, 1) != XA_CUT_BUFFER7) AtomError(); if (MakeAtom("DRAWABLE", 8, 1) != XA_DRAWABLE) AtomError(); if (MakeAtom("FONT", 4, 1) != XA_FONT) AtomError(); if (MakeAtom("INTEGER", 7, 1) != XA_INTEGER) AtomError(); if (MakeAtom("PIXMAP", 6, 1) != XA_PIXMAP) AtomError(); if (MakeAtom("POINT", 5, 1) != XA_POINT) AtomError(); if (MakeAtom("RECTANGLE", 9, 1) != XA_RECTANGLE) AtomError(); if (MakeAtom("RESOURCE_MANAGER", 16, 1) != XA_RESOURCE_MANAGER) AtomError(); if (MakeAtom("RGB_COLOR_MAP", 13, 1) != XA_RGB_COLOR_MAP) AtomError(); if (MakeAtom("RGB_BEST_MAP", 12, 1) != XA_RGB_BEST_MAP) AtomError(); if (MakeAtom("RGB_BLUE_MAP", 12, 1) != XA_RGB_BLUE_MAP) AtomError(); if (MakeAtom("RGB_DEFAULT_MAP", 15, 1) != XA_RGB_DEFAULT_MAP) AtomError(); if (MakeAtom("RGB_GRAY_MAP", 12, 1) != XA_RGB_GRAY_MAP) AtomError(); if (MakeAtom("RGB_GREEN_MAP", 13, 1) != XA_RGB_GREEN_MAP) AtomError(); if (MakeAtom("RGB_RED_MAP", 11, 1) != XA_RGB_RED_MAP) AtomError(); if (MakeAtom("STRING", 6, 1) != XA_STRING) AtomError(); if (MakeAtom("VISUALID", 8, 1) != XA_VISUALID) AtomError(); if (MakeAtom("WINDOW", 6, 1) != XA_WINDOW) AtomError(); if (MakeAtom("WM_COMMAND", 10, 1) != XA_WM_COMMAND) AtomError(); if (MakeAtom("WM_HINTS", 8, 1) != XA_WM_HINTS) AtomError(); if (MakeAtom("WM_CLIENT_MACHINE", 17, 1) != XA_WM_CLIENT_MACHINE) AtomError(); if (MakeAtom("WM_ICON_NAME", 12, 1) != XA_WM_ICON_NAME) AtomError(); if (MakeAtom("WM_ICON_SIZE", 12, 1) != XA_WM_ICON_SIZE) AtomError(); if (MakeAtom("WM_NAME", 7, 1) != XA_WM_NAME) AtomError(); if (MakeAtom("WM_NORMAL_HINTS", 15, 1) != XA_WM_NORMAL_HINTS) AtomError(); if (MakeAtom("WM_SIZE_HINTS", 13, 1) != XA_WM_SIZE_HINTS) AtomError(); if (MakeAtom("WM_ZOOM_HINTS", 13, 1) != XA_WM_ZOOM_HINTS) AtomError(); if (MakeAtom("MIN_SPACE", 9, 1) != XA_MIN_SPACE) AtomError(); if (MakeAtom("NORM_SPACE", 10, 1) != XA_NORM_SPACE) AtomError(); if (MakeAtom("MAX_SPACE", 9, 1) != XA_MAX_SPACE) AtomError(); if (MakeAtom("END_SPACE", 9, 1) != XA_END_SPACE) AtomError(); if (MakeAtom("SUPERSCRIPT_X", 13, 1) != XA_SUPERSCRIPT_X) AtomError(); if (MakeAtom("SUPERSCRIPT_Y", 13, 1) != XA_SUPERSCRIPT_Y) AtomError(); if (MakeAtom("SUBSCRIPT_X", 11, 1) != XA_SUBSCRIPT_X) AtomError(); if (MakeAtom("SUBSCRIPT_Y", 11, 1) != XA_SUBSCRIPT_Y) AtomError(); if (MakeAtom("UNDERLINE_POSITION", 18, 1) != XA_UNDERLINE_POSITION) AtomError(); if (MakeAtom("UNDERLINE_THICKNESS", 19, 1) != XA_UNDERLINE_THICKNESS) AtomError(); if (MakeAtom("STRIKEOUT_ASCENT", 16, 1) != XA_STRIKEOUT_ASCENT) AtomError(); if (MakeAtom("STRIKEOUT_DESCENT", 17, 1) != XA_STRIKEOUT_DESCENT) AtomError(); if (MakeAtom("ITALIC_ANGLE", 12, 1) != XA_ITALIC_ANGLE) AtomError(); if (MakeAtom("X_HEIGHT", 8, 1) != XA_X_HEIGHT) AtomError(); if (MakeAtom("QUAD_WIDTH", 10, 1) != XA_QUAD_WIDTH) AtomError(); if (MakeAtom("WEIGHT", 6, 1) != XA_WEIGHT) AtomError(); if (MakeAtom("POINT_SIZE", 10, 1) != XA_POINT_SIZE) AtomError(); if (MakeAtom("RESOLUTION", 10, 1) != XA_RESOLUTION) AtomError(); if (MakeAtom("COPYRIGHT", 9, 1) != XA_COPYRIGHT) AtomError(); if (MakeAtom("NOTICE", 6, 1) != XA_NOTICE) AtomError(); if (MakeAtom("FONT_NAME", 9, 1) != XA_FONT_NAME) AtomError(); if (MakeAtom("FAMILY_NAME", 11, 1) != XA_FAMILY_NAME) AtomError(); if (MakeAtom("FULL_NAME", 9, 1) != XA_FULL_NAME) AtomError(); if (MakeAtom("CAP_HEIGHT", 10, 1) != XA_CAP_HEIGHT) AtomError(); if (MakeAtom("WM_CLASS", 8, 1) != XA_WM_CLASS) AtomError(); if (MakeAtom("WM_TRANSIENT_FOR", 16, 1) != XA_WM_TRANSIENT_FOR) AtomError(); }
static Bool XkbWriteRulesProp(ClientPtr client, pointer closure) { int len,out; Atom name; char * pval; len= (XkbRulesUsed?strlen(XkbRulesUsed):0); len+= (XkbModelUsed?strlen(XkbModelUsed):0); len+= (XkbLayoutUsed?strlen(XkbLayoutUsed):0); len+= (XkbVariantUsed?strlen(XkbVariantUsed):0); len+= (XkbOptionsUsed?strlen(XkbOptionsUsed):0); if (len<1) return TRUE; len+= 5; /* trailing NULs */ name= MakeAtom(_XKB_RF_NAMES_PROP_ATOM,strlen(_XKB_RF_NAMES_PROP_ATOM),1); if (name==None) { ErrorF("[xkb] Atom error: %s not created\n",_XKB_RF_NAMES_PROP_ATOM); return TRUE; } pval= (char*) malloc(len); if (!pval) { ErrorF("[xkb] Allocation error: %s proprerty not created\n", _XKB_RF_NAMES_PROP_ATOM); return TRUE; } out= 0; if (XkbRulesUsed) { strcpy(&pval[out],XkbRulesUsed); out+= strlen(XkbRulesUsed); } pval[out++]= '\0'; if (XkbModelUsed) { strcpy(&pval[out],XkbModelUsed); out+= strlen(XkbModelUsed); } pval[out++]= '\0'; if (XkbLayoutUsed) { strcpy(&pval[out],XkbLayoutUsed); out+= strlen(XkbLayoutUsed); } pval[out++]= '\0'; if (XkbVariantUsed) { strcpy(&pval[out],XkbVariantUsed); out+= strlen(XkbVariantUsed); } pval[out++]= '\0'; if (XkbOptionsUsed) { strcpy(&pval[out],XkbOptionsUsed); out+= strlen(XkbOptionsUsed); } pval[out++]= '\0'; if (out!=len) { ErrorF("[xkb] Internal Error! bad size (%d!=%d) for _XKB_RULES_NAMES\n", out,len); } dixChangeWindowProperty(serverClient, screenInfo.screens[0]->root, name, XA_STRING, 8, PropModeReplace, len, pval, TRUE); free(pval); return TRUE; }
/** Load the font, \a pFont, on the back-end server associated with \a * pScreen. When a font is loaded, the font path on back-end server is * first initialized to that specified on the command line with the * -fontpath options, and then the font is loaded. */ Bool dmxBELoadFont(ScreenPtr pScreen, FontPtr pFont) { DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum]; dmxFontPrivPtr pFontPriv = FontGetPrivate(pFont, dmxFontPrivateIndex); const char *name; char **oldFontPath = NULL; int nOldPaths; Atom name_atom, value_atom; int i; /* Make sure we have a font private struct to work with */ if (!pFontPriv) return FALSE; /* Don't load a font over top of itself */ if (pFontPriv->font[pScreen->myNum]) { return TRUE; /* Already loaded font */ } /* Save old font path */ oldFontPath = XGetFontPath(dmxScreen->beDisplay, &nOldPaths); /* Set the font path for the font about to be loaded on the back-end */ if (dmxSetFontPath(dmxScreen)) { char **fp; int npaths; Bool *goodfps; /* This could fail only when first starting the X server and * loading the default font. If it fails here, then the default * font path is invalid, no default font path will be set, the * DMX server will fail to load the default font, and it will * exit with an error unless we remove the offending font paths * with the -ignorebadfontpaths command line option. */ fp = dmxGetFontPath(&npaths); if (!fp) { dmxLog(dmxError, "No default font path set.\n"); dmxLog(dmxError, "Please see the Xdmx man page for information on how to\n"); dmxLog(dmxError, "initialize the DMX server's default font path.\n"); XFreeFontPath(oldFontPath); return FALSE; } if (!dmxFontPath) dmxLog(dmxWarning, "No default font path is set.\n"); goodfps = xallocarray(npaths, sizeof(*goodfps)); dmxLog(dmxError, "The DMX server failed to set the following font paths on " "screen #%d:\n", pScreen->myNum); for (i = 0; i < npaths; i++) if (!(goodfps[i] = dmxCheckFontPathElement(dmxScreen, fp[i]))) dmxLog(dmxError, " %s\n", fp[i]); if (dmxIgnoreBadFontPaths) { char *newfp; int newnpaths = 0; int len = 0; int j = 0; dmxLog(dmxError, "These font paths will not be used because the " "\"-ignorebadfontpaths\"\n"); dmxLog(dmxError, "option is set.\n"); for (i = 0; i < npaths; i++) if (goodfps[i]) { len += strlen(fp[i]) + 1; newnpaths++; } if (!newnpaths) { /* No valid font paths were found */ dmxLog(dmxError, "After removing the font paths above, no valid font " "paths were\n"); dmxLog(dmxError, "available. Please check that the font paths set on " "the command\n"); dmxLog(dmxError, "line or in the configuration file via the " "\"-fontpath\" option\n"); dmxLog(dmxError, "are valid on all back-end servers. See the Xdmx man " "page for\n"); dmxLog(dmxError, "more information on font paths.\n"); dmxFreeFontPath(fp); XFreeFontPath(oldFontPath); free(goodfps); return FALSE; } newfp = xallocarray(len, sizeof(*newfp)); for (i = 0; i < npaths; i++) { if (goodfps[i]) { int n = strlen(fp[i]); newfp[j++] = n; strncpy(&newfp[j], fp[i], n); j += n; } } if (SetFontPath(serverClient, newnpaths, (unsigned char *) newfp)) { /* Note that this should never happen since all of the * FPEs were previously valid. */ dmxLog(dmxError, "Cannot reset the default font path.\n"); } } else if (dmxFontPath) { dmxLog(dmxError, "Please remove these font paths from the command line " "or\n"); dmxLog(dmxError, "configuration file, or set the \"-ignorebadfontpaths\" " "option to\n"); dmxLog(dmxError, "ignore them. For more information on these options, see " "the\n"); dmxLog(dmxError, "Xdmx man page.\n"); } else { dmxLog(dmxError, "Please specify the font paths that are available on all " "back-end\n"); dmxLog(dmxError, "servers with the \"-fontpath\" option, or use the " "\"-ignorebadfontpaths\"\n"); dmxLog(dmxError, "to ignore bad defaults. For more information on " "these and other\n"); dmxLog(dmxError, "font-path-related options, see the Xdmx man page.\n"); } free(goodfps); if (!dmxIgnoreBadFontPaths || (dmxIgnoreBadFontPaths && dmxSetFontPath(dmxScreen))) { /* We still have errors so return with error */ dmxFreeFontPath(fp); XFreeFontPath(oldFontPath); return FALSE; } } /* Find requested font on back-end server */ name_atom = MakeAtom("FONT", 4, TRUE); value_atom = 0L; for (i = 0; i < pFont->info.nprops; i++) { if ((Atom) pFont->info.props[i].name == name_atom) { value_atom = pFont->info.props[i].value; break; } } if (!value_atom) return FALSE; name = NameForAtom(value_atom); if (!name) return FALSE; pFontPriv->font[pScreen->myNum] = XLoadQueryFont(dmxScreen->beDisplay, name); /* Restore old font path */ XSetFontPath(dmxScreen->beDisplay, oldFontPath, nOldPaths); XFreeFontPath(oldFontPath); dmxSync(dmxScreen, FALSE); if (!pFontPriv->font[pScreen->myNum]) return FALSE; return TRUE; }
/* * InitOutput -- * Initialize screenInfo for all actually accessible framebuffers. * That includes vt-manager setup, querying all possible devices and * collecting the pixmap formats. */ void InitOutput(ScreenInfo *pScreenInfo, int argc, char **argv) { int i, j, k, scr_index, was_blocked = 0; char **modulelist; pointer *optionlist; Pix24Flags screenpix24, pix24; MessageType pix24From = X_DEFAULT; Bool pix24Fail = FALSE; Bool autoconfig = FALSE; GDevPtr configured_device; xf86Initialising = TRUE; if (serverGeneration == 1) { if ((xf86ServerName = strrchr(argv[0], '/')) != 0) xf86ServerName++; else xf86ServerName = argv[0]; xf86PrintBanner(); xf86PrintMarkers(); if (xf86LogFile) { time_t t; const char *ct; t = time(NULL); ct = ctime(&t); xf86MsgVerb(xf86LogFileFrom, 0, "Log file: \"%s\", Time: %s", xf86LogFile, ct); } /* Read and parse the config file */ if (!xf86DoConfigure && !xf86DoShowOptions) { switch (xf86HandleConfigFile(FALSE)) { case CONFIG_OK: break; case CONFIG_PARSE_ERROR: xf86Msg(X_ERROR, "Error parsing the config file\n"); return; case CONFIG_NOFILE: autoconfig = TRUE; break; } } InstallSignalHandlers(); /* Initialise the loader */ LoaderInit(); /* Tell the loader the default module search path */ LoaderSetPath(xf86ModulePath); if (xf86Info.ignoreABI) { LoaderSetOptions(LDR_OPT_ABI_MISMATCH_NONFATAL); } if (xf86DoShowOptions) DoShowOptions(); /* Do a general bus probe. This will be a PCI probe for x86 platforms */ xf86BusProbe(); if (xf86DoConfigure) DoConfigure(); if (autoconfig) { if (!xf86AutoConfig()) { xf86Msg(X_ERROR, "Auto configuration failed\n"); return; } } #ifdef XF86PM xf86OSPMClose = xf86OSPMOpen(); #endif /* Load all modules specified explicitly in the config file */ if ((modulelist = xf86ModulelistFromConfig(&optionlist))) { xf86LoadModules(modulelist, optionlist); free(modulelist); free(optionlist); } /* Load all driver modules specified in the config file */ /* If there aren't any specified in the config file, autoconfig them */ /* FIXME: Does not handle multiple active screen sections, but I'm not * sure if we really want to handle that case*/ configured_device = xf86ConfigLayout.screens->screen->device; if ((!configured_device) || (!configured_device->driver)) { if (!autoConfigDevice(configured_device)) { xf86Msg(X_ERROR, "Automatic driver configuration failed\n"); return ; } } if ((modulelist = xf86DriverlistFromConfig())) { xf86LoadModules(modulelist, NULL); free(modulelist); } /* Load all input driver modules specified in the config file. */ if ((modulelist = xf86InputDriverlistFromConfig())) { xf86LoadModules(modulelist, NULL); free(modulelist); } /* * It is expected that xf86AddDriver()/xf86AddInputDriver will be * called for each driver as it is loaded. Those functions save the * module pointers for drivers. * XXX Nothing keeps track of them for other modules. */ /* XXX What do we do if not all of these could be loaded? */ /* * At this point, xf86DriverList[] is all filled in with entries for * each of the drivers to try and xf86NumDrivers has the number of * drivers. If there are none, return now. */ if (xf86NumDrivers == 0) { xf86Msg(X_ERROR, "No drivers available.\n"); return; } /* * Call each of the Identify functions and call the driverFunc to check * if HW access is required. The Identify functions print out some * identifying information, and anything else that might be * needed at this early stage. */ for (i = 0; i < xf86NumDrivers; i++) { if (xf86DriverList[i]->Identify != NULL) xf86DriverList[i]->Identify(0); if (!xorgHWAccess || !xorgHWOpenConsole) { xorgHWFlags flags; if(!xf86DriverList[i]->driverFunc || !xf86DriverList[i]->driverFunc(NULL, GET_REQUIRED_HW_INTERFACES, &flags)) flags = HW_IO; if(NEED_IO_ENABLED(flags)) xorgHWAccess = TRUE; if(!(flags & HW_SKIP_CONSOLE)) xorgHWOpenConsole = TRUE; } } if (xorgHWOpenConsole) xf86OpenConsole(); else xf86Info.dontVTSwitch = TRUE; if (xf86BusConfig() == FALSE) return; xf86PostProbe(); /* * Sort the drivers to match the requested ording. Using a slow * bubble sort. */ for (j = 0; j < xf86NumScreens - 1; j++) { for (i = 0; i < xf86NumScreens - j - 1; i++) { if (xf86Screens[i + 1]->confScreen->screennum < xf86Screens[i]->confScreen->screennum) { ScrnInfoPtr tmpScrn = xf86Screens[i + 1]; xf86Screens[i + 1] = xf86Screens[i]; xf86Screens[i] = tmpScrn; } } } /* Fix up the indexes */ for (i = 0; i < xf86NumScreens; i++) { xf86Screens[i]->scrnIndex = i; } /* * Call the driver's PreInit()'s to complete initialisation for the first * generation. */ for (i = 0; i < xf86NumScreens; i++) { xf86VGAarbiterScrnInit(xf86Screens[i]); xf86VGAarbiterLock(xf86Screens[i]); if (xf86Screens[i]->PreInit && xf86Screens[i]->PreInit(xf86Screens[i], 0)) xf86Screens[i]->configured = TRUE; xf86VGAarbiterUnlock(xf86Screens[i]); } for (i = 0; i < xf86NumScreens; i++) if (!xf86Screens[i]->configured) xf86DeleteScreen(i--, 0); /* * If no screens left, return now. */ if (xf86NumScreens == 0) { xf86Msg(X_ERROR, "Screen(s) found, but none have a usable configuration.\n"); return; } for (i = 0; i < xf86NumScreens; i++) { if (xf86Screens[i]->name == NULL) { XNFasprintf(&xf86Screens[i]->name, "screen%d", i); xf86MsgVerb(X_WARNING, 0, "Screen driver %d has no name set, using `%s'.\n", i, xf86Screens[i]->name); } } /* Remove (unload) drivers that are not required */ for (i = 0; i < xf86NumDrivers; i++) if (xf86DriverList[i] && xf86DriverList[i]->refCount <= 0) xf86DeleteDriver(i); /* * At this stage we know how many screens there are. */ for (i = 0; i < xf86NumScreens; i++) xf86InitViewport(xf86Screens[i]); /* * Collect all pixmap formats and check for conflicts at the display * level. Should we die here? Or just delete the offending screens? */ screenpix24 = Pix24DontCare; for (i = 0; i < xf86NumScreens; i++) { if (xf86Screens[i]->imageByteOrder != xf86Screens[0]->imageByteOrder) FatalError("Inconsistent display bitmapBitOrder. Exiting\n"); if (xf86Screens[i]->bitmapScanlinePad != xf86Screens[0]->bitmapScanlinePad) FatalError("Inconsistent display bitmapScanlinePad. Exiting\n"); if (xf86Screens[i]->bitmapScanlineUnit != xf86Screens[0]->bitmapScanlineUnit) FatalError("Inconsistent display bitmapScanlineUnit. Exiting\n"); if (xf86Screens[i]->bitmapBitOrder != xf86Screens[0]->bitmapBitOrder) FatalError("Inconsistent display bitmapBitOrder. Exiting\n"); /* Determine the depth 24 pixmap format the screens would like */ if (xf86Screens[i]->pixmap24 != Pix24DontCare) { if (screenpix24 == Pix24DontCare) screenpix24 = xf86Screens[i]->pixmap24; else if (screenpix24 != xf86Screens[i]->pixmap24) FatalError("Inconsistent depth 24 pixmap format. Exiting\n"); } } /* check if screenpix24 is consistent with the config/cmdline */ if (xf86Info.pixmap24 != Pix24DontCare) { pix24 = xf86Info.pixmap24; pix24From = xf86Info.pix24From; if (screenpix24 != Pix24DontCare && screenpix24 != xf86Info.pixmap24) pix24Fail = TRUE; } else if (screenpix24 != Pix24DontCare) { pix24 = screenpix24; pix24From = X_PROBED; } else pix24 = Pix24Use32; if (pix24Fail) FatalError("Screen(s) can't use the required depth 24 pixmap format" " (%d). Exiting\n", PIX24TOBPP(pix24)); /* Initialise the depth 24 format */ for (j = 0; j < numFormats && formats[j].depth != 24; j++) ; formats[j].bitsPerPixel = PIX24TOBPP(pix24); /* Collect additional formats */ for (i = 0; i < xf86NumScreens; i++) { for (j = 0; j < xf86Screens[i]->numFormats; j++) { for (k = 0; ; k++) { if (k >= numFormats) { if (k >= MAXFORMATS) FatalError("Too many pixmap formats! Exiting\n"); formats[k] = xf86Screens[i]->formats[j]; numFormats++; break; } if (formats[k].depth == xf86Screens[i]->formats[j].depth) { if ((formats[k].bitsPerPixel == xf86Screens[i]->formats[j].bitsPerPixel) && (formats[k].scanlinePad == xf86Screens[i]->formats[j].scanlinePad)) break; FatalError("Inconsistent pixmap format for depth %d." " Exiting\n", formats[k].depth); } } } } formatsDone = TRUE; if (xf86Info.vtno >= 0 ) { #define VT_ATOM_NAME "XFree86_VT" Atom VTAtom=-1; CARD32 *VT = NULL; int ret; /* This memory needs to stay available until the screen has been initialized, and we can create the property for real. */ if ( (VT = malloc(sizeof(CARD32)))==NULL ) { FatalError("Unable to make VT property - out of memory. Exiting...\n"); } *VT = xf86Info.vtno; VTAtom = MakeAtom(VT_ATOM_NAME, sizeof(VT_ATOM_NAME) - 1, TRUE); for (i = 0, ret = Success; i < xf86NumScreens && ret == Success; i++) { ret = xf86RegisterRootWindowProperty(xf86Screens[i]->scrnIndex, VTAtom, XA_INTEGER, 32, 1, VT ); if (ret != Success) xf86DrvMsg(xf86Screens[i]->scrnIndex, X_WARNING, "Failed to register VT property\n"); } } if (SeatId) { Atom SeatAtom; SeatAtom = MakeAtom(SEAT_ATOM_NAME, sizeof(SEAT_ATOM_NAME) - 1, TRUE); for (i = 0; i < xf86NumScreens; i++) { int ret; ret = xf86RegisterRootWindowProperty(xf86Screens[i]->scrnIndex, SeatAtom, XA_STRING, 8, strlen(SeatId)+1, SeatId ); if (ret != Success) { xf86DrvMsg(xf86Screens[i]->scrnIndex, X_WARNING, "Failed to register seat property\n"); } } } /* If a screen uses depth 24, show what the pixmap format is */ for (i = 0; i < xf86NumScreens; i++) { if (xf86Screens[i]->depth == 24) { xf86Msg(pix24From, "Depth 24 pixmap format is %d bpp\n", PIX24TOBPP(pix24)); break; } } } else { /* * serverGeneration != 1; some OSs have to do things here, too. */ if (xorgHWOpenConsole) xf86OpenConsole(); #ifdef XF86PM /* should we reopen it here? We need to deal with an already opened device. We could leave this to the OS layer. For now we simply close it here */ if (xf86OSPMClose) xf86OSPMClose(); if ((xf86OSPMClose = xf86OSPMOpen()) != NULL) xf86MsgVerb(X_INFO, 3, "APM registered successfully\n"); #endif /* Make sure full I/O access is enabled */ if (xorgHWAccess) xf86EnableIO(); } /* * Use the previously collected parts to setup pScreenInfo */ pScreenInfo->imageByteOrder = xf86Screens[0]->imageByteOrder; pScreenInfo->bitmapScanlinePad = xf86Screens[0]->bitmapScanlinePad; pScreenInfo->bitmapScanlineUnit = xf86Screens[0]->bitmapScanlineUnit; pScreenInfo->bitmapBitOrder = xf86Screens[0]->bitmapBitOrder; pScreenInfo->numPixmapFormats = numFormats; for (i = 0; i < numFormats; i++) pScreenInfo->formats[i] = formats[i]; /* Make sure the server's VT is active */ if (serverGeneration != 1) { xf86Resetting = TRUE; /* All screens are in the same state, so just check the first */ if (!xf86Screens[0]->vtSema) { #ifdef HAS_USL_VTS ioctl(xf86Info.consoleFd, VT_RELDISP, VT_ACKACQ); #endif xf86AccessEnter(); was_blocked = xf86BlockSIGIO(); } } for (i = 0; i < xf86NumScreens; i++) if (!xf86ColormapAllocatePrivates(xf86Screens[i])) FatalError("Cannot register DDX private keys"); if (!dixRegisterPrivateKey(&xf86ScreenKeyRec, PRIVATE_SCREEN, 0) || !dixRegisterPrivateKey(&xf86CreateRootWindowKeyRec, PRIVATE_SCREEN, 0)) FatalError("Cannot register DDX private keys"); for (i = 0; i < xf86NumScreens; i++) { xf86VGAarbiterLock(xf86Screens[i]); /* * Almost everything uses these defaults, and many of those that * don't, will wrap them. */ xf86Screens[i]->EnableDisableFBAccess = xf86EnableDisableFBAccess; #ifdef XFreeXDGA xf86Screens[i]->SetDGAMode = xf86SetDGAMode; #endif xf86Screens[i]->DPMSSet = NULL; xf86Screens[i]->LoadPalette = NULL; xf86Screens[i]->SetOverscan = NULL; xf86Screens[i]->DriverFunc = NULL; xf86Screens[i]->pScreen = NULL; scr_index = AddScreen(xf86Screens[i]->ScreenInit, argc, argv); xf86VGAarbiterUnlock(xf86Screens[i]); if (scr_index == i) { /* * Hook in our ScrnInfoRec, and initialise some other pScreen * fields. */ dixSetPrivate(&screenInfo.screens[scr_index]->devPrivates, xf86ScreenKey, xf86Screens[i]); xf86Screens[i]->pScreen = screenInfo.screens[scr_index]; /* The driver should set this, but make sure it is set anyway */ xf86Screens[i]->vtSema = TRUE; } else { /* This shouldn't normally happen */ FatalError("AddScreen/ScreenInit failed for driver %d\n", i); } DebugF("InitOutput - xf86Screens[%d]->pScreen = %p\n", i, xf86Screens[i]->pScreen ); DebugF("xf86Screens[%d]->pScreen->CreateWindow = %p\n", i, xf86Screens[i]->pScreen->CreateWindow ); dixSetPrivate(&screenInfo.screens[scr_index]->devPrivates, xf86CreateRootWindowKey, xf86Screens[i]->pScreen->CreateWindow); xf86Screens[i]->pScreen->CreateWindow = xf86CreateRootWindow; if (PictureGetSubpixelOrder (xf86Screens[i]->pScreen) == SubPixelUnknown) { xf86MonPtr DDC = (xf86MonPtr)(xf86Screens[i]->monitor->DDC); PictureSetSubpixelOrder (xf86Screens[i]->pScreen, DDC ? (DDC->features.input_type ? SubPixelHorizontalRGB : SubPixelNone) : SubPixelUnknown); } #ifdef RANDR if (!xf86Info.disableRandR) xf86RandRInit (screenInfo.screens[scr_index]); xf86Msg(xf86Info.randRFrom, "RandR %s\n", xf86Info.disableRandR ? "disabled" : "enabled"); #endif } xf86VGAarbiterWrapFunctions(); xf86UnblockSIGIO(was_blocked); xf86InitOrigins(); xf86Resetting = FALSE; xf86Initialising = FALSE; RegisterBlockAndWakeupHandlers((BlockHandlerProcPtr)NoopDDA, xf86Wakeup, NULL); }
static Bool ParseAttrAccess(char *str) { AttrAccessPtr acc, last; char buf[256]; char *attr; char *vstr; char *p, *e, *v; ATOM id; Bool fail; int value; if (!str || !str[0]) { PolicyError("option '%s' require value", XVIDEO_RESTRICT_XVATTR_ACCESS); return FALSE; } strncpy(buf, str, sizeof(buf)); buf[sizeof(buf)-1] = '\0'; for (p = buf; *p != '\0'; p = e) { /* skip leading spaces, if any */ while (*p == ' ') p++; /* see what is left: ie. have we an attribute name? */ if (*(attr = p) == '\0') { PolicyError("option '%s' missing attribute name", XVIDEO_RESTRICT_XVATTR_ACCESS); return FALSE; } /* find the end of the attribute definition */ if ((e = strchr(p, ',')) == NULL) e = p + strlen(p); /* this is the last one */ else *e++ = '\0'; /* there is more to come */ /* see if we had a value definition */ if ((vstr = strchr(p, ':')) == NULL) { fail = TRUE; value = 0; } else { fail = FALSE; *vstr++ = '\0'; if (!vstr[0]) { PolicyError("option '%s' attribute '%s' invalid value ''", XVIDEO_RESTRICT_XVATTR_ACCESS, attr); return FALSE; } value = strtol(vstr, &v, 10); if (*v || v == vstr) { PolicyError("option '%s' attribute '%s' invalid value '%s'", XVIDEO_RESTRICT_XVATTR_ACCESS, attr, vstr); return FALSE; } } /* get the id */ if ((id = MakeAtom(attr, strlen(attr), TRUE)) == None) { PolicyError("option '%s' attribute '%s' invalid name", XVIDEO_RESTRICT_XVATTR_ACCESS, attr); return FALSE; } /* make a restrict entry */ for (last = (AttrAccessPtr)&AttrAccess; last->next; last = last->next){ if (id == last->next->id) { PolicyWarning("option '%s' duplicate attribute '%s'", XVIDEO_RESTRICT_XVATTR_ACCESS, attr); return FALSE; } } if ((acc = malloc(sizeof(AttrAccessRec))) == NULL) return FALSE; else { memset(acc, 0, sizeof(AttrAccessRec)); acc->id = id; acc->fail = fail; acc->value = value; last->next = acc; if (fail) { PolicyInfo("restrict access to Xv port attribute '%s' " "(fail if not allowed)", attr); } else { PolicyInfo("restrict access to Xv port attribute '%s' " "(reply with %d if not allowed)", attr, value); } } } return TRUE; }
Bool XkbWriteRulesProp(ClientPtr client, pointer closure) { int len,out; Atom name; char * pval; if (rulesDefined && (!XkbRulesFile)) return False; len= (XkbRulesFile?strlen(XkbRulesFile):strlen(XKB_DFLT_RULES_FILE)); len+= (XkbModelUsed?strlen(XkbModelUsed):0); len+= (XkbLayoutUsed?strlen(XkbLayoutUsed):0); len+= (XkbVariantUsed?strlen(XkbVariantUsed):0); len+= (XkbOptionsUsed?strlen(XkbOptionsUsed):0); if (len<1) return True; len+= 5; /* trailing NULs */ name= MakeAtom(_XKB_RF_NAMES_PROP_ATOM,strlen(_XKB_RF_NAMES_PROP_ATOM),1); if (name==None) { ErrorF("Atom error: %s not created\n",_XKB_RF_NAMES_PROP_ATOM); return True; } pval= (char*) ALLOCATE_LOCAL(len); if (!pval) { ErrorF("Allocation error: %s proprerty not created\n", _XKB_RF_NAMES_PROP_ATOM); return True; } out= 0; if (XkbRulesFile) { strcpy(&pval[out],XkbRulesFile); out+= strlen(XkbRulesFile); } else { strcpy(&pval[out],XKB_DFLT_RULES_FILE); out+= strlen(XKB_DFLT_RULES_FILE); } pval[out++]= '\0'; if (XkbModelUsed) { strcpy(&pval[out],XkbModelUsed); out+= strlen(XkbModelUsed); } pval[out++]= '\0'; if (XkbLayoutUsed) { strcpy(&pval[out],XkbLayoutUsed); out+= strlen(XkbLayoutUsed); } pval[out++]= '\0'; if (XkbVariantUsed) { strcpy(&pval[out],XkbVariantUsed); out+= strlen(XkbVariantUsed); } pval[out++]= '\0'; if (XkbOptionsUsed) { strcpy(&pval[out],XkbOptionsUsed); out+= strlen(XkbOptionsUsed); } pval[out++]= '\0'; if (out!=len) { ErrorF("Internal Error! bad size (%d!=%d) for _XKB_RULES_NAMES\n", out,len); } ChangeWindowProperty(WindowTable[0],name,XA_STRING,8,PropModeReplace, len,pval,True); DEALLOCATE_LOCAL(pval); return True; }
static void addRootWindowProperties(ScrnInfoPtr pScrn, xf86MonPtr DDC) { Atom EDID1Atom=-1, EDID2Atom=-1; CARD8 *EDID1rawdata = NULL; CARD8 *EDID2rawdata = NULL; int i, scrnIndex = pScrn->scrnIndex; Bool makeEDID1prop = FALSE; Bool makeEDID2prop = FALSE; if (DDC->ver.version == 1) { makeEDID1prop = TRUE; } else if (DDC->ver.version == 2) { int checksum1; int checksum2; makeEDID2prop = TRUE; /* Some monitors (eg Panasonic PanaSync4) * report version==2 because they used EDID v2 spec document, * although they use EDID v1 data structure :-( * * Try using checksum to determine when we have such a monitor. */ checksum2 = 0; for (i = 0; i < 256; i++) checksum2 += DDC->rawData[i]; if (checksum2 % 256) { xf86DrvMsg(scrnIndex, X_INFO, "Monitor EDID v2 checksum failed\n"); xf86DrvMsg(scrnIndex, X_INFO, "XFree86_DDC_EDID2_RAWDATA property may be bad\n"); checksum1 = 0; for (i = 0; i < 128; i++) checksum1 += DDC->rawData[i]; if (!(checksum1 % 256)) { xf86DrvMsg(scrnIndex, X_INFO, "Monitor EDID v1 checksum passed,\n"); xf86DrvMsg(scrnIndex, X_INFO, "XFree86_DDC_EDID1_RAWDATA property created\n"); makeEDID1prop = TRUE; } } } else { xf86DrvMsg(scrnIndex, X_PROBED, "unexpected EDID version %d.%d\n", DDC->ver.version, DDC->ver.revision); return; } if (makeEDID1prop) { if ((EDID1rawdata = xalloc(128*sizeof(CARD8)))==NULL) return; EDID1Atom = MakeAtom(EDID1_ATOM_NAME, sizeof(EDID1_ATOM_NAME) - 1, TRUE); memcpy(EDID1rawdata, DDC->rawData, 128); xf86RegisterRootWindowProperty(scrnIndex, EDID1Atom, XA_INTEGER, 8, 128, (unsigned char *)EDID1rawdata); } if (makeEDID2prop) { if ((EDID2rawdata = xalloc(256*sizeof(CARD8)))==NULL) return; memcpy(EDID2rawdata, DDC->rawData, 256); EDID2Atom = MakeAtom(EDID2_ATOM_NAME, sizeof(EDID2_ATOM_NAME) - 1, TRUE); xf86RegisterRootWindowProperty(scrnIndex, EDID2Atom, XA_INTEGER, 8, 256, (unsigned char *)EDID2rawdata); } }
static void drmmode_output_create_resources(xf86OutputPtr output) { drmmode_output_private_ptr drmmode_output = output->driver_private; drmModeConnectorPtr mode_output = drmmode_output->mode_output; drmmode_ptr drmmode = drmmode_output->drmmode; drmModePropertyPtr drmmode_prop; int i, j, err; drmmode_output->props = calloc(mode_output->count_props, sizeof(drmmode_prop_rec)); if (!drmmode_output->props) return; drmmode_output->num_props = 0; for (i = 0, j = 0; i < mode_output->count_props; i++) { drmmode_prop = drmModeGetProperty(drmmode->fd, mode_output->props[i]); if (drmmode_property_ignore(drmmode_prop)) { drmModeFreeProperty(drmmode_prop); continue; } drmmode_output->props[j].mode_prop = drmmode_prop; drmmode_output->props[j].value = mode_output->prop_values[i]; drmmode_output->num_props++; j++; } for (i = 0; i < drmmode_output->num_props; i++) { drmmode_prop_ptr p = &drmmode_output->props[i]; drmmode_prop = p->mode_prop; if (drmmode_prop->flags & DRM_MODE_PROP_RANGE) { INT32 range[2]; p->num_atoms = 1; p->atoms = calloc(p->num_atoms, sizeof(Atom)); if (!p->atoms) continue; p->atoms[0] = MakeAtom(drmmode_prop->name, strlen(drmmode_prop->name), TRUE); range[0] = drmmode_prop->values[0]; range[1] = drmmode_prop->values[1]; err = RRConfigureOutputProperty(output->randr_output, p->atoms[0], FALSE, TRUE, drmmode_prop->flags & DRM_MODE_PROP_IMMUTABLE ? TRUE : FALSE, 2, range); if (err != 0) { xf86DrvMsg(output->scrn->scrnIndex, X_ERROR, "RRConfigureOutputProperty error, %d\n", err); } err = RRChangeOutputProperty(output->randr_output, p->atoms[0], XA_INTEGER, 32, PropModeReplace, 1, &p->value, FALSE, TRUE); if (err != 0) { xf86DrvMsg(output->scrn->scrnIndex, X_ERROR, "RRChangeOutputProperty error, %d\n", err); } } else if (drmmode_prop->flags & DRM_MODE_PROP_ENUM) { p->num_atoms = drmmode_prop->count_enums + 1; p->atoms = calloc(p->num_atoms, sizeof(Atom)); if (!p->atoms) continue; p->atoms[0] = MakeAtom(drmmode_prop->name, strlen(drmmode_prop->name), TRUE); for (j = 1; j <= drmmode_prop->count_enums; j++) { struct drm_mode_property_enum *e = &drmmode_prop->enums[j-1]; p->atoms[j] = MakeAtom(e->name, strlen(e->name), TRUE); } err = RRConfigureOutputProperty(output->randr_output, p->atoms[0], FALSE, FALSE, drmmode_prop->flags & DRM_MODE_PROP_IMMUTABLE ? TRUE : FALSE, p->num_atoms - 1, (INT32 *)&p->atoms[1]); if (err != 0) { xf86DrvMsg(output->scrn->scrnIndex, X_ERROR, "RRConfigureOutputProperty error, %d\n", err); } for (j = 0; j < drmmode_prop->count_enums; j++) if (drmmode_prop->enums[j].value == p->value) break; /* there's always a matching value */ err = RRChangeOutputProperty(output->randr_output, p->atoms[0], XA_ATOM, 32, PropModeReplace, 1, &p->atoms[j+1], FALSE, TRUE); if (err != 0) { xf86DrvMsg(output->scrn->scrnIndex, X_ERROR, "RRChangeOutputProperty error, %d\n", err); } } } if (drmmode_output->backlight_iface) { INT32 data, backlight_range[2]; /* Set up the backlight property, which takes effect immediately * and accepts values only within the backlight_range. */ backlight_atom = MakeAtom(BACKLIGHT_NAME, sizeof(BACKLIGHT_NAME) - 1, TRUE); backlight_deprecated_atom = MakeAtom(BACKLIGHT_DEPRECATED_NAME, sizeof(BACKLIGHT_DEPRECATED_NAME) - 1, TRUE); backlight_range[0] = 0; backlight_range[1] = drmmode_output->backlight_max; err = RRConfigureOutputProperty(output->randr_output, backlight_atom, FALSE, TRUE, FALSE, 2, backlight_range); if (err != 0) { xf86DrvMsg(output->scrn->scrnIndex, X_ERROR, "RRConfigureOutputProperty error, %d\n", err); } err = RRConfigureOutputProperty(output->randr_output, backlight_deprecated_atom, FALSE, TRUE, FALSE, 2, backlight_range); if (err != 0) { xf86DrvMsg(output->scrn->scrnIndex, X_ERROR, "RRConfigureOutputProperty error, %d\n", err); } /* Set the current value of the backlight property */ data = drmmode_output->backlight_active_level; err = RRChangeOutputProperty(output->randr_output, backlight_atom, XA_INTEGER, 32, PropModeReplace, 1, &data, FALSE, TRUE); if (err != 0) { xf86DrvMsg(output->scrn->scrnIndex, X_ERROR, "RRChangeOutputProperty error, %d\n", err); } err = RRChangeOutputProperty(output->randr_output, backlight_deprecated_atom, XA_INTEGER, 32, PropModeReplace, 1, &data, FALSE, TRUE); if (err != 0) { xf86DrvMsg(output->scrn->scrnIndex, X_ERROR, "RRChangeOutputProperty error, %d\n", err); } } }
static Bool ephyrXVPrivQueryHostAdaptors(EphyrXVPriv * a_this) { EphyrHostXVAdaptor *cur_host_adaptor = NULL; EphyrHostVideoFormat *video_formats = NULL; EphyrHostEncoding *encodings = NULL; EphyrHostAttribute *attributes = NULL; EphyrHostImageFormat *image_formats = NULL; int num_video_formats = 0, base_port_id = 0, num_attributes = 0, num_formats = 0, i = 0, port_priv_offset = 0; unsigned num_encodings = 0; Bool is_ok = FALSE; EPHYR_RETURN_VAL_IF_FAIL(a_this, FALSE); EPHYR_LOG("enter\n"); if (!ephyrHostXVQueryAdaptors(&a_this->host_adaptors)) { EPHYR_LOG_ERROR("failed to query host adaptors\n"); goto out; } if (a_this->host_adaptors) a_this->num_adaptors = ephyrHostXVAdaptorArrayGetSize(a_this->host_adaptors); if (a_this->num_adaptors < 0) { EPHYR_LOG_ERROR("failed to get number of host adaptors\n"); goto out; } EPHYR_LOG("host has %d adaptors\n", a_this->num_adaptors); /* * copy what we can from adaptors into a_this->adaptors */ if (a_this->num_adaptors) { a_this->adaptors = calloc(a_this->num_adaptors, sizeof(KdVideoAdaptorRec)); if (!a_this->adaptors) { EPHYR_LOG_ERROR("failed to create internal adaptors\n"); goto out; } } for (i = 0; i < a_this->num_adaptors; i++) { int j = 0; cur_host_adaptor = ephyrHostXVAdaptorArrayAt(a_this->host_adaptors, i); if (!cur_host_adaptor) continue; a_this->adaptors[i].nPorts = ephyrHostXVAdaptorGetNbPorts(cur_host_adaptor); if (a_this->adaptors[i].nPorts <= 0) { EPHYR_LOG_ERROR("Could not find any port of adaptor %d\n", i); continue; } a_this->adaptors[i].type = ephyrHostXVAdaptorGetType(cur_host_adaptor); a_this->adaptors[i].type |= XvWindowMask; a_this->adaptors[i].flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT; if (ephyrHostXVAdaptorGetName(cur_host_adaptor)) a_this->adaptors[i].name = strdup(ephyrHostXVAdaptorGetName(cur_host_adaptor)); else a_this->adaptors[i].name = strdup("Xephyr Video Overlay"); base_port_id = ephyrHostXVAdaptorGetFirstPortID(cur_host_adaptor); if (base_port_id < 0) { EPHYR_LOG_ERROR("failed to get port id for adaptor %d\n", i); continue; } if (!s_base_port_id) s_base_port_id = base_port_id; if (!ephyrHostXVQueryEncodings(base_port_id, &encodings, &num_encodings)) { EPHYR_LOG_ERROR("failed to get encodings for port port id %d," " adaptors %d\n", base_port_id, i); continue; } a_this->adaptors[i].nEncodings = num_encodings; a_this->adaptors[i].pEncodings = videoEncodingDup(encodings, num_encodings); video_formats = (EphyrHostVideoFormat *) ephyrHostXVAdaptorGetVideoFormats(cur_host_adaptor, &num_video_formats); a_this->adaptors[i].pFormats = (KdVideoFormatPtr) video_formats; a_this->adaptors[i].nFormats = num_video_formats; /* got a_this->adaptors[i].nPorts already a_this->adaptors[i].nPorts = ephyrHostXVAdaptorGetNbPorts (cur_host_adaptor) ; */ a_this->adaptors[i].pPortPrivates = calloc(a_this->adaptors[i].nPorts, sizeof(DevUnion) + sizeof(EphyrPortPriv)); port_priv_offset = a_this->adaptors[i].nPorts; for (j = 0; j < a_this->adaptors[i].nPorts; j++) { EphyrPortPriv *port_privs_base = (EphyrPortPriv *) &a_this->adaptors[i]. pPortPrivates[port_priv_offset]; EphyrPortPriv *port_priv = &port_privs_base[j]; port_priv->port_number = base_port_id + j; port_priv->current_adaptor = &a_this->adaptors[i]; port_priv->xv_priv = a_this; a_this->adaptors[i].pPortPrivates[j].ptr = port_priv; } if (!ephyrHostXVQueryPortAttributes(base_port_id, &attributes, &num_attributes)) { EPHYR_LOG_ERROR("failed to get port attribute " "for adaptor %d\n", i); continue; } a_this->adaptors[i].pAttributes = portAttributesDup(attributes, num_attributes); a_this->adaptors[i].nAttributes = num_attributes; /*make sure atoms of attrs names are created in xephyr */ for (j = 0; j < a_this->adaptors[i].nAttributes; j++) { if (a_this->adaptors[i].pAttributes[j].name) MakeAtom(a_this->adaptors[i].pAttributes[j].name, strlen(a_this->adaptors[i].pAttributes[j].name), TRUE); } if (!ephyrHostXVQueryImageFormats(base_port_id, &image_formats, &num_formats)) { EPHYR_LOG_ERROR("failed to get image formats " "for adaptor %d\n", i); continue; } a_this->adaptors[i].pImages = (KdImagePtr) image_formats; a_this->adaptors[i].nImages = num_formats; } is_ok = TRUE; out: if (encodings) { ephyrHostEncodingsDelete(encodings, num_encodings); encodings = NULL; } if (attributes) { ephyrHostAttributesDelete(attributes); attributes = NULL; } EPHYR_LOG("leave\n"); return is_ok; }
void mprops_init(struct MConfig* cfg, InputInfoPtr local) { int ivals[MAX_INT_VALUES]; float fvals[MAX_FLOAT_VALUES]; mprops.float_type = XIGetKnownProperty(XATOM_FLOAT); if (!mprops.float_type) { mprops.float_type = MakeAtom(XATOM_FLOAT, strlen(XATOM_FLOAT), TRUE); if (!mprops.float_type) { xf86Msg(X_ERROR, "mtrack: %s: Failed to init float atom. Property support is disabled.\n", local->name); return; } } ivals[0] = cfg->trackpad_disable; mprops.trackpad_disable = atom_init_integer(local->dev, MTRACK_PROP_TRACKPAD_DISABLE, 1, ivals, 8); fvals[0] = (float)cfg->sensitivity; mprops.sensitivity = atom_init_float(local->dev, MTRACK_PROP_SENSITIVITY, 1, fvals, mprops.float_type); ivals[0] = cfg->touch_down; ivals[1] = cfg->touch_up; mprops.pressure = atom_init_integer(local->dev, MTRACK_PROP_PRESSURE, 2, ivals, 8); ivals[0] = cfg->button_enable; ivals[1] = cfg->button_integrated; mprops.button_settings = atom_init_integer(local->dev, MTRACK_PROP_BUTTON_SETTINGS, 2, ivals, 8); ivals[0] = cfg->button_zones; ivals[1] = cfg->button_move; ivals[2] = cfg->button_expire; mprops.button_emulate_settings = atom_init_integer(local->dev, MTRACK_PROP_BUTTON_EMULATE_SETTINGS, 3, ivals, 16); ivals[0] = cfg->button_1touch; ivals[1] = cfg->button_2touch; ivals[2] = cfg->button_3touch; mprops.button_emulate_values = atom_init_integer(local->dev, MTRACK_PROP_BUTTON_EMULATE_VALUES, 3, ivals, 8); ivals[0] = cfg->tap_hold; ivals[1] = cfg->tap_timeout; ivals[2] = cfg->tap_dist; mprops.tap_settings = atom_init_integer(local->dev, MTRACK_PROP_TAP_SETTINGS, 3, ivals, 32); ivals[0] = cfg->tap_1touch; ivals[1] = cfg->tap_2touch; ivals[2] = cfg->tap_3touch; ivals[3] = cfg->tap_4touch; mprops.tap_emulate = atom_init_integer(local->dev, MTRACK_PROP_TAP_EMULATE, 4, ivals, 8); ivals[0] = cfg->single_finger; mprops.single_finger = atom_init_integer(local->dev, MTRACK_PROP_SINGLE_FINGER, 1, ivals, 8); ivals[0] = cfg->ignore_thumb; ivals[1] = cfg->disable_on_thumb; mprops.thumb_detect = atom_init_integer(local->dev, MTRACK_PROP_THUMB_DETECT, 2, ivals, 8); ivals[0] = cfg->thumb_size; ivals[1] = cfg->thumb_ratio; mprops.thumb_size = atom_init_integer(local->dev, MTRACK_PROP_THUMB_SIZE, 2, ivals, 32); ivals[0] = cfg->ignore_palm; ivals[1] = cfg->disable_on_palm; mprops.palm_detect = atom_init_integer(local->dev, MTRACK_PROP_PALM_DETECT, 2, ivals, 8); ivals[0] = cfg->palm_size; mprops.palm_size = atom_init_integer(local->dev, MTRACK_PROP_PALM_SIZE, 1, ivals, 32); ivals[0] = cfg->gesture_hold; ivals[1] = cfg->gesture_wait; mprops.gesture_settings = atom_init_integer(local->dev, MTRACK_PROP_GESTURE_SETTINGS, 2, ivals, 16); ivals[0] = cfg->scroll_dist; mprops.scroll_dist = atom_init_integer(local->dev, MTRACK_PROP_SCROLL_DIST, 1, ivals, 32); ivals[0] = cfg->scroll_up_btn; ivals[1] = cfg->scroll_dn_btn; ivals[2] = cfg->scroll_lt_btn; ivals[3] = cfg->scroll_rt_btn; mprops.scroll_buttons = atom_init_integer(local->dev, MTRACK_PROP_SCROLL_BUTTONS, 4, ivals, 8); ivals[0] = cfg->swipe_dist; mprops.swipe_dist = atom_init_integer(local->dev, MTRACK_PROP_SWIPE_DIST, 1, ivals, 32); ivals[0] = cfg->swipe_up_btn; ivals[1] = cfg->swipe_dn_btn; ivals[2] = cfg->swipe_lt_btn; ivals[3] = cfg->swipe_rt_btn; mprops.swipe_buttons = atom_init_integer(local->dev, MTRACK_PROP_SWIPE_BUTTONS, 4, ivals, 8); ivals[0] = cfg->swipe4_dist; mprops.swipe4_dist = atom_init_integer(local->dev, MTRACK_PROP_SWIPE4_DIST, 1, ivals, 32); ivals[0] = cfg->swipe4_up_btn; ivals[1] = cfg->swipe4_dn_btn; ivals[2] = cfg->swipe4_lt_btn; ivals[3] = cfg->swipe4_rt_btn; mprops.swipe4_buttons = atom_init_integer(local->dev, MTRACK_PROP_SWIPE4_BUTTONS, 4, ivals, 8); ivals[0] = cfg->scale_dist; mprops.scale_dist = atom_init_integer(local->dev, MTRACK_PROP_SCALE_DIST, 1, ivals, 32); ivals[0] = cfg->scale_up_btn; ivals[1] = cfg->scale_dn_btn; mprops.scale_buttons = atom_init_integer(local->dev, MTRACK_PROP_SCALE_BUTTONS, 2, ivals, 8); ivals[0] = cfg->rotate_dist; mprops.rotate_dist = atom_init_integer(local->dev, MTRACK_PROP_ROTATE_DIST, 1, ivals, 32); ivals[0] = cfg->rotate_lt_btn; ivals[1] = cfg->rotate_rt_btn; mprops.rotate_buttons = atom_init_integer(local->dev, MTRACK_PROP_ROTATE_BUTTONS, 2, ivals, 8); ivals[0] = cfg->drag_enable; ivals[1] = cfg->drag_timeout; ivals[2] = cfg->drag_wait; ivals[3] = cfg->drag_dist; mprops.drag_settings = atom_init_integer(local->dev, MTRACK_PROP_DRAG_SETTINGS, 4, ivals, 32); ivals[0] = cfg->axis_x_invert; ivals[1] = cfg->axis_y_invert; mprops.axis_invert = atom_init_integer(local->dev, MTRACK_PROP_AXIS_INVERT, 2, ivals, 8); }
Atom atom_init_float(DeviceIntPtr dev, char* name, int nvalues, float* values, Atom float_type) { Atom atom = MakeAtom(name, strlen(name), TRUE); XIChangeDeviceProperty(dev, atom, float_type, 32, PropModeReplace, nvalues, values, FALSE); XISetDevicePropertyDeletable(dev, atom, FALSE); return atom; }