diff options
author | Martin Herkt <lachs0r@srsfckn.biz> | 2015-11-15 23:03:48 +0100 |
---|---|---|
committer | Martin Herkt <lachs0r@srsfckn.biz> | 2015-11-15 23:18:24 +0100 |
commit | bf0b178e71d76c839d6d17c42a83536e444ba31d (patch) | |
tree | de21f2f308d4f1c4558330d6fd9dbc9a9a325fa4 /video | |
parent | 883d3114138a8f9a03f778165de553b7cdb99bee (diff) | |
download | mpv-bf0b178e71d76c839d6d17c42a83536e444ba31d.tar.bz2 mpv-bf0b178e71d76c839d6d17c42a83536e444ba31d.tar.xz |
win32: support taskbar button progress indicator
This adds support for the progress indicator taskbar extension
that was introduced with Windows 7 and Windows Server 2008 R2.
I don’t like this solution because it keeps its own state and
introduces another VOCTRL, but I couldn’t come up with anything
less messy.
closes #2399
Diffstat (limited to 'video')
-rw-r--r-- | video/out/vo.h | 7 | ||||
-rw-r--r-- | video/out/w32_common.c | 37 |
2 files changed, 44 insertions, 0 deletions
diff --git a/video/out/vo.h b/video/out/vo.h index 30948e149b..3a8231a295 100644 --- a/video/out/vo.h +++ b/video/out/vo.h @@ -76,6 +76,7 @@ enum mp_voctrl { VOCTRL_ALL_WORKSPACES, VOCTRL_UPDATE_WINDOW_TITLE, // char* + VOCTRL_UPDATE_PLAYBACK_STATE, // struct voctrl_playback_state* VOCTRL_SET_CURSOR_VISIBILITY, // bool* @@ -130,6 +131,12 @@ struct voctrl_get_equalizer_args { #define VO_NOTAVAIL -2 #define VO_NOTIMPL -3 +// VOCTRL_UPDATE_PLAYBACK_STATE +struct voctrl_playback_state { + bool paused; + int percent_pos; +}; + enum { // VO does handle mp_image_params.rotate in 90 degree steps VO_CAP_ROTATE90 = 1 << 0, diff --git a/video/out/w32_common.c b/video/out/w32_common.c index 37e0057162..6f0bb82ed3 100644 --- a/video/out/w32_common.c +++ b/video/out/w32_common.c @@ -105,6 +105,9 @@ struct vo_w32_state { int high_surrogate; ITaskbarList2 *taskbar_list; + ITaskbarList3 *taskbar_list3; + UINT tbtnCreatedMsg; + bool tbtnCreated; // updates on move/resize/displaychange double display_fps; @@ -826,6 +829,11 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, break; } + if (message == w32->tbtnCreatedMsg) { + w32->tbtnCreated = true; + return 0; + } + if (mouse_button) { mouse_button |= mod_state(w32); mp_input_put_key(w32->input_ctx, mouse_button); @@ -1198,6 +1206,20 @@ static void *gui_thread(void *ptr) w32->taskbar_list = NULL; } } + + // ITaskbarList3 has methods for status indication on taskbar buttons, + // however that interface is only available on Win7/2008 R2 or newer + if (SUCCEEDED(CoCreateInstance(&CLSID_TaskbarList, NULL, + CLSCTX_INPROC_SERVER, &IID_ITaskbarList3, + (void**)&w32->taskbar_list3))) + { + if (FAILED(ITaskbarList3_HrInit(w32->taskbar_list3))) { + ITaskbarList3_Release(w32->taskbar_list3); + w32->taskbar_list3 = NULL; + } else { + w32->tbtnCreatedMsg = RegisterWindowMessage(L"TaskbarButtonCreated"); + } + } } else { MP_ERR(w32, "Failed to initialize OLE/COM\n"); } @@ -1235,6 +1257,8 @@ done: } if (w32->taskbar_list) ITaskbarList2_Release(w32->taskbar_list); + if (w32->taskbar_list3) + ITaskbarList3_Release(w32->taskbar_list3); if (ole_ok) OleUninitialize(); SetThreadExecutionState(ES_CONTINUOUS); @@ -1348,6 +1372,19 @@ static int gui_thread_control(struct vo_w32_state *w32, int request, void *arg) talloc_free(title); return VO_TRUE; } + case VOCTRL_UPDATE_PLAYBACK_STATE: { + struct voctrl_playback_state *pstate = + (struct voctrl_playback_state *)arg; + + if (w32->taskbar_list3 && w32->tbtnCreated) { + ITaskbarList3_SetProgressValue(w32->taskbar_list3, w32->window, + pstate->percent_pos, 100); + ITaskbarList3_SetProgressState(w32->taskbar_list3, w32->window, + pstate->paused ? TBPF_PAUSED : + TBPF_NORMAL); + } + return VO_TRUE; + } case VOCTRL_GET_DISPLAY_FPS: update_display_fps(w32); *(double*) arg = w32->display_fps; |