|
@@ -188,10 +188,7 @@ static DWORD GetWindowStyleEx(SDL_Window *window)
|
|
|
static ITaskbarList3 *GetTaskbarList(SDL_Window* window)
|
|
|
{
|
|
|
const SDL_WindowData *data = window->internal;
|
|
|
- if (!data->videodata->taskbar_button_created) {
|
|
|
- SDL_SetError("Missing taskbar button");
|
|
|
- return NULL;
|
|
|
- }
|
|
|
+ SDL_assert(data->taskbar_button_created);
|
|
|
if (!data->videodata->taskbar_list) {
|
|
|
HRESULT ret = CoCreateInstance(&CLSID_TaskbarList, NULL, CLSCTX_ALL, &IID_ITaskbarList3, (LPVOID *)&data->videodata->taskbar_list);
|
|
|
if (FAILED(ret)) {
|
|
@@ -2248,18 +2245,23 @@ bool WIN_FlashWindow(SDL_VideoDevice *_this, SDL_Window *window, SDL_FlashOperat
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-bool WIN_SetWindowProgressState(SDL_VideoDevice *_this, SDL_Window *window, SDL_ProgressState state)
|
|
|
+bool WIN_ApplyWindowProgress(SDL_Window* window)
|
|
|
{
|
|
|
#ifndef HAVE_SHOBJIDL_CORE_H
|
|
|
return false;
|
|
|
#else
|
|
|
+ SDL_WindowData *data = window->internal;
|
|
|
+ if (!data->taskbar_button_created) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
ITaskbarList3 *taskbar_list = GetTaskbarList(window);
|
|
|
if (!taskbar_list) {
|
|
|
return false;
|
|
|
- };
|
|
|
+ }
|
|
|
|
|
|
TBPFLAG tbpFlags;
|
|
|
- switch (state) {
|
|
|
+ switch (data->progress_state) {
|
|
|
case SDL_PROGRESS_STATE_NONE:
|
|
|
tbpFlags = TBPF_NOPROGRESS;
|
|
|
break;
|
|
@@ -2279,31 +2281,59 @@ bool WIN_SetWindowProgressState(SDL_VideoDevice *_this, SDL_Window *window, SDL_
|
|
|
return SDL_SetError("Parameter 'state' is not supported");
|
|
|
}
|
|
|
|
|
|
- HRESULT ret = taskbar_list->lpVtbl->SetProgressState(taskbar_list, window->internal->hwnd, tbpFlags);
|
|
|
+ HRESULT ret = taskbar_list->lpVtbl->SetProgressState(taskbar_list, data->hwnd, tbpFlags);
|
|
|
if (FAILED(ret)) {
|
|
|
return WIN_SetErrorFromHRESULT("ITaskbarList3::SetProgressState()", ret);
|
|
|
}
|
|
|
|
|
|
+ if (data->progress_state >= SDL_PROGRESS_STATE_NORMAL) {
|
|
|
+ ret = taskbar_list->lpVtbl->SetProgressValue(taskbar_list, data->hwnd, (ULONGLONG)(data->progress_value * 10000.f), 10000);
|
|
|
+ if (FAILED(ret)) {
|
|
|
+ return WIN_SetErrorFromHRESULT("ITaskbarList3::SetProgressValue()", ret);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
return true;
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
+bool WIN_SetWindowProgressState(SDL_VideoDevice *_this, SDL_Window *window, SDL_ProgressState state)
|
|
|
+{
|
|
|
+#ifndef HAVE_SHOBJIDL_CORE_H
|
|
|
+ return SDL_Unsupported();
|
|
|
+#else
|
|
|
+ window->internal->progress_state = state;
|
|
|
+ return WIN_ApplyWindowProgress(window);
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
+SDL_ProgressState WIN_GetWindowProgressState(SDL_VideoDevice *_this, SDL_Window *window)
|
|
|
+{
|
|
|
+#ifndef HAVE_SHOBJIDL_CORE_H
|
|
|
+ SDL_Unsupported();
|
|
|
+ return SDL_PROGRESS_STATE_INVALID;
|
|
|
+#else
|
|
|
+ return window->internal->progress_state;
|
|
|
#endif // HAVE_SHOBJIDL_CORE_H
|
|
|
}
|
|
|
|
|
|
bool WIN_SetWindowProgressValue(SDL_VideoDevice *_this, SDL_Window *window, float value)
|
|
|
{
|
|
|
#ifndef HAVE_SHOBJIDL_CORE_H
|
|
|
- return false;
|
|
|
+ return SDL_Unsupported();
|
|
|
#else
|
|
|
- ITaskbarList3 *taskbar_list = GetTaskbarList(window);
|
|
|
- if (!taskbar_list) {
|
|
|
- return false;
|
|
|
- };
|
|
|
-
|
|
|
- HRESULT ret = taskbar_list->lpVtbl->SetProgressValue(taskbar_list, window->internal->hwnd, (ULONGLONG)(value * 10000.f), 10000);
|
|
|
- if (FAILED(ret)) {
|
|
|
- return WIN_SetErrorFromHRESULT("ITaskbarList3::SetProgressValue()", ret);
|
|
|
- }
|
|
|
+ window->internal->progress_value = value;
|
|
|
+ return WIN_ApplyWindowProgress(window);
|
|
|
+#endif
|
|
|
+}
|
|
|
|
|
|
- return true;
|
|
|
+float WIN_GetWindowProgressValue(SDL_VideoDevice *_this, SDL_Window *window)
|
|
|
+{
|
|
|
+#ifndef HAVE_SHOBJIDL_CORE_H
|
|
|
+ SDL_Unsupported();
|
|
|
+ return -1.0f;
|
|
|
+#else
|
|
|
+ return window->internal->progress_value;
|
|
|
#endif // HAVE_SHOBJIDL_CORE_H
|
|
|
}
|
|
|
|