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
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);
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);
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
227static void bang(LiVESWidget *widget, livespointer null) {
228 lives_widget_destroy(widget);
229}
230
231
232void 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
269void on_merge_activate(LiVESMenuItem *menuitem, livespointer user_data) {
271
275
276 on_align_start_end_toggled(NULL, NULL);
277}
278
279
280void on_merge_cancel_clicked(LiVESButton *button, livespointer user_data) {
281 lives_rfx_t *rfx = (lives_rfx_t *)user_data;
293}
294
295
296void 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) {
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
389
390 // dummy values - used for 'fit to audio' in insert
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;
405 on_insert_activate(NULL, NULL);
406 if (mainw->error) {
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();
501 }
502 return;
503 }
504
505 // insert any post 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
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
549void after_spinbutton_loops_changed(LiVESSpinButton *spinbutton, livespointer user_data) {
551}
552
553
554void on_align_start_end_toggled(LiVESToggleButton *togglebutton, livespointer user_data) {
557}
558
559
560void on_fit_toggled(LiVESToggleButton *togglebutton, livespointer user_data) {
564}
565
566
567void on_ins_frames_toggled(LiVESToggleButton *togglebutton, livespointer user_data) {
569}
void on_delete_activate(LiVESMenuItem *menuitem, livespointer user_data)
Definition: callbacks.c:4208
void on_insert_activate(LiVESButton *button, livespointer user_data)
Definition: callbacks.c:3322
void on_undo_activate(LiVESWidget *menuitem, livespointer user_data)
Definition: callbacks.c:2275
LIVES_GLOBAL_INLINE void do_rendered_fx_dialog(void)
Definition: dialogs.c:3368
boolean do_clipboard_fps_warning(void)
Definition: dialogs.c:3244
boolean do_effect(lives_rfx_t *rfx, boolean is_preview)
defined as extern in paramwindow.c
Definition: effects.c:127
#define lives_free
Definition: machinestate.h:52
#define lives_malloc
Definition: machinestate.h:46
void sensitize(void)
Definition: main.c:5078
ssize_t sizint
type sizes
Definition: main.c:102
mainwindow * mainw
Definition: main.c:103
void switch_to_file(int old_file, int new_file)
Definition: main.c:9646
#define clipboard
Definition: main.h:1835
void lives_list_free_all(LiVESList **)
Definition: utils.c:4873
void get_play_times(void)
recalculate video / audio lengths and draw the timer bars
Definition: utils.c:3672
@ UNDO_MERGE
Definition: main.h:663
int lives_system(const char *com, boolean allow_error)
Definition: utils.c:145
void set_undoable(const char *what, boolean sensitive)
Definition: utils.c:4784
int count_resampled_frames(int in_frames, double orig_fps, double resampled_fps)
Definition: resample.c:72
void d_print_failed(void)
Definition: utils.c:2615
#define cfile
Definition: main.h:1833
int lives_list_strcmp_index(LiVESList *list, livesconstpointer data, boolean case_sensitive)
Definition: utils.c:4678
void d_print(const char *fmt,...)
Definition: utils.c:2542
void d_print_done(void)
Definition: utils.c:2620
#define SCR_HEIGHT_SAFETY
Definition: mainwindow.h:90
#define GUI_SCREEN_WIDTH
Definition: mainwindow.h:99
#define SCR_WIDTH_SAFETY
sepwin/screen size safety margins in pixels
Definition: mainwindow.h:89
#define GUI_SCREEN_HEIGHT
Definition: mainwindow.h:100
void on_merge_activate(LiVESMenuItem *menuitem, livespointer user_data)
Definition: merge.c:269
void on_merge_ok_clicked(LiVESButton *button, livespointer user_data)
Definition: merge.c:296
void on_merge_cancel_clicked(LiVESButton *button, livespointer user_data)
Definition: merge.c:280
void create_merge_dialog(void)
Definition: merge.c:17
void on_trans_method_changed(LiVESCombo *combo, livespointer user_data)
Definition: merge.c:232
void on_fit_toggled(LiVESToggleButton *togglebutton, livespointer user_data)
Definition: merge.c:560
void on_align_start_end_toggled(LiVESToggleButton *togglebutton, livespointer user_data)
Definition: merge.c:554
void after_spinbutton_loops_changed(LiVESSpinButton *spinbutton, livespointer user_data)
Definition: merge.c:549
_merge_opts * merge_opts
Definition: merge.c:15
void on_ins_frames_toggled(LiVESToggleButton *togglebutton, livespointer user_data)
Definition: merge.c:567
boolean special_cleanup(boolean is_ok)
Definition: paramspecial.c:641
void setmergealign(void)
Definition: paramspecial.c:687
void on_paramwindow_button_clicked(LiVESButton *button, lives_rfx_t *rfx)
Definition: paramwindow.c:90
void param_demarshall(lives_rfx_t *rfx, LiVESList *plist, boolean with_min_max, boolean upd)
Definition: paramwindow.c:3013
void after_param_text_changed(LiVESWidget *textwidget, lives_rfx_t *rfx)
Definition: paramwindow.c:2635
boolean make_param_box(LiVESVBox *top_vbox, lives_rfx_t *rfx)
make a dynamic parameter window
Definition: paramwindow.c:1015
LiVESList * do_onchange_init(lives_rfx_t *rfx)
Definition: paramwindow.c:35
@ RFX_STATUS_TEST
test effects in the advanced menu
Definition: plugins.h:614
@ RFX_STATUS_CUSTOM
custom effects in the custom menu
Definition: plugins.h:613
_prefs * prefs
Definition: preferences.h:847
boolean resample_clipboard(double new_fps)
call this to resample clipboard video
Definition: resample.c:2250
LiVESWidget * ins_frame_button
Definition: mainwindow.h:1824
LiVESWidget * param_vbox
Definition: mainwindow.h:1826
LiVESWidget * merge_dialog
Definition: mainwindow.h:1823
LiVESList * trans_list
Definition: mainwindow.h:1834
int * list_to_rfx_index
Definition: mainwindow.h:1833
ulong ins_frame_function
Definition: mainwindow.h:1821
boolean ins_frames
Definition: mainwindow.h:1831
boolean loop_to_fit
Definition: mainwindow.h:1829
LiVESWidget * spinbutton_loops
Definition: mainwindow.h:1827
boolean align_start
Definition: mainwindow.h:1830
LiVESWidget * drop_frame_button
Definition: mainwindow.h:1825
char backend[PATH_MAX *4]
Definition: preferences.h:411
boolean show_gui
Definition: preferences.h:290
boolean ins_resample
Definition: preferences.h:184
char * menu_text
for Weed, this is the filter_class "name"
Definition: plugins.h:627
lives_rfx_status_t status
Definition: plugins.h:631
int num_rendered_effects_builtin
Definition: mainwindow.h:856
LiVESWidget * redo
Definition: mainwindow.h:1147
boolean last_transition_ins_frames
Definition: mainwindow.h:865
boolean last_transition_loop_to_fit
Definition: mainwindow.h:863
int last_transition_idx
Definition: mainwindow.h:861
boolean fx1_bool
Definition: mainwindow.h:1053
boolean last_transition_align_start
Definition: mainwindow.h:864
boolean fx2_bool
Definition: mainwindow.h:1053
boolean effects_paused
Definition: mainwindow.h:1055
volatile lives_cancel_t cancelled
Definition: mainwindow.h:798
int current_file
Definition: mainwindow.h:727
int num_rendered_effects_test
Definition: mainwindow.h:858
int num_rendered_effects_custom
Definition: mainwindow.h:857
int last_transition_loops
Definition: mainwindow.h:862
boolean insert_after
Definition: mainwindow.h:880
double fx1_val
Definition: mainwindow.h:1049
LiVESWidget * textwidget_focus
Definition: mainwindow.h:1569
boolean error
Definition: mainwindow.h:801
lives_rfx_t * rendered_fx
rendered fx
Definition: mainwindow.h:855
int packing_height
vertical pixels between widgets
int border_width
border width in pixels
#define lives_strdup_printf(fmt,...)
Definition: support.c:27
#define _(String)
Definition: support.h:44
#define P_(String, StringPlural, n)
Definition: support.h:46
#define TRUE
Definition: videoplugin.h:59
#define FALSE
Definition: videoplugin.h:60
WIDGET_HELPER_GLOBAL_INLINE boolean lives_spin_button_set_value(LiVESSpinButton *button, double value)
WIDGET_HELPER_GLOBAL_INLINE LiVESWidget * lives_vbox_new(boolean homogeneous, int spacing)
WIDGET_HELPER_GLOBAL_INLINE LiVESAccelGroup * lives_accel_group_new(void)
boolean lives_button_grab_default_special(LiVESWidget *button)
WIDGET_HELPER_GLOBAL_INLINE boolean lives_box_pack_start(LiVESBox *box, LiVESWidget *child, boolean expand, boolean fill, uint32_t padding)
LiVESWidget * lives_standard_dialog_new(const char *title, boolean add_std_buttons, int width, int height)
WIDGET_HELPER_GLOBAL_INLINE boolean lives_combo_set_active_index(LiVESCombo *combo, int index)
WIDGET_HELPER_GLOBAL_INLINE boolean lives_widget_set_sensitive(LiVESWidget *widget, boolean state)
WIDGET_HELPER_GLOBAL_INLINE LiVESWidget * lives_dialog_get_content_area(LiVESDialog *dialog)
WIDGET_HELPER_GLOBAL_INLINE boolean lives_container_set_border_width(LiVESContainer *container, uint32_t width)
WIDGET_HELPER_GLOBAL_INLINE boolean lives_container_foreach(LiVESContainer *cont, LiVESWidgetCallback callback, livespointer cb_data)
LiVESWidget * add_hsep_to_box(LiVESBox *box)
LiVESWidget * add_fill_to_box(LiVESBox *box)
WIDGET_HELPER_GLOBAL_INLINE const char * lives_combo_get_active_text(LiVESCombo *combo)
WIDGET_HELPER_GLOBAL_INLINE int lives_spin_button_get_value_as_int(LiVESSpinButton *button)
LIVES_GLOBAL_INLINE boolean lives_widget_destroy(LiVESWidget *widget)
LiVESWidget * lives_dialog_add_button_from_stock(LiVESDialog *dialog, const char *stock_id, const char *label, int response_id)
WIDGET_HELPER_GLOBAL_INLINE boolean lives_toggle_button_set_active(LiVESToggleButton *button, boolean active)
WIDGET_HELPER_GLOBAL_INLINE boolean lives_widget_show_all(LiVESWidget *widget)
boolean lives_widget_context_update(void)
WIDGET_HELPER_GLOBAL_INLINE boolean lives_signal_handlers_disconnect_by_func(livespointer instance, LiVESGuiCallback func, livespointer data)
WIDGET_HELPER_GLOBAL_INLINE LiVESWidget * lives_hbox_new(boolean homogeneous, int spacing)
LiVESWidget * lives_standard_label_new(const char *text)
LiVESWidget * lives_standard_check_button_new(const char *labeltext, boolean active, LiVESBox *box, const char *tooltip)
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)
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)
LiVESWidget * lives_standard_combo_new(const char *labeltext, LiVESList *list, LiVESBox *box, const char *tooltip)
LiVESWidget * lives_standard_radio_button_new(const char *labeltext, LiVESSList **rbgroup, LiVESBox *box, const char *tooltip)
WIDGET_HELPER_GLOBAL_INLINE boolean lives_window_add_accel_group(LiVESWindow *window, LiVESAccelGroup *group)
#define TEXTWIDGET_KEY
ulong lives_signal_connect(LiVESWidget *, const char *signal_name, ulong funcptr, livespointer data)
widget_opts_t widget_opts