summaryrefslogtreecommitdiffstats
path: root/video
diff options
context:
space:
mode:
authorMartin Herkt <lachs0r@srsfckn.biz>2015-11-15 23:03:48 +0100
committerMartin Herkt <lachs0r@srsfckn.biz>2015-11-15 23:18:24 +0100
commitbf0b178e71d76c839d6d17c42a83536e444ba31d (patch)
treede21f2f308d4f1c4558330d6fd9dbc9a9a325fa4 /video
parent883d3114138a8f9a03f778165de553b7cdb99bee (diff)
downloadmpv-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.h7
-rw-r--r--video/out/w32_common.c37
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;