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-01-10 20:38:17 +0300
committerTon Roosendaal <ton@blender.org>2008-01-10 20:38:17 +0300
commit43cf3af8c07a534f06b14a003eef2fc65c3c937b (patch)
tree9a93be5e2e3b4abb969ce751f0b8aa7d4948d7f8 /source/blender/windowmanager
parentb81b6be18458462939aefbb260ca6a68020131d4 (diff)
Blender 2.5 project: added first more complex handler + operator
- on mouse-over edge, you can drag area borders around. - note it's a handerized system now, so it updates UI while you move mouse. Feedback needed: - read bottom part of the screen_edit.c file. It's the proposed method for adding tools and handlers. I think it's close, but might need some tweaks.
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r--source/blender/windowmanager/WM_api.h8
-rw-r--r--source/blender/windowmanager/WM_types.h5
-rw-r--r--source/blender/windowmanager/intern/screen_edit.c0
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c67
-rw-r--r--source/blender/windowmanager/intern/wm_files.c4
-rw-r--r--source/blender/windowmanager/intern/wm_keymap.c11
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c6
-rw-r--r--source/blender/windowmanager/intern/wm_window.c11
8 files changed, 81 insertions, 31 deletions
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 6f94bfac456..915c55f4cf7 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -61,10 +61,14 @@ void WM_keymap_set_item (ListBase *lb, char *idname, short type,
short val, int modifier, short keymodifier);
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);
struct wmEventHandler *WM_event_add_keymap_handler(ListBase *keymap, ListBase *handlers);
-struct wmEventHandler *WM_event_add_modal_keymap_handler(ListBase *keymap, ListBase *handlers, wmOperator *op);
+struct wmEventHandler *WM_event_add_modal_handler(ListBase *handlers, wmOperator *op);
+void WM_event_remove_modal_handler(ListBase *handlers, wmOperator *op);
-void WM_event_add_notifier(wmWindowManager *wm, wmWindow *window, int swinid, int type, int value);
+void WM_event_add_notifier(wmWindowManager *wm, wmWindow *window, int swinid, int type,
+ int value);
/* operator api, default callbacks */
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index 9c670aff71e..c232815fd49 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -99,8 +99,9 @@ typedef struct wmNotifier {
enum {
- WM_NOTE_REDRAW,
- WM_NOTE_REFRESH,
+ WM_NOTE_WINDOW_REDRAW,
+ WM_NOTE_SCREEN_CHANGED,
+ WM_NOTE_OBJECT_CHANGED,
WM_NOTE_LAST
};
diff --git a/source/blender/windowmanager/intern/screen_edit.c b/source/blender/windowmanager/intern/screen_edit.c
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/source/blender/windowmanager/intern/screen_edit.c
+++ /dev/null
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 37efc1a1367..ebf94bfc5c3 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -205,14 +205,20 @@ void wm_draw_update(bContext *C)
/* ********************* handlers *************** */
+/* not handler itself */
+static void wm_event_free_handler(wmEventHandler *handler)
+{
+ if(handler->op)
+ MEM_freeN(handler->op);
+}
+
void wm_event_free_handlers(ListBase *lb)
{
wmEventHandler *handler;
- for(handler= lb->first; handler; handler= handler->next) {
- if(handler->op)
- MEM_freeN(handler->op);
- }
+ for(handler= lb->first; handler; handler= handler->next)
+ wm_event_free_handler(handler);
+
BLI_freelistN(lb);
}
@@ -227,7 +233,8 @@ static int wm_eventmatch(wmEvent *winevent, wmKeymapItem *km)
if(winevent->ctrl!=km->ctrl) return 0;
if(winevent->alt!=km->alt) return 0;
if(winevent->oskey!=km->oskey) return 0;
- if(winevent->keymodifier!=km->keymodifier) return 0;
+ if(km->keymodifier)
+ if(winevent->keymodifier!=km->keymodifier) return 0;
/* optional boundbox */
@@ -240,25 +247,23 @@ static int wm_handler_operator_call(bContext *C, wmEventHandler *handler, wmEven
/* derived, modal or blocking operator */
if(handler->op) {
- if( handler->op->type->poll(C)) {
- if(handler->op->type->interactive)
- retval= handler->op->type->interactive(C, handler->op, event);
- else
- printf("wm_handler_operator_call error\n");
- }
+ if(handler->op->type->modal)
+ retval= handler->op->type->modal(C, handler->op, event);
+ else
+ printf("wm_handler_operator_call error\n");
}
else {
wmOperatorType *ot= WM_operatortype_find(event->keymap_idname);
if(ot) {
- if(ot->poll(C)) {
+ if(ot->poll==NULL || ot->poll(C)) {
/* operator on stack, register or new modal handle malloc-copies */
wmOperator op;
memset(&op, 0, sizeof(wmOperator));
op.type= ot;
- if(op.type->interactive)
- retval= op.type->interactive(C, &op, event);
+ if(op.type->invoke)
+ retval= (*op.type->invoke)(C, &op, event);
else if(&op.type->exec)
retval= op.type->exec(C, &op);
@@ -298,6 +303,11 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
if(action==WM_HANDLER_BREAK)
break;
}
+ else {
+ /* modal, swallows all */
+ action= wm_handler_operator_call(C, handler, event);
+ }
+
/* modal+blocking handler */
if(handler->flag & WM_HANDLER_BLOCKING)
action= WM_HANDLER_BREAK;
@@ -336,7 +346,7 @@ void wm_event_do_handlers(bContext *C)
ScrArea *sa= win->screen->areabase.first;
for(; sa; sa= sa->next) {
- if(wm_event_inside_i(event, &sa->winrct)) {
+ if(wm_event_inside_i(event, &sa->totrct)) {
C->curarea= sa;
action= wm_handlers_do(C, event, &sa->handlers);
@@ -368,7 +378,7 @@ void WM_event_set_handler_flag(wmEventHandler *handler, int flag)
handler->flag= flag;
}
-wmEventHandler *WM_event_add_modal_keymap_handler(ListBase *keymap, ListBase *handlers, wmOperator *op)
+wmEventHandler *WM_event_add_modal_handler(ListBase *handlers, wmOperator *op)
{
/* debug test; operator not in registry */
if(op->type->flag & OPTYPE_REGISTER) {
@@ -378,8 +388,7 @@ wmEventHandler *WM_event_add_modal_keymap_handler(ListBase *keymap, ListBase *ha
wmEventHandler *handler= MEM_callocN(sizeof(wmEventHandler), "event handler");
wmOperator *opc= MEM_mallocN(sizeof(wmOperator), "operator modal");
- BLI_addtail(handlers, handler);
- handler->keymap= keymap;
+ BLI_addhead(handlers, handler);
*opc= *op;
handler->op= opc;
@@ -388,6 +397,20 @@ wmEventHandler *WM_event_add_modal_keymap_handler(ListBase *keymap, ListBase *ha
return NULL;
}
+void WM_event_remove_modal_handler(ListBase *handlers, wmOperator *op)
+{
+ wmEventHandler *handler;
+
+ for(handler= handlers->first; handler; handler= handler->next) {
+ if(handler->op==op) {
+ BLI_remlink(handlers, handler);
+ wm_event_free_handler(handler);
+ MEM_freeN(handler);
+ break;
+ }
+ }
+}
+
wmEventHandler *WM_event_add_keymap_handler(ListBase *keymap, ListBase *handlers)
{
wmEventHandler *handler= MEM_callocN(sizeof(wmEventHandler), "event handler");
@@ -398,6 +421,7 @@ wmEventHandler *WM_event_add_keymap_handler(ListBase *keymap, ListBase *handlers
return handler;
}
+
/* ********************* ghost stuff *************** */
static int convert_key(GHOST_TKey key)
@@ -517,6 +541,8 @@ void wm_event_add_ghostevent(wmWindow *win, int type, void *customdata)
event.x= evt->x= cx;
event.y= evt->y= (win->sizey-1) - cy;
+ ED_screen_set_subwinactive(win); /* state variables in screen */
+
update_tablet_data(win, &event);
wm_event_add(win, &event);
}
@@ -535,6 +561,11 @@ void wm_event_add_ghostevent(wmWindow *win, int type, void *customdata)
else
event.type= MIDDLEMOUSE;
+ if(event.val)
+ event.keymodifier= evt->keymodifier= event.type;
+ else
+ event.keymodifier= evt->keymodifier= 0;
+
update_tablet_data(win, &event);
wm_event_add(win, &event);
diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c
index da81c0edff2..8dbe235d256 100644
--- a/source/blender/windowmanager/intern/wm_files.c
+++ b/source/blender/windowmanager/intern/wm_files.c
@@ -557,7 +557,9 @@ int WM_read_homefile(bContext *C, int from_memory)
if (!from_memory && BLI_exists(tstr)) {
success = BKE_read_file(C, tstr, NULL);
} else {
- //XXX success = BKE_read_file_from_memory(C, datatoc_B_blend, datatoc_B_blend_size, NULL);
+ extern int datatoc_B_blend_size;
+ extern char datatoc_B_blend[];
+ success = BKE_read_file_from_memory(C, datatoc_B_blend, datatoc_B_blend_size, NULL);
/* outliner patch for 2.42 .b.blend */
outliner_242_patch();
}
diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c
index da340e35d79..7a5ec0e4d47 100644
--- a/source/blender/windowmanager/intern/wm_keymap.c
+++ b/source/blender/windowmanager/intern/wm_keymap.c
@@ -108,5 +108,16 @@ void WM_keymap_set_item(ListBase *lb, char *idname, short type, short val, int m
keymap_set(km, 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");
+
+ BLI_addtail(lb, km);
+ BLI_strncpy(km->idname, idname, OP_MAX_TYPENAME);
+
+ keymap_set(km, type, val, modifier, keymodifier);
+}
+
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 49989000c6f..27f8b48451a 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -87,7 +87,7 @@ static void WM_OT_window_duplicate(wmOperatorType *ot)
ot->name= "Duplicate Window";
ot->idname= "WM_OT_window_duplicate";
- ot->interactive= NULL; //WM_operator_confirm;
+ ot->invoke= NULL; //WM_operator_confirm;
ot->exec= wm_window_duplicate_op;
ot->poll= WM_operator_winactive;
}
@@ -97,7 +97,7 @@ static void WM_OT_save_homefile(wmOperatorType *ot)
ot->name= "Save User Settings";
ot->idname= "WM_OT_save_homefile";
- ot->interactive= NULL; //WM_operator_confirm;
+ ot->invoke= NULL; //WM_operator_confirm;
ot->exec= WM_write_homefile;
ot->poll= WM_operator_winactive;
@@ -109,7 +109,7 @@ static void WM_OT_window_fullscreen_toggle(wmOperatorType *ot)
ot->name= "Toggle Fullscreen";
ot->idname= "WM_OT_window_fullscreen_toggle";
- ot->interactive= NULL;
+ ot->invoke= NULL;
ot->exec= wm_window_fullscreen_toggle_op;
ot->poll= WM_operator_winactive;
}
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index a802efffb96..21c456fd51c 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -381,6 +381,8 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private)
win->eventstate->x= cx;
win->eventstate->y= (win->sizey-1) - cy;
+ ED_screen_set_subwinactive(win); /* active subwindow in screen */
+
wm_window_make_drawable(C, win);
break;
}
@@ -392,7 +394,7 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private)
printf("ghost redraw\n");
wm_window_make_drawable(C, win);
- WM_event_add_notifier(C->wm, win, 0, WM_NOTE_REDRAW, 0);
+ WM_event_add_notifier(C->wm, win, 0, WM_NOTE_WINDOW_REDRAW, 0);
break;
}
@@ -432,14 +434,13 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private)
}
wm_window_make_drawable(C, win);
- WM_event_add_notifier(C->wm, win, 0, WM_NOTE_REFRESH, 0);
- WM_event_add_notifier(C->wm, win, 0, WM_NOTE_REDRAW, 0);
+ WM_event_add_notifier(C->wm, win, 0, WM_NOTE_SCREEN_CHANGED, 0);
break;
}
default:
- if(type==GHOST_kEventKeyDown)
- WM_event_add_notifier(C->wm, win, 0, WM_NOTE_REDRAW, 0);
+ if(type==GHOST_kEventKeyDown) // XXX debug
+ WM_event_add_notifier(C->wm, win, 0, WM_NOTE_WINDOW_REDRAW, 0);
wm_event_add_ghostevent(win, type, data);
break;
}