From d596a6368cc62d198dd33dadd1cd0831d0de3dee Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 3 Oct 2019 00:20:58 +1000 Subject: Preference: option to use OS-Key to emulate MMB Alt-LMB is used in quite a few areas now, see T69323 using OS-Key allows these conflicts to be avoided. Currently disabled for WIN32, since it conflicts with the start menu. --- release/scripts/presets/keyconfig/blender.py | 5 ++++- release/scripts/presets/keyconfig/blender_27x.py | 5 ++++- release/scripts/startup/bl_ui/space_userpref.py | 5 +++++ source/blender/makesdna/DNA_userdef_types.h | 8 ++++++- source/blender/makesrna/intern/rna_userdef.c | 26 ++++++++++++++++++++++ .../blender/windowmanager/intern/wm_event_system.c | 24 +++++++++++++++----- 6 files changed, 64 insertions(+), 9 deletions(-) diff --git a/release/scripts/presets/keyconfig/blender.py b/release/scripts/presets/keyconfig/blender.py index 8a7689d6d60..596b17d734f 100644 --- a/release/scripts/presets/keyconfig/blender.py +++ b/release/scripts/presets/keyconfig/blender.py @@ -169,7 +169,10 @@ def load(): keyconfig_data = blender_default.generate_keymaps( blender_default.Params( select_mouse=kc_prefs.select_mouse, - use_mouse_emulate_3_button=prefs.inputs.use_mouse_emulate_3_button, + use_mouse_emulate_3_button=( + prefs.inputs.use_mouse_emulate_3_button and + prefs.inputs.mouse_emulate_3_button_modifier == 'ALT' + ), spacebar_action=kc_prefs.spacebar_action, v3d_tilde_action=kc_prefs.v3d_tilde_action, use_select_all_toggle=kc_prefs.use_select_all_toggle, diff --git a/release/scripts/presets/keyconfig/blender_27x.py b/release/scripts/presets/keyconfig/blender_27x.py index 4ce77f46213..8d50d449494 100644 --- a/release/scripts/presets/keyconfig/blender_27x.py +++ b/release/scripts/presets/keyconfig/blender_27x.py @@ -53,7 +53,10 @@ def load(): keyconfig_data = blender_default.generate_keymaps( blender_default.Params( select_mouse=kc_prefs.select_mouse, - use_mouse_emulate_3_button=prefs.inputs.use_mouse_emulate_3_button, + use_mouse_emulate_3_button=( + prefs.inputs.use_mouse_emulate_3_button and + prefs.inputs.mouse_emulate_3_button_modifier == 'ALT' + ), spacebar_action='SEARCH', use_select_all_toggle=True, use_gizmo_drag=False, diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index be41fb52118..8ccd8b57357 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -1479,12 +1479,17 @@ class USERPREF_PT_input_mouse(PreferencePanel, Panel): return (prefs.active_section == 'INPUT') def draw_props(self, context, layout): + import sys prefs = context.preferences inputs = prefs.inputs flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False) flow.prop(inputs, "use_mouse_emulate_3_button") + if sys.platform[:3] != "win": + rowsub = flow.row() + rowsub.active = inputs.use_mouse_emulate_3_button + rowsub.prop(inputs, "mouse_emulate_3_button_modifier") flow.prop(inputs, "use_mouse_continuous") flow.prop(inputs, "use_drag_immediately") flow.prop(inputs, "mouse_double_click_time", text="Double Click Speed") diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index 126b4638ca1..f36802d33b3 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -606,7 +606,8 @@ typedef struct UserDef { /** #eUserPref_PrefFlag preferences for the preferences. */ char pref_flag; char savetime; - char _pad4[4]; + char mouse_emulate_3_button_modifier; + char _pad4[3]; /** FILE_MAXDIR length. */ char tempdir[768]; char fontdir[768]; @@ -1240,6 +1241,11 @@ typedef enum eUserpref_TempSpaceDisplayType { USER_TEMP_SPACE_DISPLAY_WINDOW, } eUserpref_TempSpaceDisplayType; +typedef enum eUserpref_EmulateMMBMod { + USER_EMU_MMB_MOD_ALT = 0, + USER_EMU_MMB_MOD_OSKEY = 1, +} eUserpref_EmulateMMBMod; + #ifdef __cplusplus } #endif diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index c9b6f46ab04..078af30e36c 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -424,6 +424,17 @@ static void rna_userdef_timecode_style_set(PointerRNA *ptr, int value) } } +static int rna_UserDef_mouse_emulate_3_button_modifier_get(PointerRNA *ptr) +{ +# if !defined(WIN32) + UserDef *userdef = ptr->data; + return userdef->mouse_emulate_3_button_modifier; +# else + UNUSED_VARS(ptr); + return USER_EMU_MMB_MOD_ALT; +# endif +} + static PointerRNA rna_UserDef_view_get(PointerRNA *ptr) { return rna_pointer_inherit_refine(ptr, &RNA_PreferencesView, ptr->data); @@ -5487,6 +5498,21 @@ static void rna_def_userdef_input(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); RNA_def_property_update(prop, 0, "rna_userdef_keyconfig_reload_update"); + static const EnumPropertyItem mouse_emulate_3_button_modifier[] = { + {USER_EMU_MMB_MOD_ALT, "ALT", 0, "Alt", ""}, + {USER_EMU_MMB_MOD_OSKEY, "OSKEY", 0, "OS-Key", ""}, + {0, NULL, 0, NULL, NULL}, + }; + + prop = RNA_def_property(srna, "mouse_emulate_3_button_modifier", PROP_ENUM, PROP_NONE); + /* Only needed because of WIN32 inability to support the option. */ + RNA_def_property_enum_funcs(prop, "rna_UserDef_mouse_emulate_3_button_modifier_get", NULL, NULL); + RNA_def_property_enum_items(prop, mouse_emulate_3_button_modifier); + RNA_def_property_ui_text( + prop, "Emulate 3 Button Modifier", "Hold this modifier to emulate the middle mouse button"); + RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); + RNA_def_property_update(prop, 0, "rna_userdef_keyconfig_reload_update"); + prop = RNA_def_property(srna, "use_emulate_numpad", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_NONUMPAD); RNA_def_property_ui_text( diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 6b4327d5f44..6991dd2f9a6 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -4210,19 +4210,31 @@ static void wm_eventemulation(wmEvent *event, bool test_only) if (U.flag & USER_TWOBUTTONMOUSE) { if (event->type == LEFTMOUSE) { - if (event->val == KM_PRESS && event->alt) { - event->type = MIDDLEMOUSE; - event->alt = 0; + short *mod = ( +#if !defined(WIN32) + (U.mouse_emulate_3_button_modifier == USER_EMU_MMB_MOD_OSKEY) ? &event->oskey : + &event->alt +#else + /* Disable for WIN32 for now because it accesses the start menu. */ + &event->alt +#endif + ); - if (!test_only) { - emulating_event = MIDDLEMOUSE; + if (event->val == KM_PRESS) { + if (*mod) { + *mod = 0; + event->type = MIDDLEMOUSE; + + if (!test_only) { + emulating_event = MIDDLEMOUSE; + } } } else if (event->val == KM_RELEASE) { /* only send middle-mouse release if emulated */ if (emulating_event == MIDDLEMOUSE) { event->type = MIDDLEMOUSE; - event->alt = 0; + *mod = 0; } if (!test_only) { -- cgit v1.2.3