diff options
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; |