4 * ***** BEGIN GPL LICENSE BLOCK *****
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 * The Original Code is Copyright (C) 2008 Blender Foundation.
21 * All rights reserved.
24 * Contributor(s): Blender Foundation
26 * ***** END GPL LICENSE BLOCK *****
32 #include "MEM_guardedalloc.h"
34 #include "DNA_scene_types.h"
35 #include "DNA_screen_types.h"
36 #include "DNA_space_types.h"
37 #include "DNA_view2d_types.h"
38 #include "DNA_userdef_types.h"
39 #include "DNA_windowmanager_types.h"
41 #include "RNA_access.h"
42 #include "RNA_define.h"
44 #include "BLI_blenlib.h"
46 #include "BKE_context.h"
47 #include "BKE_global.h"
48 #include "BKE_utildefines.h"
54 #include "BIF_glutil.h"
56 #include "UI_interface.h"
57 #include "UI_interface_icons.h"
58 #include "UI_view2d.h"
59 #include "UI_resources.h"
62 #include "ED_markers.h"
63 #include "ED_screen.h"
67 /* ************* Marker API **************** */
69 static ListBase *context_get_markers(const bContext *C)
73 /* XXX get them from pose */
74 if ((slink->spacetype == SPACE_ACTION) && (saction->flag & SACTION_POSEMARKERS_MOVE)) {
76 markers= &saction->action->markers;
83 return &CTX_data_scene(C)->markers;
86 /* ************* Marker Drawing ************ */
89 extern void ui_rasterpos_safe(float x, float y, float aspect);
91 /* function to draw markers */
92 static void draw_marker(View2D *v2d, TimeMarker *marker, int cfra, int flag)
94 float xpos, ypixels, xscale, yscale;
99 /* no time correction for framelen! space is drawn with old values */
100 ypixels= v2d->mask.ymax-v2d->mask.ymin;
101 UI_view2d_getscale(v2d, &xscale, &yscale);
103 glScalef(1.0/xscale, 1.0, 1.0);
106 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
108 /* vertical line - dotted */
109 if (flag & DRAW_MARKERS_LINES) {
112 if (marker->flag & SELECT)
113 glColor4ub(255, 255, 255, 96);
115 glColor4ub(0, 0, 0, 96);
118 glVertex2f((xpos*xscale)+0.5, 12);
119 glVertex2f((xpos*xscale)+0.5, 34*yscale); /* a bit lazy but we know it cant be greater then 34 strips high*/
125 /* 5 px to offset icon to align properly, space / pixels corrects for zoom */
126 if (flag & DRAW_MARKERS_LOCAL) {
127 icon_id= (marker->flag & ACTIVE) ? ICON_PMARKER_ACT :
128 (marker->flag & SELECT) ? ICON_PMARKER_SEL :
132 icon_id= (marker->flag & SELECT) ? ICON_MARKER_HLT :
136 UI_icon_draw(xpos*xscale-5.0, 16.0, icon_id);
138 glBlendFunc(GL_ONE, GL_ZERO);
141 /* and the marker name too, shifted slightly to the top-right */
142 if (marker->name && marker->name[0]) {
143 if(marker->flag & SELECT) {
144 UI_ThemeColor(TH_TEXT_HI);
145 ui_rasterpos_safe(xpos*xscale+4.0, (ypixels<=39.0)?(ypixels-10.0):29.0, 1.0);
148 UI_ThemeColor(TH_TEXT);
149 if((marker->frame <= cfra) && (marker->frame+5 > cfra))
150 ui_rasterpos_safe(xpos*xscale+4.0, (ypixels<=39.0)?(ypixels-10.0):29.0, 1.0);
152 ui_rasterpos_safe(xpos*xscale+4.0, 17.0, 1.0);
154 UI_DrawString(G.font, marker->name, 0);
156 glScalef(xscale, 1.0, 1.0);
159 /* Draw Scene-Markers in time window */
160 void draw_markers_time(const bContext *C, int flag)
162 ListBase *markers= context_get_markers(C);
163 View2D *v2d= UI_view2d_fromcontext(C);
166 /* unselected markers are drawn at the first time */
167 for (marker= markers->first; marker; marker= marker->next) {
168 if (!(marker->flag & SELECT)) draw_marker(v2d, marker, CTX_data_scene(C)->r.cfra, flag);
171 /* selected markers are drawn later */
172 for (marker= markers->first; marker; marker= marker->next) {
173 if (marker->flag & SELECT) draw_marker(v2d, marker, CTX_data_scene(C)->r.cfra, flag);
179 /* ************************** add markers *************************** */
181 /* add TimeMarker at curent frame */
182 static int ed_marker_add(bContext *C, wmOperator *op)
184 ListBase *markers= context_get_markers(C);
186 int frame= CTX_data_scene(C)->r.cfra;
188 /* two markers can't be at the same place */
189 for(marker= markers->first; marker; marker= marker->next)
190 if(marker->frame == frame)
191 return OPERATOR_CANCELLED;
194 for(marker= markers->first; marker; marker= marker->next)
195 marker->flag &= ~SELECT;
197 marker = MEM_callocN(sizeof(TimeMarker), "TimeMarker");
198 marker->flag= SELECT;
199 marker->frame= frame;
200 sprintf(marker->name, "Frame %d", frame); // XXX - temp code only
201 BLI_addtail(markers, marker);
203 WM_event_add_notifier(C, WM_NOTE_MARKERS_CHANGED, 0, NULL);
204 //BIF_undo_push("Add Marker");
206 return OPERATOR_FINISHED;
209 static void ED_MARKER_OT_add(wmOperatorType *ot)
212 ot->name= "Add Time Marker";
213 ot->idname= "ED_MARKER_OT_add";
216 ot->exec= ed_marker_add;
217 ot->poll= ED_operator_areaactive;
221 /* ************************** transform markers *************************** */
224 /* operator state vars used:
229 init() check selection, add customdata with old values and some lookups
231 apply() do the actual movement
233 exit() cleanup, send notifier
235 cancel() to escpae from modal
239 exec() calls init, apply, exit
241 invoke() calls init, adds modal handler
243 modal() accept modal events while doing it, ends with apply and exit, or cancel
247 typedef struct MarkerMove {
250 int event_type; /* store invoke-event, to verify */
251 int *oldframe, evtx, firstx;
254 /* copy selection to temp buffer */
255 /* return 0 if not OK */
256 static int ed_marker_move_init(bContext *C, wmOperator *op)
258 ListBase *markers= context_get_markers(C);
264 for (marker= markers->first; marker; marker= marker->next)
265 if (marker->flag & SELECT) totmark++;
267 if (totmark==0) return 0;
269 op->customdata= mm= MEM_callocN(sizeof(MarkerMove), "Markermove");
270 mm->slink= CTX_wm_space_data(C);
271 mm->markers= markers;
272 mm->oldframe= MEM_callocN(totmark*sizeof(int), "MarkerMove oldframe");
274 for (a=0, marker= markers->first; marker; marker= marker->next) {
275 if (marker->flag & SELECT) {
276 mm->oldframe[a]= marker->frame;
285 static void ed_marker_move_exit(bContext *C, wmOperator *op)
287 MarkerMove *mm= op->customdata;
289 MEM_freeN(mm->oldframe);
290 MEM_freeN(op->customdata);
291 op->customdata= NULL;
294 static int ed_marker_move_invoke(bContext *C, wmOperator *op, wmEvent *evt)
296 if(ed_marker_move_init(C, op)) {
297 MarkerMove *mm= op->customdata;
301 mm->event_type= evt->type;
303 /* add temp handler */
304 WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
306 /* reset frs delta */
307 RNA_int_set(op->ptr, "frs", 0);
309 return OPERATOR_RUNNING_MODAL;
312 return OPERATOR_CANCELLED;
315 /* note, init has to be called succesfully */
316 static void ed_marker_move_apply(bContext *C, wmOperator *op)
318 MarkerMove *mm= op->customdata;
322 offs= RNA_int_get(op->ptr, "frs");
323 for (a=0, marker= mm->markers->first; marker; marker= marker->next) {
324 if (marker->flag & SELECT) {
325 marker->frame= mm->oldframe[a] + offs;
332 static void ed_marker_move_cancel(bContext *C, wmOperator *op)
335 RNA_int_set(op->ptr, "frs", 0);
336 ed_marker_move_apply(C, op);
337 ed_marker_move_exit(C, op);
339 WM_event_add_notifier(C, WM_NOTE_MARKERS_CHANGED, 0, NULL);
343 /* for tweak handlers, check configuration for how to interpret events */
344 int WM_modal_tweak_check(wmEvent *evt, int tweak_event)
346 /* user preset?? dunno... */
349 switch(tweak_event) {
353 if(evt->val==tweak_modal)
356 /* this case is when modal callcback didnt get started with a tweak */
363 static int ed_marker_move_modal(bContext *C, wmOperator *op, wmEvent *evt)
365 MarkerMove *mm= op->customdata;
366 View2D *v2d= UI_view2d_fromcontext(C);
367 TimeMarker *marker, *selmarker=NULL;
373 ed_marker_move_cancel(C, op);
374 return OPERATOR_CANCELLED;
379 if(WM_modal_tweak_check(evt, mm->event_type)) {
380 ed_marker_move_exit(C, op);
381 WM_event_add_notifier(C, WM_NOTE_MARKERS_CHANGED, 0, NULL);
382 return OPERATOR_FINISHED;
388 dx= v2d->mask.xmax-v2d->mask.xmin;
389 dx= (v2d->cur.xmax-v2d->cur.xmin)/dx;
391 if (evt->x != mm->evtx) { /* XXX maybe init for firsttime */
392 int a, offs, totmark=0;
396 fac= ((float)(evt->x - mm->firstx)*dx);
398 if (ELEM(mm->slink->spacetype, SPACE_TIME, SPACE_SOUND))
399 apply_keyb_grid(evt->shift, evt->ctrl, &fac, 0.0, FPS, 0.1*FPS, 0);
401 apply_keyb_grid(evt->shift, evt->ctrl, &fac, 0.0, 1.0, 0.1, U.flag & USER_AUTOGRABGRID);
404 RNA_int_set(op->ptr, "frs", offs);
405 ed_marker_move_apply(C, op);
407 /* cruft below is for header print */
408 for (a=0, marker= mm->markers->first; marker; marker= marker->next) {
409 if (marker->flag & SELECT) {
416 /* we print current marker value */
417 if (ELEM(mm->slink->spacetype, SPACE_TIME, SPACE_SOUND)) {
418 SpaceTime *stime= (SpaceTime *)mm->slink;
419 if (stime->flag & TIME_DRAWFRAMES)
420 sprintf(str, "Marker %d offset %d", selmarker->frame, offs);
422 sprintf(str, "Marker %.2f offset %.2f", FRA2TIME(selmarker->frame), FRA2TIME(offs));
424 else if (mm->slink->spacetype == SPACE_ACTION) {
426 XXX if (saction->flag & SACTION_DRAWTIME)
427 sprintf(str, "Marker %.2f offset %.2f", FRA2TIME(selmarker->frame), FRA2TIME(offs));
429 sprintf(str, "Marker %.2f offset %.2f", (double)(selmarker->frame), (double)(offs));
433 sprintf(str, "Marker %.2f offset %.2f", (double)(selmarker->frame), (double)(offs));
437 /* we only print the offset */
438 if (ELEM(mm->slink->spacetype, SPACE_TIME, SPACE_SOUND)) {
439 SpaceTime *stime= (SpaceTime *)mm->slink;
440 if (stime->flag & TIME_DRAWFRAMES)
441 sprintf(str, "Marker offset %d ", offs);
443 sprintf(str, "Marker offset %.2f ", FRA2TIME(offs));
446 XXX else if (mm->slink->spacetype == SPACE_ACTION) {
447 if (saction->flag & SACTION_DRAWTIME)
448 sprintf(str, "Marker offset %.2f ", FRA2TIME(offs));
450 sprintf(str, "Marker offset %.2f ", (double)(offs));
454 sprintf(str, "Marker offset %.2f ", (double)(offs));
458 WM_event_add_notifier(C, WM_NOTE_MARKERS_CHANGED, 0, NULL);
459 // headerprint(str); XXX
463 return OPERATOR_RUNNING_MODAL;
466 static int ed_marker_move_exec(bContext *C, wmOperator *op)
468 if(ed_marker_move_init(C, op)) {
469 ed_marker_move_apply(C, op);
470 ed_marker_move_exit(C, op);
471 return OPERATOR_FINISHED;
473 return OPERATOR_CANCELLED;
476 static void ED_MARKER_OT_move(wmOperatorType *ot)
479 ot->name= "Move Time Marker";
480 ot->idname= "ED_MARKER_OT_move";
483 ot->exec= ed_marker_move_exec;
484 ot->invoke= ed_marker_move_invoke;
485 ot->modal= ed_marker_move_modal;
486 ot->poll= ED_operator_areaactive;
489 RNA_def_property(ot->srna, "frs", PROP_INT, PROP_NONE);
492 /* ************************** duplicate markers *************************** */
494 /* operator state vars used:
499 apply() do the actual duplicate
503 exec() calls apply, move_exec
505 invoke() calls apply, move_invoke
507 modal() uses move_modal
512 /* duplicate selected TimeMarkers */
513 static void ed_marker_duplicate_apply(bContext *C, wmOperator *op)
515 ListBase *markers= context_get_markers(C);
516 TimeMarker *marker, *newmarker;
518 /* go through the list of markers, duplicate selected markers and add duplicated copies
519 * to the begining of the list (unselect original markers) */
520 for(marker= markers->first; marker; marker= marker->next) {
521 if(marker->flag & SELECT){
522 /* unselect selected marker */
523 marker->flag &= ~SELECT;
524 /* create and set up new marker */
525 newmarker = MEM_callocN(sizeof(TimeMarker), "TimeMarker");
526 newmarker->flag= SELECT;
527 newmarker->frame= marker->frame;
528 BLI_strncpy(newmarker->name, marker->name, sizeof(marker->name));
529 /* new marker is added to the begining of list */
530 BLI_addhead(markers, newmarker);
535 static int ed_marker_duplicate_exec(bContext *C, wmOperator *op)
537 ed_marker_duplicate_apply(C, op);
538 ed_marker_move_exec(C, op); /* assumes frs delta set */
540 return OPERATOR_FINISHED;
544 static int ed_marker_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *evt)
546 ed_marker_duplicate_apply(C, op);
547 return ed_marker_move_invoke(C, op, evt);
550 static void ED_MARKER_OT_duplicate(wmOperatorType *ot)
553 ot->name= "Duplicate Time Marker";
554 ot->idname= "ED_MARKER_OT_duplicate";
557 ot->exec= ed_marker_duplicate_exec;
558 ot->invoke= ed_marker_duplicate_invoke;
559 ot->modal= ed_marker_move_modal;
560 ot->poll= ED_operator_areaactive;
563 RNA_def_property(ot->srna, "frs", PROP_INT, PROP_NONE);
566 /* ************************** selection ************************************/
568 /* select/deselect TimeMarker at current frame */
569 static void select_timeline_marker_frame(ListBase *markers, int frame, unsigned char shift)
574 for(marker= markers->first; marker; marker= marker->next) {
575 /* if Shift is not set, then deselect Markers */
576 if(!shift) marker->flag &= ~SELECT;
577 /* this way a not-shift select will allways give 1 selected marker */
578 if((marker->frame == frame) && (!select)) {
579 if(marker->flag & SELECT)
580 marker->flag &= ~SELECT;
582 marker->flag |= SELECT;
588 static int find_nearest_marker_time(ListBase *markers, float dx)
590 TimeMarker *marker, *nearest= NULL;
591 float dist, min_dist= 1000000;
593 for(marker= markers->first; marker; marker= marker->next) {
594 dist = ABS((float)marker->frame - dx);
601 if(nearest) return nearest->frame;
602 else return (int)floor(dx); /* hrmf? */
606 static int ed_marker_select(bContext *C, wmEvent *evt, int extend)
608 ListBase *markers= context_get_markers(C);
609 View2D *v2d= UI_view2d_fromcontext(C);
613 x= evt->x - CTX_wm_region(C)->winrct.xmin;
614 y= evt->y - CTX_wm_region(C)->winrct.ymin;
616 UI_view2d_region_to_view(v2d, x, y, &viewx, NULL);
618 cfra= find_nearest_marker_time(markers, viewx);
621 select_timeline_marker_frame(markers, cfra, 1);
623 select_timeline_marker_frame(markers, cfra, 0);
625 WM_event_add_notifier(C, WM_NOTE_MARKERS_CHANGED, 0, NULL);
627 return OPERATOR_PASS_THROUGH;
630 static int ed_marker_select_extend_invoke(bContext *C, wmOperator *op, wmEvent *evt)
632 return ed_marker_select(C, evt, 1);
635 static int ed_marker_select_invoke(bContext *C, wmOperator *op, wmEvent *evt)
637 return ed_marker_select(C, evt, 0);
640 static void ED_MARKER_OT_mouseselect(wmOperatorType *ot)
643 ot->name= "Select Time Marker";
644 ot->idname= "ED_MARKER_OT_mouseselect";
647 ot->invoke= ed_marker_select_invoke;
648 ot->poll= ED_operator_areaactive;
651 static void ED_MARKER_OT_mouseselect_extend(wmOperatorType *ot)
654 ot->name= "Extend Select Time Marker";
655 ot->idname= "ED_MARKER_OT_mouseselect_extend";
658 ot->invoke= ed_marker_select_extend_invoke;
659 ot->poll= ED_operator_areaactive;
662 /* *************************** border select markers **************** */
664 /* operator state vars used: (added by default WM callbacks)
668 customdata: the wmGesture pointer, with subwindow
672 exec() has to be filled in by user
674 invoke() default WM function
677 modal() default WM function
678 accept modal events while doing it, calls exec(), handles ESC and border drawing
680 poll() has to be filled in by user for context
683 static int ed_marker_border_select_exec(bContext *C, wmOperator *op)
685 View2D *v2d= UI_view2d_fromcontext(C);
686 ListBase *markers= context_get_markers(C);
688 float xminf, xmaxf, yminf, ymaxf;
689 int event_type= RNA_int_get(op->ptr, "event_type");
690 int xmin= RNA_int_get(op->ptr, "xmin");
691 int xmax= RNA_int_get(op->ptr, "xmax");
692 int ymin= RNA_int_get(op->ptr, "ymin");
693 int ymax= RNA_int_get(op->ptr, "ymax");
695 UI_view2d_region_to_view(v2d, xmin, ymin, &xminf, &yminf);
696 UI_view2d_region_to_view(v2d, xmax, ymax, &xmaxf, &ymaxf);
699 if(yminf > 30.0f || ymaxf < 0.0f)
702 /* XXX marker context */
703 for(marker= markers->first; marker; marker= marker->next) {
704 if ((marker->frame > xminf) && (marker->frame <= xmaxf)) {
705 switch (event_type) {
707 if ((marker->flag & SELECT) == 0)
708 marker->flag |= SELECT;
711 if (marker->flag & SELECT)
712 marker->flag &= ~SELECT;
718 WM_event_add_notifier(C, WM_NOTE_MARKERS_CHANGED, 0, NULL);
723 static void ED_MARKER_OT_border_select(wmOperatorType *ot)
726 ot->name= "Marker Border select";
727 ot->idname= "ED_MARKER_OT_border_select";
730 ot->exec= ed_marker_border_select_exec;
731 ot->invoke= WM_border_select_invoke;
732 ot->modal= WM_border_select_modal;
734 ot->poll= ED_operator_areaactive;
737 RNA_def_property(ot->srna, "event_type", PROP_INT, PROP_NONE);
738 RNA_def_property(ot->srna, "xmin", PROP_INT, PROP_NONE);
739 RNA_def_property(ot->srna, "xmax", PROP_INT, PROP_NONE);
740 RNA_def_property(ot->srna, "ymin", PROP_INT, PROP_NONE);
741 RNA_def_property(ot->srna, "ymax", PROP_INT, PROP_NONE);
745 /* *********************** (de)select all ***************** */
747 static int ed_marker_select_all_exec(bContext *C, wmOperator *op)
749 ListBase *markers= context_get_markers(C);
751 int select= RNA_int_get(op->ptr, "select_type");
753 if(RNA_int_get(op->ptr, "select_swap")) {
754 for(marker= markers->first; marker; marker= marker->next) {
755 if(marker->flag & SELECT)
764 for(marker= markers->first; marker; marker= marker->next) {
766 marker->flag |= SELECT;
768 marker->flag &= ~SELECT;
771 WM_event_add_notifier(C, WM_NOTE_MARKERS_CHANGED, 0, NULL);
773 return OPERATOR_FINISHED;
776 static int ed_marker_select_all_invoke(bContext *C, wmOperator *op, wmEvent *evt)
778 RNA_int_set(op->ptr, "select_swap", 1);
780 return ed_marker_select_all_exec(C, op);
783 static void ED_MARKER_OT_select_all(wmOperatorType *ot)
786 ot->name= "(De)select all markers";
787 ot->idname= "ED_MARKER_OT_select_all";
790 ot->exec= ed_marker_select_all_exec;
791 ot->invoke= ed_marker_select_all_invoke;
792 ot->poll= ED_operator_areaactive;
795 RNA_def_property(ot->srna, "select_swap", PROP_INT, PROP_NONE);
796 RNA_def_property(ot->srna, "select_type", PROP_INT, PROP_NONE);
800 /* ******************************* remove marker ***************** */
802 /* remove selected TimeMarkers */
803 static int ed_marker_delete_exec(bContext *C, wmOperator *op)
805 ListBase *markers= context_get_markers(C);
806 TimeMarker *marker, *nmarker;
809 for(marker= markers->first; marker; marker= nmarker) {
810 nmarker= marker->next;
811 if(marker->flag & SELECT) {
812 BLI_freelinkN(markers, marker);
818 WM_event_add_notifier(C, WM_NOTE_MARKERS_CHANGED, 0, NULL);
820 return OPERATOR_FINISHED;
824 static void ED_MARKER_OT_delete(wmOperatorType *ot)
827 ot->name= "Delete Markers";
828 ot->idname= "ED_MARKER_OT_delete";
831 ot->invoke= WM_operator_confirm;
832 ot->exec= ed_marker_delete_exec;
833 ot->poll= ED_operator_areaactive;
837 /* ************************** registration **********************************/
839 /* called in screen_ops.c:ED_operatortypes_screen() */
840 void ED_marker_operatortypes(void)
842 WM_operatortype_append(ED_MARKER_OT_add);
843 WM_operatortype_append(ED_MARKER_OT_move);
844 WM_operatortype_append(ED_MARKER_OT_duplicate);
845 WM_operatortype_append(ED_MARKER_OT_mouseselect);
846 WM_operatortype_append(ED_MARKER_OT_mouseselect_extend);
847 WM_operatortype_append(ED_MARKER_OT_border_select);
848 WM_operatortype_append(ED_MARKER_OT_select_all);
849 WM_operatortype_append(ED_MARKER_OT_delete);
852 /* called in screen_ops.c:ED_keymap_screen() */
853 void ED_marker_keymap(wmWindowManager *wm)
855 ListBase *keymap= WM_keymap_listbase(wm, "Markers", 0, 0);
857 WM_keymap_verify_item(keymap, "ED_MARKER_OT_add", MKEY, KM_PRESS, 0, 0);
858 WM_keymap_verify_item(keymap, "ED_MARKER_OT_move", EVT_TWEAK_R, KM_ANY, 0, 0);
859 WM_keymap_verify_item(keymap, "ED_MARKER_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0);
860 WM_keymap_verify_item(keymap, "ED_MARKER_OT_mouseselect", RIGHTMOUSE, KM_PRESS, 0, 0);
861 WM_keymap_verify_item(keymap, "ED_MARKER_OT_mouseselect_extend", RIGHTMOUSE, KM_PRESS, KM_SHIFT, 0);
862 WM_keymap_verify_item(keymap, "ED_MARKER_OT_border_select", BKEY, KM_PRESS, 0, 0);
863 WM_keymap_verify_item(keymap, "ED_MARKER_OT_select_all", AKEY, KM_PRESS, 0, 0);
864 WM_keymap_verify_item(keymap, "ED_MARKER_OT_delete", XKEY, KM_PRESS, 0, 0);
866 WM_keymap_add_item(keymap, "ED_MARKER_OT_move", GKEY, KM_PRESS, 0, 0);
868 /* generates event, in end to make select work */
869 WM_keymap_verify_item(keymap, "WM_OT_tweak_gesture", RIGHTMOUSE, KM_PRESS, 0, 0);