Wallpaper functionality restored for windows

This commit is contained in:
Mathew Velasquez 2016-10-13 20:24:37 -04:00
parent 0dc872bcea
commit 99c9a27f2a
6 changed files with 164 additions and 2 deletions

View file

@ -74,6 +74,7 @@ void graphicsBindingInit();
void fileIntBindingInit();
void screenBindingInit();
void wallpaperBindingInit();
void oneshotBindingInit();
void steamBindingInit();
@ -106,6 +107,7 @@ static void mriBindingInit()
fileIntBindingInit();
screenBindingInit();
wallpaperBindingInit();
oneshotBindingInit();
steamBindingInit();

View file

@ -0,0 +1,140 @@
#include "etc.h"
#include "sharedstate.h"
#include "binding-util.h"
#include "binding-types.h"
#include "config.h"
static bool isCached = false;
#ifdef _WIN32
#include <windows.h>
static WCHAR szStyle[8] = {0};
static WCHAR szTile[8] = {0};
static WCHAR szFile[MAX_PATH+1] = {0};
static DWORD oldcolor = 0;
static DWORD szStyleSize = sizeof(szStyle) - 1;
static DWORD szTileSize = sizeof(szTile) - 1;
static bool setStyle = false;
static bool setTile = false;
#endif
RB_METHOD(wallpaperSet)
{
RB_UNUSED_PARAM;
const char *imageName;
rb_get_args(argc, argv, "z", &imageName RB_ARG_END);
std::string imgname = shState->config().gameFolder + "/Wallpaper/" + imageName + ".bmp";
#ifdef _WIN32
// Crapify the slashes
size_t index = 0;
for (;;) {
index = imgname.find("/", index);
if (index == std::string::npos)
break;
imgname.replace(index, 1, "\\");
index += 1;
}
WCHAR imgnameW[MAX_PATH];
WCHAR imgnameFull[MAX_PATH];
MultiByteToWideChar(CP_UTF8, 0, imgname.c_str(), -1, imgnameW, MAX_PATH);
GetFullPathNameW(imgnameW, MAX_PATH, imgnameFull, NULL);
int colorId = COLOR_BACKGROUND;
int color = 0x1a041f;
WCHAR zero[2] = L"0";
DWORD zeroSize = 4;
HKEY hKey = NULL;
if (RegOpenKeyExW(HKEY_CURRENT_USER, L"Control Panel\\Desktop", 0, KEY_READ, &hKey) != ERROR_SUCCESS)
goto end;
if (!isCached) {
// QUERY
// Style
setStyle = RegQueryValueExW(hKey, L"WallpaperStyle", 0, NULL, (LPBYTE)(szStyle), &szStyleSize) == ERROR_SUCCESS;
// Tile
setTile = RegQueryValueExW(hKey, L"TileWallpaper", 0, NULL, (LPBYTE)(szTile), &szTileSize) == ERROR_SUCCESS;
// File path
if (!SystemParametersInfoW(SPI_GETDESKWALLPAPER, MAX_PATH, (PVOID)szFile, 0))
goto end;
// Color
oldcolor = GetSysColor(COLOR_BACKGROUND);
isCached = true;
}
RegCloseKey(hKey);
hKey = NULL;
if (RegOpenKeyExW(HKEY_CURRENT_USER, L"Control Panel\\Desktop", 0, KEY_WRITE, &hKey) != ERROR_SUCCESS)
goto end;
// SET
// Set the style
if (RegSetValueExW(hKey, L"WallpaperStyle", 0, REG_SZ, (const BYTE*)zero, zeroSize) != ERROR_SUCCESS)
goto end;
if (RegSetValueExW(hKey, L"TileWallpaper", 0, REG_SZ, (const BYTE*)zero, zeroSize) != ERROR_SUCCESS)
goto end;
// Set the wallpaper
if (!SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, (PVOID)imgnameFull, SPIF_UPDATEINIFILE))
goto end;
// Set the color
if (!SetSysColors(1, &colorId, (const COLORREF *)&color))
goto end;
end:
if (hKey)
RegCloseKey(hKey);
#else
#endif
return Qnil;
}
RB_METHOD(wallpaperReset)
{
RB_UNUSED_PARAM;
#ifdef _WIN32
if (isCached) {
int colorId = COLOR_BACKGROUND;
HKEY hKey = NULL;
if (RegOpenKeyExW(HKEY_CURRENT_USER, L"Control Panel\\Desktop", 0, KEY_WRITE, &hKey) != ERROR_SUCCESS)
goto end;
// Set the style
if (setStyle)
RegSetValueExW(hKey, L"WallpaperStyle", 0, REG_SZ, (const BYTE*)szStyle, szStyleSize);
if (setTile)
RegSetValueExW(hKey, L"TileWallpaper", 0, REG_SZ, (const BYTE*)szTile, szTileSize);
// Set the wallpaper
if (!SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, (PVOID)szFile, SPIF_UPDATEINIFILE))
goto end;
// Set the color
if (!SetSysColors(1, &colorId, (const COLORREF *)&oldcolor))
goto end;
end:
if (hKey)
RegCloseKey(hKey);
}
#else
#endif
return Qnil;
}
void wallpaperBindingInit()
{
VALUE module = rb_define_module("Wallpaper");
//Functions
_rb_define_module_function(module, "set", wallpaperSet);
_rb_define_module_function(module, "reset", wallpaperReset);
}

View file

@ -197,7 +197,8 @@ SOURCES += \
binding-mri/steam-binding.cpp \
src/xdg-user-dir-lookup.c \
src/screen.cpp \
binding-mri/screen-binding.cpp
binding-mri/screen-binding.cpp \
binding-mri/wallpaper-binding.cpp
STEAM {
HEADERS += src/steam.h steamshim/steamshim_child.h

View file

@ -4,6 +4,7 @@ class Game_Oneshot
#--------------------------------------------------------------------------
attr_accessor :player_name # map music (for battle memory)
attr_accessor :plight_timer # start of plight's plight
attr_accessor :wallpaper # the wallpaper that we should use
def initialize
if $GDC
@ -18,5 +19,18 @@ class Game_Oneshot
end
@lights = {}
@plight_timer = nil
@wallpaper = nil
end
end
module Wallpaper
def set_persistent(name)
$game_oneshot.wallpaper = name
Wallpaper.set(name)
end
def reset_persistent
$game_oneshot.wallpaper = nil
Wallpaper.reset
end
end

View file

@ -5,6 +5,7 @@
#==============================================================================
at_exit do
Wallpaper.reset
save unless ($game_system.map_interpreter.running? || !$scene.is_a?(Scene_Map))
end

View file

@ -79,6 +79,10 @@ def real_load
# Switch to map screen
$scene = Scene_Map.new
$game_temp.common_event_id = 42
# Set wallpaper if necessary
if $game_oneshot.wallpaper
Wallpaper.set $game_oneshot.wallpaper
end
end
def save_exists