diff options
-rw-r--r-- | source/blender/blenkernel/BKE_keyconfig.h | 50 | ||||
-rw-r--r-- | source/blender/blenkernel/CMakeLists.txt | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/blender.c | 12 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/keyconfig.c | 93 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 6 | ||||
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 7 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_userdef_types.h | 1 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_windowmanager_types.h | 13 | ||||
-rw-r--r-- | source/blender/makesrna/RNA_access.h | 1 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_wm.c | 140 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_init_exit.c | 5 |
11 files changed, 330 insertions, 0 deletions
diff --git a/source/blender/blenkernel/BKE_keyconfig.h b/source/blender/blenkernel/BKE_keyconfig.h new file mode 100644 index 00000000000..bef6aab2d82 --- /dev/null +++ b/source/blender/blenkernel/BKE_keyconfig.h @@ -0,0 +1,50 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * ***** END GPL LICENSE BLOCK ***** + */ +#ifndef __BKE_KEYCONFIG_H__ +#define __BKE_KEYCONFIG_H__ + +/** \file BKE_keyconfig.h + * \ingroup bke + */ + +/** Based on #BKE_addon_pref_type_init and friends */ + +/** Actual data is stored in #wmKeyConfigPrefType. */ +#if defined(__RNA_TYPES_H__) +typedef struct wmKeyConfigPrefType_Runtime { + char idname[64]; + + /* RNA integration */ + ExtensionRNA ext; +} wmKeyConfigPrefType_Runtime; + +#else +typedef struct wmKeyConfigPrefType_Runtime wmKeyConfigPrefType_Runtime; +#endif + +/* KeyConfig preferenes. */ +struct wmKeyConfigPrefType_Runtime *BKE_keyconfig_pref_type_find(const char *idname, bool quiet); +void BKE_keyconfig_pref_type_add(struct wmKeyConfigPrefType_Runtime *kpt_rt); +void BKE_keyconfig_pref_type_remove(const struct wmKeyConfigPrefType_Runtime *kpt_rt); + +void BKE_keyconfig_pref_type_init(void); +void BKE_keyconfig_pref_type_free(void); + +#endif /* __BKE_KEYCONFIG_H__ */ diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index 4161a5ecd79..7d09374c99e 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -128,6 +128,7 @@ set(SRC intern/image_gen.c intern/ipo.c intern/key.c + intern/keyconfig.c intern/lamp.c intern/lattice.c intern/library.c @@ -280,6 +281,7 @@ set(SRC BKE_image.h BKE_ipo.h BKE_key.h + BKE_keyconfig.h BKE_lamp.h BKE_lattice.h BKE_library.h diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c index d0dea75860e..b90d4fd3948 100644 --- a/source/blender/blenkernel/intern/blender.c +++ b/source/blender/blenkernel/intern/blender.c @@ -208,6 +208,17 @@ static void userdef_free_keymaps(UserDef *userdef) BLI_listbase_clear(&userdef->user_keymaps); } +static void userdef_free_keyconfig_prefs(UserDef *userdef) +{ + for (wmKeyConfigPrefType *kpt = userdef->user_keyconfig_prefs.first, *kpt_next; kpt; kpt = kpt_next) { + kpt_next = kpt->next; + IDP_FreeProperty(kpt->prop); + MEM_freeN(kpt->prop); + MEM_freeN(kpt); + } + BLI_listbase_clear(&userdef->user_keyconfig_prefs); +} + static void userdef_free_user_menus(UserDef *userdef) { for (bUserMenu *um = userdef->user_menus.first, *um_next; um; um = um_next) { @@ -237,6 +248,7 @@ void BKE_blender_userdef_data_free(UserDef *userdef, bool clear_fonts) #endif userdef_free_keymaps(userdef); + userdef_free_keyconfig_prefs(userdef); userdef_free_user_menus(userdef); userdef_free_addons(userdef); diff --git a/source/blender/blenkernel/intern/keyconfig.c b/source/blender/blenkernel/intern/keyconfig.c new file mode 100644 index 00000000000..46b82569f47 --- /dev/null +++ b/source/blender/blenkernel/intern/keyconfig.c @@ -0,0 +1,93 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/blenkernel/intern/keyconfig.c + * \ingroup bke + */ + +#include <stddef.h> +#include <stdlib.h> + +#include "RNA_types.h" + +#include "BLI_utildefines.h" +#include "BLI_ghash.h" + +#include "DNA_listBase.h" + +#include "BKE_keyconfig.h" /* own include */ + +#include "MEM_guardedalloc.h" + +/* -------------------------------------------------------------------- */ +/** \name Key-Config Preference API + * + * \see #BKE_addon_pref_type_init for logic this is bases on. + * \{ */ + +static GHash *global_keyconfigpreftype_hash = NULL; + + +wmKeyConfigPrefType_Runtime *BKE_keyconfig_pref_type_find(const char *idname, bool quiet) +{ + if (idname[0]) { + wmKeyConfigPrefType_Runtime *kpt_rt; + + kpt_rt = BLI_ghash_lookup(global_keyconfigpreftype_hash, idname); + if (kpt_rt) { + return kpt_rt; + } + + if (!quiet) { + printf("search for unknown keyconfig-pref '%s'\n", idname); + } + } + else { + if (!quiet) { + printf("search for empty keyconfig-pref\n"); + } + } + + return NULL; +} + +void BKE_keyconfig_pref_type_add(wmKeyConfigPrefType_Runtime *kpt_rt) +{ + BLI_ghash_insert(global_keyconfigpreftype_hash, kpt_rt->idname, kpt_rt); +} + +void BKE_keyconfig_pref_type_remove(const wmKeyConfigPrefType_Runtime *kpt_rt) +{ + BLI_ghash_remove(global_keyconfigpreftype_hash, kpt_rt->idname, NULL, MEM_freeN); +} + +void BKE_keyconfig_pref_type_init(void) +{ + BLI_assert(global_keyconfigpreftype_hash == NULL); + global_keyconfigpreftype_hash = BLI_ghash_str_new(__func__); +} + +void BKE_keyconfig_pref_type_free(void) +{ + BLI_ghash_free(global_keyconfigpreftype_hash, NULL, MEM_freeN); + global_keyconfigpreftype_hash = NULL; +} + +/** \} */ diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 4eea35ad89f..90deb0f37ea 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -8914,6 +8914,7 @@ static BHead *read_userdef(BlendFileData *bfd, FileData *fd, BHead *bhead) link_list(fd, &user->themes); link_list(fd, &user->user_keymaps); + link_list(fd, &user->user_keyconfig_prefs); link_list(fd, &user->user_menus); link_list(fd, &user->addons); link_list(fd, &user->autoexec_paths); @@ -8940,6 +8941,11 @@ static BHead *read_userdef(BlendFileData *bfd, FileData *fd, BHead *bhead) direct_link_keymapitem(fd, kmi); } + for (wmKeyConfigPrefType *kpt = user->user_keyconfig_prefs.first; kpt; kpt = kpt->next) { + kpt->prop = newdataadr(fd, kpt->prop); + IDP_DirectLinkGroup_OrFree(&kpt->prop, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd); + } + for (bUserMenu *um = user->user_menus.first; um; um = um->next) { link_list(fd, &um->items); for (bUserMenuItem *umi = um->items.first; umi; umi = umi->next) { diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index fd097927f57..3d4edc2e4da 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -1248,6 +1248,13 @@ static void write_userdef(WriteData *wd, const UserDef *userdef) } } + for (const wmKeyConfigPrefType *kpt = userdef->user_keyconfig_prefs.first; kpt; kpt = kpt->next) { + writestruct(wd, DATA, wmKeyConfigPrefType, 1, kpt); + if (kpt->prop) { + IDP_WriteProperty(kpt->prop, wd); + } + } + for (const bUserMenu *um = userdef->user_menus.first; um; um = um->next) { writestruct(wd, DATA, bUserMenu, 1, um); for (const bUserMenuItem *umi = um->items.first; umi; umi = umi->next) { diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index afff070946e..79a3397b752 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -569,6 +569,7 @@ typedef struct UserDef { struct ListBase uifonts; struct ListBase uistyles; struct ListBase user_keymaps; + struct ListBase user_keyconfig_prefs; /* wmKeyConfigPrefType. */ struct ListBase addons; struct ListBase autoexec_paths; struct ListBase user_menus; /* bUserMenu */ diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h index 26ab24d8f9d..88974750ffb 100644 --- a/source/blender/makesdna/DNA_windowmanager_types.h +++ b/source/blender/makesdna/DNA_windowmanager_types.h @@ -348,6 +348,19 @@ enum { KEYMAP_TOOL = (1 << 7), /* keymap for active tool system */ }; +/** + * This is similar to addon-preferences, + * however unlike add-ons key-config's aren't saved to disk. + * + * #wmKeyConfigPrefType is written to DNA, + * #wmKeyConfigPrefType_Runtime has the RNA type. + */ +typedef struct wmKeyConfigPrefType { + struct wmKeyConfigPrefType *next, *prev; + char idname[64]; /* unique name */ + IDProperty *prop; +} wmKeyConfigPrefType; + typedef struct wmKeyConfig { struct wmKeyConfig *next, *prev; diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index a74479e193c..f540930b1d5 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -307,6 +307,7 @@ extern StructRNA RNA_Itasc; extern StructRNA RNA_JoystickSensor; extern StructRNA RNA_Key; extern StructRNA RNA_KeyConfig; +extern StructRNA RNA_KeyConfigPreferences; extern StructRNA RNA_KeyMap; extern StructRNA RNA_KeyMapItem; extern StructRNA RNA_KeyMapItems; diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c index d7c256c2223..6ad5e365e03 100644 --- a/source/blender/makesrna/intern/rna_wm.c +++ b/source/blender/makesrna/intern/rna_wm.c @@ -37,6 +37,7 @@ #include "BLT_translation.h" #include "BKE_workspace.h" +#include "BKE_keyconfig.h" #include "RNA_access.h" #include "RNA_define.h" @@ -986,6 +987,117 @@ static void rna_WindowManager_active_keyconfig_set(PointerRNA *ptr, PointerRNA v WM_keyconfig_set_active(wm, kc->idname); } +/* -------------------------------------------------------------------- */ +/** \name Key Config Preferences + * \{ */ + +static PointerRNA rna_wmKeyConfig_preferences_get(PointerRNA *ptr) +{ + wmKeyConfig *kc = ptr->data; + wmKeyConfigPrefType_Runtime *kpt_rt = BKE_keyconfig_pref_type_find(kc->idname, true); + if (kpt_rt) { + wmKeyConfigPrefType *kpt = BLI_findstring( + &U.user_keyconfig_prefs, kc->idname, offsetof(wmKeyConfigPrefType, idname)); + if (kpt == NULL) { + kpt = MEM_callocN(sizeof(*kpt), __func__); + STRNCPY(kpt->idname, kc->idname); + BLI_addtail(&U.user_keyconfig_prefs, kpt); + } + if (kpt->prop == NULL) { + IDPropertyTemplate val = {0}; + kpt->prop = IDP_New(IDP_GROUP, &val, kc->idname); /* name is unimportant */ + } + return rna_pointer_inherit_refine(ptr, kpt_rt->ext.srna, kpt->prop); + } + else { + return PointerRNA_NULL; + } +} + +static IDProperty *rna_wmKeyConfigPref_idprops(PointerRNA *ptr, bool create) +{ + if (create && !ptr->data) { + IDPropertyTemplate val = {0}; + ptr->data = IDP_New(IDP_GROUP, &val, "RNA_KeyConfigPreferences group"); + } + return ptr->data; +} + +static void rna_wmKeyConfigPref_unregister(Main *UNUSED(bmain), StructRNA *type) +{ + wmKeyConfigPrefType_Runtime *kpt_rt = RNA_struct_blender_type_get(type); + + if (!kpt_rt) + return; + + RNA_struct_free_extension(type, &kpt_rt->ext); + RNA_struct_free(&BLENDER_RNA, type); + + /* Possible we're not in the preferences if they have been reset. */ + BKE_keyconfig_pref_type_remove(kpt_rt); + + /* update while blender is running */ + WM_main_add_notifier(NC_WINDOW, NULL); +} + +static StructRNA *rna_wmKeyConfigPref_register( + Main *bmain, ReportList *reports, void *data, const char *identifier, + StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free) +{ + wmKeyConfigPrefType_Runtime *kpt_rt, dummy_kpt_rt = {{'\0'}}; + wmKeyConfigPrefType dummy_kpt = {NULL}; + PointerRNA dummy_ptr; + // int have_function[1]; + + /* setup dummy keyconf-prefs & keyconf-prefs type to store static properties in */ + RNA_pointer_create(NULL, &RNA_KeyConfigPreferences, &dummy_kpt, &dummy_ptr); + + /* validate the python class */ + if (validate(&dummy_ptr, data, NULL /* have_function */ ) != 0) + return NULL; + + STRNCPY(dummy_kpt_rt.idname, dummy_kpt.idname); + if (strlen(identifier) >= sizeof(dummy_kpt_rt.idname)) { + BKE_reportf(reports, RPT_ERROR, "Registering key-config preferences class: '%s' is too long, maximum length is %d", + identifier, (int)sizeof(dummy_kpt_rt.idname)); + return NULL; + } + + /* check if we have registered this keyconf-prefs type before, and remove it */ + kpt_rt = BKE_keyconfig_pref_type_find(dummy_kpt.idname, true); + if (kpt_rt && kpt_rt->ext.srna) { + rna_wmKeyConfigPref_unregister(bmain, kpt_rt->ext.srna); + } + + /* create a new keyconf-prefs type */ + kpt_rt = MEM_mallocN(sizeof(wmKeyConfigPrefType_Runtime), "keyconfigpreftype"); + memcpy(kpt_rt, &dummy_kpt_rt, sizeof(dummy_kpt_rt)); + + BKE_keyconfig_pref_type_add(kpt_rt); + + kpt_rt->ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, identifier, &RNA_KeyConfigPreferences); + kpt_rt->ext.data = data; + kpt_rt->ext.call = call; + kpt_rt->ext.free = free; + RNA_struct_blender_type_set(kpt_rt->ext.srna, kpt_rt); + +// kpt_rt->draw = (have_function[0]) ? header_draw : NULL; + + /* update while blender is running */ + WM_main_add_notifier(NC_WINDOW, NULL); + + return kpt_rt->ext.srna; +} + +/* placeholder, doesn't do anything useful yet */ +static StructRNA *rna_wmKeyConfigPref_refine(PointerRNA *ptr) +{ + return (ptr->type) ? ptr->type : &RNA_KeyConfigPreferences; +} + +/** \} */ + + static void rna_wmKeyMapItem_idname_get(PointerRNA *ptr, char *value) { wmKeyMapItem *kmi = ptr->data; @@ -2198,6 +2310,28 @@ static void rna_def_wm_keymaps(BlenderRNA *brna, PropertyRNA *cprop) RNA_api_keymaps(srna); } +static void rna_def_keyconfig_prefs(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + srna = RNA_def_struct(brna, "KeyConfigPreferences", NULL); + RNA_def_struct_ui_text(srna, "Key-Config Preferences", ""); + RNA_def_struct_sdna(srna, "wmKeyConfigPrefType"); /* WARNING: only a bAddon during registration */ + + RNA_def_struct_refine_func(srna, "rna_wmKeyConfigPref_refine"); + RNA_def_struct_register_funcs(srna, "rna_wmKeyConfigPref_register", "rna_wmKeyConfigPref_unregister", NULL); + RNA_def_struct_idprops_func(srna, "rna_wmKeyConfigPref_idprops"); + RNA_def_struct_flag(srna, STRUCT_NO_DATABLOCK_IDPROPERTIES); /* Mandatory! */ + + /* registration */ + RNA_define_verify_sdna(0); + prop = RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "idname"); + RNA_def_property_flag(prop, PROP_REGISTER); + RNA_define_verify_sdna(1); +} + static void rna_def_keyconfig(BlenderRNA *brna) { StructRNA *srna; @@ -2237,6 +2371,11 @@ static void rna_def_keyconfig(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "has_select_mouse", 1); RNA_def_property_ui_text(prop, "Has Select Mouse", "Configuration supports select mouse switching"); + /* Collection active property */ + prop = RNA_def_property(srna, "preferences", PROP_POINTER, PROP_NONE); + RNA_def_property_struct_type(prop, "KeyConfigPreferences"); + RNA_def_property_pointer_funcs(prop, "rna_wmKeyConfig_preferences_get", NULL, NULL, NULL); + RNA_api_keyconfig(srna); /* KeyMap */ @@ -2441,6 +2580,7 @@ void RNA_def_wm(BlenderRNA *brna) rna_def_piemenu(brna); rna_def_window(brna); rna_def_windowmanager(brna); + rna_def_keyconfig_prefs(brna); rna_def_keyconfig(brna); } diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c index 52f609700b3..e6114b44221 100644 --- a/source/blender/windowmanager/intern/wm_init_exit.c +++ b/source/blender/windowmanager/intern/wm_init_exit.c @@ -70,6 +70,7 @@ #include "BKE_node.h" #include "BKE_report.h" #include "BKE_screen.h" +#include "BKE_keyconfig.h" #include "BKE_addon.h" #include "BKE_appdir.h" @@ -207,6 +208,7 @@ void WM_init(bContext *C, int argc, const char **argv) GHOST_CreateSystemPaths(); BKE_addon_pref_type_init(); + BKE_keyconfig_pref_type_init(); wm_operatortype_init(); wm_operatortypes_register(); @@ -459,7 +461,10 @@ void WM_exit_ext(bContext *C, const bool do_python) } WM_paneltype_clear(); + BKE_addon_pref_type_free(); + BKE_keyconfig_pref_type_free(); + wm_operatortype_free(); wm_dropbox_free(); WM_menutype_free(); |