Blender  V3.3
sequencer_drag_drop.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2022 Blender Foundation. All rights reserved. */
3 
8 #include "MEM_guardedalloc.h"
9 
10 #include "DNA_scene_types.h"
11 #include "DNA_sound_types.h"
12 
13 #include "BLI_blenlib.h"
14 #include "BLI_string_utils.h"
15 
16 #include "BKE_context.h"
17 #include "BKE_global.h"
18 #include "BKE_image.h"
19 #include "BKE_main.h"
20 
21 #include "SEQ_channels.h"
22 #include "SEQ_iterator.h"
23 #include "SEQ_sequencer.h"
24 #include "SEQ_transform.h"
25 
26 #include "UI_resources.h"
27 #include "UI_view2d.h"
28 
29 #include "GPU_immediate.h"
30 #include "GPU_matrix.h"
31 
32 #include "ED_screen.h"
33 #include "ED_transform.h"
34 
35 #include "IMB_imbuf.h"
36 #include "IMB_imbuf_types.h"
37 
38 #include "WM_api.h"
39 #include "WM_types.h"
40 
41 /* For querying audio files. */
42 #ifdef WITH_AUDASPACE
43 # include "BKE_sound.h"
44 # include <AUD_Sound.h>
45 # include <AUD_Special.h>
46 #endif
47 
48 /* Own include. */
49 #include "sequencer_intern.h"
50 
51 typedef struct SeqDropCoords {
55  bool in_use;
59  float snap_point_x;
62 
63 /* The current drag and drop API doesn't allow us to easily pass along the
64  * required custom data to all callbacks that need it. Especially when
65  * preloading data on drag start.
66  * Therefore we will for now use a global variable for this.
67  */
68 static SeqDropCoords g_drop_coords = {.in_use = false, .has_read_mouse_pos = false};
69 
70 static void generic_poll_operations(const wmEvent *event, uint8_t type)
71 {
73  /* We purposely ignore the snapping tool setting here as currently other drag&drop operators only
74  * snaps when holding down Ctrl. */
75  g_drop_coords.use_snapping = event->modifier & KM_CTRL;
76 }
77 
78 static bool image_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent *event)
79 {
80  if (drag->type == WM_DRAG_PATH) {
81  if (ELEM(drag->icon, ICON_FILE_IMAGE, ICON_FILE_BLANK)) { /* Rule might not work? */
83  return true;
84  }
85  }
86 
87  if (WM_drag_is_ID_type(drag, ID_IM)) {
89  return true;
90  }
91 
92  return false;
93 }
94 
95 static bool is_movie(wmDrag *drag)
96 {
97  if (drag->type == WM_DRAG_PATH) {
98  if (ELEM(drag->icon, ICON_FILE_MOVIE, ICON_FILE_BLANK)) { /* Rule might not work? */
99  return true;
100  }
101  }
102  if (WM_drag_is_ID_type(drag, ID_MC)) {
103  return true;
104  }
105  return false;
106 }
107 
108 static bool movie_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent *event)
109 {
110  if (is_movie(drag)) {
112  return true;
113  }
114 
115  return false;
116 }
117 
118 static bool is_sound(wmDrag *drag)
119 {
120  if (drag->type == WM_DRAG_PATH) {
121  if (ELEM(drag->icon, ICON_FILE_SOUND, ICON_FILE_BLANK)) { /* Rule might not work? */
122  return true;
123  }
124  }
125  if (WM_drag_is_ID_type(drag, ID_SO)) {
126  return true;
127  }
128  return false;
129 }
130 
131 static bool sound_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent *event)
132 {
133  if (is_sound(drag)) {
135  return true;
136  }
137 
138  return false;
139 }
140 
141 static float update_overlay_strip_position_data(bContext *C, const int mval[2])
142 {
143  SeqDropCoords *coords = &g_drop_coords;
144  ARegion *region = CTX_wm_region(C);
146  int hand;
147  View2D *v2d = &region->v2d;
148 
149  /* Update the position were we would place the strip if we complete the drag and drop action.
150  */
151  UI_view2d_region_to_view(v2d, mval[0], mval[1], &coords->start_frame, &coords->channel);
152  coords->start_frame = roundf(coords->start_frame);
153  if (coords->channel < 1.0f) {
154  coords->channel = 1;
155  }
156 
157  float start_frame = coords->start_frame;
158  float end_frame;
159  float strip_len;
160 
161  if (coords->playback_rate != 0.0f) {
162  float scene_playback_rate = (float)scene->r.frs_sec / scene->r.frs_sec_base;
163  strip_len = coords->strip_len / (coords->playback_rate / scene_playback_rate);
164  }
165  else {
166  strip_len = coords->strip_len;
167  }
168 
169  end_frame = coords->start_frame + strip_len;
170 
171  if (coords->use_snapping) {
172  /* Do snapping via the existing transform code. */
173  int snap_delta;
174  float snap_frame;
175  bool valid_snap;
176 
178  scene, region, start_frame, end_frame, &snap_delta, &snap_frame);
179 
180  if (valid_snap) {
181  /* We snapped onto something! */
182  start_frame += snap_delta;
183  coords->start_frame = start_frame;
184  end_frame = start_frame + strip_len;
185  coords->snap_point_x = snap_frame;
186  }
187  else {
188  /* Nothing was snapped to, disable snap drawing. */
189  coords->use_snapping = false;
190  }
191  }
192 
193  if (strip_len < 1) {
194  /* Only check if there is a strip already under the mouse cursor. */
195  coords->is_intersecting = find_nearest_seq(scene, &region->v2d, &hand, mval);
196  }
197  else {
198  /* Check if there is a strip that would intersect with the new strip(s). */
199  coords->is_intersecting = false;
200  Sequence dummy_seq = {.machine = coords->channel,
201  .start = coords->start_frame,
202  .len = coords->strip_len,
203  .speed_factor = 1.0f,
204  .media_playback_rate = coords->playback_rate,
205  .flag = SEQ_AUTO_PLAYBACK_RATE};
207 
208  for (int i = 0; i < coords->channel_len && !coords->is_intersecting; i++) {
209  coords->is_intersecting = SEQ_transform_test_overlap(scene, ed->seqbasep, &dummy_seq);
210  dummy_seq.machine++;
211  }
212  }
213 
214  return strip_len;
215 }
216 
217 static void sequencer_drop_copy(bContext *C, wmDrag *drag, wmDropBox *drop)
218 {
220  /* ID dropped. */
221  if (id != NULL) {
222  const ID_Type id_type = GS(id->name);
223  if (id_type == ID_IM) {
224  Image *ima = (Image *)id;
225  PointerRNA itemptr;
226  char dir[FILE_MAX], file[FILE_MAX];
227  BLI_split_dirfile(ima->filepath, dir, file, sizeof(dir), sizeof(file));
228  RNA_string_set(drop->ptr, "directory", dir);
229  RNA_collection_clear(drop->ptr, "files");
230  RNA_collection_add(drop->ptr, "files", &itemptr);
231  RNA_string_set(&itemptr, "name", file);
232  }
233  else if (id_type == ID_MC) {
234  MovieClip *clip = (MovieClip *)id;
235  RNA_string_set(drop->ptr, "filepath", clip->filepath);
236  RNA_struct_property_unset(drop->ptr, "name");
237  }
238  else if (id_type == ID_SO) {
239  bSound *sound = (bSound *)id;
240  RNA_string_set(drop->ptr, "filepath", sound->filepath);
241  RNA_struct_property_unset(drop->ptr, "name");
242  }
243  }
244  /* Path dropped. */
245  else if (drag->path[0]) {
246  if (RNA_struct_find_property(drop->ptr, "filepath")) {
247  RNA_string_set(drop->ptr, "filepath", drag->path);
248  }
249  if (RNA_struct_find_property(drop->ptr, "directory")) {
250  PointerRNA itemptr;
251  char dir[FILE_MAX], file[FILE_MAX];
252 
253  BLI_split_dirfile(drag->path, dir, file, sizeof(dir), sizeof(file));
254 
255  RNA_string_set(drop->ptr, "directory", dir);
256 
257  RNA_collection_clear(drop->ptr, "files");
258  RNA_collection_add(drop->ptr, "files", &itemptr);
259  RNA_string_set(&itemptr, "name", file);
260  }
261  }
262 
263  if (g_drop_coords.in_use) {
265  /* We didn't read the mouse position, so we need to do it manually here. */
266  int xy[2];
267  wmWindow *win = CTX_wm_window(C);
268  xy[0] = win->eventstate->xy[0];
269  xy[1] = win->eventstate->xy[1];
270 
271  ARegion *region = CTX_wm_region(C);
272  int mval[2];
273  /* Convert mouse coordinates to region local coordinates. */
274  mval[0] = xy[0] - region->winrct.xmin;
275  mval[1] = xy[1] - region->winrct.ymin;
276 
278  }
279 
280  RNA_int_set(drop->ptr, "frame_start", g_drop_coords.start_frame);
281  RNA_int_set(drop->ptr, "channel", g_drop_coords.channel);
282  RNA_boolean_set(drop->ptr, "overlap_shuffle_override", true);
283  }
284  else {
285  /* We are dropped inside the preview region. Put the strip on top of the
286  * current displayed frame. */
289  ListBase *seqbase = SEQ_active_seqbase_get(ed);
291  SpaceSeq *sseq = CTX_wm_space_seq(C);
292 
294  scene, channels, seqbase, scene->r.cfra, sseq->chanshown);
295 
296  /* Get the top most strip channel that is in view.*/
297  Sequence *seq;
298  int max_channel = -1;
299  SEQ_ITERATOR_FOREACH (seq, strips) {
300  max_channel = max_ii(seq->machine, max_channel);
301  }
302 
303  if (max_channel != -1) {
304  RNA_int_set(drop->ptr, "channel", max_channel);
305  }
306  SEQ_collection_free(strips);
307  }
308 }
309 
310 static void get_drag_path(wmDrag *drag, char r_path[FILE_MAX])
311 {
313  /* ID dropped. */
314  if (id != NULL) {
315  const ID_Type id_type = GS(id->name);
316  if (id_type == ID_IM) {
317  Image *ima = (Image *)id;
318  BLI_strncpy(r_path, ima->filepath, FILE_MAX);
319  }
320  else if (id_type == ID_MC) {
321  MovieClip *clip = (MovieClip *)id;
322  BLI_strncpy(r_path, clip->filepath, FILE_MAX);
323  }
324  else if (id_type == ID_SO) {
325  bSound *sound = (bSound *)id;
326  BLI_strncpy(r_path, sound->filepath, FILE_MAX);
327  }
329  }
330  else {
331  BLI_strncpy(r_path, drag->path, FILE_MAX);
332  }
333 }
334 
335 static void draw_seq_in_view(bContext *C, wmWindow *UNUSED(win), wmDrag *drag, const int xy[2])
336 {
337  SeqDropCoords *coords = &g_drop_coords;
338  if (!coords->in_use) {
339  return;
340  }
341 
342  ARegion *region = CTX_wm_region(C);
343  int mval[2];
344  /* Convert mouse coordinates to region local coordinates. */
345  mval[0] = xy[0] - region->winrct.xmin;
346  mval[1] = xy[1] - region->winrct.ymin;
347 
348  float strip_len = update_overlay_strip_position_data(C, mval);
349 
350  GPU_matrix_push();
351  UI_view2d_view_ortho(&region->v2d);
352 
353  /* Sometimes the active theme is not the sequencer theme, e.g. when an operator invokes the
354  * file browser. This makes sure we get the right color values for the theme. */
355  struct bThemeState theme_state;
356  UI_Theme_Store(&theme_state);
358 
359  if (coords->use_snapping) {
361  }
362 
363  /* Init GPU drawing. */
364  GPU_line_width(2.0f);
366  GPU_line_smooth(true);
369 
370  /* Draw strips. The code here is taken from sequencer_draw. */
371  float x1 = coords->start_frame;
372  float x2 = coords->start_frame + floorf(strip_len);
373  float strip_color[3];
374  uchar text_color[4] = {255, 255, 255, 255};
375  float pixelx = BLI_rctf_size_x(&region->v2d.cur) / BLI_rcti_size_x(&region->v2d.mask);
376  float pixely = BLI_rctf_size_y(&region->v2d.cur) / BLI_rcti_size_y(&region->v2d.mask);
377 
378  for (int i = 0; i < coords->channel_len; i++) {
379  float y1 = floorf(coords->channel) + i + SEQ_STRIP_OFSBOTTOM;
380  float y2 = floorf(coords->channel) + i + SEQ_STRIP_OFSTOP;
381 
382  if (coords->type == TH_SEQ_MOVIE && i == 0 && coords->channel_len > 1) {
383  /* Assume only video strips occupies two channels.
384  * One for video and the other for audio.
385  * The audio channel is added first.
386  */
387  UI_GetThemeColor3fv(TH_SEQ_AUDIO, strip_color);
388  }
389  else {
390  UI_GetThemeColor3fv(coords->type, strip_color);
391  }
392 
393  immUniformColor3fvAlpha(strip_color, 0.8f);
394  immRectf(pos, x1, y1, x2, y2);
395 
396  if (coords->is_intersecting) {
397  strip_color[0] = 1.0f;
398  strip_color[1] = strip_color[2] = 0.3f;
399  }
400  else {
401  if (coords->channel_len - 1 == i) {
402  text_color[0] = text_color[1] = text_color[2] = 255;
403  UI_GetThemeColor3fv(TH_SEQ_ACTIVE, strip_color);
404  }
405  else {
406  text_color[0] = text_color[1] = text_color[2] = 10;
407  UI_GetThemeColor3fv(TH_SEQ_SELECTED, strip_color);
408  }
409  }
410 
411  /* Draw a 2 pixel border around the strip. */
412  immUniformColor3fvAlpha(strip_color, 0.8f);
413  /* Left */
414  immRectf(pos, x1 - pixelx, y1, x1 + pixelx, y2);
415  /* Bottom */
416  immRectf(pos, x1 - pixelx, y1, x2 + pixelx, y1 + 2 * pixely);
417  /* Right */
418  immRectf(pos, x2 - pixelx, y1, x2 + pixelx, y2);
419  /* Top */
420  immRectf(pos, x1 - pixelx, y2 - 2 * pixely, x2 + pixelx, y2);
421 
422  float handle_size = 8.0f; /* SEQ_HANDLE_SIZE */
423 
424  /* Calculate height needed for drawing text on strip. */
425  float text_margin_y = y2 - min_ff(0.40f, 20 * U.dpi_fac * pixely);
426  float text_margin_x = 2.0f * (pixelx * handle_size) * U.pixelsize;
427 
428  rctf rect;
429  rect.xmin = x1 + text_margin_x;
430  rect.ymin = text_margin_y;
431  rect.xmax = x2 - text_margin_x;
432  rect.ymax = y2;
433 
434  if (rect.xmax <= rect.xmin) {
435  /* Exit early and skip text drawing if the strip doesn't have any space to put the text
436  * into.
437  */
438  break;
439  }
440 
441  SpaceSeq *sseq = CTX_wm_space_seq(C);
442  const char *text_sep = " | ";
443  const char *text_array[5];
444  char text_display[FILE_MAX];
445  char filename[FILE_MAX];
446  char path[FILE_MAX];
447  char strip_duration_text[16];
448  int len_text_arr = 0;
449 
450  get_drag_path(drag, path);
451 
453  BLI_split_file_part(path, filename, FILE_MAX);
454  text_array[len_text_arr++] = filename;
455  }
456 
458  Main *bmain = CTX_data_main(C);
460  text_array[len_text_arr++] = text_sep;
461  text_array[len_text_arr++] = path;
462  }
463 
465  SNPRINTF(strip_duration_text, "%d", (int)(x2 - x1));
466  text_array[len_text_arr++] = text_sep;
467  text_array[len_text_arr++] = strip_duration_text;
468  }
469 
470  BLI_assert(len_text_arr <= ARRAY_SIZE(text_array));
471 
472  BLI_string_join_array(text_display, FILE_MAX, text_array, len_text_arr);
473 
475  &region->v2d, &rect, text_display, strlen(text_display), text_color);
476  }
477 
478  /* Clean after drawing up. */
479  UI_Theme_Restore(&theme_state);
480  GPU_matrix_pop();
483  GPU_line_smooth(false);
484 
486 }
487 
488 static bool generic_drop_draw_handling(struct wmDropBox *drop)
489 {
490  SeqDropCoords *coords = drop->draw_data;
491  if (coords && coords->in_use) {
492  return true;
493  }
494 
495  coords = drop->draw_data = &g_drop_coords;
496  coords->in_use = true;
497 
498  return false;
499 }
500 
501 typedef struct DropJobData {
502  char path[FILE_MAX];
504  float scene_fps;
506 
507 static void prefetch_data_fn(void *custom_data,
508  short *UNUSED(stop),
509  short *UNUSED(do_update),
510  float *UNUSED(progress))
511 {
512  DropJobData *job_data = (DropJobData *)custom_data;
513 
514  if (job_data->only_audio) {
515 #ifdef WITH_AUDASPACE
516  /* Get the sound file length */
517  AUD_Sound *sound = AUD_Sound_file(job_data->path);
518  if (sound != NULL) {
519 
520  AUD_SoundInfo info = AUD_getInfo(sound);
521  if ((eSoundChannels)info.specs.channels != SOUND_CHANNELS_INVALID) {
522  g_drop_coords.strip_len = max_ii(1, round((info.length) * job_data->scene_fps));
523  }
524  AUD_Sound_free(sound);
525  return;
526  }
527 #endif
528  }
529 
530  char colorspace[64] = "\0"; /* 64 == MAX_COLORSPACE_NAME length. */
531  struct anim *anim = openanim(job_data->path, IB_rect, 0, colorspace);
532 
533  if (anim != NULL) {
535  short frs_sec;
536  float frs_sec_base;
537  if (IMB_anim_get_fps(anim, &frs_sec, &frs_sec_base, true)) {
539  }
540  else {
542  }
544 #ifdef WITH_AUDASPACE
545  /* Try to load sound and see if the video has a sound channel. */
546  AUD_Sound *sound = AUD_Sound_file(job_data->path);
547  if (sound != NULL) {
548 
549  AUD_SoundInfo info = AUD_getInfo(sound);
550  if ((eSoundChannels)info.specs.channels != SOUND_CHANNELS_INVALID) {
552  }
553  AUD_Sound_free(sound);
554  }
555 #endif
556  }
557 }
558 
559 static void free_prefetch_data_fn(void *custom_data)
560 {
561  DropJobData *job_data = (DropJobData *)custom_data;
562  MEM_freeN(job_data);
563 }
564 
565 static void start_audio_video_job(bContext *C, wmDrag *drag, bool only_audio)
566 {
569 
571  wmWindow *win = CTX_wm_window(C);
573 
574  wmJob *wm_job = WM_jobs_get(
575  wm, win, NULL, "Load Previews", 0, WM_JOB_TYPE_SEQ_DRAG_DROP_PREVIEW);
576 
577  DropJobData *job_data = (DropJobData *)MEM_mallocN(sizeof(DropJobData),
578  "SeqDragDropPreviewData");
579  get_drag_path(drag, job_data->path);
580 
581  job_data->only_audio = only_audio;
582  job_data->scene_fps = FPS;
583 
585  WM_jobs_timer(wm_job, 0.1, NC_WINDOW, NC_WINDOW);
587 
588  WM_jobs_start(wm, wm_job);
589 }
590 
591 static void video_prefetch(bContext *C, wmDrag *drag)
592 {
593  if (is_movie(drag)) {
594  start_audio_video_job(C, drag, false);
595  }
596 }
597 
598 static void audio_prefetch(bContext *C, wmDrag *drag)
599 {
600  if (is_sound(drag)) {
601  start_audio_video_job(C, drag, true);
602  }
603 }
604 
605 static void movie_drop_draw_activate(struct wmDropBox *drop, wmDrag *UNUSED(drag))
606 {
607  if (generic_drop_draw_handling(drop)) {
608  return;
609  }
610 }
611 
612 static void sound_drop_draw_activate(struct wmDropBox *drop, wmDrag *UNUSED(drag))
613 {
614  if (generic_drop_draw_handling(drop)) {
615  return;
616  }
617 }
618 
619 static void image_drop_draw_activate(struct wmDropBox *drop, wmDrag *UNUSED(drag))
620 {
621  if (generic_drop_draw_handling(drop)) {
622  return;
623  }
624 
625  SeqDropCoords *coords = drop->draw_data;
627  coords->channel_len = 1;
628 }
629 
630 static void sequencer_drop_draw_deactivate(struct wmDropBox *drop, wmDrag *UNUSED(drag))
631 {
632  SeqDropCoords *coords = drop->draw_data;
633  if (coords) {
634  coords->in_use = false;
635  coords->has_read_mouse_pos = false;
636  drop->draw_data = NULL;
637  }
638 }
639 
641  wmWindow *UNUSED(win),
642  wmDrag *UNUSED(drag),
643  const int UNUSED(xy[2]))
644 {
645  /* Do nothing in here.
646  * This is to prevent the default drag and drop mouse overlay to be drawn.
647  */
648 }
649 
650 /* This region dropbox definition. */
652 {
653  struct wmDropBox *drop;
654  drop = WM_dropbox_add(
655  lb, "SEQUENCER_OT_image_strip_add", image_drop_poll, sequencer_drop_copy, NULL, NULL);
660 
662 
663  drop = WM_dropbox_add(
664  lb, "SEQUENCER_OT_movie_strip_add", movie_drop_poll, sequencer_drop_copy, NULL, NULL);
669 
671 
672  drop = WM_dropbox_add(
673  lb, "SEQUENCER_OT_sound_strip_add", sound_drop_poll, sequencer_drop_copy, NULL, NULL);
678 }
679 
681  wmDrag *drag,
682  const wmEvent *UNUSED(event))
683 {
684  if (drag->type == WM_DRAG_PATH) {
685  if (ELEM(drag->icon, ICON_FILE_IMAGE, ICON_FILE_BLANK)) { /* Rule might not work? */
686  return true;
687  }
688  }
689 
690  return WM_drag_is_ID_type(drag, ID_IM);
691 }
692 
694  wmDrag *drag,
695  const wmEvent *UNUSED(event))
696 {
697  if (drag->type == WM_DRAG_PATH) {
698  if (ELEM(drag->icon, 0, ICON_FILE_MOVIE, ICON_FILE_BLANK)) { /* Rule might not work? */
699  return true;
700  }
701  }
702 
703  return WM_drag_is_ID_type(drag, ID_MC);
704 }
705 
707  wmDrag *drag,
708  const wmEvent *UNUSED(event))
709 {
710  if (drag->type == WM_DRAG_PATH) {
711  if (ELEM(drag->icon, ICON_FILE_SOUND, ICON_FILE_BLANK)) { /* Rule might not work? */
712  return true;
713  }
714  }
715 
716  return WM_drag_is_ID_type(drag, ID_SO);
717 }
718 
720 {
721  WM_dropbox_add(lb,
722  "SEQUENCER_OT_image_strip_add",
725  NULL,
726  NULL);
727 
728  WM_dropbox_add(lb,
729  "SEQUENCER_OT_movie_strip_add",
732  NULL,
733  NULL);
734 
735  WM_dropbox_add(lb,
736  "SEQUENCER_OT_sound_strip_add",
739  NULL,
740  NULL);
741 }
742 
744 {
747  lb = WM_dropboxmap_find("Sequencer", SPACE_SEQ, RGN_TYPE_PREVIEW);
749 }
typedef float(TangentPoint)[2]
struct Scene * CTX_data_scene(const bContext *C)
Definition: context.c:1090
struct wmWindowManager * CTX_wm_manager(const bContext *C)
Definition: context.c:713
struct SpaceSeq * CTX_wm_space_seq(const bContext *C)
Definition: context.c:851
struct ARegion * CTX_wm_region(const bContext *C)
Definition: context.c:749
struct Main * CTX_data_main(const bContext *C)
Definition: context.c:1074
struct wmWindow * CTX_wm_window(const bContext *C)
Definition: context.c:723
struct anim * openanim(const char *name, int flags, int streamindex, char colorspace[IMA_MAX_SPACE])
const char * BKE_main_blendfile_path(const struct Main *bmain) ATTR_NONNULL()
const char * BKE_main_blendfile_path_from_global(void)
Definition: main.c:562
eSoundChannels
Definition: BKE_sound.h:67
@ SOUND_CHANNELS_INVALID
Definition: BKE_sound.h:68
#define BLI_assert(a)
Definition: BLI_assert.h:46
MINLINE float min_ff(float a, float b)
MINLINE int max_ii(int a, int b)
void BLI_split_dirfile(const char *string, char *dir, char *file, size_t dirlen, size_t filelen)
Definition: path_util.c:1465
#define FILE_MAX
void BLI_path_rel(char *file, const char *relfile) ATTR_NONNULL()
Definition: path_util.c:450
void BLI_split_file_part(const char *string, char *file, size_t filelen)
Definition: path_util.c:1495
bool BLI_path_abs(char *path, const char *basepath) ATTR_NONNULL()
Definition: path_util.c:897
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
Definition: BLI_rect.h:190
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
Definition: BLI_rect.h:186
BLI_INLINE float BLI_rctf_size_x(const struct rctf *rct)
Definition: BLI_rect.h:194
BLI_INLINE float BLI_rctf_size_y(const struct rctf *rct)
Definition: BLI_rect.h:198
#define SNPRINTF(dst, format,...)
Definition: BLI_string.h:485
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t maxncpy) ATTR_NONNULL()
Definition: string.c:64
char * BLI_string_join_array(char *result, size_t result_len, const char *strings[], uint strings_len) ATTR_NONNULL()
Definition: string_utils.c:347
unsigned char uchar
Definition: BLI_sys_types.h:70
unsigned int uint
Definition: BLI_sys_types.h:67
#define ARRAY_SIZE(arr)
#define UNUSED(x)
#define ELEM(...)
ID_Type
Definition: DNA_ID_enums.h:44
@ ID_MC
Definition: DNA_ID_enums.h:73
@ ID_IM
Definition: DNA_ID_enums.h:53
@ ID_SO
Definition: DNA_ID_enums.h:64
#define FPS
@ RGN_TYPE_WINDOW
@ RGN_TYPE_PREVIEW
@ SEQ_AUTO_PLAYBACK_RATE
#define SEQ_STRIP_OFSBOTTOM
#define SEQ_STRIP_OFSTOP
@ SPACE_SEQ
@ SEQ_TIMELINE_SHOW_STRIP_DURATION
@ SEQ_TIMELINE_SHOW_STRIP_SOURCE
@ SEQ_TIMELINE_SHOW_STRIP_NAME
void ED_draw_sequencer_snap_point(struct bContext *C, float snap_point)
bool ED_transform_snap_sequencer_to_closest_strip_calc(struct Scene *scene, struct ARegion *region, int frame_1, int frame_2, int *r_snap_distance, float *r_snap_frame)
void immUnbindProgram(void)
void immBindBuiltinProgram(eGPUBuiltinShader shader_id)
GPUVertFormat * immVertexFormat(void)
void immUniformColor3fvAlpha(const float rgb[3], float a)
void immRectf(uint pos, float x1, float y1, float x2, float y2)
_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 const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble y1
_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 const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble x2
_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
void GPU_matrix_pop(void)
Definition: gpu_matrix.cc:126
void GPU_matrix_push(void)
Definition: gpu_matrix.cc:119
@ GPU_SHADER_2D_UNIFORM_COLOR
Definition: GPU_shader.h:201
@ GPU_BLEND_NONE
Definition: GPU_state.h:60
@ GPU_BLEND_ALPHA
Definition: GPU_state.h:62
void GPU_blend(eGPUBlend blend)
Definition: gpu_state.cc:39
void GPU_line_width(float width)
Definition: gpu_state.cc:158
void GPU_line_smooth(bool enable)
Definition: gpu_state.cc:75
@ GPU_FETCH_FLOAT
uint GPU_vertformat_attr_add(GPUVertFormat *, const char *name, GPUVertCompType, uint comp_len, GPUVertFetchMode)
@ GPU_COMP_F32
bool IMB_anim_get_fps(struct anim *anim, short *frs_sec, float *frs_sec_base, bool no_av_base)
Definition: anim_movie.c:1678
void IMB_free_anim(struct anim *anim)
Definition: anim_movie.c:193
int IMB_anim_get_duration(struct anim *anim, IMB_Timecode_Type tc)
Definition: anim_movie.c:1658
@ IMB_TC_NONE
Definition: IMB_imbuf.h:318
Contains defines and structs used throughout the imbuf module.
@ IB_rect
Read Guarded memory(de)allocation.
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 a value between a minimum and a maximum Vector Perform vector math operation Invert a producing a negative Combine Generate a color from its and blue channels(Deprecated)") DefNode(ShaderNode
#define C
Definition: RandGen.cpp:25
#define SEQ_ITERATOR_FOREACH(var, collection)
Definition: SEQ_iterator.h:35
void UI_GetThemeColor3fv(int colorid, float col[3])
Definition: resources.c:1165
@ TH_SEQ_SELECTED
Definition: UI_resources.h:199
@ TH_SEQ_MOVIE
Definition: UI_resources.h:187
@ TH_SEQ_AUDIO
Definition: UI_resources.h:192
@ TH_SEQ_ACTIVE
Definition: UI_resources.h:198
@ TH_SEQ_IMAGE
Definition: UI_resources.h:190
void UI_Theme_Restore(struct bThemeState *theme_state)
Definition: resources.c:1076
void UI_SetTheme(int spacetype, int regionid)
Definition: resources.c:1045
void UI_Theme_Store(struct bThemeState *theme_state)
Definition: resources.c:1072
void UI_view2d_view_ortho(const struct View2D *v2d)
void UI_view2d_region_to_view(const struct View2D *v2d, float x, float y, float *r_view_x, float *r_view_y) ATTR_NONNULL()
void UI_view2d_text_cache_draw(struct ARegion *region)
Definition: view2d.cc:2128
void UI_view2d_text_cache_add_rectf(struct View2D *v2d, const struct rctf *rect_view, const char *str, size_t str_len, const unsigned char col[4])
@ WM_JOB_TYPE_SEQ_DRAG_DROP_PREVIEW
Definition: WM_api.h:1375
#define NC_WINDOW
Definition: WM_types.h:325
#define WM_DRAG_PATH
Definition: WM_types.h:1050
@ KM_CTRL
Definition: WM_types.h:239
unsigned int U
Definition: btGjkEpa3.h:78
ListBase * SEQ_channels_displayed_get(Editing *ed)
Definition: channels.c:23
char filepath[1024]
FILE * file
Scene scene
uint pos
#define GS(x)
Definition: iris.c:225
SeqCollection * SEQ_query_rendered_strips(const Scene *scene, ListBase *channels, ListBase *seqbase, const int timeline_frame, const int displayed_channel)
Definition: iterator.c:309
void SEQ_collection_free(SeqCollection *collection)
Definition: iterator.c:81
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
void *(* MEM_mallocN)(size_t len, const char *str)
Definition: mallocn.c:33
#define floorf(x)
Definition: metal/compat.h:224
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
Definition: rna_access.c:5155
void RNA_collection_clear(PointerRNA *ptr, const char *name)
Definition: rna_access.c:5227
void RNA_boolean_set(PointerRNA *ptr, const char *name, bool value)
Definition: rna_access.c:4874
void RNA_int_set(PointerRNA *ptr, const char *name, int value)
Definition: rna_access.c:4921
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
Definition: rna_access.c:717
void RNA_collection_add(PointerRNA *ptr, const char *name, PointerRNA *r_value)
Definition: rna_access.c:5215
void RNA_struct_property_unset(PointerRNA *ptr, const char *identifier)
Definition: rna_access.c:5313
ListBase * SEQ_active_seqbase_get(const Editing *ed)
Definition: sequencer.c:388
Editing * SEQ_editing_ensure(Scene *scene)
Definition: sequencer.c:246
Editing * SEQ_editing_get(const Scene *scene)
Definition: sequencer.c:241
static void movie_drop_draw_activate(struct wmDropBox *drop, wmDrag *UNUSED(drag))
static float update_overlay_strip_position_data(bContext *C, const int mval[2])
struct SeqDropCoords SeqDropCoords
static void sequencer_drop_draw_deactivate(struct wmDropBox *drop, wmDrag *UNUSED(drag))
static bool generic_drop_draw_handling(struct wmDropBox *drop)
void sequencer_dropboxes(void)
static bool sound_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent *event)
static void start_audio_video_job(bContext *C, wmDrag *drag, bool only_audio)
static void generic_poll_operations(const wmEvent *event, uint8_t type)
static void audio_prefetch(bContext *C, wmDrag *drag)
static void image_drop_draw_activate(struct wmDropBox *drop, wmDrag *UNUSED(drag))
static bool movie_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent *event)
static void video_prefetch(bContext *C, wmDrag *drag)
static void nop_draw_droptip_fn(bContext *UNUSED(C), wmWindow *UNUSED(win), wmDrag *UNUSED(drag), const int UNUSED(xy[2]))
static void sequencer_dropboxes_add_to_lb(ListBase *lb)
static void prefetch_data_fn(void *custom_data, short *UNUSED(stop), short *UNUSED(do_update), float *UNUSED(progress))
struct DropJobData DropJobData
static bool image_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent *event)
static bool image_drop_preview_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent *UNUSED(event))
static void sequencer_preview_dropboxes_add_to_lb(ListBase *lb)
static void draw_seq_in_view(bContext *C, wmWindow *UNUSED(win), wmDrag *drag, const int xy[2])
static void sequencer_drop_copy(bContext *C, wmDrag *drag, wmDropBox *drop)
static void free_prefetch_data_fn(void *custom_data)
static void sound_drop_draw_activate(struct wmDropBox *drop, wmDrag *UNUSED(drag))
static bool movie_drop_preview_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent *UNUSED(event))
static bool is_movie(wmDrag *drag)
static bool is_sound(wmDrag *drag)
static bool sound_drop_preview_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent *UNUSED(event))
static SeqDropCoords g_drop_coords
static void get_drag_path(wmDrag *drag, char r_path[FILE_MAX])
#define DEFAULT_IMG_STRIP_LENGTH
struct Sequence * find_nearest_seq(struct Scene *scene, struct View2D *v2d, int *hand, const int mval[2])
unsigned char uint8_t
Definition: stdint.h:78
bool SEQ_transform_test_overlap(const Scene *scene, ListBase *seqbasep, Sequence *test)
char path[FILE_MAX]
ListBase * seqbasep
Definition: DNA_ID.h:368
char name[66]
Definition: DNA_ID.h:378
Definition: BKE_main.h:121
char filepath[1024]
float frs_sec_base
struct RenderData r
short chanshown
struct SequencerTimelineOverlay timeline_overlay
Definition: IMB_anim.h:71
int frs_sec
Definition: IMB_anim.h:76
char colorspace[64]
Definition: IMB_anim.h:138
double frs_sec_base
Definition: IMB_anim.h:77
char filepath[1024]
float xmin
Definition: DNA_vec_types.h:69
int ymin
Definition: DNA_vec_types.h:64
int xmin
Definition: DNA_vec_types.h:63
char path[1024]
Definition: WM_types.h:1150
int icon
Definition: WM_types.h:1146
int type
Definition: WM_types.h:1148
void(* draw_deactivate)(struct wmDropBox *drop, struct wmDrag *drag)
Definition: WM_types.h:1220
void * draw_data
Definition: WM_types.h:1223
void(* on_drag_start)(struct bContext *C, struct wmDrag *drag)
Definition: WM_types.h:1184
void(* draw_droptip)(struct bContext *C, struct wmWindow *win, struct wmDrag *drag, const int xy[2])
Definition: WM_types.h:1200
void(* draw_activate)(struct wmDropBox *drop, struct wmDrag *drag)
Definition: WM_types.h:1217
void(* draw_in_view)(struct bContext *C, struct wmWindow *win, struct wmDrag *drag, const int xy[2])
Definition: WM_types.h:1211
struct PointerRNA * ptr
Definition: WM_types.h:1237
int xy[2]
Definition: WM_types.h:682
Definition: wm_jobs.c:57
struct wmEvent * eventstate
ID * WM_drag_get_local_ID_or_import_from_asset(const wmDrag *drag, int idcode)
Definition: wm_dragdrop.cc:667
bool WM_drag_is_ID_type(const wmDrag *drag, int idcode)
Definition: wm_dragdrop.cc:556
ListBase * WM_dropboxmap_find(const char *idname, int spaceid, int regionid)
Definition: wm_dragdrop.cc:76
wmDropBox * WM_dropbox_add(ListBase *lb, const char *idname, bool(*poll)(bContext *, wmDrag *, const wmEvent *), void(*copy)(bContext *, wmDrag *, wmDropBox *), void(*cancel)(Main *, wmDrag *, wmDropBox *), WMDropboxTooltipFunc tooltip)
Definition: wm_dragdrop.cc:95
int xy[2]
Definition: wm_draw.c:135
void WM_jobs_start(wmWindowManager *wm, wmJob *wm_job)
Definition: wm_jobs.c:437
void WM_jobs_callbacks(wmJob *wm_job, wm_jobs_start_callback startjob, void(*initjob)(void *), void(*update)(void *), void(*endjob)(void *))
Definition: wm_jobs.c:351
void WM_jobs_customdata_set(wmJob *wm_job, void *customdata, void(*free)(void *))
Definition: wm_jobs.c:323
void WM_jobs_timer(wmJob *wm_job, double timestep, unsigned int note, unsigned int endnote)
Definition: wm_jobs.c:339
wmJob * WM_jobs_get(wmWindowManager *wm, wmWindow *win, const void *owner, const char *name, int flag, int job_type)
Definition: wm_jobs.c:184