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:
authorTon Roosendaal <ton@blender.org>2008-12-08 18:02:57 +0300
committerTon Roosendaal <ton@blender.org>2008-12-08 18:02:57 +0300
commit02e23c16dd9e403deb1694829c11d16dc47392ee (patch)
treef5ec9e3f68bad13137bdeafa326281c74387327e
parent11e15bf68979670b2257814aa296886222b3ee40 (diff)
2.5
Part one of wrapping up area/region management. Read design doc here: http://wiki.blender.org/index.php/BlenderDev/Blender2.5/AreaManager This commit: - brings keymap storage to WM, based on names/types. This structure allows rna-ifying it too, so you can browse keymaps etc. - creating areas and regions works slightly different now, wich regiontypes stored in areatype. Todo: - better callbacks and structure for defining which handlers need to be added. - using region types to validate regions - proper implementation of local region data - code method for customizing keymaps. Current idea is that you have to indicate an entire keymap to be custom, to prevent too complicated merging problems of default and custom maps (like order, multiple keys for same operator, disabling options, etc).
-rw-r--r--source/blender/blenkernel/BKE_screen.h32
-rw-r--r--source/blender/blenkernel/intern/blender.c4
-rw-r--r--source/blender/blenkernel/intern/screen.c33
-rw-r--r--source/blender/blenloader/intern/readfile.c6
-rw-r--r--source/blender/editors/include/ED_screen.h3
-rw-r--r--source/blender/editors/interface/interface_ops.c4
-rw-r--r--source/blender/editors/interface/interface_regions.c9
-rw-r--r--source/blender/editors/interface/view2d_ops.c24
-rw-r--r--source/blender/editors/screen/screen_ops.c16
-rw-r--r--source/blender/editors/screen/spacetypes.c20
-rw-r--r--source/blender/editors/space_outliner/space_outliner.c80
-rw-r--r--source/blender/editors/space_time/space_time.c101
-rw-r--r--source/blender/editors/space_time/time_ops.c26
-rw-r--r--source/blender/editors/space_view3d/space_view3d.c20
-rw-r--r--source/blender/makesdna/DNA_windowmanager_types.h22
-rw-r--r--source/blender/windowmanager/WM_api.h4
-rw-r--r--source/blender/windowmanager/intern/wm.c11
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c30
-rw-r--r--source/blender/windowmanager/intern/wm_keymap.c89
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c10
-rw-r--r--source/blender/windowmanager/intern/wm_window.c10
-rw-r--r--source/blender/windowmanager/wm_event_system.h6
22 files changed, 353 insertions, 207 deletions
diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index 129093f6078..49e6b20725d 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -40,13 +40,15 @@ struct wmWindowManager;
struct ListBase;
/* spacetype has everything stored to get an editor working, it gets initialized via
-spacetypes_init() in editors/area/spacetypes.c */
+ ED_spacetypes_init() in editors/area/spacetypes.c */
/* an editor in Blender is a combined ScrArea + SpaceType + SpaceData */
+#define BKE_ST_MAXNAME 32
+
typedef struct SpaceType {
struct SpaceType *next, *prev;
- char name[32]; /* for menus */
+ char name[BKE_ST_MAXNAME]; /* for menus */
int spaceid; /* unique space identifier */
int iconid; /* icon lookup for menus */
@@ -56,7 +58,7 @@ typedef struct SpaceType {
void (*free)(struct SpaceLink *);
/* init is to cope with internal contextual changes, adds handlers,
- * sets screarea regions */
+ * creates/sets screarea regions */
void (*init)(struct wmWindowManager *, struct ScrArea *);
/* refresh is for external bContext changes */
void (*refresh)(struct bContext *, struct ScrArea *);
@@ -66,23 +68,35 @@ typedef struct SpaceType {
/* register operator types on startup */
void (*operatortypes)(void);
- /* add default items to keymap */
+ /* add default items to WM keymap */
void (*keymap)(struct wmWindowManager *);
+ /* region type definitions */
+ ListBase regiontypes;
+
/* read and write... */
} SpaceType;
-/* region type gets allocated and freed in spacetype init/free callback */
-/* data storage for regions is in space struct (also width/height of regions!) */
+/* region types are also defined using spacetypes_init, via a callback */
+
typedef struct ARegionType {
+ struct ARegionType *next, *prev;
+
+ int regionid; /* unique identifier within this space */
void (*init)(const struct bContext *, struct ARegion *); /* add handlers, stuff you only do once or on area/region changes */
- void (*refresh)(const struct bContext *, struct ARegion *); /* refresh to match contextual changes */
+ void (*refresh)(const struct bContext *, struct ARegion *); /* refresh to match contextual changes */
void (*draw)(const struct bContext *, struct ARegion *); /* draw entirely, windowsize changes should be handled here */
void (*listener)(struct ARegion *, struct wmNotifier *);
void (*free)(struct ARegion *);
+
+ /* register operator types on startup */
+ void (*operatortypes)(void);
+ /* add default items to keymap */
+ void (*keymap)(struct wmWindowManager *);
+
} ARegionType;
@@ -90,9 +104,13 @@ void BKE_screen_area_free(struct ScrArea *sa);
void BKE_area_region_free(struct ARegion *ar);
void free_screen(struct bScreen *sc);
+/* spacetypes */
struct SpaceType *BKE_spacetype_from_id(int spaceid);
const struct ListBase *BKE_spacetypes_list(void);
void BKE_spacetype_register(struct SpaceType *st);
+void BKE_spacetypes_free(void); /* only for quitting blender */
+
+/* spacedata */
void BKE_spacedata_freelist(ListBase *lb);
void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2);
diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c
index b63d63c925c..e5625fa03e0 100644
--- a/source/blender/blenkernel/intern/blender.c
+++ b/source/blender/blenkernel/intern/blender.c
@@ -77,6 +77,7 @@
#include "BKE_node.h"
#include "BKE_object.h"
#include "BKE_scene.h"
+#include "BKE_screen.h"
#include "BKE_sound.h"
#include "BLI_editVert.h"
@@ -166,6 +167,7 @@ void pushpop_test()
/* ********** free ********** */
+/* only to be called on exit blender */
void free_blender(void)
{
/* samples are in a global list..., also sets G.main->sound->sample NULL */
@@ -174,6 +176,8 @@ void free_blender(void)
free_main(G.main);
G.main= NULL;
+ BKE_spacetypes_free(); /* after free main, it uses space callbacks */
+
IMB_freeImBufdata(); /* imbuf lib */
free_nodesystem();
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index 266a387732e..8332e7baea1 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -31,8 +31,11 @@
#include <stdio.h>
#include <math.h>
+#include "MEM_guardedalloc.h"
+
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
+
#include "BLI_blenlib.h"
#include "BKE_screen.h"
@@ -41,9 +44,27 @@
#include "BPY_extern.h"
#endif
+/* ************ Spacetype/regiontype handling ************** */
+
/* keep global; this has to be accessible outside of windowmanager */
static ListBase spacetypes= {NULL, NULL};
+/* not SpaceType itself */
+static void spacetype_free(SpaceType *st)
+{
+ BLI_freelistN(&st->regiontypes);
+}
+
+void BKE_spacetypes_free(void)
+{
+ SpaceType *st;
+
+ for(st= spacetypes.first; st; st= st->next)
+ spacetype_free(st);
+
+ BLI_freelistN(&spacetypes);
+}
+
SpaceType *BKE_spacetype_from_id(int spaceid)
{
SpaceType *st;
@@ -62,9 +83,21 @@ const ListBase *BKE_spacetypes_list()
void BKE_spacetype_register(SpaceType *st)
{
+ SpaceType *stype;
+
+ /* sanity check */
+ stype= BKE_spacetype_from_id(st->spaceid);
+ if(stype) {
+ printf("error: redefinition of spacetype %s\n", stype->name);
+ spacetype_free(stype);
+ MEM_freeN(stype);
+ }
+
BLI_addtail(&spacetypes, st);
}
+/* ***************** Space handling ********************** */
+
void BKE_spacedata_freelist(ListBase *lb)
{
SpaceLink *sl;
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 75733e8d6d1..71ef913e488 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -3784,11 +3784,7 @@ static void direct_link_windowmanager(FileData *fd, wmWindowManager *wm)
}
wm->operators.first= wm->operators.last= NULL;
- wm->windowkeymap.first= wm->windowkeymap.last= NULL;
- wm->screenkeymap.first= wm->screenkeymap.last= NULL;
- wm->view2dkeymap.first= wm->view2dkeymap.last= NULL;
- wm->uikeymap.first= wm->uikeymap.last= NULL;
- wm->timekeymap.first= wm->timekeymap.last= NULL;
+ wm->keymaps.first= wm->keymaps.last= NULL;
wm->queue.first= wm->queue.last= NULL;
wm->reports.first= wm->reports.last= NULL;
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index 2514c4c90fd..2c86b5076b0 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -36,6 +36,8 @@
struct wmWindowManager;
struct wmWindow;
struct wmNotifier;
+struct SpaceType;
+struct AreagionType;
/* regions */
void ED_region_initialize(struct wmWindowManager *wm, struct wmWindow *win, struct ARegion *ar);
@@ -48,6 +50,7 @@ void ED_region_pixelspace(const struct bContext *C, ARegion *ar);
/* spaces */
void ED_spacetypes_init(void);
void ED_spacetypes_keymap(struct wmWindowManager *wm);
+struct ARegionType *ED_regiontype_from_id(struct SpaceType *st, int regionid);
/* areas */
void ED_area_initialize(struct wmWindowManager *wm, struct wmWindow *win, struct ScrArea *sa);
diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c
index 32bebab2180..a256a207e70 100644
--- a/source/blender/editors/interface/interface_ops.c
+++ b/source/blender/editors/interface/interface_ops.c
@@ -3511,8 +3511,8 @@ void ui_operatortypes(void)
void UI_keymap(wmWindowManager *wm)
{
- ui_operatortypes();
+ ListBase *keymap= WM_keymap_listbase(wm, "Interface", 0, 0);
- WM_keymap_add_item(&wm->uikeymap, "ED_UI_OT_button_activate", MOUSEMOVE, 0, 0, 0);
+ WM_keymap_add_item(keymap, "ED_UI_OT_button_activate", MOUSEMOVE, 0, 0, 0);
}
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index f7029700f9c..fec3038ca88 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -277,7 +277,7 @@ static void ui_tooltip_region_free(ARegion *ar)
ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
{
- static ARegionType type={NULL, NULL, NULL, NULL, NULL};
+ static ARegionType type;
ARegion *ar;
uiTooltipData *data;
int x1, x2, y1, y2, winx, winy;
@@ -288,6 +288,7 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
/* create area region */
ar= ui_add_temporary_region(C->window->screen);
+ memset(&type, 0, sizeof(ARegionType));
type.draw= ui_tooltip_region_draw;
type.free= ui_tooltip_region_free;
ar->type= &type;
@@ -596,7 +597,8 @@ static void ui_block_region_free(ARegion *ar)
uiMenuBlockHandle *ui_menu_block_create(bContext *C, ARegion *butregion, uiBut *but, uiBlockFuncFP block_func, void *arg)
{
- static ARegionType type={NULL, NULL, NULL, NULL, NULL};
+ static ARegionType type;
+ ListBase *keymap= WM_keymap_listbase(C->wm, "Interface", 0, 0);
ARegion *ar;
uiBlock *block;
uiBut *bt;
@@ -609,11 +611,12 @@ uiMenuBlockHandle *ui_menu_block_create(bContext *C, ARegion *butregion, uiBut *
/* create area region */
ar= ui_add_temporary_region(C->window->screen);
+ memset(&type, 0, sizeof(ARegionType));
type.draw= ui_block_region_draw;
type.free= ui_block_region_free;
ar->type= &type;
- WM_event_add_keymap_handler(&ar->handlers, &C->wm->uikeymap);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
handle->region= ar;
ar->regiondata= handle;
diff --git a/source/blender/editors/interface/view2d_ops.c b/source/blender/editors/interface/view2d_ops.c
index d784b1c7743..57264bb1342 100644
--- a/source/blender/editors/interface/view2d_ops.c
+++ b/source/blender/editors/interface/view2d_ops.c
@@ -1160,27 +1160,27 @@ void ui_view2d_operatortypes(void)
void UI_view2d_keymap(wmWindowManager *wm)
{
- ui_view2d_operatortypes();
+ ListBase *keymap= WM_keymap_listbase(wm, "View2D", 0, 0);
/* pan/scroll */
- WM_keymap_add_item(&wm->view2dkeymap, "ED_View2D_OT_view_pan", MIDDLEMOUSE, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "ED_View2D_OT_view_pan", MIDDLEMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(&wm->view2dkeymap, "ED_View2D_OT_view_rightscroll", WHEELDOWNMOUSE, KM_ANY, KM_CTRL, 0);
- WM_keymap_add_item(&wm->view2dkeymap, "ED_View2D_OT_view_leftscroll", WHEELUPMOUSE, KM_ANY, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "ED_View2D_OT_view_rightscroll", WHEELDOWNMOUSE, KM_ANY, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "ED_View2D_OT_view_leftscroll", WHEELUPMOUSE, KM_ANY, KM_CTRL, 0);
- WM_keymap_add_item(&wm->view2dkeymap, "ED_View2D_OT_view_downscroll", WHEELDOWNMOUSE, KM_ANY, KM_SHIFT, 0);
- WM_keymap_add_item(&wm->view2dkeymap, "ED_View2D_OT_view_upscroll", WHEELUPMOUSE, KM_ANY, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "ED_View2D_OT_view_downscroll", WHEELDOWNMOUSE, KM_ANY, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "ED_View2D_OT_view_upscroll", WHEELUPMOUSE, KM_ANY, KM_SHIFT, 0);
/* zoom - single step */
- WM_keymap_add_item(&wm->view2dkeymap, "ED_View2D_OT_view_zoomout", WHEELUPMOUSE, KM_ANY, 0, 0);
- WM_keymap_add_item(&wm->view2dkeymap, "ED_View2D_OT_view_zoomin", WHEELDOWNMOUSE, KM_ANY, 0, 0);
- WM_keymap_add_item(&wm->view2dkeymap, "ED_View2D_OT_view_zoomout", PADMINUS, KM_PRESS, 0, 0);
- WM_keymap_add_item(&wm->view2dkeymap, "ED_View2D_OT_view_zoomin", PADPLUSKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "ED_View2D_OT_view_zoomout", WHEELUPMOUSE, KM_ANY, 0, 0);
+ WM_keymap_add_item(keymap, "ED_View2D_OT_view_zoomin", WHEELDOWNMOUSE, KM_ANY, 0, 0);
+ WM_keymap_add_item(keymap, "ED_View2D_OT_view_zoomout", PADMINUS, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "ED_View2D_OT_view_zoomin", PADPLUSKEY, KM_PRESS, 0, 0);
/* zoom - drag */
- WM_keymap_add_item(&wm->view2dkeymap, "ED_View2D_OT_view_zoom", MIDDLEMOUSE, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "ED_View2D_OT_view_zoom", MIDDLEMOUSE, KM_PRESS, KM_CTRL, 0);
/* scrollers */
- WM_keymap_add_item(&wm->view2dkeymap, "ED_View2D_OT_scroller_activate", LEFTMOUSE, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "ED_View2D_OT_scroller_activate", LEFTMOUSE, KM_PRESS, 0, 0);
}
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index da26b3dc297..e78beec3488 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -1327,14 +1327,16 @@ void ED_operatortypes_screen(void)
/* called in spacetypes.c */
void ED_keymap_screen(wmWindowManager *wm)
{
- WM_keymap_verify_item(&wm->screenkeymap, "ED_SCR_OT_cursor_type", MOUSEMOVE, 0, 0, 0);
- WM_keymap_verify_item(&wm->screenkeymap, "ED_SCR_OT_actionzone", LEFTMOUSE, KM_PRESS, 0, 0);
+ ListBase *keymap= WM_keymap_listbase(wm, "Screen", 0, 0);
- WM_keymap_verify_item(&wm->screenkeymap, "ED_SCR_OT_area_move", LEFTMOUSE, KM_PRESS, 0, 0);
- WM_keymap_verify_item(&wm->screenkeymap, "ED_SCR_OT_area_split", EVT_ACTIONZONE, 0, 0, 0); /* action tria */
- WM_keymap_verify_item(&wm->screenkeymap, "ED_SCR_OT_area_join", EVT_ACTIONZONE, 0, 0, 0); /* action tria */
- WM_keymap_verify_item(&wm->screenkeymap, "ED_SCR_OT_area_rip", RKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_verify_item(keymap, "ED_SCR_OT_cursor_type", MOUSEMOVE, 0, 0, 0);
+ WM_keymap_verify_item(keymap, "ED_SCR_OT_actionzone", LEFTMOUSE, KM_PRESS, 0, 0);
+
+ WM_keymap_verify_item(keymap, "ED_SCR_OT_area_move", LEFTMOUSE, KM_PRESS, 0, 0);
+ WM_keymap_verify_item(keymap, "ED_SCR_OT_area_split", EVT_ACTIONZONE, 0, 0, 0); /* action tria */
+ WM_keymap_verify_item(keymap, "ED_SCR_OT_area_join", EVT_ACTIONZONE, 0, 0, 0); /* action tria */
+ WM_keymap_verify_item(keymap, "ED_SCR_OT_area_rip", RKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_verify_item(&wm->screenkeymap, "ED_SCR_OT_repeat_last", F4KEY, KM_PRESS, 0, 0);
+ WM_keymap_verify_item(keymap, "ED_SCR_OT_repeat_last", F4KEY, KM_PRESS, 0, 0);
}
diff --git a/source/blender/editors/screen/spacetypes.c b/source/blender/editors/screen/spacetypes.c
index a74b3a20e4e..bafb8aef94f 100644
--- a/source/blender/editors/screen/spacetypes.c
+++ b/source/blender/editors/screen/spacetypes.c
@@ -43,8 +43,20 @@
#include "screen_intern.h" /* own module include */
+ARegionType *ED_regiontype_from_id(SpaceType *st, int regionid)
+{
+ ARegionType *art;
+
+ for(art= st->regiontypes.first; art; art= art->next)
+ if(art->regionid==regionid)
+ return art;
+
+ printf("Error, region type missing in %s\n", st->name);
+ return st->regiontypes.first;
+}
-/* only call once on startup, storage is static data (no malloc!) in kernel listbase */
+
+/* only call once on startup, storage is global in BKE kernel listbase */
void ED_spacetypes_init(void)
{
const ListBase *spacetypes;
@@ -59,13 +71,17 @@ void ED_spacetypes_init(void)
/* register operator types for screen and all spaces */
ED_operatortypes_screen();
-
+ ui_operatortypes();
+ ui_view2d_operatortypes();
+
spacetypes = BKE_spacetypes_list();
for(type=spacetypes->first; type; type=type->next)
type->operatortypes();
}
/* called in wm.c */
+/* keymap definitions are registered only once per WM initialize, usually on file read,
+ using the keymap the actual areas/regions add the handlers */
void ED_spacetypes_keymap(wmWindowManager *wm)
{
const ListBase *spacetypes;
diff --git a/source/blender/editors/space_outliner/space_outliner.c b/source/blender/editors/space_outliner/space_outliner.c
index 07f6253feb3..399a7f08205 100644
--- a/source/blender/editors/space_outliner/space_outliner.c
+++ b/source/blender/editors/space_outliner/space_outliner.c
@@ -52,6 +52,7 @@
#include "BKE_utildefines.h"
#include "ED_area.h"
+#include "ED_screen.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -496,37 +497,27 @@ static void outliner_init(wmWindowManager *wm, ScrArea *sa)
ARegion *ar;
/* link area to SpaceXXX struct */
+ sa->type= BKE_spacetype_from_id(SPACE_OOPS);
/* add handlers to area */
/* define how many regions, the order and types */
- /* add types to regions */
+ /* add types to regions, check handlers */
for(ar= sa->regionbase.first; ar; ar= ar->next) {
- if(ar->regiontype == RGN_TYPE_WINDOW) {
- static ARegionType mainart={NULL, NULL, NULL, NULL, NULL};
+
+ ar->type= ED_regiontype_from_id(sa->type, ar->regiontype); /* XXX fix type and id */
+
+ if(ar->handlers.first==NULL) {
+ ListBase *keymap;
+
+ /* XXX fixme, should be smarter */
+
+ keymap= WM_keymap_listbase(wm, "Interface", 0, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+
+ keymap= WM_keymap_listbase(wm, "View2D", 0, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
- mainart.draw= outliner_main_area_draw;
- mainart.free= outliner_main_area_free;
-
- ar->type= &mainart;
-
- WM_event_add_keymap_handler(&ar->handlers, &wm->uikeymap);
- WM_event_add_keymap_handler(&ar->handlers, &wm->view2dkeymap);
- }
- else if(ar->regiontype == RGN_TYPE_HEADER) {
- static ARegionType headerart={NULL, NULL, NULL, NULL, NULL};
-
- headerart.draw= outliner_header_area_draw;
- headerart.free= outliner_header_area_free;
-
- ar->type= &headerart;
-
- WM_event_add_keymap_handler(&ar->handlers, &wm->uikeymap);
- WM_event_add_keymap_handler(&ar->handlers, &wm->view2dkeymap);
- }
- else {
- static ARegionType headerart={NULL, NULL, NULL, NULL, NULL};
- ar->type= &headerart;
}
}
}
@@ -551,18 +542,37 @@ static SpaceLink *outliner_duplicate(SpaceLink *sl)
/* only called once, from screen/spacetypes.c */
void ED_spacetype_outliner(void)
{
- static SpaceType st;
+ SpaceType *st= MEM_callocN(sizeof(SpaceType), "spacetype time");
+ ARegionType *art;
+
+ st->spaceid= SPACE_OOPS;
+ strncpy(st->name, "Outliner", BKE_ST_MAXNAME);
+
+ st->new= outliner_new;
+ st->free= outliner_free;
+ st->init= outliner_init;
+ st->refresh= outliner_refresh;
+ st->duplicate= outliner_duplicate;
+ st->operatortypes= outliner_operatortypes;
+ st->keymap= outliner_keymap;
+
+ /* regions: main window */
+ art= MEM_callocN(sizeof(ARegionType), "spacetype time region");
+ art->regionid = RGN_TYPE_WINDOW;
+
+ art->draw= outliner_main_area_draw;
+ art->free= outliner_main_area_free;
+ BLI_addhead(&st->regiontypes, art);
+
+ /* regions: header */
+ art= MEM_callocN(sizeof(ARegionType), "spacetype time region");
+ art->regionid = RGN_TYPE_HEADER;
- st.spaceid= SPACE_OOPS;
+ art->draw= outliner_header_area_draw;
+ art->free= outliner_header_area_free;
+ BLI_addhead(&st->regiontypes, art);
- st.new= outliner_new;
- st.free= outliner_free;
- st.init= outliner_init;
- st.refresh= outliner_refresh;
- st.duplicate= outliner_duplicate;
- st.operatortypes= outliner_operatortypes;
- st.keymap= outliner_keymap;
- BKE_spacetype_register(&st);
+ BKE_spacetype_register(st);
}
diff --git a/source/blender/editors/space_time/space_time.c b/source/blender/editors/space_time/space_time.c
index bb9a99ec577..29b3b4559cb 100644
--- a/source/blender/editors/space_time/space_time.c
+++ b/source/blender/editors/space_time/space_time.c
@@ -36,10 +36,13 @@
#include "MEM_guardedalloc.h"
+#include "BLI_blenlib.h"
+
#include "BKE_global.h"
#include "BKE_screen.h"
#include "ED_area.h"
+#include "ED_screen.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -226,52 +229,38 @@ static void time_free(SpaceLink *sl)
{
}
+
/* spacetype; init callback */
+/* init is called to (re)initialize an existing editor (file read, screen changes) */
static void time_init(wmWindowManager *wm, ScrArea *sa)
{
ARegion *ar;
/* link area to SpaceXXX struct */
+ sa->type= BKE_spacetype_from_id(SPACE_TIME);
/* add handlers to area */
/* define how many regions, the order and types */
- /* add types to regions */
+ /* add types to regions, check handlers */
for(ar= sa->regionbase.first; ar; ar= ar->next) {
- if(ar->regiontype == RGN_TYPE_WINDOW) {
- static ARegionType mainart={NULL, NULL, NULL, NULL, NULL};
-
- mainart.init= time_main_area_init;
- mainart.refresh= time_main_area_refresh;
- mainart.draw= time_main_area_draw;
- mainart.listener= time_main_area_listener;
-
- ar->type= &mainart;
-
- /* XXX the windowmanager may not be the best place to keep these
- * keymaps, and this function callback may not be the best one
- * to add the keymap handler, also will need to take care of
- * area type changes, etc, basically space callbacks need to
- * be looked at further */
- WM_event_remove_keymap_handler(&ar->handlers, &wm->timekeymap);
- WM_event_add_keymap_handler(&ar->handlers, &wm->timekeymap);
- WM_event_add_keymap_handler(&ar->handlers, &wm->view2dkeymap); // XXX this should be added automatically!
- }
- else if(ar->regiontype == RGN_TYPE_HEADER) {
- static ARegionType headerart={NULL, NULL, NULL, NULL, NULL};
-
- headerart.draw= time_header_area_draw;
- headerart.free= time_header_area_free;
-
- ar->type= &headerart;
- WM_event_add_keymap_handler(&ar->handlers, &wm->uikeymap);
- WM_event_add_keymap_handler(&ar->handlers, &wm->view2dkeymap); // XXX this should be added automatically!
- }
- else {
- static ARegionType art={NULL, NULL, NULL, NULL, NULL};
-
- /* for time being; register 1 type */
- ar->type= &art;
+
+ ar->type= ED_regiontype_from_id(sa->type, ar->regiontype); /* XXX fix type and id */
+
+ if(ar->handlers.first==NULL) {
+ ListBase *keymap;
+
+ /* XXX fixme, should be smarter */
+
+ keymap= WM_keymap_listbase(wm, "Interface", 0, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+
+ /* own keymap */
+ keymap= WM_keymap_listbase(wm, "TimeLine", sa->spacetype, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+
+ keymap= WM_keymap_listbase(wm, "View2D", 0, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
}
}
}
@@ -291,20 +280,42 @@ static SpaceLink *time_duplicate(SpaceLink *sl)
}
/* only called once, from screen/spacetypes.c */
+/* it defines all callbacks to maintain spaces */
void ED_spacetype_time(void)
{
- static SpaceType st;
+ SpaceType *st= MEM_callocN(sizeof(SpaceType), "spacetype time");
+ ARegionType *art;
+
+ st->spaceid= SPACE_TIME;
+ strncpy(st->name, "Timeline", BKE_ST_MAXNAME);
+
+ st->new= time_new;
+ st->free= time_free;
+ st->init= time_init;
+ st->refresh= time_refresh;
+ st->duplicate= time_duplicate;
+ st->operatortypes= time_operatortypes;
+ st->keymap= time_keymap;
+
+ /* regions: main window */
+ art= MEM_callocN(sizeof(ARegionType), "spacetype time region");
+ art->regionid = RGN_TYPE_WINDOW;
+
+ art->init= time_main_area_init;
+ art->refresh= time_main_area_refresh;
+ art->draw= time_main_area_draw;
+ art->listener= time_main_area_listener;
+ BLI_addhead(&st->regiontypes, art);
+
+ /* regions: header */
+ art= MEM_callocN(sizeof(ARegionType), "spacetype time region");
+ art->regionid = RGN_TYPE_HEADER;
- st.spaceid= SPACE_TIME;
+ art->draw= time_header_area_draw;
+ art->free= time_header_area_free;
+ BLI_addhead(&st->regiontypes, art);
- st.new= time_new;
- st.free= time_free;
- st.init= time_init;
- st.refresh= time_refresh;
- st.duplicate= time_duplicate;
- st.operatortypes= time_operatortypes;
- st.keymap= time_keymap;
- BKE_spacetype_register(&st);
+ BKE_spacetype_register(st);
}
diff --git a/source/blender/editors/space_time/time_ops.c b/source/blender/editors/space_time/time_ops.c
index 9b7af8b3f45..bc0ed1634da 100644
--- a/source/blender/editors/space_time/time_ops.c
+++ b/source/blender/editors/space_time/time_ops.c
@@ -213,24 +213,26 @@ void time_operatortypes(void)
void time_keymap(wmWindowManager *wm)
{
- WM_keymap_verify_item(&wm->timekeymap, "ED_TIME_OT_change_frame", LEFTMOUSE, KM_PRESS, 0, 0);
- WM_keymap_verify_item(&wm->timekeymap, "ED_TIME_OT_toggle_time", TKEY, KM_PRESS, 0, 0);
+ ListBase *keymap= WM_keymap_listbase(wm, "TimeLine", SPACE_TIME, 0);
+
+ WM_keymap_verify_item(keymap, "ED_TIME_OT_change_frame", LEFTMOUSE, KM_PRESS, 0, 0);
+ WM_keymap_verify_item(keymap, "ED_TIME_OT_toggle_time", TKEY, KM_PRESS, 0, 0);
/* markers (XXX move to function?) */
- WM_keymap_verify_item(&wm->timekeymap, "ED_MARKER_OT_add", MKEY, KM_PRESS, 0, 0);
- WM_keymap_verify_item(&wm->timekeymap, "ED_MARKER_OT_move", EVT_TWEAK_R, KM_ANY, 0, 0);
- WM_keymap_verify_item(&wm->timekeymap, "ED_MARKER_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_verify_item(&wm->timekeymap, "ED_MARKER_OT_mouseselect", RIGHTMOUSE, KM_PRESS, 0, 0);
- WM_keymap_verify_item(&wm->timekeymap, "ED_MARKER_OT_mouseselect_extend", RIGHTMOUSE, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_verify_item(&wm->timekeymap, "ED_MARKER_OT_border_select", BKEY, KM_PRESS, 0, 0);
- WM_keymap_verify_item(&wm->timekeymap, "ED_MARKER_OT_select_all", AKEY, KM_PRESS, 0, 0);
- WM_keymap_verify_item(&wm->timekeymap, "ED_MARKER_OT_delete", XKEY, KM_PRESS, 0, 0);
+ WM_keymap_verify_item(keymap, "ED_MARKER_OT_add", MKEY, KM_PRESS, 0, 0);
+ WM_keymap_verify_item(keymap, "ED_MARKER_OT_move", EVT_TWEAK_R, KM_ANY, 0, 0);
+ WM_keymap_verify_item(keymap, "ED_MARKER_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_verify_item(keymap, "ED_MARKER_OT_mouseselect", RIGHTMOUSE, KM_PRESS, 0, 0);
+ WM_keymap_verify_item(keymap, "ED_MARKER_OT_mouseselect_extend", RIGHTMOUSE, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_verify_item(keymap, "ED_MARKER_OT_border_select", BKEY, KM_PRESS, 0, 0);
+ WM_keymap_verify_item(keymap, "ED_MARKER_OT_select_all", AKEY, KM_PRESS, 0, 0);
+ WM_keymap_verify_item(keymap, "ED_MARKER_OT_delete", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(&wm->timekeymap, "ED_MARKER_OT_move", GKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "ED_MARKER_OT_move", GKEY, KM_PRESS, 0, 0);
/* generates event, in end to make select work */
- WM_keymap_verify_item(&wm->timekeymap, "WM_OT_tweak_gesture", RIGHTMOUSE, KM_PRESS, 0, 0);
+ WM_keymap_verify_item(keymap, "WM_OT_tweak_gesture", RIGHTMOUSE, KM_PRESS, 0, 0);
}
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index d60dd6a4062..81911a510ae 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -185,18 +185,18 @@ void view3d_keymap(struct wmWindowManager *wm)
/* only called once, from screen/spacetypes.c */
void ED_spacetype_view3d(void)
{
- static SpaceType st;
+ SpaceType *st= MEM_callocN(sizeof(SpaceType), "spacetype time");
- st.spaceid= SPACE_VIEW3D;
+ st->spaceid= SPACE_VIEW3D;
- st.new= view3d_new;
- st.free= view3d_free;
- st.init= view3d_init;
- st.refresh= view3d_refresh;
- st.duplicate= view3d_duplicate;
- st.operatortypes= view3d_operatortypes;
- st.keymap= view3d_keymap;
+ st->new= view3d_new;
+ st->free= view3d_free;
+ st->init= view3d_init;
+ st->refresh= view3d_refresh;
+ st->duplicate= view3d_duplicate;
+ st->operatortypes= view3d_operatortypes;
+ st->keymap= view3d_keymap;
- BKE_spacetype_register(&st);
+ BKE_spacetype_register(st);
}
diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h
index c67a482ccaa..867007032b6 100644
--- a/source/blender/makesdna/DNA_windowmanager_types.h
+++ b/source/blender/makesdna/DNA_windowmanager_types.h
@@ -66,13 +66,8 @@ typedef struct wmWindowManager {
ListBase reports; /* information and error reports */
- /* custom keymaps */
- ListBase windowkeymap;
- ListBase screenkeymap;
- ListBase view2dkeymap;
- ListBase uikeymap;
- ListBase timekeymap;
- /* keymaps have to be NULLed in readfile.c */
+ /* used keymaps, optionally/partially saved */
+ ListBase keymaps;
} wmWindowManager;
@@ -157,6 +152,19 @@ typedef struct wmKeymapItem {
short pad;
} wmKeymapItem;
+#define KMAP_MAX_NAME 64
+
+/* stored in WM, the actively used keymaps */
+typedef struct wmKeyMap {
+ struct wmKeyMap *next, *prev;
+
+ ListBase keymap;
+
+ char nameid[64]; /* global editor keymaps, or for more per space/region */
+ int spaceid; /* same IDs as in DNA_space_types.h */
+ int regionid; /* see above */
+} wmKeyMap;
+
/* this one is the operator itself, stored in files for macros etc */
/* operator + operatortype should be able to redo entirely, but for different contextes */
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 7bbb97d9c42..9dbb4c46947 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -67,6 +67,10 @@ void WM_keymap_verify_item(ListBase *lb, char *idname, short type,
short val, int modifier, short keymodifier);
void WM_keymap_add_item (ListBase *lb, char *idname, short type,
short val, int modifier, short keymodifier);
+ListBase *WM_keymap_listbase (wmWindowManager *wm, const char *nameid,
+ int spaceid, int regionid);
+
+
struct wmEventHandler *WM_event_add_keymap_handler(ListBase *handlers, ListBase *keymap);
void WM_event_remove_keymap_handler(ListBase *handlers, ListBase *keymap);
diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c
index 7c1532210d9..3333c485aae 100644
--- a/source/blender/windowmanager/intern/wm.c
+++ b/source/blender/windowmanager/intern/wm.c
@@ -136,6 +136,7 @@ void wm_close_and_free(bContext *C, wmWindowManager *wm)
wmWindow *win;
wmOperator *op;
wmReport *report;
+ wmKeyMap *km;
while((win= wm->windows.first)) {
BLI_remlink(&wm->windows, win);
@@ -152,11 +153,11 @@ void wm_close_and_free(bContext *C, wmWindowManager *wm)
wm_report_free(report);
}
- BLI_freelistN(&wm->timekeymap);
- BLI_freelistN(&wm->view2dkeymap);
- BLI_freelistN(&wm->uikeymap);
- BLI_freelistN(&wm->windowkeymap);
- BLI_freelistN(&wm->screenkeymap);
+ while((km= wm->keymaps.first)) {
+ BLI_freelistN(&km->keymap);
+ BLI_remlink(&wm->keymaps, km);
+ MEM_freeN(km);
+ }
BLI_freelistN(&wm->queue);
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index ac153b76c7e..c74497fa10b 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -347,20 +347,20 @@ void WM_event_remove_handlers(bContext *C, ListBase *handlers)
}
}
-static int wm_eventmatch(wmEvent *winevent, wmKeymapItem *km)
+static int wm_eventmatch(wmEvent *winevent, wmKeymapItem *kmi)
{
- if(winevent->type!=km->type) return 0;
+ if(winevent->type!=kmi->type) return 0;
- if(km->val!=KM_ANY)
- if(winevent->val!=km->val) return 0;
+ if(kmi->val!=KM_ANY)
+ if(winevent->val!=kmi->val) return 0;
- if(winevent->shift!=km->shift) return 0;
- if(winevent->ctrl!=km->ctrl) return 0;
- if(winevent->alt!=km->alt) return 0;
- if(winevent->oskey!=km->oskey) return 0;
- if(km->keymodifier)
- if(winevent->keymodifier!=km->keymodifier) return 0;
+ if(winevent->shift!=kmi->shift) return 0;
+ if(winevent->ctrl!=kmi->ctrl) return 0;
+ if(winevent->alt!=kmi->alt) return 0;
+ if(winevent->oskey!=kmi->oskey) return 0;
+ if(kmi->keymodifier)
+ if(winevent->keymodifier!=kmi->keymodifier) return 0;
/* optional boundbox */
@@ -449,14 +449,14 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
action= WM_HANDLER_BREAK;
if(handler->keymap) {
- wmKeymapItem *km;
+ wmKeymapItem *kmi;
- for(km= handler->keymap->first; km; km= km->next) {
- if(wm_eventmatch(event, km)) {
+ for(kmi= handler->keymap->first; kmi; kmi= kmi->next) {
+ if(wm_eventmatch(event, kmi)) {
/* if(event->type!=MOUSEMOVE)
- printf("handle evt %d win %d op %s\n", event->type, C->window->winid, km->idname); */
+ printf("handle evt %d win %d op %s\n", event->type, C->window->winid, kmi->idname); */
- event->keymap_idname= km->idname; /* weak, but allows interactive callback to not use rawkey */
+ event->keymap_idname= kmi->idname; /* weak, but allows interactive callback to not use rawkey */
action= wm_handler_operator_call(C, handlers, handler, event);
if(action==WM_HANDLER_BREAK) /* not wm_event_always_pass(event) here, it denotes removed handler */
diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c
index 610222b4372..439f5c304d1 100644
--- a/source/blender/windowmanager/intern/wm_keymap.c
+++ b/source/blender/windowmanager/intern/wm_keymap.c
@@ -47,45 +47,45 @@
/* ***************** generic call, exported **************** */
-static void keymap_set(wmKeymapItem *km, short type, short val, int modifier, short keymodifier)
+static void keymap_set(wmKeymapItem *kmi, short type, short val, int modifier, short keymodifier)
{
- km->type= type;
- km->val= val;
- km->keymodifier= keymodifier;
+ kmi->type= type;
+ kmi->val= val;
+ kmi->keymodifier= keymodifier;
if(modifier & KM_SHIFT)
- km->shift= 1;
+ kmi->shift= 1;
else if(modifier & KM_SHIFT2)
- km->shift= 2;
+ kmi->shift= 2;
if(modifier & KM_CTRL)
- km->ctrl= 1;
+ kmi->ctrl= 1;
else if(modifier & KM_CTRL2)
- km->ctrl= 2;
+ kmi->ctrl= 2;
if(modifier & KM_ALT)
- km->alt= 1;
+ kmi->alt= 1;
else if(modifier & KM_ALT2)
- km->alt= 2;
+ kmi->alt= 2;
if(modifier & KM_OSKEY)
- km->oskey= 1;
+ kmi->oskey= 1;
else if(modifier & KM_OSKEY2)
- km->oskey= 2;
+ kmi->oskey= 2;
}
/* if item was added, then bail out */
void WM_keymap_verify_item(ListBase *lb, char *idname, short type, short val, int modifier, short keymodifier)
{
- wmKeymapItem *km;
+ wmKeymapItem *kmi;
- for(km= lb->first; km; km= km->next)
- if(strncmp(km->idname, idname, OP_MAX_TYPENAME)==0)
+ for(kmi= lb->first; kmi; kmi= kmi->next)
+ if(strncmp(kmi->idname, idname, OP_MAX_TYPENAME)==0)
break;
- if(km==NULL) {
- km= MEM_callocN(sizeof(wmKeymapItem), "keymap entry");
+ if(kmi==NULL) {
+ kmi= MEM_callocN(sizeof(wmKeymapItem), "keymap entry");
- BLI_addtail(lb, km);
- BLI_strncpy(km->idname, idname, OP_MAX_TYPENAME);
+ BLI_addtail(lb, kmi);
+ BLI_strncpy(kmi->idname, idname, OP_MAX_TYPENAME);
- keymap_set(km, type, val, modifier, keymodifier);
+ keymap_set(kmi, type, val, modifier, keymodifier);
}
}
@@ -93,30 +93,55 @@ void WM_keymap_verify_item(ListBase *lb, char *idname, short type, short val, in
/* if item was added, then replace */
void WM_keymap_set_item(ListBase *lb, char *idname, short type, short val, int modifier, short keymodifier)
{
- wmKeymapItem *km;
+ wmKeymapItem *kmi;
- for(km= lb->first; km; km= km->next)
- if(strncmp(km->idname, idname, OP_MAX_TYPENAME)==0)
+ for(kmi= lb->first; kmi; kmi= kmi->next)
+ if(strncmp(kmi->idname, idname, OP_MAX_TYPENAME)==0)
break;
- if(km==NULL) {
- km= MEM_callocN(sizeof(wmKeymapItem), "keymap entry");
+ if(kmi==NULL) {
+ kmi= MEM_callocN(sizeof(wmKeymapItem), "keymap entry");
- BLI_addtail(lb, km);
- BLI_strncpy(km->idname, idname, OP_MAX_TYPENAME);
+ BLI_addtail(lb, kmi);
+ BLI_strncpy(kmi->idname, idname, OP_MAX_TYPENAME);
}
- keymap_set(km, type, val, modifier, keymodifier);
+ keymap_set(kmi, type, val, modifier, keymodifier);
}
/* always add item */
void WM_keymap_add_item(ListBase *lb, char *idname, short type, short val, int modifier, short keymodifier)
{
- wmKeymapItem *km= MEM_callocN(sizeof(wmKeymapItem), "keymap entry");
+ wmKeymapItem *kmi= MEM_callocN(sizeof(wmKeymapItem), "keymap entry");
- BLI_addtail(lb, km);
- BLI_strncpy(km->idname, idname, OP_MAX_TYPENAME);
+ BLI_addtail(lb, kmi);
+ BLI_strncpy(kmi->idname, idname, OP_MAX_TYPENAME);
- keymap_set(km, type, val, modifier, keymodifier);
+ keymap_set(kmi, type, val, modifier, keymodifier);
}
+/* ****************** storage in WM ************ */
+
+/* name id's are for storing general or multiple keymaps,
+ space/region ids are same as DNA_space_types.h */
+/* gets free'd in wm.c */
+
+ListBase *WM_keymap_listbase(wmWindowManager *wm, const char *nameid, int spaceid, int regionid)
+{
+ wmKeyMap *km;
+
+ for(km= wm->keymaps.first; km; km= km->next)
+ if(km->spaceid==spaceid && km->regionid==regionid)
+ if(0==strncmp(nameid, km->nameid, KMAP_MAX_NAME))
+ break;
+ if(km==NULL) {
+ km= MEM_callocN(sizeof(struct wmKeyMap), "keymap list");
+ BLI_strncpy(km->nameid, nameid, KMAP_MAX_NAME);
+ km->spaceid= spaceid;
+ km->regionid= regionid;
+ printf("added keymap %s %d %d\n", nameid, spaceid, regionid);
+ BLI_addtail(&wm->keymaps, km);
+ }
+
+ return &km->keymap;
+}
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 17b248ae9ed..5dd36d737b1 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -352,10 +352,12 @@ void wm_operatortype_init(void)
/* default keymap for windows and screens, only call once per WM */
void wm_window_keymap(wmWindowManager *wm)
{
+ ListBase *keymap= WM_keymap_listbase(wm, "Window", 0, 0);
+
/* note, this doesn't replace existing keymap items */
- WM_keymap_verify_item(&wm->windowkeymap, "WM_OT_window_duplicate", AKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
- WM_keymap_verify_item(&wm->windowkeymap, "WM_OT_save_homefile", UKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_verify_item(&wm->windowkeymap, "WM_OT_window_fullscreen_toggle", FKEY, KM_PRESS, 0, 0);
- WM_keymap_verify_item(&wm->windowkeymap, "WM_OT_exit_blender", QKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_verify_item(keymap, "WM_OT_window_duplicate", AKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
+ WM_keymap_verify_item(keymap, "WM_OT_save_homefile", UKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_verify_item(keymap, "WM_OT_window_fullscreen_toggle", FKEY, KM_PRESS, 0, 0);
+ WM_keymap_verify_item(keymap, "WM_OT_exit_blender", QKEY, KM_PRESS, KM_CTRL, 0);
}
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index 884abc1fa25..508fe21b039 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -190,6 +190,7 @@ static void wm_window_add_ghostwindow(wmWindowManager *wm, char *title, wmWindow
0 /* no stereo */);
if (ghostwin) {
+ ListBase *keymap;
win->ghostwin= ghostwin;
GHOST_SetWindowUserData(ghostwin, win); /* pointer back */
@@ -197,9 +198,12 @@ static void wm_window_add_ghostwindow(wmWindowManager *wm, char *title, wmWindow
if(win->eventstate==NULL)
win->eventstate= MEM_callocN(sizeof(wmEvent), "window event state");
- /* add keymap handlers (1 for all keys in map!) */
- WM_event_add_keymap_handler(&win->handlers, &wm->windowkeymap);
- WM_event_add_keymap_handler(&win->handlers, &wm->screenkeymap);
+ /* add keymap handlers (1 handler for all keys in map!) */
+ keymap= WM_keymap_listbase(wm, "Window", 0, 0);
+ WM_event_add_keymap_handler(&win->handlers, keymap);
+
+ keymap= WM_keymap_listbase(wm, "Screen", 0, 0);
+ WM_event_add_keymap_handler(&win->handlers, keymap);
/* until screens get drawn, make it nice grey */
glClearColor(.55, .55, .55, 0.0);
diff --git a/source/blender/windowmanager/wm_event_system.h b/source/blender/windowmanager/wm_event_system.h
index 1b3b7ce8efb..0c37c56778f 100644
--- a/source/blender/windowmanager/wm_event_system.h
+++ b/source/blender/windowmanager/wm_event_system.h
@@ -66,11 +66,12 @@ enum {
};
+/* wm_event_system.c */
void wm_event_add(wmWindow *win, wmEvent *event_to_add);
void wm_event_free_all (wmWindow *win);
wmEvent *wm_event_next (wmWindow *win);
-/* goes over entire hierarchy: events -> window -> screen -> area -> region */
+ /* goes over entire hierarchy: events -> window -> screen -> area -> region */
void wm_event_do_handlers (bContext *C);
void wm_event_add_ghostevent(wmWindow *win, int type, void *customdata);
@@ -78,5 +79,8 @@ void wm_event_add_ghostevent(wmWindow *win, int type, void *customdata);
void wm_event_do_notifiers (bContext *C);
void wm_draw_update (bContext *C);
+/* wm_keymap.c */
+
+
#endif /* WM_EVENT_SYSTEM_H */