void raaUtilities::regDeleteEntry(std::string sKey) { std::string sTarget, sEntry; int i=0; if(sKey.find('\\')!=sKey.length()) { i=sKey.find_last_of('\\'); sTarget=sKey.substr(0, i); sEntry=sKey.substr(i+1, 0); } else { sEntry=sKey; sTarget=""; } HKEY hKey; if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, ansiToUnicode(sTarget),0,KEY_ALL_ACCESS,&hKey)==ERROR_SUCCESS) { RegDeleteKey(hKey, ansiToUnicode(sEntry)); RegCloseKey(hKey); } }
void Win32TaskbarManager::addRecent(const Common::String &name, const Common::String &description) { //warning("[Win32TaskbarManager::addRecent] Adding recent list entry: %s (%s)", name.c_str(), description.c_str()); if (_taskbar == NULL) return; // ANSI version doesn't seem to work correctly with Win7 jump lists, so explicitly use Unicode interface. IShellLinkW *link; // Get the ScummVM executable path. WCHAR path[MAX_PATH]; GetModuleFileNameW(NULL, path, MAX_PATH); // Create a shell link. if (SUCCEEDED(CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC, IID_IShellLinkW, reinterpret_cast<void **> (&link)))) { // Convert game name and description to Unicode. LPWSTR game = ansiToUnicode(name.c_str()); LPWSTR desc = ansiToUnicode(description.c_str()); // Set link properties. link->SetPath(path); link->SetArguments(game); Common::String iconPath = getIconPath(name); if (iconPath.empty()) { link->SetIconLocation(path, 0); // No game-specific icon available } else { LPWSTR icon = ansiToUnicode(iconPath.c_str()); link->SetIconLocation(icon, 0); delete[] icon; } // The link's display name must be set via property store. IPropertyStore* propStore; HRESULT hr = link->QueryInterface(IID_IPropertyStore, reinterpret_cast<void **> (&(propStore))); if (SUCCEEDED(hr)) { PROPVARIANT pv; pv.vt = VT_LPWSTR; pv.pwszVal = desc; hr = propStore->SetValue(PKEY_Title, pv); propStore->Commit(); propStore->Release(); } // SHAddToRecentDocs will cause the games to be added to the Recent list, allowing the user to pin them. SHAddToRecentDocs(SHARD_LINK, link); link->Release(); delete[] game; delete[] desc; } }
void Win32TaskbarManager::setOverlayIcon(const Common::String &name, const Common::String &description) { //warning("[Win32TaskbarManager::setOverlayIcon] Setting overlay icon to: %s (%s)", name.c_str(), description.c_str()); if (_taskbar == NULL) return; if (name.empty()) { _taskbar->SetOverlayIcon(getHwnd(), NULL, L""); return; } // Compute full icon path Common::String path = getIconPath(name); if (path.empty()) return; HICON pIcon = (HICON)::LoadImage(NULL, path.c_str(), IMAGE_ICON, 16, 16, LR_LOADFROMFILE); if (!pIcon) { warning("[Win32TaskbarManager::setOverlayIcon] Cannot load icon!"); return; } // Sets the overlay icon LPWSTR desc = ansiToUnicode(description.c_str()); _taskbar->SetOverlayIcon(getHwnd(), pIcon, desc); DestroyIcon(pIcon); delete[] desc; }
bool raaUtilities::regExists(std::string sKey) { HKEY hKey; DWORD dwType=REG_SZ, dwSize=1024*sizeof(char); if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, ansiToUnicode(sKey),0,KEY_READ,&hKey)==ERROR_SUCCESS) { if(hKey) RegCloseKey(hKey); return true; } return false; }
void* raaUtilities::getLibrary(std::string sPath, std::string sName) { std::string sFullName; if(sPath.length()) sFullName = sPath + "\\" + sName; else sFullName = sName; #ifdef _DEBUG sFullName += "D.dll"; #else sFullName += "R.dll"; #endif return ::LoadLibrary(ansiToUnicode(sFullName)); }
void Win32TaskbarManager::setCount(int count) { if (_taskbar == NULL) return; if (count == 0) { _taskbar->SetOverlayIcon(getHwnd(), NULL, L""); return; } // FIXME: This isn't really nice and could use a cleanup. // The only good thing is that it doesn't use GDI+ // and thus does not have a dependancy on it, // with the downside of being a lot more ugly. // Maybe replace it by a Graphic::Surface, use // ScummVM font drawing and extract the contents at // the end? if (_count != count || _icon == NULL) { // Cleanup previous icon _count = count; if (_icon) DestroyIcon(_icon); Common::String countString = (count < 100 ? Common::String::format("%d", count) : "9+"); // Create transparent background BITMAPV5HEADER bi; ZeroMemory(&bi, sizeof(BITMAPV5HEADER)); bi.bV5Size = sizeof(BITMAPV5HEADER); bi.bV5Width = 16; bi.bV5Height = 16; bi.bV5Planes = 1; bi.bV5BitCount = 32; bi.bV5Compression = BI_RGB; // Set 32 BPP alpha format bi.bV5RedMask = 0x00FF0000; bi.bV5GreenMask = 0x0000FF00; bi.bV5BlueMask = 0x000000FF; bi.bV5AlphaMask = 0xFF000000; // Get DC HDC hdc; hdc = GetDC(NULL); HDC hMemDC = CreateCompatibleDC(hdc); ReleaseDC(NULL, hdc); // Create a bitmap mask HBITMAP hBitmapMask = CreateBitmap(16, 16, 1, 1, NULL); // Create the DIB section with an alpha channel void *lpBits; HBITMAP hBitmap = CreateDIBSection(hdc, (BITMAPINFO *)&bi, DIB_RGB_COLORS, (void **)&lpBits, NULL, 0); HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); // Load the icon background HICON hIconBackground = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(1002 /* IDI_COUNT */)); DrawIconEx(hMemDC, 0, 0, hIconBackground, 16, 16, 0, 0, DI_NORMAL); DeleteObject(hIconBackground); // Draw the count LOGFONT lFont; memset(&lFont, 0, sizeof(LOGFONT)); lFont.lfHeight = 10; lFont.lfWeight = FW_BOLD; lFont.lfItalic = 1; strcpy(lFont.lfFaceName, "Arial"); HFONT hFont = CreateFontIndirect(&lFont); SelectObject(hMemDC, hFont); RECT rect; SetRect(&rect, 4, 4, 12, 12); SetTextColor(hMemDC, RGB(48, 48, 48)); SetBkMode(hMemDC, TRANSPARENT); DrawText(hMemDC, countString.c_str(), -1, &rect, DT_NOCLIP|DT_CENTER); // Set the text alpha to fully opaque (we consider the data inside the text rect) DWORD *lpdwPixel = (DWORD *)lpBits; for (int x = 3; x < 12; x++) { for(int y = 3; y < 12; y++) { unsigned char *p = (unsigned char *)(lpdwPixel + x * 16 + y); if (p[0] != 0 && p[1] != 0 && p[2] != 0) p[3] = 255; } } // Cleanup DC DeleteObject(hFont); SelectObject(hMemDC, hOldBitmap); DeleteDC(hMemDC); // Prepare our new icon ICONINFO ii; ii.fIcon = FALSE; ii.xHotspot = 0; ii.yHotspot = 0; ii.hbmMask = hBitmapMask; ii.hbmColor = hBitmap; _icon = CreateIconIndirect(&ii); DeleteObject(hBitmap); DeleteObject(hBitmapMask); if (!_icon) { warning("[Win32TaskbarManager::setCount] Cannot create icon for count"); return; } } // Sets the overlay icon LPWSTR desc = ansiToUnicode(Common::String::format("Found games: %d", count).c_str()); _taskbar->SetOverlayIcon(getHwnd(), _icon, desc); delete[] desc; }