summaryrefslogtreecommitdiffstats
path: root/video/out/w32_common.c
diff options
context:
space:
mode:
authorShuanglei Tao <tsl0922@gmail.com>2024-03-15 00:06:58 +0800
committerKacper Michajłow <kasper93@gmail.com>2024-04-06 08:24:06 +0200
commit3c1e98335127b28a7dc1b194e832b0e422f5ec9a (patch)
treed4fb1eb96416cfa9bae6f58cf3f15d6aaa6943ec /video/out/w32_common.c
parentf974382ca06655ac34debce7284ce87d01e5abd1 (diff)
downloadmpv-3c1e98335127b28a7dc1b194e832b0e422f5ec9a.tar.bz2
mpv-3c1e98335127b28a7dc1b194e832b0e422f5ec9a.tar.xz
vo: add win32 context menu support
Diffstat (limited to 'video/out/w32_common.c')
-rw-r--r--video/out/w32_common.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/video/out/w32_common.c b/video/out/w32_common.c
index 66d1fc4701..36f48b9be7 100644
--- a/video/out/w32_common.c
+++ b/video/out/w32_common.c
@@ -40,6 +40,7 @@
#include "w32_common.h"
#include "win32/displayconfig.h"
#include "win32/droptarget.h"
+#include "win32/menu.h"
#include "osdep/io.h"
#include "osdep/threads.h"
#include "osdep/w32_keyboard.h"
@@ -82,6 +83,8 @@ typedef enum MONITOR_DPI_TYPE {
#define rect_w(r) ((r).right - (r).left)
#define rect_h(r) ((r).bottom - (r).top)
+#define WM_SHOWMENU (WM_USER + 1)
+
struct w32_api {
HRESULT (WINAPI *pGetDpiForMonitor)(HMONITOR, MONITOR_DPI_TYPE, UINT*, UINT*);
BOOL (WINAPI *pAdjustWindowRectExForDpi)(LPRECT lpRect, DWORD dwStyle, BOOL bMenu, DWORD dwExStyle, UINT dpi);
@@ -109,6 +112,8 @@ struct vo_w32_state {
HHOOK parent_win_hook;
HWINEVENTHOOK parent_evt_hook;
+ struct menu_ctx *menu_ctx;
+
HMONITOR monitor; // Handle of the current screen
char *color_profile; // Path of the current screen's color profile
@@ -1486,6 +1491,14 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,
w32->window = NULL;
PostQuitMessage(0);
break;
+ case WM_COMMAND: {
+ const char *cmd = mp_win32_menu_get_cmd(w32->menu_ctx, LOWORD(wParam));
+ if (cmd) {
+ mp_cmd_t *cmdt = mp_input_parse_cmd(w32->input_ctx, bstr0(cmd), "");
+ mp_input_queue_cmd(w32->input_ctx, cmdt);
+ }
+ break;
+ }
case WM_SYSCOMMAND:
switch (wParam & 0xFFF0) {
case SC_SCREENSAVE:
@@ -1687,6 +1700,9 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,
return 0;
}
break;
+ case WM_SHOWMENU:
+ mp_win32_menu_show(w32->menu_ctx, w32->window);
+ break;
}
if (message == w32->tbtn_created_msg) {
@@ -2060,6 +2076,7 @@ bool vo_w32_init(struct vo *vo)
.dispatch = mp_dispatch_create(w32),
};
w32->opts = w32->opts_cache->opts;
+ w32->menu_ctx = mp_win32_menu_init();
vo->w32 = w32;
if (mp_thread_create(&w32->thread, gui_thread, w32))
@@ -2272,6 +2289,12 @@ static int gui_thread_control(struct vo_w32_state *w32, int request, void *arg)
case VOCTRL_BEGIN_DRAGGING:
w32->start_dragging = true;
return VO_TRUE;
+ case VOCTRL_SHOW_MENU:
+ PostMessageW(w32->window, WM_SHOWMENU, 0, 0);
+ return VO_TRUE;
+ case VOCTRL_UPDATE_MENU:
+ mp_win32_menu_update(w32->menu_ctx, (struct mpv_node *)arg);
+ return VO_TRUE;
}
return VO_NOTIMPL;
}
@@ -2335,6 +2358,7 @@ void vo_w32_uninit(struct vo *vo)
AvRevertMmThreadCharacteristics(w32->avrt_handle);
+ mp_win32_menu_uninit(w32->menu_ctx);
talloc_free(w32);
vo->w32 = NULL;
}