Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/BKE_keyconfig.h50
-rw-r--r--source/blender/blenkernel/CMakeLists.txt2
-rw-r--r--source/blender/blenkernel/intern/blender.c12
-rw-r--r--source/blender/blenkernel/intern/keyconfig.c93
-rw-r--r--source/blender/blenloader/intern/readfile.c6
-rw-r--r--source/blender/blenloader/intern/writefile.c7
-rw-r--r--source/blender/makesdna/DNA_userdef_types.h1
-rw-r--r--source/blender/makesdna/DNA_windowmanager_types.h13
-rw-r--r--source/blender/makesrna/RNA_access.h1
-rw-r--r--source/blender/makesrna/intern/rna_wm.c140
-rw-r--r--source/blender/windowmanager/intern/wm_init_exit.c5
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();