annotate foosdk/sdk/foobar2000/SDK/contextmenu_manager.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "menu_common.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "metadb.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include "contextmenu.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #ifdef FOOBAR2000_HAVE_KEYBOARD_SHORTCUTS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 class NOVTABLE keyboard_shortcut_manager : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 enum shortcut_type
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 TYPE_MAIN,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 TYPE_CONTEXT,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 TYPE_CONTEXT_PLAYLIST,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 TYPE_CONTEXT_NOW_PLAYING,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 virtual bool process_keydown(shortcut_type type,metadb_handle_list_cref data,unsigned keycode)=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 virtual bool process_keydown_ex(shortcut_type type,metadb_handle_list_cref data,unsigned keycode,const GUID & caller)=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 bool on_keydown(shortcut_type type,WPARAM wp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 bool on_keydown_context(const pfc::list_base_const_t<metadb_handle_ptr> & data,WPARAM wp,const GUID & caller);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 bool on_keydown_auto(WPARAM wp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 bool on_keydown_auto_playlist(WPARAM wp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 bool on_keydown_auto_context(const pfc::list_base_const_t<metadb_handle_ptr> & data,WPARAM wp,const GUID & caller);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 bool on_keydown_restricted_auto(WPARAM wp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 bool on_keydown_restricted_auto_playlist(WPARAM wp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 bool on_keydown_restricted_auto_context(const pfc::list_base_const_t<metadb_handle_ptr> & data,WPARAM wp,const GUID & caller);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 virtual bool get_key_description_for_action(const GUID & p_command,const GUID & p_subcommand, pfc::string_base & out, shortcut_type type, bool is_global)=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 static bool is_text_key(t_uint32 vkCode);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 static bool is_typing_key(t_uint32 vkCode);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 static bool is_typing_key_combo(t_uint32 vkCode, t_uint32 modifiers);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 static bool is_typing_modifier(t_uint32 flags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 static bool is_typing_message(HWND editbox, const MSG * msg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 static bool is_typing_message(const MSG * msg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 FB2K_MAKE_SERVICE_COREAPI(keyboard_shortcut_manager);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 //! New in 0.9.5.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 class keyboard_shortcut_manager_v2 : public keyboard_shortcut_manager {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 //! Deprecates old keyboard_shortcut_manager methods. If the action requires selected items, they're obtained from ui_selection_manager API automatically.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 virtual bool process_keydown_simple(t_uint32 keycode) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 //! Helper for use with message filters.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 bool pretranslate_message(const MSG * msg, HWND thisPopupWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 FB2K_MAKE_SERVICE_COREAPI_EXTENSION(keyboard_shortcut_manager_v2,keyboard_shortcut_manager);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 class NOVTABLE contextmenu_node {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 virtual contextmenu_item_node::t_type get_type()=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 virtual const char * get_name()=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 virtual t_size get_num_children()=0;//TYPE_POPUP only
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 virtual contextmenu_node * get_child(t_size n)=0;//TYPE_POPUP only
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 virtual unsigned get_display_flags()=0;//TYPE_COMMAND/TYPE_POPUP only, see contextmenu_item::FLAG_*
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 virtual unsigned get_id()=0;//TYPE_COMMAND only, returns zero-based index (helpful for win32 menu command ids)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 virtual void execute()=0;//TYPE_COMMAND only
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 virtual bool get_description(pfc::string_base & out)=0;//TYPE_COMMAND only
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 virtual bool get_full_name(pfc::string_base & out)=0;//TYPE_COMMAND only
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 virtual void * get_glyph()=0;//RESERVED, do not use
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 contextmenu_node() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 ~contextmenu_node() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 class NOVTABLE contextmenu_manager : public service_base
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 enum
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 flag_show_shortcuts = 1 << 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 flag_show_shortcuts_global = 1 << 1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 //! \since 1.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 //! To control which commands are shown, you should specify either flag_view_reduced or flag_view_full. If neither is specified, the implementation will decide automatically based on shift key being pressed, for backwards compatibility.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 flag_view_reduced = 1 << 2,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 //! \since 1.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 //! To control which commands are shown, you should specify either flag_view_reduced or flag_view_full. If neither is specified, the implementation will decide automatically based on shift key being pressed, for backwards compatibility.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 flag_view_full = 1 << 3,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 //for compatibility
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 FLAG_SHOW_SHORTCUTS = 1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 FLAG_SHOW_SHORTCUTS_GLOBAL = 2,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 virtual void init_context(metadb_handle_list_cref data,unsigned flags) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 virtual void init_context_playlist(unsigned flags) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 virtual contextmenu_node * get_root() = 0;//releasing contextmenu_manager service releaases nodes; root may be null in case of error or something
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 virtual contextmenu_node * find_by_id(unsigned id)=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 virtual void set_shortcut_preference(const keyboard_shortcut_manager::shortcut_type * data,unsigned count)=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 static void g_create(service_ptr_t<contextmenu_manager>& p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 static service_ptr_t<contextmenu_manager> g_create();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 #ifdef WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 static void win32_build_menu(HMENU menu,contextmenu_node * parent,int base_id,int max_id);//menu item identifiers are base_id<=N<base_id+max_id (if theres too many items, they will be clipped)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 static void win32_run_menu_context(HWND parent,metadb_handle_list_cref data, const POINT * pt = 0,unsigned flags = 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 static void win32_run_menu_context_playlist(HWND parent,const POINT * pt = 0,unsigned flags = 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 void win32_run_menu_popup(HWND parent,const POINT * pt = 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 void win32_build_menu(HMENU menu,int base_id,int max_id) {win32_build_menu(menu,get_root(),base_id,max_id);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 virtual void init_context_ex(metadb_handle_list_cref data,unsigned flags,const GUID & caller)=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 virtual bool init_context_now_playing(unsigned flags)=0;//returns false if not playing
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 bool execute_by_id(unsigned id) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 bool get_description_by_id(unsigned id,pfc::string_base & out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 //! Safely prevent destruction from worker threads (some components attempt that).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 static bool serviceRequiresMainThreadDestructor() { return true; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 FB2K_MAKE_SERVICE_COREAPI(contextmenu_manager);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 //! \since 1.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 class NOVTABLE contextmenu_group_manager : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 FB2K_MAKE_SERVICE_COREAPI(contextmenu_group_manager)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 virtual GUID path_to_group(const char * path) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 virtual void group_to_path(const GUID & group, pfc::string_base & path) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 class contextmenu_manager_v2 : public contextmenu_manager {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 FB2K_MAKE_SERVICE_COREAPI_EXTENSION(contextmenu_manager_v2, contextmenu_manager)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 virtual menu_tree_item::ptr build_menu() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 };