Blender  V2.93
space_sequencer.c
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2008 Blender Foundation.
17  * All rights reserved.
18  */
19 
24 #include <math.h>
25 #include <stdio.h>
26 #include <string.h>
27 
28 #include "DNA_gpencil_types.h"
29 #include "DNA_mask_types.h"
30 #include "DNA_scene_types.h"
31 
32 #include "MEM_guardedalloc.h"
33 
34 #include "BLI_blenlib.h"
35 #include "BLI_utildefines.h"
36 
37 #include "BKE_context.h"
38 #include "BKE_global.h"
39 #include "BKE_lib_id.h"
40 #include "BKE_screen.h"
42 
43 #include "ED_screen.h"
44 #include "ED_space_api.h"
45 #include "ED_view3d.h"
46 #include "ED_view3d_offscreen.h" /* Only for sequencer view3d drawing callback. */
47 
48 #include "WM_api.h"
49 #include "WM_message.h"
50 #include "WM_types.h"
51 
52 #include "RNA_access.h"
53 
54 #include "SEQ_utils.h"
55 
56 #include "UI_interface.h"
57 #include "UI_resources.h"
58 #include "UI_view2d.h"
59 
60 #include "IMB_imbuf.h"
61 
62 /* Own include. */
63 #include "sequencer_intern.h"
64 
65 /**************************** common state *****************************/
66 
68 {
69  SpaceSeq *sseq = (SpaceSeq *)area->spacedata.first;
70 
71  sseq->scopes.reference_ibuf = NULL;
72 }
73 
74 /* ******************** manage regions ********************* */
75 
77 {
78  ARegion *region = NULL;
79 
80  for (region = area->regionbase.first; region; region = region->next) {
81  if (region->regiontype == type) {
82  return region;
83  }
84  }
85 
86  return region;
87 }
88 
89 /* ******************** default callbacks for sequencer space ***************** */
90 
92 {
93  ARegion *region;
94  SpaceSeq *sseq;
95 
96  sseq = MEM_callocN(sizeof(SpaceSeq), "initsequencer");
97  sseq->spacetype = SPACE_SEQ;
98  sseq->chanshown = 0;
99  sseq->view = SEQ_VIEW_SEQUENCE;
100  sseq->mainb = SEQ_DRAW_IMG_IMBUF;
104 
105  /* Tool header. */
106  region = MEM_callocN(sizeof(ARegion), "tool header for sequencer");
107 
108  BLI_addtail(&sseq->regionbase, region);
112 
113  /* Header. */
114  region = MEM_callocN(sizeof(ARegion), "header for sequencer");
115 
116  BLI_addtail(&sseq->regionbase, region);
117  region->regiontype = RGN_TYPE_HEADER;
119 
120  /* Buttons/list view. */
121  region = MEM_callocN(sizeof(ARegion), "buttons for sequencer");
122 
123  BLI_addtail(&sseq->regionbase, region);
124  region->regiontype = RGN_TYPE_UI;
125  region->alignment = RGN_ALIGN_RIGHT;
126  region->flag = RGN_FLAG_HIDDEN;
127 
128  /* Toolbar. */
129  region = MEM_callocN(sizeof(ARegion), "tools for sequencer");
130 
131  BLI_addtail(&sseq->regionbase, region);
132  region->regiontype = RGN_TYPE_TOOLS;
133  region->alignment = RGN_ALIGN_LEFT;
134  region->flag = RGN_FLAG_HIDDEN;
135 
136  /* Preview region. */
137  /* NOTE: if you change values here, also change them in sequencer_init_preview_region. */
138  region = MEM_callocN(sizeof(ARegion), "preview region for sequencer");
139  BLI_addtail(&sseq->regionbase, region);
140  region->regiontype = RGN_TYPE_PREVIEW;
141  region->alignment = RGN_ALIGN_TOP;
142  region->flag |= RGN_FLAG_HIDDEN;
143  /* For now, aspect ratio should be maintained, and zoom is clamped within sane default limits. */
145  region->v2d.minzoom = 0.001f;
146  region->v2d.maxzoom = 1000.0f;
147  region->v2d.tot.xmin = -960.0f; /* 1920 width centered. */
148  region->v2d.tot.ymin = -540.0f; /* 1080 height centered. */
149  region->v2d.tot.xmax = 960.0f;
150  region->v2d.tot.ymax = 540.0f;
151  region->v2d.min[0] = 0.0f;
152  region->v2d.min[1] = 0.0f;
153  region->v2d.max[0] = 12000.0f;
154  region->v2d.max[1] = 12000.0f;
155  region->v2d.cur = region->v2d.tot;
156  region->v2d.align = V2D_ALIGN_FREE;
157  region->v2d.keeptot = V2D_KEEPTOT_FREE;
158 
159  /* Main region. */
160  region = MEM_callocN(sizeof(ARegion), "main region for sequencer");
161 
162  BLI_addtail(&sseq->regionbase, region);
163  region->regiontype = RGN_TYPE_WINDOW;
164 
165  /* Seq space goes from (0,8) to (0, efra). */
166  region->v2d.tot.xmin = 0.0f;
167  region->v2d.tot.ymin = 0.0f;
168  region->v2d.tot.xmax = scene->r.efra;
169  region->v2d.tot.ymax = 8.0f;
170 
171  region->v2d.cur = region->v2d.tot;
172 
173  region->v2d.min[0] = 10.0f;
174  region->v2d.min[1] = 0.5f;
175 
176  region->v2d.max[0] = MAXFRAMEF;
177  region->v2d.max[1] = MAXSEQ;
178 
179  region->v2d.minzoom = 0.01f;
180  region->v2d.maxzoom = 100.0f;
181 
184  region->v2d.keepzoom = 0;
185  region->v2d.keeptot = 0;
186  region->v2d.align = V2D_ALIGN_NO_NEG_Y;
187 
188  return (SpaceLink *)sseq;
189 }
190 
191 /* Not spacelink itself. */
192 static void sequencer_free(SpaceLink *sl)
193 {
194  SpaceSeq *sseq = (SpaceSeq *)sl;
195  SequencerScopes *scopes = &sseq->scopes;
196 
197  /* XXX if (sseq->gpd) BKE_gpencil_free(sseq->gpd); */
198 
199  if (scopes->zebra_ibuf) {
200  IMB_freeImBuf(scopes->zebra_ibuf);
201  }
202 
203  if (scopes->waveform_ibuf) {
204  IMB_freeImBuf(scopes->waveform_ibuf);
205  }
206 
207  if (scopes->sep_waveform_ibuf) {
209  }
210 
211  if (scopes->vector_ibuf) {
212  IMB_freeImBuf(scopes->vector_ibuf);
213  }
214 
215  if (scopes->histogram_ibuf) {
216  IMB_freeImBuf(scopes->histogram_ibuf);
217  }
218 }
219 
220 /* Spacetype init callback. */
222 {
223 }
224 
225 static void sequencer_refresh(const bContext *C, ScrArea *area)
226 {
228  wmWindow *window = CTX_wm_window(C);
229  SpaceSeq *sseq = (SpaceSeq *)area->spacedata.first;
232  bool view_changed = false;
233 
234  switch (sseq->view) {
235  case SEQ_VIEW_SEQUENCE:
236  if (region_main && (region_main->flag & RGN_FLAG_HIDDEN)) {
237  region_main->flag &= ~RGN_FLAG_HIDDEN;
238  region_main->v2d.flag &= ~V2D_IS_INIT;
239  view_changed = true;
240  }
241  if (region_preview && !(region_preview->flag & RGN_FLAG_HIDDEN)) {
242  region_preview->flag |= RGN_FLAG_HIDDEN;
243  region_preview->v2d.flag &= ~V2D_IS_INIT;
244  WM_event_remove_handlers((bContext *)C, &region_preview->handlers);
245  view_changed = true;
246  }
247  if (region_main && region_main->alignment != RGN_ALIGN_NONE) {
248  region_main->alignment = RGN_ALIGN_NONE;
249  view_changed = true;
250  }
251  if (region_preview && region_preview->alignment != RGN_ALIGN_NONE) {
252  region_preview->alignment = RGN_ALIGN_NONE;
253  view_changed = true;
254  }
255  break;
256  case SEQ_VIEW_PREVIEW:
257  if (region_main && !(region_main->flag & RGN_FLAG_HIDDEN)) {
258  region_main->flag |= RGN_FLAG_HIDDEN;
259  region_main->v2d.flag &= ~V2D_IS_INIT;
260  WM_event_remove_handlers((bContext *)C, &region_main->handlers);
261  view_changed = true;
262  }
263  if (region_preview && (region_preview->flag & RGN_FLAG_HIDDEN)) {
264  region_preview->flag &= ~RGN_FLAG_HIDDEN;
265  region_preview->v2d.flag &= ~V2D_IS_INIT;
266  region_preview->v2d.cur = region_preview->v2d.tot;
267  view_changed = true;
268  }
269  if (region_main && region_main->alignment != RGN_ALIGN_NONE) {
270  region_main->alignment = RGN_ALIGN_NONE;
271  view_changed = true;
272  }
273  if (region_preview && region_preview->alignment != RGN_ALIGN_NONE) {
274  region_preview->alignment = RGN_ALIGN_NONE;
275  view_changed = true;
276  }
277  break;
279  if (region_main && region_preview) {
280  /* Get available height (without DPI correction). */
281  const float height = (area->winy - ED_area_headersize()) / UI_DPI_FAC;
282 
283  /* We reuse hidden region's size, allows to find same layout as before if we just switch
284  * between one 'full window' view and the combined one. This gets lost if we switch to both
285  * 'full window' views before, though... Better than nothing. */
286  if (region_main->flag & RGN_FLAG_HIDDEN) {
287  region_main->flag &= ~RGN_FLAG_HIDDEN;
288  region_main->v2d.flag &= ~V2D_IS_INIT;
289  region_preview->sizey = (int)(height - region_main->sizey);
290  view_changed = true;
291  }
292  if (region_preview->flag & RGN_FLAG_HIDDEN) {
293  region_preview->flag &= ~RGN_FLAG_HIDDEN;
294  region_preview->v2d.flag &= ~V2D_IS_INIT;
295  region_preview->v2d.cur = region_preview->v2d.tot;
296  region_main->sizey = (int)(height - region_preview->sizey);
297  view_changed = true;
298  }
299  if (region_main->alignment != RGN_ALIGN_NONE) {
300  region_main->alignment = RGN_ALIGN_NONE;
301  view_changed = true;
302  }
303  if (region_preview->alignment != RGN_ALIGN_TOP) {
304  region_preview->alignment = RGN_ALIGN_TOP;
305  view_changed = true;
306  }
307  /* Final check that both preview and main height are reasonable. */
308  if (region_preview->sizey < 10 || region_main->sizey < 10 ||
309  region_preview->sizey + region_main->sizey > height) {
310  region_preview->sizey = roundf(height * 0.4f);
311  region_main->sizey = (int)(height - region_preview->sizey);
312  view_changed = true;
313  }
314  }
315  break;
316  }
317 
318  if (view_changed) {
319  ED_area_init(wm, window, area);
321  }
322 }
323 
325 {
326  SpaceSeq *sseqn = MEM_dupallocN(sl);
327 
328  /* Clear or remove stuff from old. */
329  /* XXX sseq->gpd = gpencil_data_duplicate(sseq->gpd, false); */
330 
331  memset(&sseqn->scopes, 0, sizeof(sseqn->scopes));
332 
333  return (SpaceLink *)sseqn;
334 }
335 
337 {
338  ScrArea *area = params->area;
339  wmNotifier *wmn = params->notifier;
340 
341  /* Context changes. */
342  switch (wmn->category) {
343  case NC_SCENE:
344  switch (wmn->data) {
345  case ND_FRAME:
346  case ND_SEQUENCER:
348  break;
349  }
350  break;
351  case NC_WINDOW:
352  case NC_SPACE:
353  if (wmn->data == ND_SPACE_SEQUENCER) {
355  }
356  break;
357  case NC_GPENCIL:
358  if (wmn->data & ND_GPENCIL_EDITMODE) {
360  }
361  break;
362  }
363 }
364 
365 /* ************* dropboxes ************* */
366 
368  wmDrag *drag,
369  const wmEvent *event,
370  const char **UNUSED(r_tooltip))
371 {
372  ARegion *region = CTX_wm_region(C);
374  int hand;
375 
376  if (drag->type == WM_DRAG_PATH) {
377  if (ELEM(drag->icon, ICON_FILE_IMAGE, ICON_FILE_BLANK)) { /* Rule might not work? */
378  if (find_nearest_seq(scene, &region->v2d, &hand, event->mval) == NULL) {
379  return 1;
380  }
381  }
382  }
383 
384  return 0;
385 }
386 
388  wmDrag *drag,
389  const wmEvent *event,
390  const char **UNUSED(r_tooltip))
391 {
392  ARegion *region = CTX_wm_region(C);
394  int hand;
395 
396  if (drag->type == WM_DRAG_PATH) {
397  if (ELEM(drag->icon, 0, ICON_FILE_MOVIE, ICON_FILE_BLANK)) { /* Rule might not work? */
398  if (find_nearest_seq(scene, &region->v2d, &hand, event->mval) == NULL) {
399  return 1;
400  }
401  }
402  }
403  return 0;
404 }
405 
407  wmDrag *drag,
408  const wmEvent *event,
409  const char **UNUSED(r_tooltip))
410 {
411  ARegion *region = CTX_wm_region(C);
413  int hand;
414 
415  if (drag->type == WM_DRAG_PATH) {
416  if (ELEM(drag->icon, ICON_FILE_SOUND, ICON_FILE_BLANK)) { /* Rule might not work? */
417  if (find_nearest_seq(scene, &region->v2d, &hand, event->mval) == NULL) {
418  return 1;
419  }
420  }
421  }
422  return 0;
423 }
424 
425 static void sequencer_drop_copy(wmDrag *drag, wmDropBox *drop)
426 {
427  /* Copy drag path to properties. */
428  if (RNA_struct_find_property(drop->ptr, "filepath")) {
429  RNA_string_set(drop->ptr, "filepath", drag->path);
430  }
431 
432  if (RNA_struct_find_property(drop->ptr, "directory")) {
433  PointerRNA itemptr;
434  char dir[FILE_MAX], file[FILE_MAX];
435 
436  BLI_split_dirfile(drag->path, dir, file, sizeof(dir), sizeof(file));
437 
438  RNA_string_set(drop->ptr, "directory", dir);
439 
440  RNA_collection_clear(drop->ptr, "files");
441  RNA_collection_add(drop->ptr, "files", &itemptr);
442  RNA_string_set(&itemptr, "name", file);
443  }
444 }
445 
446 /* This region dropbox definition. */
447 static void sequencer_dropboxes(void)
448 {
450 
451  WM_dropbox_add(lb, "SEQUENCER_OT_image_strip_add", image_drop_poll, sequencer_drop_copy, NULL);
452  WM_dropbox_add(lb, "SEQUENCER_OT_movie_strip_add", movie_drop_poll, sequencer_drop_copy, NULL);
453  WM_dropbox_add(lb, "SEQUENCER_OT_sound_strip_add", sound_drop_poll, sequencer_drop_copy, NULL);
454 }
455 
456 /* ************* end drop *********** */
457 
458 /* DO NOT make this static, this hides the symbol and breaks API generation script. */
459 extern const char *sequencer_context_dir[]; /* Quiet warning. */
460 const char *sequencer_context_dir[] = {"edit_mask", NULL};
461 
462 static int /*eContextResult*/ sequencer_context(const bContext *C,
463  const char *member,
465 {
467 
468  if (CTX_data_dir(member)) {
470 
471  return CTX_RESULT_OK;
472  }
473  if (CTX_data_equals(member, "edit_mask")) {
475  if (mask) {
477  }
478  return CTX_RESULT_OK;
479  }
480 
482 }
483 
485 {
486  VIEW2D_GGT_navigate_impl(gzgt, "SEQUENCER_GGT_navigate");
487 }
488 
489 static void sequencer_gizmos(void)
490 {
493 
495 }
496 
497 /* *********************** sequencer (main) region ************************ */
498 /* Add handlers, stuff you only do once or on area/region changes. */
500 {
501  wmKeyMap *keymap;
502  ListBase *lb;
503 
504  UI_view2d_region_reinit(&region->v2d, V2D_COMMONVIEW_CUSTOM, region->winx, region->winy);
505 
506 #if 0
507  keymap = WM_keymap_ensure(wm->defaultconf, "Mask Editing", 0, 0);
509 #endif
510 
511  keymap = WM_keymap_ensure(wm->defaultconf, "SequencerCommon", SPACE_SEQ, 0);
513 
514  /* Own keymap. */
515  keymap = WM_keymap_ensure(wm->defaultconf, "Sequencer", SPACE_SEQ, 0);
517 
518  /* Add drop boxes. */
519  lb = WM_dropboxmap_find("Sequencer", SPACE_SEQ, RGN_TYPE_WINDOW);
520 
522 }
523 
524 /* Strip editing timeline. */
525 static void sequencer_main_region_draw(const bContext *C, ARegion *region)
526 {
527  draw_timeline_seq(C, region);
528 }
529 
530 /* Strip editing timeline. */
532 {
533  draw_timeline_seq_display(C, region);
534 }
535 
537 {
538  ARegion *region = params->region;
539  wmNotifier *wmn = params->notifier;
540 
541  /* Context changes. */
542  switch (wmn->category) {
543  case NC_SCENE:
544  switch (wmn->data) {
545  case ND_FRAME:
546  case ND_FRAME_RANGE:
547  case ND_MARKERS:
548  case ND_RENDER_OPTIONS: /* For FPS and FPS Base. */
549  case ND_SEQUENCER:
550  case ND_RENDER_RESULT:
551  ED_region_tag_redraw(region);
552  break;
553  }
554  break;
555  case NC_ANIMATION:
556  switch (wmn->data) {
557  case ND_KEYFRAME:
558  ED_region_tag_redraw(region);
559  break;
560  }
561  break;
562  case NC_SPACE:
563  if (wmn->data == ND_SPACE_SEQUENCER) {
564  ED_region_tag_redraw(region);
565  }
566  break;
567  case NC_ID:
568  if (wmn->action == NA_RENAME) {
569  ED_region_tag_redraw(region);
570  }
571  break;
572  case NC_SCREEN:
573  if (ELEM(wmn->data, ND_ANIMPLAY)) {
574  ED_region_tag_redraw(region);
575  }
576  break;
577  }
578 }
579 
581 {
582  struct wmMsgBus *mbus = params->message_bus;
583  Scene *scene = params->scene;
584  ARegion *region = params->region;
585 
586  wmMsgSubscribeValue msg_sub_value_region_tag_redraw = {
587  .owner = region,
588  .user_data = region,
590  };
591 
592  /* Timeline depends on scene properties. */
593  {
594  bool use_preview = (scene->r.flag & SCER_PRV_RANGE);
595  extern PropertyRNA rna_Scene_frame_start;
596  extern PropertyRNA rna_Scene_frame_end;
597  extern PropertyRNA rna_Scene_frame_preview_start;
598  extern PropertyRNA rna_Scene_frame_preview_end;
599  extern PropertyRNA rna_Scene_use_preview_range;
600  extern PropertyRNA rna_Scene_frame_current;
601  const PropertyRNA *props[] = {
602  use_preview ? &rna_Scene_frame_preview_start : &rna_Scene_frame_start,
603  use_preview ? &rna_Scene_frame_preview_end : &rna_Scene_frame_end,
604  &rna_Scene_use_preview_range,
605  &rna_Scene_frame_current,
606  };
607 
608  PointerRNA idptr;
609  RNA_id_pointer_create(&scene->id, &idptr);
610 
611  for (int i = 0; i < ARRAY_SIZE(props); i++) {
612  WM_msg_subscribe_rna(mbus, &idptr, props[i], &msg_sub_value_region_tag_redraw, __func__);
613  }
614  }
615 
616  {
617  StructRNA *type_array[] = {
619 
620  &RNA_Sequence,
621  /* Members of 'Sequence'. */
626  };
627  wmMsgParams_RNA msg_key_params = {{0}};
628  for (int i = 0; i < ARRAY_SIZE(type_array); i++) {
629  msg_key_params.ptr.type = type_array[i];
631  mbus, &msg_key_params, &msg_sub_value_region_tag_redraw, __func__);
632  }
633  }
634 }
635 
636 /* *********************** header region ************************ */
637 /* Add handlers, stuff you only do once or on area/region changes. */
639 {
640  ED_region_header_init(region);
641 }
642 
643 static void sequencer_header_region_draw(const bContext *C, ARegion *region)
644 {
645  ED_region_header(C, region);
646 }
647 
648 /* *********************** toolbar region ************************ */
649 /* Add handlers, stuff you only do once or on area/region changes. */
651 {
652  wmKeyMap *keymap;
653 
655  ED_region_panels_init(wm, region);
656 
657  keymap = WM_keymap_ensure(wm->defaultconf, "SequencerCommon", SPACE_SEQ, 0);
659 }
660 
661 static void sequencer_tools_region_draw(const bContext *C, ARegion *region)
662 {
663  ED_region_panels(C, region);
664 }
665 /* *********************** preview region ************************ */
667 {
668  wmKeyMap *keymap;
669 
670  UI_view2d_region_reinit(&region->v2d, V2D_COMMONVIEW_CUSTOM, region->winx, region->winy);
671 
672 #if 0
673  keymap = WM_keymap_ensure(wm->defaultconf, "Mask Editing", 0, 0);
675 #endif
676 
677  keymap = WM_keymap_ensure(wm->defaultconf, "SequencerCommon", SPACE_SEQ, 0);
679 
680  /* Own keymap. */
681  keymap = WM_keymap_ensure(wm->defaultconf, "SequencerPreview", SPACE_SEQ, 0);
683 }
684 
685 static void sequencer_preview_region_layout(const bContext *C, ARegion *region)
686 {
687  SpaceSeq *sseq = CTX_wm_space_seq(C);
688 
689  if (sseq->flag & SEQ_ZOOM_TO_FIT) {
690  View2D *v2d = &region->v2d;
691  v2d->cur = v2d->tot;
692  }
693 }
694 
696 {
697  SpaceSeq *sseq = CTX_wm_space_seq(C);
698  sseq->flag &= ~SEQ_ZOOM_TO_FIT;
699 }
700 
701 static void sequencer_preview_region_draw(const bContext *C, ARegion *region)
702 {
704  SpaceSeq *sseq = area->spacedata.first;
707  const bool draw_overlay = (scene->ed && (scene->ed->over_flag & SEQ_EDIT_OVERLAY_SHOW) &&
708  (sseq->flag & SEQ_SHOW_STRIP_OVERLAY));
709 
710  /* XXX temp fix for wrong setting in sseq->mainb */
711  if (sseq->mainb == SEQ_DRAW_SEQUENCE) {
712  sseq->mainb = SEQ_DRAW_IMG_IMBUF;
713  }
714 
715  if (!draw_overlay || sseq->overlay_type != SEQ_DRAW_OVERLAY_REFERENCE) {
716  sequencer_draw_preview(C, scene, region, sseq, scene->r.cfra, 0, false, false);
717  }
718 
719  if (draw_overlay && sseq->overlay_type != SEQ_DRAW_OVERLAY_CURRENT) {
720  int over_cfra;
721 
723  over_cfra = scene->ed->over_cfra;
724  }
725  else {
726  over_cfra = scene->r.cfra + scene->ed->over_ofs;
727  }
728 
729  if (over_cfra != scene->r.cfra || sseq->overlay_type != SEQ_DRAW_OVERLAY_RECT) {
731  C, scene, region, sseq, scene->r.cfra, over_cfra - scene->r.cfra, true, false);
732  }
733  }
734 
736 
737  if ((U.uiflag & USER_SHOW_FPS) && ED_screen_animation_no_scrub(wm)) {
738  const rcti *rect = ED_region_visible_rect(region);
739  int xoffset = rect->xmin + U.widget_unit;
740  int yoffset = rect->ymax;
741  ED_scene_draw_fps(scene, xoffset, &yoffset);
742  }
743 }
744 
746 {
747  ARegion *region = params->region;
748  wmNotifier *wmn = params->notifier;
749 
750  /* Context changes. */
751  switch (wmn->category) {
752  case NC_GPENCIL:
753  if (ELEM(wmn->action, NA_EDITED, NA_SELECTED)) {
754  ED_region_tag_redraw(region);
755  }
756  break;
757  case NC_SCENE:
758  switch (wmn->data) {
759  case ND_FRAME:
760  case ND_MARKERS:
761  case ND_SEQUENCER:
762  case ND_RENDER_OPTIONS:
764  ED_region_tag_redraw(region);
765  break;
766  }
767  break;
768  case NC_ANIMATION:
769  switch (wmn->data) {
770  case ND_KEYFRAME:
771  ED_region_tag_redraw(region);
772  break;
773  }
774  break;
775  case NC_SPACE:
776  if (wmn->data == ND_SPACE_SEQUENCER) {
777  ED_region_tag_redraw(region);
778  }
779  break;
780  case NC_ID:
781  switch (wmn->data) {
782  case NA_RENAME:
783  ED_region_tag_redraw(region);
784  break;
785  }
786  break;
787  case NC_MASK:
788  if (wmn->action == NA_EDITED) {
789  ED_region_tag_redraw(region);
790  }
791  break;
792  }
793 }
794 
795 /* *********************** buttons region ************************ */
796 
797 /* Add handlers, stuff you only do once or on area/region changes. */
799 {
800  wmKeyMap *keymap;
801 
802  keymap = WM_keymap_ensure(wm->defaultconf, "SequencerCommon", SPACE_SEQ, 0);
804 
805  UI_panel_category_active_set_default(region, "Strip");
806  ED_region_panels_init(wm, region);
807 }
808 
809 static void sequencer_buttons_region_draw(const bContext *C, ARegion *region)
810 {
811  ED_region_panels(C, region);
812 }
813 
815 {
816  ARegion *region = params->region;
817  wmNotifier *wmn = params->notifier;
818 
819  /* Context changes. */
820  switch (wmn->category) {
821  case NC_GPENCIL:
822  if (ELEM(wmn->action, NA_EDITED, NA_SELECTED)) {
823  ED_region_tag_redraw(region);
824  }
825  break;
826  case NC_SCENE:
827  switch (wmn->data) {
828  case ND_FRAME:
829  case ND_SEQUENCER:
830  ED_region_tag_redraw(region);
831  break;
832  }
833  break;
834  case NC_SPACE:
835  if (wmn->data == ND_SPACE_SEQUENCER) {
836  ED_region_tag_redraw(region);
837  }
838  break;
839  case NC_ID:
840  if (wmn->action == NA_RENAME) {
841  ED_region_tag_redraw(region);
842  }
843  break;
844  }
845 }
846 
847 static void sequencer_id_remap(ScrArea *UNUSED(area), SpaceLink *slink, ID *old_id, ID *new_id)
848 {
849  SpaceSeq *sseq = (SpaceSeq *)slink;
850 
851  if (!ELEM(GS(old_id->name), ID_GD)) {
852  return;
853  }
854 
855  if ((ID *)sseq->gpd == old_id) {
856  sseq->gpd = (bGPdata *)new_id;
857  id_us_min(old_id);
858  id_us_plus(new_id);
859  }
860 }
861 
862 /* ************************************* */
863 
864 /* Only called once, from space/spacetypes.c. */
866 {
867  SpaceType *st = MEM_callocN(sizeof(SpaceType), "spacetype sequencer");
868  ARegionType *art;
869 
870  st->spaceid = SPACE_SEQ;
871  strncpy(st->name, "Sequencer", BKE_ST_MAXNAME);
872 
873  st->create = sequencer_create;
874  st->free = sequencer_free;
875  st->init = sequencer_init;
878  st->keymap = sequencer_keymap;
880  st->gizmos = sequencer_gizmos;
885 
886  /* Create regions: */
887  /* Main window. */
888  art = MEM_callocN(sizeof(ARegionType), "spacetype sequencer region");
889  art->regionid = RGN_TYPE_WINDOW;
896  BLI_addhead(&st->regiontypes, art);
897 
898  /* Preview. */
899  art = MEM_callocN(sizeof(ARegionType), "spacetype sequencer region");
900  art->regionid = RGN_TYPE_PREVIEW;
908  BLI_addhead(&st->regiontypes, art);
909 
910  /* Listview/buttons. */
911  art = MEM_callocN(sizeof(ARegionType), "spacetype sequencer region");
912  art->regionid = RGN_TYPE_UI;
913  art->prefsizex = UI_SIDEBAR_PANEL_WIDTH * 1.3f;
919  BLI_addhead(&st->regiontypes, art);
920 
922  /* Toolbar. */
923  art = MEM_callocN(sizeof(ARegionType), "spacetype sequencer tools region");
924  art->regionid = RGN_TYPE_TOOLS;
925  art->prefsizex = 58; /* XXX */
926  art->prefsizey = 50; /* XXX */
932  BLI_addhead(&st->regiontypes, art);
933 
934  /* Tool header. */
935  art = MEM_callocN(sizeof(ARegionType), "spacetype sequencer tool header region");
937  art->prefsizey = HEADERY;
943  BLI_addhead(&st->regiontypes, art);
944 
945  /* Header. */
946  art = MEM_callocN(sizeof(ARegionType), "spacetype sequencer region");
947  art->regionid = RGN_TYPE_HEADER;
948  art->prefsizey = HEADERY;
950 
954  BLI_addhead(&st->regiontypes, art);
955 
956  /* HUD. */
957  art = ED_area_type_hud(st->spaceid);
958  BLI_addhead(&st->regiontypes, art);
959 
961 
962  /* Set the sequencer callback when not in background mode. */
963  if (G.background == 0) {
965  }
966 }
struct ScrArea * CTX_wm_area(const bContext *C)
Definition: context.c:714
struct Scene * CTX_data_scene(const bContext *C)
Definition: context.c:1034
void CTX_data_dir_set(bContextDataResult *result, const char **dir)
Definition: context.c:672
bool CTX_data_equals(const char *member, const char *str)
Definition: context.c:623
void CTX_data_id_pointer_set(bContextDataResult *result, struct ID *id)
Definition: context.c:633
bool CTX_data_dir(const char *member)
Definition: context.c:628
struct wmWindowManager * CTX_wm_manager(const bContext *C)
Definition: context.c:689
struct SpaceSeq * CTX_wm_space_seq(const bContext *C)
Definition: context.c:827
@ CTX_RESULT_MEMBER_NOT_FOUND
Definition: BKE_context.h:86
@ CTX_RESULT_OK
Definition: BKE_context.h:83
struct ARegion * CTX_wm_region(const bContext *C)
Definition: context.c:725
struct wmWindow * CTX_wm_window(const bContext *C)
Definition: context.c:699
void id_us_min(struct ID *id)
Definition: lib_id.c:297
void id_us_plus(struct ID *id)
Definition: lib_id.c:288
#define BKE_ST_MAXNAME
Definition: BKE_screen.h:68
void BKE_spacetype_register(struct SpaceType *st)
Definition: screen.c:420
SequencerDrawView sequencer_view3d_fn
Definition: render.c:90
void BLI_addhead(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:87
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:110
#define FILE_MAX
void BLI_split_dirfile(const char *string, char *dir, char *file, const size_t dirlen, const size_t filelen)
Definition: path_util.c:1654
#define ARRAY_SIZE(arr)
#define UNUSED(x)
#define ELEM(...)
@ ID_GD
Definition: DNA_ID_enums.h:83
#define SCER_PRV_RANGE
#define MAXFRAMEF
#define HEADERY
@ RGN_ALIGN_BOTTOM
@ RGN_ALIGN_LEFT
@ RGN_ALIGN_TOP
@ RGN_ALIGN_RIGHT
@ RGN_ALIGN_NONE
@ RGN_FLAG_HIDDEN
@ RGN_FLAG_HIDDEN_BY_USER
@ RGN_TYPE_TOOL_HEADER
@ RGN_TYPE_UI
@ RGN_TYPE_WINDOW
@ RGN_TYPE_PREVIEW
@ RGN_TYPE_HEADER
@ RGN_TYPE_TOOLS
#define SEQ_EDIT_OVERLAY_ABS
#define SEQ_EDIT_OVERLAY_SHOW
#define MAXSEQ
@ SEQ_DRAW_OVERLAY_CURRENT
@ SEQ_DRAW_OVERLAY_REFERENCE
@ SEQ_DRAW_OVERLAY_RECT
@ SPACE_SEQ
@ SEQ_VIEW_SEQUENCE_PREVIEW
@ SEQ_VIEW_SEQUENCE
@ SEQ_VIEW_PREVIEW
@ SEQ_DRAW_SEQUENCE
@ SEQ_DRAW_IMG_IMBUF
@ SEQ_SHOW_MARKERS
@ SEQ_SHOW_GPENCIL
@ SEQ_USE_ALPHA
@ SEQ_SHOW_STRIP_DURATION
@ SEQ_SHOW_FCURVES
@ SEQ_SHOW_STRIP_NAME
@ SEQ_ZOOM_TO_FIT
@ SEQ_SHOW_STRIP_SOURCE
@ SEQ_SHOW_STRIP_OVERLAY
@ USER_SHOW_FPS
@ USER_HEADER_BOTTOM
@ V2D_IS_INIT
@ V2D_KEEPTOT_FREE
@ V2D_SCROLL_VERTICAL_HIDE
@ V2D_SCROLL_VERTICAL_HANDLES
@ V2D_SCROLL_RIGHT
@ V2D_SCROLL_BOTTOM
@ V2D_SCROLL_HORIZONTAL_HANDLES
@ V2D_ALIGN_NO_NEG_Y
@ V2D_ALIGN_FREE
@ V2D_LIMITZOOM
@ V2D_KEEPZOOM
@ V2D_KEEPASPECT
void ED_area_tag_redraw(ScrArea *area)
Definition: area.c:745
bScreen * ED_screen_animation_no_scrub(const struct wmWindowManager *wm)
void ED_region_header(const struct bContext *C, struct ARegion *region)
void ED_region_do_msg_notify_tag_redraw(struct bContext *C, struct wmMsgSubscribeKey *msg_key, struct wmMsgSubscribeValue *msg_val)
void ED_area_do_mgs_subscribe_for_tool_ui(const struct wmRegionMessageSubscribeParams *params)
int ED_region_generic_tools_region_snap_size(const struct ARegion *region, int size, int axis)
void ED_region_generic_tools_region_message_subscribe(const struct wmRegionMessageSubscribeParams *params)
int ED_area_headersize(void)
Definition: area.c:3363
void ED_region_panels(const struct bContext *C, struct ARegion *region)
void ED_area_do_mgs_subscribe_for_tool_header(const struct wmRegionMessageSubscribeParams *params)
struct ARegionType * ED_area_type_hud(int space_type)
void ED_region_panels_init(struct wmWindowManager *wm, struct ARegion *region)
Definition: area.c:3090
void ED_region_tag_redraw(struct ARegion *region)
Definition: area.c:667
void ED_region_header_init(struct ARegion *region)
Definition: area.c:3358
void ED_area_init(struct wmWindowManager *wm, struct wmWindow *win, struct ScrArea *area)
Definition: area.c:1906
@ ED_KEYMAP_UI
Definition: ED_screen.h:440
@ ED_KEYMAP_ANIMATION
Definition: ED_screen.h:444
@ ED_KEYMAP_HEADER
Definition: ED_screen.h:446
@ ED_KEYMAP_TOOL
Definition: ED_screen.h:442
@ ED_KEYMAP_GPENCIL
Definition: ED_screen.h:448
@ ED_KEYMAP_GIZMO
Definition: ED_screen.h:441
@ ED_KEYMAP_VIEW2D
Definition: ED_screen.h:443
@ ED_KEYMAP_FRAMES
Definition: ED_screen.h:445
const rcti * ED_region_visible_rect(ARegion *region)
Definition: area.c:3682
void ED_scene_draw_fps(const struct Scene *scene, int xoffset, int *yoffset)
struct ImBuf * ED_view3d_draw_offscreen_imbuf_simple(struct Depsgraph *depsgraph, struct Scene *scene, struct View3DShading *shading_override, eDrawType drawtype, struct Object *camera, int width, int height, eImBufFlags imbuf_flags, eV3DOffscreenDrawFlag draw_flags, int alpha_mode, const char *viewname, struct GPUOffScreen *ofs, char err_out[256])
Definition: view3d_draw.c:1991
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei height
void IMB_freeImBuf(struct ImBuf *ibuf)
Definition: allocimbuf.c:211
Read Guarded memory(de)allocation.
StructRNA RNA_SequenceModifier
StructRNA RNA_SequenceColorBalanceData
StructRNA RNA_SequenceEditor
StructRNA RNA_SequenceCrop
StructRNA RNA_SequenceTransform
StructRNA RNA_Sequence
#define C
Definition: RandGen.cpp:39
void UI_panel_category_active_set_default(struct ARegion *region, const char *idname)
#define UI_SIDEBAR_PANEL_WIDTH
Definition: UI_interface.h:245
#define UI_DPI_FAC
Definition: UI_interface.h:309
void VIEW2D_GGT_navigate_impl(struct wmGizmoGroupType *gzgt, const char *idname)
void UI_view2d_region_reinit(struct View2D *v2d, short type, int winx, int winy)
Definition: view2d.c:240
@ V2D_COMMONVIEW_CUSTOM
Definition: UI_view2d.h:49
@ WM_GIZMOMAP_DRAWSTEP_2D
#define ND_SEQUENCER
Definition: WM_types.h:337
#define ND_SPACE_SEQUENCER
Definition: WM_types.h:430
#define NC_WINDOW
Definition: WM_types.h:277
#define NC_ID
Definition: WM_types.h:296
#define ND_RENDER_RESULT
Definition: WM_types.h:346
#define WM_DRAG_PATH
Definition: WM_types.h:876
#define ND_GPENCIL_EDITMODE
Definition: WM_types.h:403
#define ND_RENDER_OPTIONS
Definition: WM_types.h:335
#define NC_ANIMATION
Definition: WM_types.h:289
#define NC_SCREEN
Definition: WM_types.h:278
#define ND_ANIMPLAY
Definition: WM_types.h:323
#define NC_SCENE
Definition: WM_types.h:279
#define NA_EDITED
Definition: WM_types.h:462
#define ND_FRAME_RANGE
Definition: WM_types.h:351
#define ND_MARKERS
Definition: WM_types.h:333
#define ND_FRAME
Definition: WM_types.h:334
#define NC_GPENCIL
Definition: WM_types.h:300
#define NC_MASK
Definition: WM_types.h:299
#define NA_RENAME
Definition: WM_types.h:466
#define ND_KEYFRAME
Definition: WM_types.h:394
#define NC_SPACE
Definition: WM_types.h:293
#define NA_SELECTED
Definition: WM_types.h:467
#define ND_DRAW_RENDER_VIEWPORT
Definition: WM_types.h:370
unsigned int U
Definition: btGjkEpa3.h:78
FILE * file
Scene scene
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
#define GS(x)
Definition: iris.c:241
void *(* MEM_dupallocN)(const void *vmemh)
Definition: mallocn.c:42
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:45
static void area(int d1, int d2, int e1, int e2, float weights[2])
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
Definition: rna_access.c:6550
void RNA_id_pointer_create(ID *id, PointerRNA *r_ptr)
Definition: rna_access.c:122
void RNA_collection_clear(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6622
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
Definition: rna_access.c:866
void RNA_collection_add(PointerRNA *ptr, const char *name, PointerRNA *r_value)
Definition: rna_access.c:6610
void sequencer_buttons_register(ARegionType *art)
void draw_timeline_seq_display(const bContext *C, ARegion *region)
void sequencer_draw_preview(const bContext *C, Scene *scene, ARegion *region, SpaceSeq *sseq, int timeline_frame, int offset, bool draw_overlay, bool draw_backdrop)
void draw_timeline_seq(const bContext *C, ARegion *region)
void sequencer_operatortypes(void)
Definition: sequencer_ops.c:38
void sequencer_keymap(struct wmKeyConfig *keyconf)
struct Sequence * find_nearest_seq(struct Scene *scene, struct View2D *v2d, int *hand, const int mval[2])
static void sequencer_preview_region_listener(const wmRegionListenerParams *params)
static SpaceLink * sequencer_duplicate(SpaceLink *sl)
static void sequencer_preview_region_view2d_changed(const bContext *C, ARegion *UNUSED(region))
static bool movie_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event, const char **UNUSED(r_tooltip))
static ARegion * sequencer_find_region(ScrArea *area, short type)
static void sequencer_listener(const wmSpaceTypeListenerParams *params)
static void sequencer_main_region_init(wmWindowManager *wm, ARegion *region)
static void sequencer_drop_copy(wmDrag *drag, wmDropBox *drop)
const char * sequencer_context_dir[]
static void sequencer_dropboxes(void)
static SpaceLink * sequencer_create(const ScrArea *UNUSED(area), const Scene *scene)
static void sequencer_preview_region_layout(const bContext *C, ARegion *region)
static void sequencer_main_region_listener(const wmRegionListenerParams *params)
static void sequencer_preview_region_draw(const bContext *C, ARegion *region)
static void sequencer_header_region_draw(const bContext *C, ARegion *region)
static bool image_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event, const char **UNUSED(r_tooltip))
static void sequencer_main_region_draw_overlay(const bContext *C, ARegion *region)
static void sequencer_free(SpaceLink *sl)
static bool sound_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event, const char **UNUSED(r_tooltip))
static void sequencer_id_remap(ScrArea *UNUSED(area), SpaceLink *slink, ID *old_id, ID *new_id)
static void sequencer_buttons_region_listener(const wmRegionListenerParams *params)
static void sequencer_header_region_init(wmWindowManager *UNUSED(wm), ARegion *region)
static void sequencer_preview_region_init(wmWindowManager *wm, ARegion *region)
static void sequencer_main_region_draw(const bContext *C, ARegion *region)
void ED_spacetype_sequencer(void)
static void sequencer_scopes_tag_refresh(ScrArea *area)
static void sequencer_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(area))
static void sequencer_buttons_region_draw(const bContext *C, ARegion *region)
static void sequencer_main_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
static void sequencer_refresh(const bContext *C, ScrArea *area)
static int sequencer_context(const bContext *C, const char *member, bContextDataResult *result)
static void SEQUENCER_GGT_navigate(wmGizmoGroupType *gzgt)
static void sequencer_buttons_region_init(wmWindowManager *wm, ARegion *region)
static void sequencer_gizmos(void)
static void sequencer_tools_region_draw(const bContext *C, ARegion *region)
static void sequencer_tools_region_init(wmWindowManager *wm, ARegion *region)
void(* draw)(const struct bContext *C, struct ARegion *region)
Definition: BKE_screen.h:169
void(* message_subscribe)(const wmRegionMessageSubscribeParams *params)
Definition: BKE_screen.h:185
int(* snap_size)(const struct ARegion *region, int size, int axis)
Definition: BKE_screen.h:181
void(* draw_overlay)(const struct bContext *C, struct ARegion *region)
Definition: BKE_screen.h:177
void(* listener)(const wmRegionListenerParams *params)
Definition: BKE_screen.h:183
void(* on_view2d_changed)(const struct bContext *C, struct ARegion *region)
Definition: BKE_screen.h:210
int keymapflag
Definition: BKE_screen.h:226
void(* layout)(const struct bContext *C, struct ARegion *region)
Definition: BKE_screen.h:179
void(* init)(struct wmWindowManager *wm, struct ARegion *region)
Definition: BKE_screen.h:165
struct ARegion * next
ListBase handlers
short alignment
short regiontype
struct wmGizmoMap * gizmo_map
Definition: DNA_ID.h:273
char name[66]
Definition: DNA_ID.h:283
struct StructRNA * type
Definition: RNA_types.h:51
struct Editing * ed
struct RenderData r
struct ImBuf * reference_ibuf
struct ImBuf * waveform_ibuf
struct ImBuf * sep_waveform_ibuf
struct ImBuf * zebra_ibuf
struct ImBuf * histogram_ibuf
struct ImBuf * vector_ibuf
short chanshown
struct SequencerScopes scopes
struct bGPdata * gpd
ListBase regionbase
struct SpaceLink *(* duplicate)(struct SpaceLink *sl)
Definition: BKE_screen.h:104
ListBase regiontypes
Definition: BKE_screen.h:130
void(* keymap)(struct wmKeyConfig *keyconf)
Definition: BKE_screen.h:109
void(* operatortypes)(void)
Definition: BKE_screen.h:107
void(* gizmos)(void)
Definition: BKE_screen.h:114
void(* free)(struct SpaceLink *sl)
Definition: BKE_screen.h:88
struct SpaceLink *(* create)(const struct ScrArea *area, const struct Scene *scene)
Definition: BKE_screen.h:86
void(* refresh)(const struct bContext *C, struct ScrArea *area)
Definition: BKE_screen.h:101
void(* listener)(const wmSpaceTypeListenerParams *params)
Definition: BKE_screen.h:95
void(* init)(struct wmWindowManager *wm, struct ScrArea *area)
Definition: BKE_screen.h:91
int spaceid
Definition: BKE_screen.h:81
bContextDataCallback context
Definition: BKE_screen.h:117
void(* id_remap)(struct ScrArea *area, struct SpaceLink *sl, struct ID *old_id, struct ID *new_id)
Definition: BKE_screen.h:120
char name[BKE_ST_MAXNAME]
Definition: BKE_screen.h:80
void(* dropboxes)(void)
Definition: BKE_screen.h:111
short flag
float minzoom
short align
short keeptot
float max[2]
short keepzoom
float min[2]
short scroll
float maxzoom
float xmax
Definition: DNA_vec_types.h:85
float xmin
Definition: DNA_vec_types.h:85
float ymax
Definition: DNA_vec_types.h:86
float ymin
Definition: DNA_vec_types.h:86
int ymax
Definition: DNA_vec_types.h:80
int xmin
Definition: DNA_vec_types.h:79
char path[1024]
Definition: WM_types.h:909
int icon
Definition: WM_types.h:905
int type
Definition: WM_types.h:907
struct PointerRNA * ptr
Definition: WM_types.h:953
int mval[2]
Definition: WM_types.h:583
unsigned int data
Definition: WM_types.h:260
unsigned int action
Definition: WM_types.h:260
unsigned int category
Definition: WM_types.h:260
struct wmKeyConfig * defaultconf
ccl_device_inline float4 mask(const int4 &mask, const float4 &a)
#define G(x, y, z)
Mask * SEQ_active_mask_get(Scene *scene)
Definition: utils.c:505
wmDropBox * WM_dropbox_add(ListBase *lb, const char *idname, bool(*poll)(bContext *, wmDrag *, const wmEvent *, const char **), void(*copy)(wmDrag *, wmDropBox *), void(*cancel)(struct Main *, wmDrag *, wmDropBox *))
Definition: wm_dragdrop.c:96
ListBase * WM_dropboxmap_find(const char *idname, int spaceid, int regionid)
Definition: wm_dragdrop.c:77
wmEventHandler_Dropbox * WM_event_add_dropbox_handler(ListBase *handlers, ListBase *dropboxes)
wmEventHandler_Keymap * WM_event_add_keymap_handler_v2d_mask(ListBase *handlers, wmKeyMap *keymap)
void WM_event_remove_handlers(bContext *C, ListBase *handlers)
wmGizmoGroupTypeRef * WM_gizmogrouptype_append_and_link(wmGizmoMapType *gzmap_type, void(*wtfunc)(struct wmGizmoGroupType *))
wmGizmoMapType * WM_gizmomaptype_ensure(const struct wmGizmoMapType_Params *gzmap_params)
void WM_gizmomap_draw(wmGizmoMap *gzmap, const bContext *C, const eWM_GizmoFlagMapDrawStep drawstep)
Definition: wm_gizmo_map.c:498
wmKeyMap * WM_keymap_ensure(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid)
Definition: wm_keymap.c:852
void WM_msg_subscribe_rna_params(struct wmMsgBus *mbus, const wmMsgParams_RNA *msg_key_params, const wmMsgSubscribeValue *msg_val_params, const char *id_repr)
void WM_msg_subscribe_rna(struct wmMsgBus *mbus, PointerRNA *ptr, const PropertyRNA *prop, const wmMsgSubscribeValue *msg_val_params, const char *id_repr)