Allow the progress API to be used on all platforms

It's visually only hooked up on Windows for now, but the API will be internally consistent on all platforms.
This commit is contained in:
Sam Lantinga
2025-03-25 08:32:26 -07:00
parent b45ed98ae9
commit f355c7f217
7 changed files with 60 additions and 90 deletions

View File

@@ -2437,9 +2437,8 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara
#ifdef HAVE_SHOBJIDL_CORE_H
if (msg == data->videodata->WM_TASKBAR_BUTTON_CREATED) {
SDL_Window *window = data->window;
window->internal->taskbar_button_created = true;
WIN_ApplyWindowProgress(window);
data->taskbar_button_created = true;
WIN_ApplyWindowProgress(SDL_GetVideoDevice(), data->window);
}
#endif

View File

@@ -272,10 +272,7 @@ static SDL_VideoDevice *WIN_CreateDevice(void)
device->SetWindowHitTest = WIN_SetWindowHitTest;
device->AcceptDragAndDrop = WIN_AcceptDragAndDrop;
device->FlashWindow = WIN_FlashWindow;
device->SetWindowProgressState = WIN_SetWindowProgressState;
device->GetWindowProgressState = WIN_GetWindowProgressState;
device->SetWindowProgressValue = WIN_SetWindowProgressValue;
device->GetWindowProgressValue = WIN_GetWindowProgressValue;
device->ApplyWindowProgress = WIN_ApplyWindowProgress;
device->ShowWindowSystemMenu = WIN_ShowWindowSystemMenu;
device->SetWindowFocusable = WIN_SetWindowFocusable;
device->UpdateWindowShape = WIN_UpdateWindowShape;

View File

@@ -2245,11 +2245,9 @@ bool WIN_FlashWindow(SDL_VideoDevice *_this, SDL_Window *window, SDL_FlashOperat
return true;
}
bool WIN_ApplyWindowProgress(SDL_Window* window)
bool WIN_ApplyWindowProgress(SDL_VideoDevice *_this, SDL_Window* window)
{
#ifndef HAVE_SHOBJIDL_CORE_H
return false;
#else
#ifdef HAVE_SHOBJIDL_CORE_H
SDL_WindowData *data = window->internal;
if (!data->taskbar_button_created) {
return true;
@@ -2261,7 +2259,7 @@ bool WIN_ApplyWindowProgress(SDL_Window* window)
}
TBPFLAG tbpFlags;
switch (data->progress_state) {
switch (window->progress_state) {
case SDL_PROGRESS_STATE_NONE:
tbpFlags = TBPF_NOPROGRESS;
break;
@@ -2286,55 +2284,14 @@ bool WIN_ApplyWindowProgress(SDL_Window* window)
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 (window->progress_state >= SDL_PROGRESS_STATE_NORMAL) {
ret = taskbar_list->lpVtbl->SetProgressValue(taskbar_list, data->hwnd, (ULONGLONG)(window->progress_value * 10000.f), 10000);
if (FAILED(ret)) {
return WIN_SetErrorFromHRESULT("ITaskbarList3::SetProgressValue()", ret);
}
}
#endif
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 SDL_Unsupported();
#else
window->internal->progress_value = value;
return WIN_ApplyWindowProgress(window);
#endif
}
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
}
void WIN_ShowWindowSystemMenu(SDL_Window *window, int x, int y)

View File

@@ -94,8 +94,6 @@ struct SDL_WindowData
SDL_Window *keyboard_focus;
SDL_WindowEraseBackgroundMode hint_erase_background_mode;
bool taskbar_button_created;
SDL_ProgressState progress_state;
float progress_value;
struct SDL_VideoData *videodata;
#ifdef SDL_VIDEO_OPENGL_EGL
EGLSurface egl_surface;
@@ -136,11 +134,7 @@ extern void WIN_UnclipCursorForWindow(SDL_Window *window);
extern bool WIN_SetWindowHitTest(SDL_Window *window, bool enabled);
extern void WIN_AcceptDragAndDrop(SDL_Window *window, bool accept);
extern bool WIN_FlashWindow(SDL_VideoDevice *_this, SDL_Window *window, SDL_FlashOperation operation);
extern bool WIN_ApplyWindowProgress(SDL_Window *window);
extern bool WIN_SetWindowProgressState(SDL_VideoDevice *_this, SDL_Window *window, SDL_ProgressState state);
extern SDL_ProgressState WIN_GetWindowProgressState(SDL_VideoDevice *_this, SDL_Window *window);
extern bool WIN_SetWindowProgressValue(SDL_VideoDevice *_this, SDL_Window *window, float value);
extern float WIN_GetWindowProgressValue(SDL_VideoDevice *_this, SDL_Window *window);
extern bool WIN_ApplyWindowProgress(SDL_VideoDevice *_this, SDL_Window *window);
extern void WIN_UpdateDarkModeForHWND(HWND hwnd);
extern bool WIN_SetWindowPositionInternal(SDL_Window *window, UINT flags, SDL_WindowRect rect_type);
extern void WIN_ShowWindowSystemMenu(SDL_Window *window, int x, int y);