/****************************** Module Header ******************************\ * Module Name: sysmet.c * * Copyright (c) 1985 - 1999, Microsoft Corporation * * System metrics APIs and support routines. * * History: * 24-Sep-1990 DarrinM Generated stubs. * 12-Feb-1991 JimA Added access checks \***************************************************************************/ #include "precomp.h" #pragma hdrstop /***************************************************************************\ * _SwapMouseButton (API) * * History: * 24-Sep-1990 DarrinM Generated stubs. * 25-Jan-1991 DavidPe Did the real thing. * 12-Feb-1991 JimA Added access check \***************************************************************************/ BOOL APIENTRY _SwapMouseButton( BOOL fSwapButtons) { BOOL fSwapOld; PPROCESSINFO ppiCurrent = PpiCurrent(); /* * Blow it off if the caller doesn't have the proper access rights */ RETURN_IF_ACCESS_DENIED(ppiCurrent->amwinsta, WINSTA_READATTRIBUTES | WINSTA_WRITEATTRIBUTES, FALSE); if (!(ppiCurrent->W32PF_Flags & W32PF_IOWINSTA)) { RIPERR0(ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION, RIP_WARNING, "SwapMouseButton invalid on a non-interactive WindowStation."); return FALSE; } fSwapOld = SYSMET(SWAPBUTTON); SYSMET(SWAPBUTTON) = fSwapButtons; /* * Give xxxButtonEvent a hint that a mouse button event may have to be * left/right swapped to correspond with our current async key state. * Toggle the global since an even number of SwapMouseButtons has no effect. */ if (fSwapButtons != fSwapOld) { gbMouseButtonsRecentlySwapped = !gbMouseButtonsRecentlySwapped; } /* * Return previous state */ return fSwapOld; } /***************************************************************************\ * _SetDoubleClickTime (API) * * History: * 24-Sep-1990 DarrinM Generated stubs. * 25-Jan-1991 DavidPe Did the real thing. * 12-Feb-1991 JimA Added access check * 16-May-1991 MikeKe Changed to return BOOL \***************************************************************************/ BOOL APIENTRY _SetDoubleClickTime( UINT dtTime) { PWINDOWSTATION pwinsta = PpiCurrent()->rpwinsta; /* * Blow it off if the caller doesn't have the proper access rights */ if (!CheckWinstaWriteAttributesAccess()) { return FALSE; } if (!dtTime) { dtTime = 500; } else if (dtTime > 5000) { dtTime = 5000; } gdtDblClk = dtTime; gpsi->dtLBSearch = dtTime * 4; // dtLBSearch = 4 * gdtDblClk gpsi->dtScroll = gpsi->dtLBSearch / 5; // dtScroll = 4/5 * gdtDblClk /* * This value should be set through SPI_SETMENUSHOWDELAY * gdtMNDropDown = gpsi->dtScroll; // gdtMNDropDown = 4/5 * gdtDblClk */ /* * Recalculate delays for tooltip windows on all desktops. */ if (pwinsta != NULL) { PDESKTOP pdesk; for (pdesk = pwinsta->rpdeskList; pdesk; pdesk = pdesk->rpdeskNext) { InitTooltipDelay((PTOOLTIPWND)pdesk->spwndTooltip); } } return TRUE; } /***************************************************************************\ * SetSysColor() * * Changes the value of a system color, and updates the brush. Tries to * recover in case of an error. * * History: \***************************************************************************/ VOID SetSysColor( UINT icol, DWORD rgb, UINT uOptions ) { gpsi->argbSystemUnmatched[icol] = rgb; if ((uOptions & SSCF_SETMAGICCOLORS) && gpDispInfo->fAnyPalette) { union { DWORD rgb; PALETTEENTRY pe; } peMagic; peMagic.rgb = rgb; /* * when any of the 3D colors are changing, call GDI to * set the apropiate "magic" color * * the four magic colors are reserved like so * * 8 - UI color (3D shadow) * 9 - UI color (3D face) * * F6 - UI color (3D hilight) * F7 - UI color (desktop) * * NOTE (3D hilight) inverts to (3D shadow) * (3D face) inverts to sys gray * */ switch (icol) { case COLOR_3DSHADOW: GreSetMagicColors(gpDispInfo->hdcScreen, peMagic.pe, 8); break; case COLOR_3DFACE: GreSetMagicColors(gpDispInfo->hdcScreen, peMagic.pe, 9); break; case COLOR_3DHILIGHT: GreSetMagicColors(gpDispInfo->hdcScreen, peMagic.pe, 246); break; case COLOR_DESKTOP: GreSetMagicColors(gpDispInfo->hdcScreen, peMagic.pe, 247); break; } } if (uOptions & SSCF_16COLORS) { /* * Force solid colors for all elements in 16 color or less modes. */ rgb = GreGetNearestColor(gpDispInfo->hdcScreen, rgb); } else if (uOptions & SSCF_FORCESOLIDCOLOR) { /* * Force solid colors for certain window elements. */ switch (icol) { /* * These can be dithers */ case COLOR_DESKTOP: case COLOR_ACTIVEBORDER: case COLOR_INACTIVEBORDER: case COLOR_APPWORKSPACE: case COLOR_INFOBK: case COLOR_GRADIENTACTIVECAPTION: case COLOR_GRADIENTINACTIVECAPTION: break; default: rgb = GreGetNearestColor(gpDispInfo->hdcScreen, rgb); break; } } gpsi->argbSystem[icol] = rgb; if (SYSHBRUSH(icol) == NULL) { /* * This is the first time we're setting up the system colors. * We need to create the brush */ SYSHBRUSH(icol) = GreCreateSolidBrush(rgb); GreMarkUndeletableBrush(SYSHBRUSH(icol)); GreSetBrushOwnerPublic(SYSHBRUSH(icol)); GreSetBrushGlobal(SYSHBRUSH(icol)); } else { GreSetSolidBrush(SYSHBRUSH(icol), rgb); } } /***************************************************************************\ * xxxSetSysColors (API) * * * History: * 12-Feb-1991 JimA Created stub and added access check * 22-Apr-1991 DarrinM Ported from Win 3.1 sources. * 16-May-1991 MikeKe Changed to return BOOL \***************************************************************************/ BOOL APIENTRY xxxSetSysColors(PUNICODE_STRING pProfileUserName, int cicol, PUINT picolor, COLORREF *prgb, UINT uOptions ) { int i; UINT icol; COLORREF rgb; /* * Blow it off if the caller doesn't have the proper access rights */ if ((uOptions & SSCF_NOTIFY) && !CheckWinstaWriteAttributesAccess()) { return FALSE; } if (GreGetDeviceCaps(gpDispInfo->hdcScreen, NUMCOLORS) <= 16) { uOptions |= SSCF_16COLORS; } if (uOptions & SSCF_SETMAGICCOLORS) { /* * Set the Magic colors first */ for(i = 0; i < cicol; i++) { icol = picolor[i]; rgb = prgb[i]; if ( icol == COLOR_3DFACE || icol == COLOR_3DSHADOW || icol == COLOR_3DHILIGHT || icol == COLOR_DESKTOP) { SetSysColor(icol, rgb, uOptions); } } } for (i = 0; i < cicol; i++) { icol = *picolor++; rgb = *prgb++; if (icol >= COLOR_MAX) continue; if ((uOptions & SSCF_SETMAGICCOLORS) && (icol == COLOR_3DFACE || icol == COLOR_3DSHADOW || icol == COLOR_3DHIGHLIGHT || icol == COLOR_DESKTOP)) { continue; } SetSysColor(icol, rgb, uOptions); } if (uOptions & SSCF_NOTIFY) { /* * Recolor all the current desktop */ RecolorDeskPattern(); /* * Render the system bitmaps in new colors before we broadcast */ xxxSetWindowNCMetrics(pProfileUserName,NULL, FALSE, -1); /* * Notify everyone that the colors have changed. */ xxxSendNotifyMessage(PWND_BROADCAST, WM_SYSCOLORCHANGE, 0, 0L); /* * Just redraw the entire screen. Trying to just draw the parts * that were changed isn't worth it, since Control Panel always * resets every color anyway. * * Anyway, it could get messy, sending apps NCPAINT messages without * accumulating update regions too. */ xxxRedrawScreen(); } return TRUE; }