LiVES  3.2.0
merge.c
Go to the documentation of this file.
1 // merge.c
2 // LiVES (lives-exe)
3 // (c) G. Finch 2003 - 2019 (salsaman+lives@gmail.com)
4 // Released under the GPL 3 or later
5 // see file ../COPYING for licensing details
6 
7 #include "main.h"
8 #include "callbacks.h"
9 #include "merge.h"
10 #include "paramwindow.h"
11 #include "effects.h"
12 #include "resample.h"
13 #include "callbacks.h"
14 
16 
17 void create_merge_dialog(void) {
18  lives_rfx_t *rfx;
19 
20  LiVESWidget *dialog_vbox;
21  LiVESWidget *vbox;
22  LiVESWidget *align_start_button;
23  LiVESWidget *align_end_button;
24  LiVESWidget *hbox;
25  LiVESWidget *label;
26  LiVESWidget *fit_button;
27  LiVESWidget *transition_combo;
28  LiVESWidget *cancelbutton;
29  LiVESWidget *okbutton;
30 
31  LiVESSList *radiobutton_align_group = NULL;
32  LiVESSList *radiobutton_insdrop_group = NULL;
33 
34  LiVESList *retvals;
35 
36  LiVESAccelGroup *accel_group;
37 
38  char *txt;
39 
40  int idx = 0;
41 
42  int width, height;
43 
44  int cb_frames = clipboard->frames;
45  int defstart = 0;
46 
47  register int i;
48 
53  merge_opts->trans_list = NULL;
54 
56 
58  i++) {
59  if ((rfx = &mainw->rendered_fx[i])->num_in_channels == 2) {
60  if (i == mainw->last_transition_idx) defstart = idx;
61  merge_opts->list_to_rfx_index[idx++] = i;
62  if (rfx->status == RFX_STATUS_CUSTOM) {
63  merge_opts->trans_list = lives_list_append(merge_opts->trans_list, lives_strconcat(_(rfx->menu_text), " (custom)", NULL));
64  } else if (rfx->status == RFX_STATUS_TEST) {
65  merge_opts->trans_list = lives_list_append(merge_opts->trans_list, lives_strconcat(_(rfx->menu_text), " (test)", NULL));
66  } else {
67  merge_opts->trans_list = lives_list_append(merge_opts->trans_list, (_(rfx->menu_text)));
68  }
69  }
70  }
71 
72  if (!idx) {
76  return;
77  }
78 
81 
82  merge_opts->merge_dialog = lives_standard_dialog_new(_("Merge"), FALSE, width, height);
83  lives_signal_handlers_disconnect_by_func(merge_opts->merge_dialog, LIVES_GUI_CALLBACK(return_true),
84  NULL);
85 
86  accel_group = LIVES_ACCEL_GROUP(lives_accel_group_new());
87  lives_window_add_accel_group(LIVES_WINDOW(merge_opts->merge_dialog), accel_group);
88 
89  dialog_vbox = lives_dialog_get_content_area(LIVES_DIALOG(merge_opts->merge_dialog));
90 
91  vbox = lives_vbox_new(FALSE, 0);
92  lives_box_pack_start(LIVES_BOX(dialog_vbox), vbox, TRUE, TRUE, 0);
93 
94  hbox = lives_hbox_new(FALSE, 0);
95  lives_box_pack_start(LIVES_BOX(vbox), hbox, FALSE, FALSE, widget_opts.packing_height * 2);
96 
97  txt = lives_strdup_printf(_("Merge Clipboard [ %d Frames ] With Selection [ %d Frames ]"), clipboard->frames,
98  cfile->end - cfile->start + 1);
99  if (prefs->ins_resample && clipboard->fps != cfile->fps) {
100  cb_frames = count_resampled_frames(clipboard->frames, clipboard->fps, cfile->fps);
101  if (!(cb_frames == clipboard->frames)) {
102  lives_free(txt);
103  txt = lives_strdup_printf(_("Merge Clipboard [ %d Frames (resampled) ] With Selection [ %d Frames ]"), cb_frames,
104  cfile->end - cfile->start + 1);
105  }
106  }
107 
108  label = lives_standard_label_new(txt);
109  lives_free(txt);
110 
111  lives_box_pack_start(LIVES_BOX(hbox), label, FALSE, FALSE, 0);
112 
113  add_fill_to_box(LIVES_BOX(hbox));
114 
115  align_start_button = lives_standard_radio_button_new(_("Align _Starts"), &radiobutton_align_group, LIVES_BOX(hbox), NULL);
116 
117  add_fill_to_box(LIVES_BOX(hbox));
118 
119  align_end_button = lives_standard_radio_button_new(_("Align _Ends"), &radiobutton_align_group, LIVES_BOX(hbox), NULL);
120 
121  lives_toggle_button_set_active(LIVES_TOGGLE_BUTTON(align_end_button), !mainw->last_transition_align_start);
122 
123  hbox = lives_hbox_new(FALSE, 0);
124  lives_box_pack_start(LIVES_BOX(vbox), hbox, FALSE, TRUE, widget_opts.packing_height * 2);
125 
126  if ((cfile->end - cfile->start + 1) < cb_frames) {
127  // hide loop controls if selection is smaller than clipboard
128  label = lives_standard_label_new(_("What to do with extra clipboard frames -"));
129  lives_box_pack_start(LIVES_BOX(hbox), label, FALSE, FALSE, 0);
130 
131  merge_opts->ins_frame_button = lives_standard_radio_button_new(_("_Insert Frames"), &radiobutton_insdrop_group, LIVES_BOX(hbox),
132  NULL);
133 
135  LIVES_WIDGET_TOGGLED_SIGNAL, LIVES_GUI_CALLBACK(on_ins_frames_toggled), NULL);
136 
137  merge_opts->drop_frame_button = lives_standard_radio_button_new(_("_Drop Frames"), &radiobutton_insdrop_group, LIVES_BOX(hbox),
138  NULL);
139 
141  } else if ((cfile->end - cfile->start + 1) > cb_frames) {
143  (_("Number of Times to Loop Clipboard"), 1., 1.,
144  (int)((cfile->end - cfile->start + 1) / cb_frames), 1., 10., 0, LIVES_BOX(hbox), NULL);
145 
148 
149  lives_signal_connect_after(LIVES_GUI_OBJECT(merge_opts->spinbutton_loops), LIVES_WIDGET_VALUE_CHANGED_SIGNAL,
150  LIVES_GUI_CALLBACK(after_spinbutton_loops_changed),
151  NULL);
152 
153  fit_button = lives_standard_check_button_new(_("_Loop Clipboard to Fit Selection"), mainw->last_transition_loop_to_fit,
154  LIVES_BOX(hbox), NULL);
155  lives_toggle_button_set_active(LIVES_TOGGLE_BUTTON(fit_button), mainw->last_transition_loop_to_fit);
156 
157  lives_signal_connect(LIVES_GUI_OBJECT(fit_button), LIVES_WIDGET_TOGGLED_SIGNAL,
158  LIVES_GUI_CALLBACK(on_fit_toggled),
159  NULL);
160  }
161 
162  add_hsep_to_box(LIVES_BOX(vbox));
163 
164  hbox = lives_hbox_new(TRUE, 0);
165  lives_box_pack_start(LIVES_BOX(vbox), hbox, FALSE, FALSE, widget_opts.packing_height);
166 
167  transition_combo = lives_standard_combo_new(_("_Transition Method:"), merge_opts->trans_list, LIVES_BOX(hbox), NULL);
168 
169  lives_combo_set_active_index(LIVES_COMBO(transition_combo), defstart);
170 
172 
173  add_hsep_to_box(LIVES_BOX(vbox));
174 
175  // now the dynamic part...
178 
179  lives_box_pack_start(LIVES_BOX(vbox), merge_opts->param_vbox, TRUE, TRUE, 0);
180 
182  make_param_box(LIVES_VBOX(merge_opts->param_vbox), rfx);
184 
185  retvals = do_onchange_init(rfx);
186 
187  if (retvals) {
188  // now apply visually anything we got from onchange_init
189  //param_demarshall (rfx,retvals,TRUE,TRUE);
190  lives_list_free_all(&retvals);
191  }
192 
193  // done !
194 
195  cancelbutton = lives_dialog_add_button_from_stock(LIVES_DIALOG(merge_opts->merge_dialog), LIVES_STOCK_CANCEL, NULL,
196  LIVES_RESPONSE_CANCEL);
197 
198  okbutton = lives_dialog_add_button_from_stock(LIVES_DIALOG(merge_opts->merge_dialog), LIVES_STOCK_OK, NULL,
199  LIVES_RESPONSE_OK);
200 
202 
203  lives_signal_connect(LIVES_GUI_OBJECT(cancelbutton), LIVES_WIDGET_CLICKED_SIGNAL,
204  LIVES_GUI_CALLBACK(on_merge_cancel_clicked),
205  rfx);
206 
207  lives_widget_add_accelerator(cancelbutton, LIVES_WIDGET_CLICKED_SIGNAL, accel_group,
208  LIVES_KEY_Escape, (LiVESXModifierType)0, (LiVESAccelFlags)0);
209 
210  lives_signal_connect(LIVES_GUI_OBJECT(okbutton), LIVES_WIDGET_CLICKED_SIGNAL,
211  LIVES_GUI_CALLBACK(on_merge_ok_clicked),
212  rfx);
213 
214  lives_signal_connect(LIVES_GUI_OBJECT(transition_combo), LIVES_WIDGET_CHANGED_SIGNAL,
215  LIVES_GUI_CALLBACK(on_trans_method_changed), NULL);
216 
217  lives_signal_connect(LIVES_GUI_OBJECT(align_start_button), LIVES_WIDGET_TOGGLED_SIGNAL,
218  LIVES_GUI_CALLBACK(on_align_start_end_toggled),
219  rfx);
220 
221  if (prefs->show_gui) {
223  }
224 }
225 
226 
227 static void bang(LiVESWidget *widget, livespointer null) {
228  lives_widget_destroy(widget);
229 }
230 
231 
232 void on_trans_method_changed(LiVESCombo *combo, livespointer user_data) {
233  lives_rfx_t *rfx;
234 
235  LiVESList *retvals;
236 
237  const char *txt = lives_combo_get_active_text(combo);
238 
239  int idx;
240 
241  if (!*txt) return;
242 
244 
245  lives_container_foreach(LIVES_CONTAINER(merge_opts->param_vbox), bang, NULL);
247 
249 
252 
253  make_param_box(LIVES_VBOX(merge_opts->param_vbox), rfx);
255 
256  retvals = do_onchange_init(rfx);
257 
258  if (retvals) {
259  // now apply visually anything we got from onchange_init
260  param_demarshall(rfx, retvals, TRUE, TRUE);
261  lives_list_free_all(&retvals);
262  }
263 
265  on_align_start_end_toggled(NULL, NULL);
266 }
267 
268 
269 void on_merge_activate(LiVESMenuItem *menuitem, livespointer user_data) {
271 
275 
276  on_align_start_end_toggled(NULL, NULL);
277 }
278 
279 
280 void on_merge_cancel_clicked(LiVESButton *button, livespointer user_data) {
281  lives_rfx_t *rfx = (lives_rfx_t *)user_data;
293 }
294 
295 
296 void on_merge_ok_clicked(LiVESButton *button, livespointer user_data) {
297  lives_rfx_t *rfx;
298 
299  char *com;
300 
301  int start, end;
302 
303  int cb_start = 1;
304  boolean cb_video_change = FALSE;
305 
306  int current_file = mainw->current_file;
307  int old_frames = clipboard->frames;
308 
309  // save original values in case we cancel
310  int oundo_start = cfile->undo_start;
311  int oundo_end = cfile->undo_end;
312  int cb_end, excess_frames;
313  int times_to_loop = 1;
314 
316 
317  if (rfx && mainw->textwidget_focus) {
318  // make sure text widgets are updated if they activate the default
319  LiVESWidget *textwidget = (LiVESWidget *)lives_widget_object_get_data(LIVES_WIDGET_OBJECT(mainw->textwidget_focus),
321  after_param_text_changed(textwidget, rfx);
322  }
323 
324  if (!special_cleanup(TRUE)) {
325  // check for file overwrites with special type "filewrite"
326  // if user declines, will return with LIVES_RESPONSE_RETRY
327  return;
328  }
329 
330  mainw->textwidget_focus = NULL;
331 
334 
338 
339  if (cfile->fps != clipboard->fps) {
340  if (!do_clipboard_fps_warning()) {
344  lives_list_free(merge_opts->trans_list);
347  return;
348  }
349  }
350 
352  times_to_loop = lives_spin_button_get_value_as_int(LIVES_SPIN_BUTTON(merge_opts->spinbutton_loops));
353  else
354  times_to_loop = 1;
355 
359  lives_list_free(merge_opts->trans_list);
362 
363  // if pref is set, resample clipboard video
364  if (prefs->ins_resample && cfile->fps != clipboard->fps) {
365  if (!resample_clipboard(cfile->fps)) return;
366  }
367 
368  if ((cfile->end - cfile->start + 1) <= clipboard->frames) {
369  times_to_loop = 1;
370  }
371 
372  d_print(_("Merging clipboard with selection..."));
373 
374  // clear up any leftover old files
375  com = lives_strdup_printf("%s clear_tmp_files \"%s\"", prefs->backend, cfile->handle);
376  lives_system(com, FALSE);
377  lives_free(com);
378 
379  excess_frames = clipboard->frames - (cfile->end - cfile->start + 1);
380  if (excess_frames < 0) excess_frames = 0;
381 
382  cfile->insert_start = 0;
383  cfile->insert_end = 0;
384 
385  cfile->redoable = FALSE;
387 
388  mainw->fx2_bool = FALSE;
389 
390  // dummy values - used for 'fit to audio' in insert
391  mainw->fx1_bool = FALSE;
392  mainw->fx1_val = 1; // times to insert
393 
394  // insert pre-frames
395  if (!mainw->last_transition_align_start && excess_frames > 0 && mainw->last_transition_ins_frames) {
397  d_print(P_("inserting %d extra frame before merge\n", "inserting %d extra frames before merge\n", excess_frames),
398  excess_frames);
399 
400  // fx1_start and fx2_start indicate the clipboard start/end values, fx2_bool is insert_with_audio
401  // TODO - allow this to be cancelled
402  mainw->fx1_start = 1;
403  mainw->fx2_start = excess_frames;
404  mainw->fx2_bool = FALSE;
405  on_insert_activate(NULL, NULL);
406  if (mainw->error) {
407  d_print_failed();
408  return;
409  }
410  if (mainw->cancelled) {
411  return;
412  }
413  }
414 
415  // these should be the original values, maybe shifted if frames were inserted
416 
417  // now the merge section
419 
420  // There are 6 possibilities:
421 
422  // align starts align ends
423  //
424  // cb_start cb_end cb_start cb_end
425  // cb <= sel 1 cb_frames*ttl 1 cb_frames*ttl
426  // cb > sel 1 end-start+1 excess_frames cb_frames
427  // l2f 1 end-start+1 1 end-start+1
428 
429  // number of frames to merge, must be <= selection length
431  cb_end = (clipboard->frames - excess_frames) * times_to_loop;
432  } else {
433  //loop_to_fit_audio
434  cb_end = cfile->end - cfile->start + 1;
435  }
436 
437  // here we use undo_start and undo_end to mark the merged section,
438  // insert_start and insert_end to mark the inserted section (if any)
440  cfile->undo_start = cfile->start;
441  cfile->undo_end = cfile->start + (cb_end * times_to_loop) - 1;
442  } else {
443  cfile->undo_start = cfile->end - (cb_end * times_to_loop) + 1;
444  cfile->undo_end = cfile->end;
445  cb_start = excess_frames + 1;
447  // make sure last frames are lined up
448  cb_start -= cb_end;
449  cb_end = (int)((cb_end + clipboard->frames - 1) / clipboard->frames) * clipboard->frames;
450  cb_start += cb_end;
451  }
452  }
453 
456  cfile->progress_end = cb_end - cb_start + cfile->start + excess_frames * !mainw->last_transition_align_start;
457  cfile->progress_start = cfile->start;
458  } else {
459  cfile->progress_end = cfile->end;
460  cfile->progress_start = cfile->end - cb_end + 1;
461  }
462  } else {
463  cfile->progress_start = cfile->start;
464  cfile->progress_end = cfile->end;
465  }
466 
467  // do the actual merge
468  if (!do_effect(rfx, FALSE)) {
469  // cancelled
470  // delete pre-inserted frames
471  if (!mainw->last_transition_align_start && excess_frames > 0) {
472  start = cfile->start;
473  end = cfile->end;
474  cfile->start = cfile->insert_start;
475  cfile->end = cfile->insert_end;
476  on_delete_activate(NULL, NULL);
477  // reset to original values
478  cfile->start = start;
479  cfile->end = end;
480  }
481 
482  cfile->undo_start = oundo_start;
483  cfile->undo_end = oundo_end;
484  cfile->insert_start = cfile->insert_end = 0;
485 
486  if (cb_video_change) {
487  mainw->current_file = 0;
488  on_undo_activate(NULL, NULL);
489  switch_to_file(0, current_file);
490  }
491  set_undoable(NULL, FALSE);
492 
493  if (!mainw->last_transition_align_start && excess_frames > 0) {
494  // we've added and now deleted frames, we need to redraw everything...
495  cfile->start -= excess_frames;
496  cfile->end -= excess_frames;
498  } else {
499  sensitize();
500  get_play_times();
501  }
502  return;
503  }
504 
505  // insert any post frames
506  if (mainw->last_transition_align_start && excess_frames > 0 && mainw->last_transition_ins_frames) {
508  d_print(P_("now inserting %d extra frame\n", "now inserting %d extra frames\n", excess_frames), excess_frames);
509 
510  // fx1_start and fx2_start hold the clipboard start/end values
511  mainw->fx1_start = clipboard->frames - excess_frames + 1;
512  mainw->fx2_start = clipboard->frames;
513 
514  on_insert_activate(NULL, LIVES_INT_TO_POINTER(1));
515  }
516 
517  if (excess_frames == 0 || !mainw->last_transition_ins_frames) {
518  d_print_done();
519  } else {
520  d_print(_("Merge done.\n"));
521  }
522 
523  if (cb_video_change) {
524  clipboard->old_frames = old_frames;
525  mainw->current_file = 0;
526  on_undo_activate(NULL, NULL);
527  mainw->current_file = current_file;
528  }
529 
530  cfile->undo_action = UNDO_MERGE;
531  // can get overwritten by undo insert
532  set_undoable(_(rfx->menu_text), TRUE);
533 
534  if (cfile->insert_start == 0) {
535  cfile->insert_start = cfile->undo_start;
536  cfile->insert_end = cfile->undo_end;
537  }
538  if (cfile->undo_end > cfile->insert_end) {
539  cfile->insert_end = cfile->undo_end;
540  }
541  if (cfile->undo_start < cfile->insert_start) {
542  cfile->insert_start = cfile->undo_start;
543  }
544 
546 }
547 
548 
549 void after_spinbutton_loops_changed(LiVESSpinButton *spinbutton, livespointer user_data) {
550  setmergealign();
551 }
552 
553 
554 void on_align_start_end_toggled(LiVESToggleButton *togglebutton, livespointer user_data) {
556  setmergealign();
557 }
558 
559 
560 void on_fit_toggled(LiVESToggleButton *togglebutton, livespointer user_data) {
563  setmergealign();
564 }
565 
566 
567 void on_ins_frames_toggled(LiVESToggleButton *togglebutton, livespointer user_data) {
569 }
_prefs::ins_resample
boolean ins_resample
Definition: preferences.h:184
_merge_opts::drop_frame_button
LiVESWidget * drop_frame_button
Definition: mainwindow.h:1825
on_merge_cancel_clicked
void on_merge_cancel_clicked(LiVESButton *button, livespointer user_data)
Definition: merge.c:280
on_merge_activate
void on_merge_activate(LiVESMenuItem *menuitem, livespointer user_data)
Definition: merge.c:269
lives_signal_connect
ulong lives_signal_connect(LiVESWidget *, const char *signal_name, ulong funcptr, livespointer data)
mainwindow::effects_paused
boolean effects_paused
Definition: mainwindow.h:1055
lives_dialog_add_button_from_stock
LiVESWidget * lives_dialog_add_button_from_stock(LiVESDialog *dialog, const char *stock_id, const char *label, int response_id)
Definition: widget-helper.c:9892
do_onchange_init
LiVESList * do_onchange_init(lives_rfx_t *rfx)
Definition: paramwindow.c:35
set_undoable
void set_undoable(const char *what, boolean sensitive)
Definition: utils.c:4784
lives_list_strcmp_index
int lives_list_strcmp_index(LiVESList *list, livesconstpointer data, boolean case_sensitive)
Definition: utils.c:4678
lives_free
#define lives_free
Definition: machinestate.h:52
on_delete_activate
void on_delete_activate(LiVESMenuItem *menuitem, livespointer user_data)
Definition: callbacks.c:4208
lives_widget_add_accelerator
WIDGET_HELPER_GLOBAL_INLINE boolean lives_widget_add_accelerator(LiVESWidget *widget, const char *accel_signal, LiVESAccelGroup *accel_group, uint32_t accel_key, LiVESXModifierType accel_mods, LiVESAccelFlags accel_flags)
Definition: widget-helper.c:2953
lives_malloc
#define lives_malloc
Definition: machinestate.h:46
mainwindow::last_transition_ins_frames
boolean last_transition_ins_frames
Definition: mainwindow.h:865
lives_widget_destroy
LIVES_GLOBAL_INLINE boolean lives_widget_destroy(LiVESWidget *widget)
Definition: widget-helper.c:1553
SCR_HEIGHT_SAFETY
#define SCR_HEIGHT_SAFETY
Definition: mainwindow.h:90
lives_standard_spin_button_new
LiVESWidget * lives_standard_spin_button_new(const char *labeltext, double val, double min, double max, double step, double page, int dp, LiVESBox *box, const char *tooltip)
Definition: widget-helper.c:9397
mainwindow::redo
LiVESWidget * redo
Definition: mainwindow.h:1147
_merge_opts::ins_frame_button
LiVESWidget * ins_frame_button
Definition: mainwindow.h:1824
lives_spin_button_set_value
WIDGET_HELPER_GLOBAL_INLINE boolean lives_spin_button_set_value(LiVESSpinButton *button, double value)
Definition: widget-helper.c:5119
lives_spin_button_get_value_as_int
WIDGET_HELPER_GLOBAL_INLINE int lives_spin_button_get_value_as_int(LiVESSpinButton *button)
Definition: widget-helper.c:5091
lives_dialog_get_content_area
WIDGET_HELPER_GLOBAL_INLINE LiVESWidget * lives_dialog_get_content_area(LiVESDialog *dialog)
Definition: widget-helper.c:2479
_prefs::show_gui
boolean show_gui
Definition: preferences.h:290
mainwindow::current_file
int current_file
Definition: mainwindow.h:727
lives_rfx_t::status
lives_rfx_status_t status
Definition: plugins.h:631
_merge_opts::param_vbox
LiVESWidget * param_vbox
Definition: mainwindow.h:1826
cfile
#define cfile
Definition: main.h:1833
count_resampled_frames
int count_resampled_frames(int in_frames, double orig_fps, double resampled_fps)
Definition: resample.c:72
effects.h
_merge_opts::trans_list
LiVESList * trans_list
Definition: mainwindow.h:1834
lives_standard_dialog_new
LiVESWidget * lives_standard_dialog_new(const char *title, boolean add_std_buttons, int width, int height)
Definition: widget-helper.c:9971
prefs
_prefs * prefs
Definition: preferences.h:847
_merge_opts::align_start
boolean align_start
Definition: mainwindow.h:1830
_prefs::backend
char backend[PATH_MAX *4]
Definition: preferences.h:411
mainwindow::num_rendered_effects_builtin
int num_rendered_effects_builtin
Definition: mainwindow.h:856
lives_rfx_t::menu_text
char * menu_text
for Weed, this is the filter_class "name"
Definition: plugins.h:627
_merge_opts::ins_frame_function
ulong ins_frame_function
Definition: mainwindow.h:1821
add_hsep_to_box
LiVESWidget * add_hsep_to_box(LiVESBox *box)
Definition: widget-helper.c:12355
lives_button_grab_default_special
boolean lives_button_grab_default_special(LiVESWidget *button)
Definition: widget-helper.c:7587
sensitize
void sensitize(void)
Definition: main.c:5078
add_fill_to_box
LiVESWidget * add_fill_to_box(LiVESBox *box)
Definition: widget-helper.c:12377
_merge_opts::ins_frames
boolean ins_frames
Definition: mainwindow.h:1831
merge_opts
_merge_opts * merge_opts
Definition: merge.c:15
after_spinbutton_loops_changed
void after_spinbutton_loops_changed(LiVESSpinButton *spinbutton, livespointer user_data)
Definition: merge.c:549
lives_container_set_border_width
WIDGET_HELPER_GLOBAL_INLINE boolean lives_container_set_border_width(LiVESContainer *container, uint32_t width)
Definition: widget-helper.c:4947
param_demarshall
void param_demarshall(lives_rfx_t *rfx, LiVESList *plist, boolean with_min_max, boolean upd)
Definition: paramwindow.c:3013
on_paramwindow_button_clicked
void on_paramwindow_button_clicked(LiVESButton *button, lives_rfx_t *rfx)
Definition: paramwindow.c:90
mainwindow::last_transition_align_start
boolean last_transition_align_start
Definition: mainwindow.h:864
on_ins_frames_toggled
void on_ins_frames_toggled(LiVESToggleButton *togglebutton, livespointer user_data)
Definition: merge.c:567
lives_window_add_accel_group
WIDGET_HELPER_GLOBAL_INLINE boolean lives_window_add_accel_group(LiVESWindow *window, LiVESAccelGroup *group)
Definition: widget-helper.c:2968
TRUE
#define TRUE
Definition: videoplugin.h:59
sizint
ssize_t sizint
type sizes
Definition: main.c:102
do_effect
boolean do_effect(lives_rfx_t *rfx, boolean is_preview)
defined as extern in paramwindow.c
Definition: effects.c:127
lives_standard_combo_new
LiVESWidget * lives_standard_combo_new(const char *labeltext, LiVESList *list, LiVESBox *box, const char *tooltip)
Definition: widget-helper.c:9544
lives_rfx_t
Definition: plugins.h:625
mainwindow::cancelled
volatile lives_cancel_t cancelled
Definition: mainwindow.h:798
mainwindow::fx2_bool
boolean fx2_bool
Definition: mainwindow.h:1053
on_insert_activate
void on_insert_activate(LiVESButton *button, livespointer user_data)
Definition: callbacks.c:3322
mainwindow::fx1_start
int fx1_start
Definition: mainwindow.h:1050
callbacks.h
make_param_box
boolean make_param_box(LiVESVBox *top_vbox, lives_rfx_t *rfx)
make a dynamic parameter window
Definition: paramwindow.c:1015
d_print
void d_print(const char *fmt,...)
Definition: utils.c:2542
mainwindow::insert_after
boolean insert_after
Definition: mainwindow.h:880
switch_to_file
void switch_to_file(int old_file, int new_file)
Definition: main.c:9646
mainwindow::num_rendered_effects_custom
int num_rendered_effects_custom
Definition: mainwindow.h:857
mainwindow::fx1_bool
boolean fx1_bool
Definition: mainwindow.h:1053
lives_standard_label_new
LiVESWidget * lives_standard_label_new(const char *text)
Definition: widget-helper.c:8601
mainwindow::textwidget_focus
LiVESWidget * textwidget_focus
Definition: mainwindow.h:1569
lives_combo_set_active_index
WIDGET_HELPER_GLOBAL_INLINE boolean lives_combo_set_active_index(LiVESCombo *combo, int index)
Definition: widget-helper.c:3883
do_clipboard_fps_warning
boolean do_clipboard_fps_warning(void)
Definition: dialogs.c:3244
lives_vbox_new
WIDGET_HELPER_GLOBAL_INLINE LiVESWidget * lives_vbox_new(boolean homogeneous, int spacing)
Definition: widget-helper.c:3267
do_rendered_fx_dialog
LIVES_GLOBAL_INLINE void do_rendered_fx_dialog(void)
Definition: dialogs.c:3368
d_print_failed
void d_print_failed(void)
Definition: utils.c:2615
P_
#define P_(String, StringPlural, n)
Definition: support.h:46
widget_opts_t::border_width
int border_width
border width in pixels
Definition: widget-helper.h:1416
widget_opts_t::packing_height
int packing_height
vertical pixels between widgets
Definition: widget-helper.h:1411
lives_hbox_new
WIDGET_HELPER_GLOBAL_INLINE LiVESWidget * lives_hbox_new(boolean homogeneous, int spacing)
Definition: widget-helper.c:3253
lives_signal_handlers_disconnect_by_func
WIDGET_HELPER_GLOBAL_INLINE boolean lives_signal_handlers_disconnect_by_func(livespointer instance, LiVESGuiCallback func, livespointer data)
Definition: widget-helper.c:1399
clipboard
#define clipboard
Definition: main.h:1835
lives_strdup_printf
#define lives_strdup_printf(fmt,...)
Definition: support.c:27
after_param_text_changed
void after_param_text_changed(LiVESWidget *textwidget, lives_rfx_t *rfx)
Definition: paramwindow.c:2635
GUI_SCREEN_HEIGHT
#define GUI_SCREEN_HEIGHT
Definition: mainwindow.h:100
resample_clipboard
boolean resample_clipboard(double new_fps)
call this to resample clipboard video
Definition: resample.c:2250
paramwindow.h
lives_list_free_all
void lives_list_free_all(LiVESList **)
Definition: utils.c:4873
setmergealign
void setmergealign(void)
Definition: paramspecial.c:687
_merge_opts::merge_dialog
LiVESWidget * merge_dialog
Definition: mainwindow.h:1823
on_fit_toggled
void on_fit_toggled(LiVESToggleButton *togglebutton, livespointer user_data)
Definition: merge.c:560
lives_widget_set_sensitive
WIDGET_HELPER_GLOBAL_INLINE boolean lives_widget_set_sensitive(LiVESWidget *widget, boolean state)
Definition: widget-helper.c:1477
lives_accel_group_new
WIDGET_HELPER_GLOBAL_INLINE LiVESAccelGroup * lives_accel_group_new(void)
Definition: widget-helper.c:2915
mainwindow::fx2_start
int fx2_start
Definition: mainwindow.h:1050
UNDO_MERGE
@ UNDO_MERGE
Definition: main.h:663
main.h
RFX_STATUS_TEST
@ RFX_STATUS_TEST
test effects in the advanced menu
Definition: plugins.h:614
lives_combo_get_active_text
WIDGET_HELPER_GLOBAL_INLINE const char * lives_combo_get_active_text(LiVESCombo *combo)
Definition: widget-helper.c:3874
resample.h
mainw
mainwindow * mainw
Definition: main.c:103
mainwindow::last_transition_idx
int last_transition_idx
Definition: mainwindow.h:861
_merge_opts::spinbutton_loops
LiVESWidget * spinbutton_loops
Definition: mainwindow.h:1827
_merge_opts
Definition: mainwindow.h:1820
create_merge_dialog
void create_merge_dialog(void)
Definition: merge.c:17
lives_system
int lives_system(const char *com, boolean allow_error)
Definition: utils.c:145
lives_widget_show_all
WIDGET_HELPER_GLOBAL_INLINE boolean lives_widget_show_all(LiVESWidget *widget)
Definition: widget-helper.c:1523
mainwindow::num_rendered_effects_test
int num_rendered_effects_test
Definition: mainwindow.h:858
lives_container_foreach
WIDGET_HELPER_GLOBAL_INLINE boolean lives_container_foreach(LiVESContainer *cont, LiVESWidgetCallback callback, livespointer cb_data)
Definition: widget-helper.c:4957
lives_toggle_button_set_active
WIDGET_HELPER_GLOBAL_INLINE boolean lives_toggle_button_set_active(LiVESToggleButton *button, boolean active)
Definition: widget-helper.c:4483
widget_opts
widget_opts_t widget_opts
Definition: widget-helper.h:1442
special_cleanup
boolean special_cleanup(boolean is_ok)
Definition: paramspecial.c:641
_merge_opts::list_to_rfx_index
int * list_to_rfx_index
Definition: mainwindow.h:1833
get_play_times
void get_play_times(void)
recalculate video / audio lengths and draw the timer bars
Definition: utils.c:3672
on_merge_ok_clicked
void on_merge_ok_clicked(LiVESButton *button, livespointer user_data)
Definition: merge.c:296
mainwindow::last_transition_loops
int last_transition_loops
Definition: mainwindow.h:862
on_undo_activate
void on_undo_activate(LiVESWidget *menuitem, livespointer user_data)
Definition: callbacks.c:2275
GUI_SCREEN_WIDTH
#define GUI_SCREEN_WIDTH
Definition: mainwindow.h:99
mainwindow::fx1_val
double fx1_val
Definition: mainwindow.h:1049
merge.h
lives_standard_check_button_new
LiVESWidget * lives_standard_check_button_new(const char *labeltext, boolean active, LiVESBox *box, const char *tooltip)
Definition: widget-helper.c:9048
d_print_done
void d_print_done(void)
Definition: utils.c:2620
on_align_start_end_toggled
void on_align_start_end_toggled(LiVESToggleButton *togglebutton, livespointer user_data)
Definition: merge.c:554
FALSE
#define FALSE
Definition: videoplugin.h:60
on_trans_method_changed
void on_trans_method_changed(LiVESCombo *combo, livespointer user_data)
Definition: merge.c:232
TEXTWIDGET_KEY
#define TEXTWIDGET_KEY
Definition: widget-helper.h:1492
_
#define _(String)
Definition: support.h:44
mainwindow::error
boolean error
Definition: mainwindow.h:801
_merge_opts::loop_to_fit
boolean loop_to_fit
Definition: mainwindow.h:1829
lives_widget_context_update
boolean lives_widget_context_update(void)
Definition: widget-helper.c:11878
SCR_WIDTH_SAFETY
#define SCR_WIDTH_SAFETY
sepwin/screen size safety margins in pixels
Definition: mainwindow.h:89
mainwindow::last_transition_loop_to_fit
boolean last_transition_loop_to_fit
Definition: mainwindow.h:863
lives_standard_radio_button_new
LiVESWidget * lives_standard_radio_button_new(const char *labeltext, LiVESSList **rbgroup, LiVESBox *box, const char *tooltip)
Definition: widget-helper.c:9265
RFX_STATUS_CUSTOM
@ RFX_STATUS_CUSTOM
custom effects in the custom menu
Definition: plugins.h:613
mainwindow::rendered_fx
lives_rfx_t * rendered_fx
rendered fx
Definition: mainwindow.h:855
lives_box_pack_start
WIDGET_HELPER_GLOBAL_INLINE boolean lives_box_pack_start(LiVESBox *box, LiVESWidget *child, boolean expand, boolean fill, uint32_t padding)
Definition: widget-helper.c:3281