wmKeyMap *WM_keymap_find(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid) { wmKeyMap *km= WM_keymap_list_find(&keyconf->keymaps, idname, spaceid, regionid); if(km==NULL) { km= wm_keymap_new(idname, spaceid, regionid); BLI_addtail(&keyconf->keymaps, km); WM_keyconfig_update_tag(km, NULL); } return km; }
static void wm_keymap_diff_update(ListBase *lb, wmKeyMap *defaultmap, wmKeyMap *addonmap, wmKeyMap *km) { wmKeyMap *diffmap, *prevmap, *origmap; /* create temporary default + addon keymap for diff */ origmap = defaultmap; if (addonmap) { defaultmap = wm_keymap_copy(defaultmap); wm_keymap_addon_add(defaultmap, addonmap); } /* remove previous diff keymap in list, we will replace it */ prevmap = WM_keymap_list_find(lb, km->idname, km->spaceid, km->regionid); if (prevmap) { WM_keymap_free(prevmap); BLI_freelinkN(lb, prevmap); } /* create diff keymap */ diffmap = wm_keymap_new(km->idname, km->spaceid, km->regionid); diffmap->flag |= KEYMAP_DIFF; if (defaultmap->flag & KEYMAP_MODAL) diffmap->flag |= KEYMAP_MODAL; wm_keymap_diff(diffmap, defaultmap, km, origmap, addonmap); /* add to list if not empty */ if (diffmap->diff_items.first) { BLI_addtail(lb, diffmap); } else { WM_keymap_free(diffmap); MEM_freeN(diffmap); } /* free temporary default map */ if (addonmap) { WM_keymap_free(defaultmap); MEM_freeN(defaultmap); } }