annotate foosdk/sdk/foobar2000/SDK/menu_manager.cpp @ 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 #include "foobar2000-sdk-pch.h"
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 "contextmenu_manager.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "menu_helpers.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include "playlist.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 WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 #include "ui_element_typable_window_manager.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 static void fix_ampersand(const char * src,pfc::string_base & out)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 out.reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 unsigned ptr = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 while(src[ptr])
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 if (src[ptr]=='&')
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 out.add_string("&&");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 ptr++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 while(src[ptr]=='&')
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 out.add_string("&&");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 ptr++;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 else out.add_byte(src[ptr++]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 }
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 static unsigned flags_to_win32(unsigned flags)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 unsigned ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 if (flags & contextmenu_item_node::FLAG_RADIOCHECKED) {/* dealt with elsewhere */}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 else if (flags & contextmenu_item_node::FLAG_CHECKED) ret |= MF_CHECKED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 if (flags & contextmenu_item_node::FLAG_DISABLED) ret |= MF_DISABLED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 if (flags & contextmenu_item_node::FLAG_GRAYED) ret |= MF_GRAYED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 void contextmenu_manager::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
42 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 if (parent!=0 && parent->get_type()==contextmenu_item_node::TYPE_POPUP)
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 pfc::string8_fastalloc temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 t_size child_idx,child_num = parent->get_num_children();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 for(child_idx=0;child_idx<child_num;child_idx++)
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 contextmenu_node * child = parent->get_child(child_idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 if (child)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 const char * name = child->get_name();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 if (strchr(name,'&')) {fix_ampersand(name,temp);name=temp;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 contextmenu_item_node::t_type type = child->get_type();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 if (type==contextmenu_item_node::TYPE_POPUP)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 HMENU new_menu = CreatePopupMenu();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 uAppendMenu(menu,MF_STRING|MF_POPUP | flags_to_win32(child->get_display_flags()),(UINT_PTR)new_menu,name);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 win32_build_menu(new_menu,child,base_id,max_id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 else if (type==contextmenu_item_node::TYPE_SEPARATOR)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 uAppendMenu(menu,MF_SEPARATOR,0,0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 else if (type==contextmenu_item_node::TYPE_COMMAND)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 int id = child->get_id();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 if (id>=0 && (max_id<0 || id<max_id))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 const unsigned flags = child->get_display_flags();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 const UINT ID = base_id+id;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 uAppendMenu(menu,MF_STRING | flags_to_win32(flags),ID,name);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 if (flags & contextmenu_item_node::FLAG_RADIOCHECKED) CheckMenuRadioItem(menu,ID,ID,ID,MF_BYCOMMAND);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 }
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 bool contextmenu_manager::get_description_by_id(unsigned id,pfc::string_base & out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 contextmenu_node * ptr = find_by_id(id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 if (ptr == NULL) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 return ptr->get_description(out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 }
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 void contextmenu_manager::win32_run_menu_popup(HWND parent,const POINT * pt)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 enum {ID_CUSTOM_BASE = 1};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 int cmd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 POINT p;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 if (pt) p = *pt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 else GetCursorPos(&p);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 HMENU hmenu = CreatePopupMenu();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 try {
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 win32_build_menu(hmenu,ID_CUSTOM_BASE,-1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 menu_helpers::win32_auto_mnemonics(hmenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 cmd = TrackPopupMenu(hmenu,TPM_RIGHTBUTTON|TPM_NONOTIFY|TPM_RETURNCMD,p.x,p.y,0,parent,0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 } catch(...) {DestroyMenu(hmenu); throw;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 DestroyMenu(hmenu);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 if (cmd>0)
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 if (cmd>=ID_CUSTOM_BASE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 execute_by_id(cmd - ID_CUSTOM_BASE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 void contextmenu_manager::win32_run_menu_context(HWND parent,const pfc::list_base_const_t<metadb_handle_ptr> & data,const POINT * pt,unsigned flags)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 service_ptr_t<contextmenu_manager> manager;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 contextmenu_manager::g_create(manager);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 manager->init_context(data,flags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 manager->win32_run_menu_popup(parent,pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 }
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 void contextmenu_manager::win32_run_menu_context_playlist(HWND parent,const POINT * pt,unsigned flags)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 service_ptr_t<contextmenu_manager> manager;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 contextmenu_manager::g_create(manager);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 manager->init_context_playlist(flags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 manager->win32_run_menu_popup(parent,pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 class mnemonic_manager
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 pfc::string8_fastalloc used;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 bool is_used(unsigned c)
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 char temp[8];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 temp[pfc::utf8_encode_char(uCharLower(c),temp)]=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 return !!strstr(used,temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 static bool is_alphanumeric(char c)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 return (c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9');
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 void insert(const char * src,unsigned idx,pfc::string_base & out)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 out.reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 out.add_string(src,idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 out.add_string("&");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 out.add_string(src+idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 used.add_char(uCharLower(src[idx]));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 bool check_string(const char * src)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 {//check for existing mnemonics
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 const char * ptr = src;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 for( ;; ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 ptr = strchr(ptr, '&');
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 if (ptr == nullptr) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 if (ptr[1]=='&') ptr+=2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 unsigned c = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 if (pfc::utf8_decode_char(ptr+1,c)>0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 if (!is_used(c)) used.add_char(uCharLower(c));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 bool process_string(const char * src,pfc::string_base & out)//returns if changed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 if (check_string(src)) {out=src;return false;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 unsigned idx=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 while(src[idx]==' ') idx++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 while(src[idx])
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 if (is_alphanumeric(src[idx]) && !is_used(src[idx]))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 insert(src,idx,out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 while(src[idx] && src[idx]!=' ' && src[idx]!='\t') idx++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 if (src[idx]=='\t') break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 while(src[idx]==' ') idx++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 //no success picking first letter of one of words
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 idx=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 while(src[idx])
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 if (src[idx]=='\t') break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 if (is_alphanumeric(src[idx]) && !is_used(src[idx]))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 insert(src,idx,out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 idx++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 //giving up
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 out = src;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 void menu_helpers::win32_auto_mnemonics(HMENU menu)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 PFC_ASSERT(IsMenu(menu));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 mnemonic_manager mgr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 int n, m = GetMenuItemCount(menu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 PFC_ASSERT(m >= 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 pfc::string8_fastalloc temp,temp2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 for(n=0;n<m;n++)//first pass, check existing mnemonics
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 unsigned type = uGetMenuItemType(menu,n);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 if (type==MFT_STRING)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 uGetMenuString(menu,n,temp,MF_BYPOSITION);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 mgr.check_string(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 for(n=0;n<m;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 HMENU submenu = GetSubMenu(menu,n);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 if (submenu) win32_auto_mnemonics(submenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 unsigned type = uGetMenuItemType(menu,n);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 if (type==MFT_STRING)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 unsigned state = submenu ? 0 : GetMenuState(menu,n,MF_BYPOSITION);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 unsigned id = GetMenuItemID(menu,n);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 uGetMenuString(menu,n,temp,MF_BYPOSITION);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 if (mgr.process_string(temp,temp2))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 uModifyMenu(menu,n,MF_BYPOSITION|MF_STRING|state,id,temp2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 static bool test_key(unsigned k)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 return (GetKeyState(k) & 0x8000) ? true : false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 #define F_SHIFT (HOTKEYF_SHIFT<<8)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 #define F_CTRL (HOTKEYF_CONTROL<<8)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 #define F_ALT (HOTKEYF_ALT<<8)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 #define F_WIN (HOTKEYF_EXT<<8)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 static t_uint32 get_key_code(WPARAM wp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 t_uint32 code = (t_uint32)(wp & 0xFF);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 if (test_key(VK_CONTROL)) code|=F_CTRL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 if (test_key(VK_SHIFT)) code|=F_SHIFT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 if (test_key(VK_MENU)) code|=F_ALT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 if (test_key(VK_LWIN) || test_key(VK_RWIN)) code|=F_WIN;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 return code;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 static t_uint32 get_key_code(WPARAM wp, t_uint32 mods) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 t_uint32 code = (t_uint32)(wp & 0xFF);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 if (mods & MOD_CONTROL) code|=F_CTRL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 if (mods & MOD_SHIFT) code|=F_SHIFT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 if (mods & MOD_ALT) code|=F_ALT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 if (mods & MOD_WIN) code|=F_WIN;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 return code;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 bool keyboard_shortcut_manager::on_keydown(shortcut_type type,WPARAM wp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 if (type==TYPE_CONTEXT) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 metadb_handle_list dummy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 return process_keydown(type,dummy,get_key_code(wp));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 bool keyboard_shortcut_manager::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
297 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 if (data.get_count()==0) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 return process_keydown_ex(TYPE_CONTEXT,data,get_key_code(wp),caller);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 bool keyboard_shortcut_manager::on_keydown_auto(WPARAM wp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 if (on_keydown(TYPE_MAIN,wp)) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 if (on_keydown(TYPE_CONTEXT_PLAYLIST,wp)) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 if (on_keydown(TYPE_CONTEXT_NOW_PLAYING,wp)) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 bool keyboard_shortcut_manager::on_keydown_auto_playlist(WPARAM wp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 metadb_handle_list data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 playlist_manager::get()->activeplaylist_get_selected_items(data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 return on_keydown_auto_context(data,wp,contextmenu_item::caller_playlist);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 bool keyboard_shortcut_manager::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
318 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 if (on_keydown_context(data,wp,caller)) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 else return on_keydown_auto(wp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 static bool should_relay_key_restricted(WPARAM p_key) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 switch(p_key) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 case VK_LEFT:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 case VK_RIGHT:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 case VK_UP:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 case VK_DOWN:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 return (p_key >= VK_F1 && p_key <= VK_F24) || IsKeyPressed(VK_CONTROL) || IsKeyPressed(VK_LWIN) || IsKeyPressed(VK_RWIN);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 bool keyboard_shortcut_manager::on_keydown_restricted_auto(WPARAM wp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 if (!should_relay_key_restricted(wp)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 return on_keydown_auto(wp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 bool keyboard_shortcut_manager::on_keydown_restricted_auto_playlist(WPARAM wp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 if (!should_relay_key_restricted(wp)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 return on_keydown_auto_playlist(wp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 bool keyboard_shortcut_manager::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
344 if (!should_relay_key_restricted(wp)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 return on_keydown_auto_context(data,wp,caller);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 static bool filterTypableWindowMessage(const MSG * msg, t_uint32 modifiers) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 if (keyboard_shortcut_manager::is_typing_key_combo((t_uint32)msg->wParam, modifiers)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 const DWORD mask = DLGC_HASSETSEL | DLGC_WANTCHARS | DLGC_WANTARROWS;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 auto status = ::SendMessage(msg->hwnd, WM_GETDLGCODE,0, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 if ( (status & mask) == mask ) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 ui_element_typable_window_manager::ptr api;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 if (ui_element_typable_window_manager::tryGet(api)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 if (api->is_registered(msg->hwnd)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 bool keyboard_shortcut_manager_v2::pretranslate_message(const MSG * msg, HWND thisPopupWnd) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 switch(msg->message) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 case WM_KEYDOWN:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 case WM_SYSKEYDOWN:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 if (thisPopupWnd != NULL && FindOwningPopup(msg->hwnd) == thisPopupWnd) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 const t_uint32 modifiers = GetHotkeyModifierFlags();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 if (filterTypableWindowMessage(msg, modifiers)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 if (process_keydown_simple(get_key_code(msg->wParam,modifiers))) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 bool keyboard_shortcut_manager::is_text_key(t_uint32 vkCode) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 return vkCode == VK_SPACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 || (vkCode >= '0' && vkCode < 0x40)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 || (vkCode > 0x40 && vkCode < VK_LWIN)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 || (vkCode >= VK_NUMPAD0 && vkCode <= VK_DIVIDE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 || (vkCode >= VK_OEM_1 && vkCode <= VK_OEM_3)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 || (vkCode >= VK_OEM_4 && vkCode <= VK_OEM_8)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 ;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 bool keyboard_shortcut_manager::is_typing_key(t_uint32 vkCode) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 return is_text_key(vkCode)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 || vkCode == VK_BACK
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 || vkCode == VK_RETURN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 || vkCode == VK_INSERT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 || (vkCode > VK_SPACE && vkCode < '0');
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 bool keyboard_shortcut_manager::is_typing_key_combo(t_uint32 vkCode, t_uint32 modifiers) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 if (!is_typing_modifier(modifiers)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 return is_typing_key(vkCode);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 bool keyboard_shortcut_manager::is_typing_modifier(t_uint32 flags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 flags &= ~MOD_SHIFT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 return flags == 0 || flags == (MOD_ALT | MOD_CONTROL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 bool keyboard_shortcut_manager::is_typing_message(HWND editbox, const MSG * msg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 if (msg->hwnd != editbox) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 return is_typing_message(msg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 bool keyboard_shortcut_manager::is_typing_message(const MSG * msg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 if (msg->message != WM_KEYDOWN && msg->message != WM_SYSKEYDOWN) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 return is_typing_key_combo((uint32_t)msg->wParam, GetHotkeyModifierFlags());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 #endif // _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 bool contextmenu_manager::execute_by_id(unsigned id) noexcept {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 contextmenu_node * ptr = find_by_id(id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 if (ptr == NULL) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 ptr->execute();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 void contextmenu_manager::g_create(service_ptr_t<contextmenu_manager>& p_out) { standard_api_create_t(p_out); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425 service_ptr_t<contextmenu_manager> contextmenu_manager::g_create() { service_ptr_t<contextmenu_manager> ret; standard_api_create_t(ret); return ret; }