diff --git a/gfx/display_servers/dispserv_win32.c b/gfx/display_servers/dispserv_win32.c index 4bd4cf5ec6..4816923680 100644 --- a/gfx/display_servers/dispserv_win32.c +++ b/gfx/display_servers/dispserv_win32.c @@ -43,24 +43,27 @@ #ifdef __ITaskbarList3_INTERFACE_DEFINED__ #define HAS_TASKBAR_EXT -static ITaskbarList3 *g_taskbarList = NULL; - /* MSVC really doesn't want CINTERFACE to be used with shobjidl for some reason, but since we use C++ mode, * we need a workaround... so use the names of the COBJMACROS functions instead. */ #if defined(__cplusplus) && !defined(CINTERFACE) -#define ITaskbarList3_HrInit(x) g_taskbarList->HrInit() -#define ITaskbarList3_Release(x) g_taskbarList->Release() -#define ITaskbarList3_SetProgressState(a, b, c) g_taskbarList->SetProgressState(b, c) -#define ITaskbarList3_SetProgressValue(a, b, c, d) g_taskbarList->SetProgressValue(b, c, d) +#define ITaskbarList3_HrInit(x) (x)->HrInit() +#define ITaskbarList3_Release(x) (x)->Release() +#define ITaskbarList3_SetProgressState(a, b, c) (a)->SetProgressState(b, c) +#define ITaskbarList3_SetProgressValue(a, b, c, d) (a)->SetProgressValue(b, c, d) #endif #endif typedef struct { - unsigned opacity; - int progress; bool decorations; + int progress; + int crt_center; + unsigned opacity; + unsigned orig_width; + unsigned orig_height; + unsigned orig_refresh; + ITaskbarList3 *taskbar_list; } dispserv_win32_t; /* @@ -71,12 +74,7 @@ typedef struct be received by your application before it calls any ITaskbarList3 method. */ -static unsigned win32_orig_width = 0; -static unsigned win32_orig_height = 0; -static unsigned win32_orig_refresh = 0; -static int crt_center = 0; - -static void* win32_display_server_init(void) +static void *win32_display_server_init(void) { HRESULT hr; dispserv_win32_t *dispserv = (dispserv_win32_t*)calloc(1, sizeof(*dispserv)); @@ -90,23 +88,25 @@ static void* win32_display_server_init(void) #ifdef __cplusplus /* When compiling in C++ mode, GUIDs are references instead of pointers */ hr = CoCreateInstance(CLSID_TaskbarList, NULL, - CLSCTX_INPROC_SERVER, IID_ITaskbarList3, (void**)&g_taskbarList); + CLSCTX_INPROC_SERVER, IID_ITaskbarList3, + (void**)&dispserv->taskbar_list); #else /* Mingw GUIDs are pointers instead of references since we're in C mode */ hr = CoCreateInstance(&CLSID_TaskbarList, NULL, - CLSCTX_INPROC_SERVER, &IID_ITaskbarList3, (void**)&g_taskbarList); + CLSCTX_INPROC_SERVER, &IID_ITaskbarList3, + (void**)&dispserv->taskbar_list); #endif if (SUCCEEDED(hr)) { - hr = ITaskbarList3_HrInit(g_taskbarList); + hr = ITaskbarList3_HrInit(dispserv->taskbar_list); if (!SUCCEEDED(hr)) RARCH_ERR("[dispserv]: HrInit of ITaskbarList3 failed.\n"); } else { - g_taskbarList = NULL; + dispserv->taskbar_list = NULL; RARCH_ERR("[dispserv]: CoCreateInstance of ITaskbarList3 failed.\n"); } #endif @@ -118,15 +118,19 @@ static void win32_display_server_destroy(void *data) { dispserv_win32_t *dispserv = (dispserv_win32_t*)data; - if (win32_orig_width > 0 && win32_orig_height > 0) - video_display_server_set_resolution(win32_orig_width, win32_orig_height, - win32_orig_refresh, (float)win32_orig_refresh, crt_center, 0, 0); + if (dispserv->orig_width > 0 && dispserv->orig_height > 0) + video_display_server_set_resolution( + dispserv->orig_width, + dispserv->orig_height, + dispserv->orig_refresh, + (float)dispserv->orig_refresh, + dispserv->crt_center, 0, 0); #ifdef HAS_TASKBAR_EXT - if (g_taskbarList) + if (dispserv->taskbar_list) { - ITaskbarList3_Release(g_taskbarList); - g_taskbarList = NULL; + ITaskbarList3_Release(dispserv->taskbar_list); + dispserv->taskbar_list = NULL; } #endif @@ -170,29 +174,29 @@ static bool win32_display_server_set_window_progress(void *data, int progress, b serv->progress = progress; #ifdef HAS_TASKBAR_EXT - if (!g_taskbarList || !win32_taskbar_is_created()) + if (!serv->taskbar_list || !win32_taskbar_is_created()) return false; if (progress == -1) { if (ITaskbarList3_SetProgressState( - g_taskbarList, hwnd, TBPF_INDETERMINATE) != S_OK) + serv->taskbar_list, hwnd, TBPF_INDETERMINATE) != S_OK) return false; } else if (finished) { if (ITaskbarList3_SetProgressState( - g_taskbarList, hwnd, TBPF_NOPROGRESS) != S_OK) + serv->taskbar_list, hwnd, TBPF_NOPROGRESS) != S_OK) return false; } else if (progress >= 0) { if (ITaskbarList3_SetProgressState( - g_taskbarList, hwnd, TBPF_NORMAL) != S_OK) + serv->taskbar_list, hwnd, TBPF_NORMAL) != S_OK) return false; if (ITaskbarList3_SetProgressValue( - g_taskbarList, hwnd, progress, 100) != S_OK) + serv->taskbar_list, hwnd, progress, 100) != S_OK) return false; } #endif @@ -227,11 +231,11 @@ static bool win32_display_server_set_resolution(void *data, win32_get_video_output(&curDevmode, -1, sizeof(curDevmode)); - if (win32_orig_width == 0) - win32_orig_width = GetSystemMetrics(SM_CXSCREEN); - win32_orig_refresh = curDevmode.dmDisplayFrequency; - if (win32_orig_height == 0) - win32_orig_height = GetSystemMetrics(SM_CYSCREEN); + if (serv->orig_width == 0) + serv->orig_width = GetSystemMetrics(SM_CXSCREEN); + serv->orig_refresh = curDevmode.dmDisplayFrequency; + if (serv->orig_height == 0) + serv->orig_height = GetSystemMetrics(SM_CYSCREEN); /* Used to stop super resolution bug */ if (width == curDevmode.dmPelsWidth)