Blender  V3.3
graph_ops.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2008 Blender Foundation. All rights reserved. */
3 
8 #include <math.h>
9 #include <stdlib.h>
10 
11 #include "DNA_scene_types.h"
12 
13 #include "BLI_blenlib.h"
14 #include "BLI_math_base.h"
15 #include "BLI_utildefines.h"
16 
17 #include "BKE_context.h"
18 #include "BKE_global.h"
19 
20 #include "UI_view2d.h"
21 
22 #include "ED_anim_api.h"
23 #include "ED_screen.h"
24 #include "ED_transform.h"
25 
26 #include "graph_intern.h"
27 
28 #include "RNA_access.h"
29 #include "RNA_define.h"
30 
31 #include "DEG_depsgraph.h"
32 
33 #include "WM_api.h"
34 #include "WM_types.h"
35 
36 /* ************************** view-based operators **********************************/
37 /* XXX should these really be here? */
38 
39 /* -------------------------------------------------------------------- */
48 {
49  /* prevent changes during render */
50  if (G.is_rendering) {
51  return false;
52  }
53 
55 }
56 
57 /* Set the new frame number */
59 {
62  /* this isn't technically "frame", but it'll do... */
63  float frame = RNA_float_get(op->ptr, "frame");
64 
65  /* adjust the frame or the cursor x-value */
66  if (sipo->mode == SIPO_MODE_DRIVERS) {
67  /* adjust cursor x-value */
68  sipo->cursorTime = frame;
69  }
70  else {
71  /* adjust the frame
72  * NOTE: sync this part of the code with ANIM_OT_change_frame
73  */
74  /* 1) frame is rounded to the nearest int, since frames are ints */
75  scene->r.cfra = round_fl_to_int(frame);
76 
78  /* Clip to preview range
79  * NOTE: Preview range won't go into negative values,
80  * so only clamping once should be fine.
81  */
83  }
84  else {
85  /* Prevent negative frames */
87  }
88 
89  scene->r.subframe = 0.0f;
91  }
92 
93  /* set the cursor value */
94  sipo->cursorVal = RNA_float_get(op->ptr, "value");
95 
96  /* send notifiers - notifiers for frame should force an update for both vars ok... */
98 }
99 
100 /* ... */
101 
102 /* Non-modal callback for running operator without user input */
104 {
106  return OPERATOR_FINISHED;
107 }
108 
109 /* ... */
110 
111 /* set the operator properties from the initial event */
112 static void graphview_cursor_setprops(bContext *C, wmOperator *op, const wmEvent *event)
113 {
114  ARegion *region = CTX_wm_region(C);
115  float viewx, viewy;
116 
117  /* abort if not active region (should not really be possible) */
118  if (region == NULL) {
119  return;
120  }
121 
122  /* convert from region coordinates to View2D 'tot' space */
123  UI_view2d_region_to_view(&region->v2d, event->mval[0], event->mval[1], &viewx, &viewy);
124 
125  /* store the values in the operator properties */
126  /* NOTE: we don't clamp frame here, as it might be used for the drivers cursor */
127  RNA_float_set(op->ptr, "frame", viewx);
128  RNA_float_set(op->ptr, "value", viewy);
129 }
130 
131 /* Modal Operator init */
132 static int graphview_cursor_invoke(bContext *C, wmOperator *op, const wmEvent *event)
133 {
134  bScreen *screen = CTX_wm_screen(C);
135 
136  /* Change to frame that mouse is over before adding modal handler,
137  * as user could click on a single frame (jump to frame) as well as
138  * click-dragging over a range (modal scrubbing). Apply this change.
139  */
140  graphview_cursor_setprops(C, op, event);
142 
143  /* Signal that a scrubbing operating is starting */
144  if (screen) {
145  screen->scrubbing = true;
146  }
147 
148  /* add temp handler */
150  return OPERATOR_RUNNING_MODAL;
151 }
152 
153 /* Modal event handling of cursor changing */
154 static int graphview_cursor_modal(bContext *C, wmOperator *op, const wmEvent *event)
155 {
156  bScreen *screen = CTX_wm_screen(C);
158 
159  /* execute the events */
160  switch (event->type) {
161  case EVT_ESCKEY:
162  if (screen) {
163  screen->scrubbing = false;
164  }
165 
167  return OPERATOR_FINISHED;
168 
169  case MOUSEMOVE:
170  /* set the new values */
171  graphview_cursor_setprops(C, op, event);
173  break;
174 
175  case LEFTMOUSE:
176  case RIGHTMOUSE:
177  case MIDDLEMOUSE:
178  /* We check for either mouse-button to end, to work with all user keymaps. */
179  if (event->val == KM_RELEASE) {
180  if (screen) {
181  screen->scrubbing = false;
182  }
183 
185  return OPERATOR_FINISHED;
186  }
187  break;
188  }
189 
190  return OPERATOR_RUNNING_MODAL;
191 }
192 
194 {
195  /* identifiers */
196  ot->name = "Set Cursor";
197  ot->idname = "GRAPH_OT_cursor_set";
198  ot->description = "Interactively set the current frame and value cursor";
199 
200  /* api callbacks */
205 
206  /* flags */
208 
209  /* rna */
210  RNA_def_float(ot->srna, "frame", 0, MINAFRAMEF, MAXFRAMEF, "Frame", "", MINAFRAMEF, MAXFRAMEF);
211  RNA_def_float(ot->srna, "value", 0, -FLT_MAX, FLT_MAX, "Value", "", -100.0f, 100.0f);
212 }
213 
216 /* -------------------------------------------------------------------- */
221 {
222  bAnimContext ac;
223  ListBase anim_data = {NULL, NULL};
224  ListBase all_data = {NULL, NULL};
225  bAnimListElem *ale;
226  int filter;
227  const bool unselected = RNA_boolean_get(op->ptr, "unselected");
228 
229  /* get editor data */
230  if (ANIM_animdata_get_context(C, &ac) == 0) {
231  return OPERATOR_CANCELLED;
232  }
233 
234  /* get list of all channels that selection may need to be flushed to
235  * - hierarchy must not affect what we have access to here...
236  */
239  ANIM_animdata_filter(&ac, &all_data, filter, ac.data, ac.datatype);
240 
241  /* filter data
242  * - of the remaining visible curves, we want to hide the ones that are
243  * selected/unselected (depending on "unselected" prop)
244  */
247  if (unselected) {
249  }
250  else {
252  }
253 
254  ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
255 
256  for (ale = anim_data.first; ale; ale = ale->next) {
257  /* hack: skip object channels for now, since flushing those will always flush everything,
258  * but they are always included */
259  /* TODO: find out why this is the case, and fix that */
260  if (ale->type == ANIMTYPE_OBJECT) {
261  continue;
262  }
263 
264  /* change the hide setting, and unselect it... */
267 
268  /* now, also flush selection status up/down as appropriate */
270  &ac, &all_data, ale, ACHANNEL_SETTING_VISIBLE, ACHANNEL_SETFLAG_CLEAR);
271  }
272 
273  /* cleanup */
274  ANIM_animdata_freelist(&anim_data);
275  BLI_freelistN(&all_data);
276 
277  /* unhide selected */
278  if (unselected) {
279  /* turn off requirement for visible */
282 
283  /* flushing has been done */
284  ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
285 
286  for (ale = anim_data.first; ale; ale = ale->next) {
287  /* hack: skip object channels for now, since flushing those
288  * will always flush everything, but they are always included */
289 
290  /* TODO: find out why this is the case, and fix that */
291  if (ale->type == ANIMTYPE_OBJECT) {
292  continue;
293  }
294 
295  /* change the hide setting, and unselect it... */
298 
299  /* now, also flush selection status up/down as appropriate */
301  &ac, &anim_data, ale, ACHANNEL_SETTING_VISIBLE, ACHANNEL_SETFLAG_ADD);
302  }
303  ANIM_animdata_freelist(&anim_data);
304  }
305 
306  /* send notifier that things have changed */
308 
309  return OPERATOR_FINISHED;
310 }
311 
313 {
314  /* identifiers */
315  ot->name = "Hide Curves";
316  ot->idname = "GRAPH_OT_hide";
317  ot->description = "Hide selected curves from Graph Editor view";
318 
319  /* api callbacks */
322 
323  /* flags */
325 
326  /* props */
328  ot->srna, "unselected", 0, "Unselected", "Hide unselected rather than selected curves");
329 }
330 
331 /* ........ */
332 
334 {
335  bAnimContext ac;
336  ListBase anim_data = {NULL, NULL};
337  ListBase all_data = {NULL, NULL};
338  bAnimListElem *ale;
339  int filter;
340  const bool select = RNA_boolean_get(op->ptr, "select");
341 
342  /* get editor data */
343  if (ANIM_animdata_get_context(C, &ac) == 0) {
344  return OPERATOR_CANCELLED;
345  }
346 
347  /* get list of all channels that selection may need to be flushed to
348  * - hierarchy must not affect what we have access to here...
349  */
352  ANIM_animdata_filter(&ac, &all_data, filter, ac.data, ac.datatype);
353 
354  /* filter data
355  * - just go through all visible channels, ensuring that everything is set to be curve-visible
356  */
359  ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
360 
361  for (ale = anim_data.first; ale; ale = ale->next) {
362  /* hack: skip object channels for now, since flushing those will always flush everything,
363  * but they are always included. */
364  /* TODO: find out why this is the case, and fix that */
365  if (ale->type == ANIMTYPE_OBJECT) {
366  continue;
367  }
368 
369  /* select if it is not visible */
372  ale,
375  }
376 
377  /* change the visibility setting */
379 
380  /* now, also flush selection status up/down as appropriate */
382  }
383 
384  /* cleanup */
385  ANIM_animdata_freelist(&anim_data);
386  BLI_freelistN(&all_data);
387 
388  /* send notifier that things have changed */
390 
391  return OPERATOR_FINISHED;
392 }
393 
395 {
396  /* identifiers */
397  ot->name = "Reveal Curves";
398  ot->idname = "GRAPH_OT_reveal";
399  ot->description = "Make previously hidden curves visible again in Graph Editor view";
400 
401  /* api callbacks */
404 
405  /* flags */
407 
408  RNA_def_boolean(ot->srna, "select", true, "Select", "");
409 }
410 
413 /* -------------------------------------------------------------------- */
418 {
419  /* view */
421 
426 
429 
432 
433  /* keyframes */
434  /* selection */
445 
446  /* editing */
469 
472 
475 
476  /* F-Curve Modifiers */
480 
481  /* Drivers */
485 }
486 
488 {
490  wmOperatorTypeMacro *otmacro;
491 
492  ot = WM_operatortype_append_macro("GRAPH_OT_duplicate_move",
493  "Duplicate",
494  "Make a copy of all selected keyframes and move them",
496  WM_operatortype_macro_define(ot, "GRAPH_OT_duplicate");
497  otmacro = WM_operatortype_macro_define(ot, "TRANSFORM_OT_transform");
498  RNA_enum_set(otmacro->ptr, "mode", TFM_TIME_DUPLICATE);
499  RNA_boolean_set(otmacro->ptr, "use_proportional_edit", false);
500 }
501 
504 /* -------------------------------------------------------------------- */
509 {
510  /* keymap for all regions */
511  WM_keymap_ensure(keyconf, "Graph Editor Generic", SPACE_GRAPH, 0);
512 
513  /* channels */
514  /* Channels are not directly handled by the Graph Editor module,
515  * but are inherited from the Animation module.
516  * All the relevant operations, keymaps, drawing, etc.
517  * can therefore all be found in that module instead,
518  * as these are all used for the Graph Editor too.
519  */
520 
521  /* keyframes */
522  WM_keymap_ensure(keyconf, "Graph Editor", SPACE_GRAPH, 0);
523 }
524 
struct Scene * CTX_data_scene(const bContext *C)
Definition: context.c:1090
struct SpaceGraph * CTX_wm_space_graph(const bContext *C)
Definition: context.c:887
struct bScreen * CTX_wm_screen(const bContext *C)
Definition: context.c:733
struct ARegion * CTX_wm_region(const bContext *C)
Definition: context.c:749
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
Definition: listbase.c:466
MINLINE int round_fl_to_int(float a)
void DEG_id_tag_update(struct ID *id, int flag)
@ ID_RECALC_FRAME_CHANGE
Definition: DNA_ID.h:841
#define SCER_LOCK_FRAME_SELECTION
#define PSFRA
#define MAXFRAMEF
#define MINAFRAMEF
#define PEFRA
@ SPACE_GRAPH
@ SIPO_MODE_DRIVERS
#define FRAMENUMBER_MIN_CLAMP(cfra)
@ OPERATOR_CANCELLED
@ OPERATOR_FINISHED
@ OPERATOR_RUNNING_MODAL
@ ACHANNEL_SETFLAG_ADD
Definition: ED_anim_api.h:552
@ ACHANNEL_SETFLAG_CLEAR
Definition: ED_anim_api.h:550
@ ANIMTYPE_OBJECT
Definition: ED_anim_api.h:197
@ ACHANNEL_SETTING_VISIBLE
Definition: ED_anim_api.h:567
@ ACHANNEL_SETTING_SELECT
Definition: ED_anim_api.h:561
@ ANIMFILTER_UNSEL
Definition: ED_anim_api.h:309
@ ANIMFILTER_DATA_VISIBLE
Definition: ED_anim_api.h:292
@ ANIMFILTER_CURVE_VISIBLE
Definition: ED_anim_api.h:297
@ ANIMFILTER_LIST_VISIBLE
Definition: ED_anim_api.h:295
@ ANIMFILTER_LIST_CHANNELS
Definition: ED_anim_api.h:300
@ ANIMFILTER_NODUPLIS
Definition: ED_anim_api.h:325
@ ANIMFILTER_FCURVESONLY
Definition: ED_anim_api.h:328
@ ANIMFILTER_SEL
Definition: ED_anim_api.h:308
bool ED_operator_graphedit_active(struct bContext *C)
Definition: screen_ops.c:329
@ TFM_TIME_DUPLICATE
Definition: ED_transform.h:54
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Bright Control the brightness and contrast of the input color Vector Map an input vectors to used to fine tune the interpolation of the input Camera Retrieve information about the camera and how it relates to the current shading point s position CLAMP
#define C
Definition: RandGen.cpp:25
void UI_view2d_region_to_view(const struct View2D *v2d, float x, float y, float *r_view_x, float *r_view_y) ATTR_NONNULL()
@ KM_RELEASE
Definition: WM_types.h:268
@ OPTYPE_BLOCKING
Definition: WM_types.h:150
@ OPTYPE_UNDO
Definition: WM_types.h:148
@ OPTYPE_REGISTER
Definition: WM_types.h:146
@ OPTYPE_GRAB_CURSOR_X
Definition: WM_types.h:156
#define NC_ANIMATION
Definition: WM_types.h:338
#define NC_SCENE
Definition: WM_types.h:328
#define NA_EDITED
Definition: WM_types.h:523
#define ND_FRAME
Definition: WM_types.h:382
#define ND_ANIMCHAN
Definition: WM_types.h:444
void ANIM_channel_setting_set(bAnimContext *ac, bAnimListElem *ale, eAnimChannel_Settings setting, eAnimChannels_SetFlag mode)
short ANIM_channel_setting_get(bAnimContext *ac, bAnimListElem *ale, eAnimChannel_Settings setting)
void ANIM_flush_setting_anim_channels(bAnimContext *ac, ListBase *anim_data, bAnimListElem *ale_setting, eAnimChannel_Settings setting, eAnimChannels_SetFlag mode)
void ANIM_animdata_freelist(ListBase *anim_data)
Definition: anim_deps.c:397
bool ANIM_animdata_get_context(const bContext *C, bAnimContext *ac)
Definition: anim_filter.c:379
size_t ANIM_animdata_filter(bAnimContext *ac, ListBase *anim_data, eAnimFilter_Flags filter_mode, void *data, eAnimCont_Types datatype)
Definition: anim_filter.c:3447
__forceinline const avxb select(const avxb &m, const avxb &t, const avxb &f)
Definition: avxb.h:154
Scene scene
void GRAPH_OT_delete(wmOperatorType *ot)
Definition: graph_edit.c:768
void GRAPH_OT_click_insert(wmOperatorType *ot)
Definition: graph_edit.c:402
void GRAPH_OT_fmodifier_paste(wmOperatorType *ot)
Definition: graph_edit.c:2932
void GRAPH_OT_smooth(wmOperatorType *ot)
Definition: graph_edit.c:2658
void GRAPH_OT_equalize_handles(wmOperatorType *ot)
Definition: graph_edit.c:2412
void GRAPH_OT_snap_cursor_value(wmOperatorType *ot)
Definition: graph_edit.c:2184
void GRAPH_OT_mirror(wmOperatorType *ot)
Definition: graph_edit.c:2596
void GRAPH_OT_sample(wmOperatorType *ot)
Definition: graph_edit.c:1315
void GRAPH_OT_bake(wmOperatorType *ot)
Definition: graph_edit.c:929
void GRAPH_OT_fmodifier_copy(wmOperatorType *ot)
Definition: graph_edit.c:2841
void GRAPH_OT_handle_type(wmOperatorType *ot)
Definition: graph_edit.c:1685
void GRAPH_OT_frame_jump(wmOperatorType *ot)
Definition: graph_edit.c:2144
void GRAPH_OT_driver_variables_copy(wmOperatorType *ot)
Definition: graph_edit.c:2986
void GRAPH_OT_extrapolation_type(wmOperatorType *ot)
Definition: graph_edit.c:1448
void GRAPH_OT_unbake(wmOperatorType *ot)
Definition: graph_edit.c:1006
void GRAPH_OT_driver_variables_paste(wmOperatorType *ot)
Definition: graph_edit.c:3034
void GRAPH_OT_interpolation_type(wmOperatorType *ot)
Definition: graph_edit.c:1524
void GRAPH_OT_easing_type(wmOperatorType *ot)
Definition: graph_edit.c:1600
void GRAPH_OT_copy(wmOperatorType *ot)
Definition: graph_edit.c:527
void GRAPH_OT_driver_delete_invalid(wmOperatorType *ot)
Definition: graph_edit.c:3136
void GRAPH_OT_keyframe_insert(wmOperatorType *ot)
Definition: graph_edit.c:260
void GRAPH_OT_sound_bake(wmOperatorType *ot)
Definition: graph_edit.c:1163
void GRAPH_OT_duplicate(wmOperatorType *ot)
Definition: graph_edit.c:683
void GRAPH_OT_euler_filter(wmOperatorType *ot)
Definition: graph_edit.c:2021
void GRAPH_OT_clean(wmOperatorType *ot)
Definition: graph_edit.c:838
void GRAPH_OT_snap(wmOperatorType *ot)
Definition: graph_edit.c:2336
void GRAPH_OT_fmodifier_add(wmOperatorType *ot)
Definition: graph_edit.c:2772
void GRAPH_OT_paste(wmOperatorType *ot)
Definition: graph_edit.c:591
void GRAPH_OT_select_linked(struct wmOperatorType *ot)
void GRAPH_OT_select_box(struct wmOperatorType *ot)
Definition: graph_select.c:880
void GRAPH_OT_decimate(struct wmOperatorType *ot)
void GRAPH_OT_select_column(struct wmOperatorType *ot)
void GRAPH_OT_ghost_curves_create(struct wmOperatorType *ot)
Definition: graph_view.c:483
void GRAPH_OT_select_lasso(struct wmOperatorType *ot)
Definition: graph_select.c:986
void GRAPH_OT_previewrange_set(struct wmOperatorType *ot)
Definition: graph_view.c:221
void GRAPH_OT_select_more(struct wmOperatorType *ot)
void GRAPH_OT_blend_to_neighbor(struct wmOperatorType *ot)
void GRAPH_OT_select_circle(struct wmOperatorType *ot)
void GRAPH_OT_clickselect(struct wmOperatorType *ot)
void GRAPH_OT_select_less(struct wmOperatorType *ot)
void GRAPH_OT_breakdown(struct wmOperatorType *ot)
void GRAPH_OT_view_frame(struct wmOperatorType *ot)
Definition: graph_view.c:360
void GRAPH_OT_view_selected(struct wmOperatorType *ot)
Definition: graph_view.c:324
void GRAPH_OT_select_leftright(struct wmOperatorType *ot)
void GRAPH_OT_blend_to_default(struct wmOperatorType *ot)
void GRAPH_OT_view_all(struct wmOperatorType *ot)
Definition: graph_view.c:301
void GRAPH_OT_ghost_curves_clear(struct wmOperatorType *ot)
Definition: graph_view.c:533
void GRAPH_OT_select_all(struct wmOperatorType *ot)
Definition: graph_select.c:457
void ED_operatormacros_graph(void)
Definition: graph_ops.c:487
void graphedit_keymap(wmKeyConfig *keyconf)
Definition: graph_ops.c:508
static int graphview_curves_hide_exec(bContext *C, wmOperator *op)
Definition: graph_ops.c:220
static void graphview_cursor_apply(bContext *C, wmOperator *op)
Definition: graph_ops.c:58
static int graphview_cursor_modal(bContext *C, wmOperator *op, const wmEvent *event)
Definition: graph_ops.c:154
static int graphview_cursor_exec(bContext *C, wmOperator *op)
Definition: graph_ops.c:103
static void graphview_cursor_setprops(bContext *C, wmOperator *op, const wmEvent *event)
Definition: graph_ops.c:112
static void GRAPH_OT_cursor_set(wmOperatorType *ot)
Definition: graph_ops.c:193
static void GRAPH_OT_hide(wmOperatorType *ot)
Definition: graph_ops.c:312
void graphedit_operatortypes(void)
Definition: graph_ops.c:417
static void GRAPH_OT_reveal(wmOperatorType *ot)
Definition: graph_ops.c:394
static int graphview_curves_reveal_exec(bContext *C, wmOperator *op)
Definition: graph_ops.c:333
static bool graphview_cursor_poll(bContext *C)
Definition: graph_ops.c:47
static int graphview_cursor_invoke(bContext *C, wmOperator *op, const wmEvent *event)
Definition: graph_ops.c:132
DO_INLINE void filter(lfVector *V, fmatrix3x3 *S)
#define G(x, y, z)
void RNA_boolean_set(PointerRNA *ptr, const char *name, bool value)
Definition: rna_access.c:4874
float RNA_float_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:4957
void RNA_float_set(PointerRNA *ptr, const char *name, float value)
Definition: rna_access.c:4968
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:4863
void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
Definition: rna_access.c:5015
PropertyRNA * RNA_def_float(StructOrFunctionRNA *cont_, const char *identifier, float default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax)
Definition: rna_define.c:3836
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, bool default_value, const char *ui_name, const char *ui_description)
Definition: rna_define.c:3493
void * first
Definition: DNA_listBase.h:31
struct RenderData r
short datatype
Definition: ED_anim_api.h:62
void * data
Definition: ED_anim_api.h:60
struct bAnimListElem * next
Definition: ED_anim_api.h:127
char scrubbing
short val
Definition: WM_types.h:680
int mval[2]
Definition: WM_types.h:684
short type
Definition: WM_types.h:678
int(* invoke)(struct bContext *, struct wmOperator *, const struct wmEvent *) ATTR_WARN_UNUSED_RESULT
Definition: WM_types.h:919
const char * name
Definition: WM_types.h:888
int(* modal)(struct bContext *, struct wmOperator *, const struct wmEvent *) ATTR_WARN_UNUSED_RESULT
Definition: WM_types.h:935
const char * idname
Definition: WM_types.h:890
bool(* poll)(struct bContext *) ATTR_WARN_UNUSED_RESULT
Definition: WM_types.h:943
struct StructRNA * srna
Definition: WM_types.h:969
const char * description
Definition: WM_types.h:893
int(* exec)(struct bContext *, struct wmOperator *) ATTR_WARN_UNUSED_RESULT
Definition: WM_types.h:903
struct PointerRNA * ptr
wmEventHandler_Op * WM_event_add_modal_handler(bContext *C, wmOperator *op)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
@ RIGHTMOUSE
@ MOUSEMOVE
@ LEFTMOUSE
@ MIDDLEMOUSE
@ EVT_ESCKEY
wmOperatorType * ot
Definition: wm_files.c:3479
wmKeyMap * WM_keymap_ensure(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid)
Definition: wm_keymap.c:852
wmOperatorType * WM_operatortype_append_macro(const char *idname, const char *name, const char *description, int flag)
wmOperatorTypeMacro * WM_operatortype_macro_define(wmOperatorType *ot, const char *idname)
void WM_operatortype_append(void(*opfunc)(wmOperatorType *))