18 static LiVESWidget *make_param_window_dialog(
int hnum,
rfx_build_window_t *rfxbuilder);
20 static void on_table_add_row(LiVESButton *, livespointer rfxbuilder);
21 static void on_table_edit_row(LiVESButton *, livespointer rfxbuilder);
22 static void on_table_swap_row(LiVESButton *, livespointer rfxbuilder);
23 static void on_table_delete_row(LiVESButton *, livespointer rfxbuilder);
27 static void after_param_dp_changed(LiVESSpinButton *, livespointer rfxbuilder);
28 static void after_param_min_changed(LiVESSpinButton *, livespointer rfxbuilder);
29 static void after_param_max_changed(LiVESSpinButton *, livespointer rfxbuilder);
30 static void after_param_def_changed(LiVESSpinButton *, livespointer rfxbuilder);
31 static void after_rfxbuilder_type_toggled(LiVESToggleButton *, livespointer rfxbuilder);
32 static void on_param_type_changed(LiVESCombo *, livespointer rfxbuilder);
33 static void on_paramw_kw_changed(LiVESCombo *, livespointer rfxbuilder);
34 static void on_paramw_sp_changed(LiVESCombo *, livespointer rfxbuilder);
35 static void on_paramw_spsub_changed(LiVESCombo *, livespointer rfxbuilder);
36 static void populate_script_combo(LiVESCombo *script_combo,
lives_rfx_status_t status);
37 static void on_script_status_changed(LiVESCombo *status_combo, livespointer script_combo);
41 static void on_rfxbuilder_ok(LiVESButton *, livespointer);
42 static void on_rfxbuilder_cancel(LiVESButton *, livespointer);
44 static void on_list_table_clicked(LiVESButton *, livespointer rfxbuilder);
45 static void on_requirements_ok(LiVESButton *, livespointer rfxbuilder);
46 static void on_requirements_cancel(LiVESButton *, livespointer);
47 static void on_properties_clicked(LiVESButton *, livespointer rfxbuilder);
48 static void on_properties_ok(LiVESButton *, livespointer rfxbuilder);
49 static void on_params_ok(LiVESButton *, livespointer rfxbuilder);
50 static void on_params_cancel(LiVESButton *, livespointer);
51 static void on_param_window_ok(LiVESButton *, livespointer rfxbuilder);
52 static void on_param_window_cancel(LiVESButton *, livespointer);
53 static void on_code_clicked(LiVESButton *, livespointer rfxbuilder);
54 static void on_code_ok(LiVESButton *, livespointer rfxbuilder);
55 static void on_triggers_ok(LiVESButton *, livespointer rfxbuilder);
56 static void on_triggers_cancel(LiVESButton *, livespointer);
58 static LiVESWidget *copy_script_okbutton;
80 if (!strlen(script_name)) {
84 if ((rfxbuilder = make_rfx_build_window(script_name,
RFX_STATUS_TEST)) == NULL) {
121 LiVESWidget *dialog_vbox;
125 LiVESWidget *okbutton;
126 LiVESWidget *cancelbutton;
127 LiVESWidget *scrollw;
128 LiVESWidget *top_vbox;
130 LiVESSList *radiobutton_type_group = NULL;
131 LiVESList *langc = NULL;
137 int winsize_h, winsize_v;
139 char *tmp, *tmp2, *title, *string;
152 rfxbuilder->
props = 0;
156 rfxbuilder->
pre_code = lives_strdup(
"");
157 rfxbuilder->
loop_code = lives_strdup(
"");
158 rfxbuilder->
post_code = lives_strdup(
"");
163 rfxbuilder->
oname = NULL;
172 title = (
_(
"New Test RFX"));
174 title = (
_(
"Edit Test RFX"));
228 LIVES_BOX(hbox), (tmp2 = (
_(
"The name of the plugin. No spaces allowed."))));
236 LIVES_BOX(hbox), (tmp2 = (
_(
"The script version."))));
243 LIVES_BOX(hbox), (tmp2 = (
_(
"The script author."))));
250 LIVES_BOX(hbox), (tmp2 = (
_(
"URL for the plugin maintainer."))));
257 LIVES_BOX(hbox), (tmp2 = (
_(
"The text to show in the menu."))));
269 (tmp2 = (
_(
"Describe what the plugin is doing. E.g. \"Edge detecting\""))));
273 1., 1., 1000., 1., 1., 0, LIVES_BOX(top_vbox),
274 (tmp2 = (
_(
"Minimum number of frames this effect/tool can be applied to. Normally 1."))));
287 (
_(
"Enter any binaries required by the plugin.")));
296 (
_(
"Set properties for the plugin. Optional.")));
305 (
_(
"Set up parameters used in pre/loop/post/trigger code. Optional.")));
314 (
_(
"Set hints about how to lay out the parameter window. Optional.")));
318 langc = lives_list_append(langc, (livespointer)
"0xF0 - LiVES-Perl");
321 (tmp2 = (
_(
"Language for pre/loop/post/triggers. Optional."))));
324 lives_list_free(langc);
333 (
_(
"Code to be executed before the loop. Optional.")));
342 (
_(
"Loop code to be applied to each frame.")));
351 (
_(
"Code to be executed after the loop. Optional.")));
360 (
_(
"Set trigger code for when the parameter window is shown, or when a parameter is changed. "
361 "Optional (except for Utilities).")));
364 LIVES_RESPONSE_CANCEL);
372 LIVES_KEY_Escape, (LiVESXModifierType)0, (LiVESAccelFlags)0);
374 lives_signal_sync_connect(LIVES_GUI_OBJECT(okbutton), LIVES_WIDGET_CLICKED_SIGNAL,
375 LIVES_GUI_CALLBACK(on_rfxbuilder_ok), (livespointer)rfxbuilder);
377 lives_signal_sync_connect(LIVES_GUI_OBJECT(cancelbutton), LIVES_WIDGET_CLICKED_SIGNAL,
378 LIVES_GUI_CALLBACK(on_rfxbuilder_cancel), (livespointer)rfxbuilder);
381 LIVES_GUI_CALLBACK(on_list_table_clicked), (livespointer)rfxbuilder);
383 lives_signal_sync_connect(rfxbuilder->
properties_button, LIVES_WIDGET_CLICKED_SIGNAL,
384 LIVES_GUI_CALLBACK(on_properties_clicked), (livespointer)rfxbuilder);
386 lives_signal_sync_connect(rfxbuilder->
params_button, LIVES_WIDGET_CLICKED_SIGNAL,
387 LIVES_GUI_CALLBACK(on_list_table_clicked), (livespointer)rfxbuilder);
390 LIVES_GUI_CALLBACK(on_list_table_clicked), (livespointer)rfxbuilder);
392 lives_signal_sync_connect(rfxbuilder->
trigger_button, LIVES_WIDGET_CLICKED_SIGNAL,
393 LIVES_GUI_CALLBACK(on_list_table_clicked), (livespointer)rfxbuilder);
395 lives_signal_sync_connect(rfxbuilder->
pre_button, LIVES_WIDGET_CLICKED_SIGNAL,
396 LIVES_GUI_CALLBACK(on_code_clicked), (livespointer)rfxbuilder);
398 lives_signal_sync_connect(rfxbuilder->
loop_button, LIVES_WIDGET_CLICKED_SIGNAL,
399 LIVES_GUI_CALLBACK(on_code_clicked), (livespointer)rfxbuilder);
401 lives_signal_sync_connect(rfxbuilder->
post_button, LIVES_WIDGET_CLICKED_SIGNAL,
402 LIVES_GUI_CALLBACK(on_code_clicked), (livespointer)rfxbuilder);
404 lives_signal_sync_connect_after(LIVES_GUI_OBJECT(rfxbuilder->
type_effect1_radiobutton), LIVES_WIDGET_TOGGLED_SIGNAL,
405 LIVES_GUI_CALLBACK(after_rfxbuilder_type_toggled), (livespointer)rfxbuilder);
407 lives_signal_sync_connect_after(LIVES_GUI_OBJECT(rfxbuilder->
type_effect2_radiobutton), LIVES_WIDGET_TOGGLED_SIGNAL,
408 LIVES_GUI_CALLBACK(after_rfxbuilder_type_toggled), (livespointer)rfxbuilder);
410 lives_signal_sync_connect_after(LIVES_GUI_OBJECT(rfxbuilder->
type_effect0_radiobutton), LIVES_WIDGET_TOGGLED_SIGNAL,
411 LIVES_GUI_CALLBACK(after_rfxbuilder_type_toggled), (livespointer)rfxbuilder);
413 lives_signal_sync_connect_after(LIVES_GUI_OBJECT(rfxbuilder->
type_tool_radiobutton), LIVES_WIDGET_TOGGLED_SIGNAL,
414 LIVES_GUI_CALLBACK(after_rfxbuilder_type_toggled), (livespointer)rfxbuilder);
416 lives_signal_sync_connect_after(LIVES_GUI_OBJECT(rfxbuilder->
type_utility_radiobutton), LIVES_WIDGET_TOGGLED_SIGNAL,
417 LIVES_GUI_CALLBACK(after_rfxbuilder_type_toggled), (livespointer)rfxbuilder);
443 rfxbuilder_destroy(rfxbuilder);
448 switch (rfxbuilder->
type) {
474 void after_rfxbuilder_type_toggled(LiVESToggleButton *togglebutton, livespointer user_data) {
516 static void on_list_table_clicked(LiVESButton *button, livespointer user_data) {
518 LiVESWidget *dialog_vbox;
520 LiVESWidget *button_box;
523 LiVESWidget *okbutton;
524 LiVESWidget *scrolledwindow;
525 LiVESWidget *cancelbutton;
537 }
else if (button == LIVES_BUTTON(rfxbuilder->
params_button)) {
546 title = (
_(
"RFX Requirements"));
549 title = (
_(
"RFX Parameters"));
552 title = (
_(
"RFX Parameter Window Hints"));
555 title = (
_(
"RFX Triggers"));
573 for (i = 0; i < rfxbuilder->
num_reqs; i++) {
574 on_table_add_row(NULL, (livespointer)rfxbuilder);
580 for (i = 0; i < rfxbuilder->
num_params; i++) {
582 on_table_add_row(NULL, (livespointer)rfxbuilder);
587 on_table_add_row(NULL, (livespointer)rfxbuilder);
595 on_table_add_row(NULL, (livespointer)rfxbuilder);
668 LIVES_RESPONSE_CANCEL);
674 LIVES_KEY_Escape, (LiVESXModifierType)0, (LiVESAccelFlags)0);
679 lives_signal_sync_connect(LIVES_GUI_OBJECT(okbutton), LIVES_WIDGET_CLICKED_SIGNAL,
680 LIVES_GUI_CALLBACK(on_requirements_ok), user_data);
682 lives_signal_sync_connect(LIVES_GUI_OBJECT(cancelbutton), LIVES_WIDGET_CLICKED_SIGNAL,
683 LIVES_GUI_CALLBACK(on_requirements_cancel), user_data);
685 lives_signal_sync_connect(LIVES_GUI_OBJECT(okbutton), LIVES_WIDGET_CLICKED_SIGNAL,
686 LIVES_GUI_CALLBACK(on_params_ok), user_data);
688 lives_signal_sync_connect(LIVES_GUI_OBJECT(cancelbutton), LIVES_WIDGET_CLICKED_SIGNAL,
689 LIVES_GUI_CALLBACK(on_params_cancel), user_data);
691 lives_signal_sync_connect(LIVES_GUI_OBJECT(okbutton), LIVES_WIDGET_CLICKED_SIGNAL,
692 LIVES_GUI_CALLBACK(on_param_window_ok), user_data);
694 lives_signal_sync_connect(LIVES_GUI_OBJECT(cancelbutton), LIVES_WIDGET_CLICKED_SIGNAL,
695 LIVES_GUI_CALLBACK(on_param_window_cancel),
698 lives_signal_sync_connect(LIVES_GUI_OBJECT(okbutton), LIVES_WIDGET_CLICKED_SIGNAL,
699 LIVES_GUI_CALLBACK(on_triggers_ok), user_data);
701 lives_signal_sync_connect(LIVES_GUI_OBJECT(cancelbutton), LIVES_WIDGET_CLICKED_SIGNAL,
702 LIVES_GUI_CALLBACK(on_triggers_cancel), user_data);
705 lives_signal_sync_connect(LIVES_GUI_OBJECT(rfxbuilder->
new_entry_button), LIVES_WIDGET_CLICKED_SIGNAL,
706 LIVES_GUI_CALLBACK(on_table_add_row), user_data);
708 lives_signal_sync_connect(LIVES_GUI_OBJECT(rfxbuilder->
edit_entry_button), LIVES_WIDGET_CLICKED_SIGNAL,
709 LIVES_GUI_CALLBACK(on_table_edit_row), user_data);
711 lives_signal_sync_connect(LIVES_GUI_OBJECT(rfxbuilder->
remove_entry_button), LIVES_WIDGET_CLICKED_SIGNAL,
712 LIVES_GUI_CALLBACK(on_table_delete_row), user_data);
715 lives_signal_sync_connect(LIVES_GUI_OBJECT(rfxbuilder->
move_up_button), LIVES_WIDGET_CLICKED_SIGNAL,
716 LIVES_GUI_CALLBACK(on_table_swap_row), user_data);
718 lives_signal_sync_connect(LIVES_GUI_OBJECT(rfxbuilder->
move_down_button), LIVES_WIDGET_CLICKED_SIGNAL,
719 LIVES_GUI_CALLBACK(on_table_swap_row), user_data);
723 table_select_row(rfxbuilder, -1);
727 static void on_requirements_ok(LiVESButton *button, livespointer user_data) {
731 for (i = 0; i < rfxbuilder->
onum_reqs; i++) {
734 for (i = 0; i < rfxbuilder->
num_reqs; i++) {
741 static void on_requirements_cancel(LiVESButton *button, livespointer user_data) {
749 static void on_properties_ok(LiVESButton *button, livespointer user_data) {
769 static void on_params_ok(LiVESButton *button, livespointer user_data) {
786 for (i = 0; i < rfxbuilder->
num_params; i++) {
803 static void on_params_cancel(LiVESButton *button, livespointer user_data) {
806 for (
register int i = 0; i < rfxbuilder->
num_params; i++) {
823 static void on_param_window_ok(LiVESButton *button, livespointer user_data) {
839 static void on_param_window_cancel(LiVESButton *button, livespointer user_data) {
847 static void on_code_ok(LiVESButton *button, livespointer user_data) {
880 char **lines = lives_strsplit(values,
"\n", numlines);
887 for (
register int i = 0; i < numlines; i++) {
888 if (i < numlines - 1 || strlen(lines[i])) {
893 lives_strfreev(lines);
914 static void on_triggers_ok(LiVESButton * button, livespointer user_data) {
937 static void on_triggers_cancel(LiVESButton * button, livespointer user_data) {
940 uint8_t *valid_triggers = NULL;
942 boolean init_trigger_valid =
FALSE;
959 if (when == 0) init_trigger_valid = 1;
960 else valid_triggers[when - 1] = 1;
964 for (i = 0; i < rfxbuilder->
num_params; i++) {
965 if (!valid_triggers[i]) {
972 if (valid_triggers)
lives_free(valid_triggers);
974 if (!init_trigger_valid) {
984 static void on_properties_clicked(LiVESButton * button, livespointer user_data) {
986 LiVESWidget *dialog_vbox;
987 LiVESWidget *cancelbutton;
988 LiVESWidget *okbutton;
1018 LIVES_RESPONSE_CANCEL);
1026 LIVES_KEY_Escape, (LiVESXModifierType)0, (LiVESAccelFlags)0);
1028 lives_signal_sync_connect(LIVES_GUI_OBJECT(okbutton), LIVES_WIDGET_CLICKED_SIGNAL,
1029 LIVES_GUI_CALLBACK(on_properties_ok), user_data);
1031 lives_signal_sync_connect(LIVES_GUI_OBJECT(cancelbutton), LIVES_WIDGET_CLICKED_SIGNAL,
1039 for (
register int i = 0; i < rfxbuilder->
table_rows; i++) {
1045 i < rfxbuilder->table_rows - 1);
1048 if (rfxbuilder->
entry2[i]) {
1051 if (rfxbuilder->
entry3[i]) {
1058 if (rfxbuilder->
entry2[i]) {
1062 if (rfxbuilder->
entry3[i]) {
1071 static boolean on_entry_click(LiVESWidget * widget, LiVESXEventButton * event, livespointer user_data) {
1075 for (
register int i = 0; i < rfxbuilder->
table_rows; i++) {
1076 if (widget == rfxbuilder->
entry[i] || widget == rfxbuilder->
entry2[i] || widget == rfxbuilder->
entry3[i]) {
1077 table_select_row(rfxbuilder, i);
1079 if (event->type != LIVES_BUTTON_PRESS) {
1081 on_table_edit_row(NULL, rfxbuilder);
1090 static void on_table_add_row(LiVESButton * button, livespointer user_data) {
1091 LiVESWidget *entry = NULL, *entry2 = NULL, *entry3 = NULL;
1092 LiVESWidget *param_dialog = NULL;
1093 LiVESWidget *param_window_dialog = NULL;
1094 LiVESWidget *trigger_dialog = NULL;
1104 LiVESWidget *ebox, *ebox2 = NULL, *ebox3 = NULL;
1112 for (i = 0; i < rfxbuilder->
table_rows; i++) {
1131 (LiVESAttachOptions)(LIVES_FILL | LIVES_EXPAND),
1132 (LiVESAttachOptions)(0), 0, 0);
1138 }
else goto add_row_done;
1146 boolean param_ok =
FALSE;
1153 param_dialog = make_param_dialog(-1, rfxbuilder);
1155 if (
lives_dialog_run(LIVES_DIALOG(param_dialog)) == LIVES_RESPONSE_CANCEL) {
1162 }
while (!param_ok);
1185 (LiVESAttachOptions)(0),
1186 (LiVESAttachOptions)(0), 0, 0);
1196 (LiVESAttachOptions)(LIVES_FILL | LIVES_EXPAND),
1197 (LiVESAttachOptions)(0), 0, 0);
1207 switch (param->
type) {
1236 (LiVESAttachOptions)(LIVES_FILL),
1237 (LiVESAttachOptions)(0), 0, 0);
1240 if (!button)
goto add_row_done;
1247 param_window_dialog = make_param_window_dialog(-1, rfxbuilder);
1248 if (
lives_dialog_run(LIVES_DIALOG(param_window_dialog)) == LIVES_RESPONSE_CANCEL) {
1259 lives_strfreev(array);
1271 (LiVESAttachOptions)(LIVES_FILL),
1272 (LiVESAttachOptions)(0), 0, 0);
1282 if (!strcmp(ctext,
"framedraw")) {
1297 lives_strfreev(array);
1308 (LiVESAttachOptions)(LIVES_FILL | LIVES_EXPAND),
1309 (LiVESAttachOptions)(0), 0, 0);
1312 if (!button)
goto add_row_done;
1322 trigger_dialog = make_trigger_dialog(-1, rfxbuilder);
1323 if (
lives_dialog_run(LIVES_DIALOG(trigger_dialog)) == LIVES_RESPONSE_CANCEL) {
1344 (LiVESAttachOptions)(LIVES_FILL | LIVES_EXPAND),
1345 (LiVESAttachOptions)(0), 0, 0);
1385 lives_signal_sync_connect(LIVES_GUI_OBJECT(ebox), LIVES_WIDGET_BUTTON_PRESS_EVENT,
1386 LIVES_GUI_CALLBACK(on_entry_click), (livespointer)rfxbuilder);
1401 lives_signal_sync_connect(LIVES_GUI_OBJECT(ebox2), LIVES_WIDGET_BUTTON_PRESS_EVENT,
1402 LIVES_GUI_CALLBACK(on_entry_click), (livespointer)rfxbuilder);
1418 lives_signal_sync_connect(LIVES_GUI_OBJECT(ebox3), LIVES_WIDGET_BUTTON_PRESS_EVENT,
1419 LIVES_GUI_CALLBACK(on_entry_click), (livespointer)rfxbuilder);
1433 table_select_row(rfxbuilder, rfxbuilder->
table_rows - 1);
1436 on_table_edit_row(NULL, user_data);
1450 if (!strcmp(ctext,
"num")) {
1452 }
else if (!strcmp(ctext,
"bool")) {
1454 }
else if (!strcmp(ctext,
"colRGB24")) {
1456 }
else if (!strcmp(ctext,
"string")) {
1458 }
else if (!strcmp(ctext,
"string_list")) {
1470 switch (copy_param->
type) {
1476 if (!copy_param->
dp) {
1512 static void on_table_edit_row(LiVESButton * button, livespointer user_data) {
1513 LiVESWidget *param_dialog;
1514 LiVESWidget *paramw_dialog;
1515 LiVESWidget *trigger_dialog;
1522 boolean param_ok =
FALSE;
1527 for (i = 0; i < rfxbuilder->
table_rows && found == -1; i++) {
1533 if (found == -1)
return;
1537 for (i = 0; i < rfxbuilder->
table_rows; i++) {
1549 param_dialog = make_param_dialog(found, rfxbuilder);
1551 if (
lives_dialog_run(LIVES_DIALOG(param_dialog)) == LIVES_RESPONSE_CANCEL) {
1555 }
while (!param_ok);
1557 param_set_from_dialog((param = &rfxbuilder->
copy_params[found]), rfxbuilder);
1559 switch (param->
type) {
1583 paramw_dialog = make_param_window_dialog(found, rfxbuilder);
1584 if (
lives_dialog_run(LIVES_DIALOG(paramw_dialog)) == LIVES_RESPONSE_CANCEL) {
1595 if (!strcmp(ctext,
"framedraw")) {
1612 trigger_dialog = make_trigger_dialog(found, rfxbuilder);
1613 if (
lives_dialog_run(LIVES_DIALOG(trigger_dialog)) == LIVES_RESPONSE_CANCEL) {
1626 static void on_table_swap_row(LiVESButton * button, livespointer user_data) {
1631 for (
register int i = 0; i < rfxbuilder->
table_rows && found == -1; i++) {
1638 if (found == -1)
if ((found = rfxbuilder->
table_swap_row1) == -1)
return;
1670 static void on_table_delete_row(LiVESButton * button, livespointer user_data) {
1675 #if !LIVES_TABLE_IS_GRID
1676 LiVESWidget *ebox2 = NULL, *ebox3 = NULL, *ebox4 = NULL;
1678 LiVESWidget *entry = NULL, *entry2;
1682 boolean triggers_adjusted =
FALSE;
1688 for (i = 0; i < rfxbuilder->
table_rows; i++) {
1690 #if !LIVES_TABLE_IS_GRID
1695 rfxbuilder->
entry[i - 1] = rfxbuilder->
entry[i];
1697 #if LIVES_TABLE_IS_GRID
1709 if (move == 0)
return;
1715 for (i = 0; i < rfxbuilder->
table_rows; i++) {
1719 #if !LIVES_TABLE_IS_GRID
1721 if (i < rfxbuilder->table_rows - 1) {
1731 entry2 = rfxbuilder->
entry[i];
1749 do_error_dialog(
_(
"\n\nCannot remove this parameter as it has a trigger.\nPlease remove the trigger first.\n\n"));
1753 #if LIVES_TABLE_IS_GRID
1754 entry = rfxbuilder->
entry[i];
1778 #if LIVES_TABLE_IS_GRID
1782 if (move == 0)
return;
1790 triggers_adjusted =
TRUE;
1792 if (triggers_adjusted) {
1793 do_error_dialog(
_(
"\n\nSome triggers were adjusted.\nPlease check the trigger code.\n"));
1798 for (i = 0; i < rfxbuilder->
table_rows; i++) {
1800 #if !LIVES_TABLE_IS_GRID
1801 if (i < rfxbuilder->table_rows - 1) {
1811 rfxbuilder->
entry[i - 1] = rfxbuilder->
entry[i];
1814 #if LIVES_TABLE_IS_GRID
1835 for (i = 0; i < rfxbuilder->
table_rows; i++) {
1837 #if !LIVES_TABLE_IS_GRID
1843 rfxbuilder->
entry[i - 1] = rfxbuilder->
entry[i];
1855 #if LIVES_TABLE_IS_GRID
1887 table_select_row(rfxbuilder, move);
1893 LiVESWidget *dialog;
1894 LiVESWidget *dialog_vbox;
1898 LiVESList *typelist = NULL;
1902 char *tmp, *tmp2, *title;
1905 title = (
_(
"New RFX Parameter"));
1907 title = (
_(
"Edit RFX Parameter"));
1922 (tmp2 = lives_strdup((
_(
"Name of the parameter, must be unique in the plugin.")))));
1934 (tmp2 = (
_(
"Label to be shown by the parameter. "
1935 "An underscore represents mnemonic accelerator."))));
1941 typelist = lives_list_append(typelist, (livespointer)
"num");
1942 typelist = lives_list_append(typelist, (livespointer)
"bool");
1943 typelist = lives_list_append(typelist, (livespointer)
"string");
1944 typelist = lives_list_append(typelist, (livespointer)
"colRGB24");
1945 typelist = lives_list_append(typelist, (livespointer)
"string_list");
1948 LIVES_BOX(dialog_vbox), (tmp2 = (
_(
"Parameter type (select from list)."))));
1951 lives_list_free(typelist);
1974 pnum >= 0 ? rfxbuilder->
copy_params[pnum].
dp : 0., 0., 16., 1., 1., 0, LIVES_BOX(dialog_vbox), NULL);
1982 1., 0, LIVES_BOX(dialog_vbox), NULL);
2032 1., 0, LIVES_BOX(rfxbuilder->
hbox_bg),
2033 (tmp2 = (
_(
"A non-zero value can be used to group radio buttons."))));
2043 1., 0, LIVES_BOX(dialog_vbox), NULL);
2049 LIVES_MAXINT, 1., 1., 0, LIVES_BOX(dialog_vbox), NULL);
2055 LIVES_MAXINT, 1., 1., 0, LIVES_BOX(dialog_vbox),
2056 (tmp2 = (
_(
"How much the parameter is adjusted when the spinbutton arrows are pressed."))));
2068 (tmp2 = (
_(
"Whether the value wraps max->min and min->max."))));
2073 lives_signal_sync_connect(LIVES_GUI_OBJECT(rfxbuilder->
param_strdef_button), LIVES_WIDGET_CLICKED_SIGNAL,
2074 LIVES_GUI_CALLBACK(on_code_clicked), (livespointer)rfxbuilder);
2076 lives_signal_sync_connect(LIVES_GUI_OBJECT(rfxbuilder->
param_type_combo), LIVES_WIDGET_CHANGED_SIGNAL,
2077 LIVES_GUI_CALLBACK(on_param_type_changed), (livespointer)rfxbuilder);
2079 lives_signal_sync_connect_after(LIVES_GUI_OBJECT(rfxbuilder->
spinbutton_param_dp), LIVES_WIDGET_VALUE_CHANGED_SIGNAL,
2080 LIVES_GUI_CALLBACK(after_param_dp_changed), (livespointer)rfxbuilder);
2083 LIVES_WIDGET_VALUE_CHANGED_SIGNAL,
2084 LIVES_GUI_CALLBACK(after_param_def_changed), (livespointer)rfxbuilder);
2087 LIVES_WIDGET_VALUE_CHANGED_SIGNAL,
2088 LIVES_GUI_CALLBACK(after_param_min_changed), (livespointer)rfxbuilder);
2091 LIVES_WIDGET_VALUE_CHANGED_SIGNAL,
2092 LIVES_GUI_CALLBACK(after_param_max_changed), (livespointer)rfxbuilder);
2116 on_param_type_changed(LIVES_COMBO(rfxbuilder->
param_type_combo), (livespointer)rfxbuilder);
2117 after_param_dp_changed(LIVES_SPIN_BUTTON(rfxbuilder->
spinbutton_param_dp), (livespointer)rfxbuilder);
2122 static void after_param_dp_changed(LiVESSpinButton * spinbutton, livespointer user_data) {
2127 if (strcmp(ctext,
"num"))
return;
2143 (max - min) > 1. ? (max - min) : 1.);
2165 static void after_param_min_changed(LiVESSpinButton * spinbutton, livespointer user_data) {
2170 if (strcmp(ctext,
"num"))
return;
2209 static void after_param_max_changed(LiVESSpinButton * spinbutton, livespointer user_data) {
2214 if (strcmp(ctext,
"num"))
return;
2251 static void after_param_def_changed(LiVESSpinButton * spinbutton, livespointer user_data) {
2255 if (strcmp(ctext,
"num"))
return;
2275 static void on_param_type_changed(LiVESCombo * param_type_combo, livespointer user_data) {
2297 if (pnum < 0)
return;
2299 if (!strcmp(ctext,
"string_list")) {
2321 (
char *)lives_list_nth_data(rfxbuilder->
copy_params[pnum].
list, defindex));
2337 if (!strcmp(ctext,
"num")) {
2346 after_param_dp_changed(LIVES_SPIN_BUTTON(rfxbuilder->
spinbutton_param_dp), (livespointer)rfxbuilder);
2354 }
else if (!strcmp(ctext,
"bool")) {
2368 }
else if (!strcmp(ctext,
"colRGB24")) {
2389 }
else if (!strcmp(ctext,
"string")) {
2415 LiVESWidget *dialog;
2416 LiVESWidget *dialog_vbox;
2418 LiVESList *kwlist = NULL;
2419 LiVESList *splist = NULL;
2420 LiVESList *spsublist = NULL;
2429 title = (
_(
"New RFX Parameter Window Hint"));
2431 title = (
_(
"Edit RFX Parameter Window Hint"));
2441 if (!strcmp(kw,
"layout")) {
2443 }
else if (!strcmp(kw,
"special")) {
2447 sp = lives_strdup(array[0]);
2448 if (!strcmp(sp,
"framedraw")) {
2450 spsub = lives_strdup(array[1]);
2453 rest = lives_strdup(array[2]);
2457 rest = lives_strdup(array[1]);
2460 lives_strfreev(array);
2465 kwlist = lives_list_append(kwlist, (livespointer)
"layout");
2466 kwlist = lives_list_append(kwlist, (livespointer)
"special");
2469 lives_list_free(kwlist);
2471 if (pnum >= 0 && kw) {
2476 splist = lives_list_append(splist, (livespointer)
"aspect");
2477 splist = lives_list_append(splist, (livespointer)
"framedraw");
2478 splist = lives_list_append(splist, (livespointer)
"fileread");
2479 splist = lives_list_append(splist, (livespointer)
"filewrite");
2480 splist = lives_list_append(splist, (livespointer)
"password");
2482 splist = lives_list_append(splist, (livespointer)
"mergealign");
2486 lives_list_free(splist);
2488 if (pnum >= 0 && sp) {
2494 spsublist = lives_list_append(spsublist, (livespointer)
"rectdemask");
2495 spsublist = lives_list_append(spsublist, (livespointer)
"multirect");
2496 spsublist = lives_list_append(spsublist, (livespointer)
"singlepoint");
2497 spsublist = lives_list_append(spsublist, (livespointer)
"scaledpoint");
2501 lives_list_free(spsublist);
2503 if (pnum >= 0 && spsub) {
2510 -1, -1, LIVES_BOX(dialog_vbox), NULL);
2520 lives_signal_sync_connect(LIVES_GUI_OBJECT(rfxbuilder->
paramw_kw_combo), LIVES_WIDGET_CHANGED_SIGNAL,
2521 LIVES_GUI_CALLBACK(on_paramw_kw_changed), (livespointer)rfxbuilder);
2523 lives_signal_sync_connect(LIVES_GUI_OBJECT(rfxbuilder->
paramw_sp_combo), LIVES_WIDGET_CHANGED_SIGNAL,
2524 LIVES_GUI_CALLBACK(on_paramw_sp_changed), (livespointer)rfxbuilder);
2526 lives_signal_sync_connect(LIVES_GUI_OBJECT(rfxbuilder->
paramw_spsub_combo), LIVES_WIDGET_CHANGED_SIGNAL,
2527 LIVES_GUI_CALLBACK(on_paramw_spsub_changed), (livespointer)rfxbuilder);
2530 on_paramw_kw_changed(LIVES_COMBO(rfxbuilder->
paramw_kw_combo), (livespointer)rfxbuilder);
2536 static void on_paramw_kw_changed(LiVESCombo * combo, livespointer user_data) {
2540 if (!strcmp(ctext,
"special")) {
2542 on_paramw_sp_changed(LIVES_COMBO(rfxbuilder->
paramw_sp_combo), (livespointer)rfxbuilder);
2553 static void paramw_set_splabel(LiVESLabel * label,
int npars) {
2557 tmpx = (
_(
"Linked parameter: "));
2559 char example[256] =
"0";
2560 for (
register int i = 1; i < npars; i++) {
2572 static void on_paramw_sp_changed(LiVESCombo * combo, livespointer user_data) {
2577 if (!strcmp(ctext,
"framedraw")) {
2579 on_paramw_spsub_changed(LIVES_COMBO(rfxbuilder->
paramw_spsub_combo), (livespointer)rfxbuilder);
2582 if (!strcmp(ctext,
"fileread") || !strcmp(ctext,
"filewrite") || !strcmp(ctext,
"password")) npars = 1;
2592 static void on_paramw_spsub_changed(LiVESCombo * combo, livespointer user_data) {
2597 if (!strcmp(ctext,
"rectdemask") || !strcmp(ctext,
"multirect")) {
2599 }
else if (!strcmp(ctext,
"singlepoint")) {
2601 }
else if (!strcmp(ctext,
"scaledpoint")) {
2609 LiVESWidget *dialog;
2610 LiVESWidget *dialog_vbox;
2612 LiVESWidget *scrolledwindow;
2614 LiVESList *whenlist = NULL;
2622 title = (
_(
"New RFX Trigger"));
2624 title = (
_(
"Edit RFX Trigger"));
2634 if (tnum >= 0) whenlist = lives_list_append(whenlist, (livespointer)(rfxbuilder->
copy_triggers[tnum].
when ?
2636 when - 1) :
"init"));
2639 whenlist = lives_list_append(whenlist, (livespointer)
"init");
2641 for (i = 0; i < rfxbuilder->
num_params; i++) {
2649 lives_list_free(whenlist);
2686 static void on_code_clicked(LiVESButton * button, livespointer user_data) {
2687 LiVESWidget *dialog;
2688 LiVESWidget *dialog_vbox;
2689 LiVESWidget *cancelbutton;
2690 LiVESWidget *okbutton;
2691 LiVESWidget *scrolledwindow;
2734 if (button == LIVES_BUTTON(rfxbuilder->
pre_button)) {
2741 else if (button == LIVES_BUTTON(rfxbuilder->
loop_button)) {
2748 else if (button == LIVES_BUTTON(rfxbuilder->
post_button)) {
2763 (
_(
"Default text (max length %d)"), maxlen)));
2770 LiVESTextIter start_iter;
2771 char *
string = lives_strdup(
""), *string_new;
2779 string_new = lives_strconcat(
string, (
char *)lives_list_nth_data(rfxbuilder->
copy_params[rfxbuilder->
edit_param].
list, i),
2781 if (
string != string_new)
lives_free(
string);
2782 string = string_new;
2798 lives_signal_sync_connect(LIVES_GUI_OBJECT(okbutton), LIVES_WIDGET_CLICKED_SIGNAL,
2799 LIVES_GUI_CALLBACK(on_code_ok), user_data);
2801 lives_signal_sync_connect(LIVES_GUI_OBJECT(cancelbutton), LIVES_WIDGET_CLICKED_SIGNAL,
2808 static void on_rfxbuilder_ok(LiVESButton * button, livespointer user_data) {
2815 rfxbuilder_destroy(rfxbuilder);
2819 static void on_rfxbuilder_cancel(LiVESButton * button, livespointer user_data) {
2823 rfxbuilder_destroy(rfxbuilder);
2830 for (i = 0; i < rfxbuilder->
num_reqs; i++) {
2833 for (i = 0; i < rfxbuilder->
num_params; i++) {
2863 if (rfxbuilder->
oname) {
2875 if (!strlen(name)) {
2907 !strcmp(rfxbuilder->
oname, name))) {
2910 do_error_dialog(
_(
"\n\nThere is already a plugin with this name.\nName must be unique.\n"));
2923 do_error_dialog(
_(
"\n\nTrigger code should not be blank for a utility.\n"));
2941 for (i = 0; i < rows; i++) {
2944 do_error_dialog(
_(
"\n\nDuplicate parameter name detected. Parameter names must be unique in a plugin.\n\n"));
2963 char *script_file, *script_file_dir;
2966 char *buf, *tmp, *tmp2;
2977 script_name = new_name;
2982 if (!lives_file_test(script_file_dir, LIVES_FILE_TEST_IS_DIR)) {
2983 if (lives_mkdir_with_parents(script_file_dir,
capable->
umask) == -1) {
2993 d_print(
_(
"Writing script file %s..."), script_file);
3003 if (!(sfile = fopen(script_file,
"w"))) {
3008 if (retval == LIVES_RESPONSE_CANCEL) {
3016 lives_fputs(
"Script file generated from LiVES\n\n", sfile);
3040 buf = lives_strdup(
"-1");
3047 switch (rfxbuilder->
type) {
3049 buf = lives_strdup(
"2");
3052 buf = lives_strdup(
"0");
3055 buf = lives_strdup(
"1");
3062 for (i = 0; i < rfxbuilder->
num_reqs; i++) {
3064 if (i < rfxbuilder->num_reqs - 1)
3069 for (i = 0; i < rfxbuilder->
num_params; i++) {
3077 if (rfxbuilder->
params[i].
wrap) stepwrap = -stepwrap;
3096 if (stepwrap != 1.) {
3116 if (stepwrap != 1.) {
3176 for (j = 0; j < lives_list_length(rfxbuilder->
params[i].
list); j++) {
3178 (rfxbuilder->
params[i].
list, j),
"\n",
"\\n"))), sfile);
3188 if (i < rfxbuilder->num_params - 1)
3204 else props = rfxbuilder->
props;
3215 array = lives_strsplit(ctext,
" ", -1);
3217 lives_strfreev(array);
3238 array = lives_strsplit(rfxbuilder->
triggers[i].
code,
"\n", numtok);
3239 for (
int j = 0; j < numtok; j++) {
3248 lives_strfreev(array);
3261 }
while (retval == LIVES_RESPONSE_RETRY);
3265 if (retval != LIVES_RESPONSE_CANCEL) {
3290 int filled_triggers = 0;
3300 tmp = (
char *)lives_list_nth_data(list, 0);
3301 if (strlen(tmp) < 2) {
3307 version = lives_strdup(tmp + 1);
3333 (
double)atoi((
char *)lives_list_nth_data(list, 0)));
3340 array = lives_strsplit((
char *)lives_list_nth_data(list, 0), rfxbuilder->
field_delim, 2);
3345 lives_strfreev(array);
3353 lives_snprintf(
mainw->
msg,
MAINW_MSG_SIZE, (
_(
"Bad description. (%s)\n")), (
char *)lives_list_nth_data(list, 0));
3357 array = lives_strsplit((
char *)lives_list_nth_data(list, 0), rfxbuilder->
field_delim, -1);
3362 num_channels = atoi(array[3]);
3364 if (num_channels == 2) {
3367 if (num_channels == 0) {
3371 lives_strfreev(array);
3373 rfxbuilder->
script_name = lives_strdup(script_file);
3376 rfxbuilder->
num_reqs = lives_list_length(list);
3377 for (i = 0; i < rfxbuilder->
num_reqs; i++) {
3378 rfxbuilder->
reqs[i] = (
char *)lives_list_nth_data(list, i);
3380 lives_list_free(list);
3383 rfxbuilder->
props = 0;
3386 if (!strncmp((
char *)lives_list_nth_data(list, 0),
"0x", 2) || !strncmp((
char *)lives_list_nth_data(list, 0),
"0x", 2)) {
3387 rfxbuilder->
props =
hextodec((
char *)lives_list_nth_data(list, 0) + 2);
3388 }
else rfxbuilder->
props = atoi((
char *)lives_list_nth_data(list, 0));
3397 listlen = lives_list_length(list);
3402 for (j = 0; j < listlen; j++) {
3403 line = (
char *)lives_list_nth_data(list, j);
3410 array = lives_strsplit(line, rfxbuilder->
field_delim, -1);
3412 rfxbuilder->
params[i].
name = lives_strdup(array[0]);
3413 rfxbuilder->
params[i].
label = lives_strdup(array[1]);
3427 type = lives_strdup(array[2]);
3428 if (!strncmp(type,
"num", 3)) {
3436 rfxbuilder->
params[i].
dp = atoi(type + 3);
3445 rfxbuilder->
params[i].
min = lives_strtod(array[4], NULL);
3446 rfxbuilder->
params[i].
max = lives_strtod(array[5], NULL);
3455 }
else if (!strcmp(type,
"colRGB24")) {
3466 (
short)atoi(array[4]), (
short)atoi(array[5]));
3467 }
else if (!strcmp(type,
"string")) {
3469 rfxbuilder->
params[i].
def =
subst((tmp = L2U8(array[3])),
"\\n",
"\n");
3471 if (len > 4) rfxbuilder->
params[i].
max = (double)atoi(array[4]);
3473 }
else if (!strcmp(type,
"string_list")) {
3488 if (len > 4) rfxbuilder->
params[i].
group = atoi(array[4]);
3491 lives_strfreev(array);
3494 lives_list_free(list);
3500 rfxbuilder->
paramw_hints[i] = (
char *)lives_list_nth_data(list, i);
3502 lives_list_free(list);
3506 listlen = lives_list_length(list);
3507 for (i = 0; i < listlen; i++) {
3508 array = lives_strsplit((
char *)lives_list_nth_data(list, i), rfxbuilder->
field_delim, -1);
3509 if (!strcmp(array[0],
"init")) {
3514 }
else if ((tnum = atoi(array[0]) + 1) <= rfxbuilder->
num_params && tnum > 0) {
3521 char *msg =
lives_strdup_printf(
_(
"\n\nInvalid trigger (%s)\nfound in script.\n\n"), array[0]);
3527 lives_strfreev(array);
3537 filled_triggers = 0;
3538 listlen = lives_list_length(list);
3539 for (i = 0; i < listlen; i++) {
3540 array = lives_strsplit((
char *)lives_list_nth_data(list, i), rfxbuilder->
field_delim, -1);
3541 if (!strcmp(array[0],
"init")) {
3543 found = filled_triggers;
3544 for (j = 0; j < filled_triggers && found == filled_triggers; j++)
if (rfxbuilder->
triggers[j].
when == 0) found = j;
3545 if (found == filled_triggers) filled_triggers++;
3547 tmp = lives_strconcat(rfxbuilder->
triggers[found].
code, array[1], NULL);
3549 tmp = lives_strconcat(rfxbuilder->
triggers[found].
code,
"\n", array[1], NULL);
3555 }
else if ((tnum = atoi(array[0]) + 1) <= rfxbuilder->
num_params && tnum > 0) {
3557 found = filled_triggers;
3559 for (j = 0; j < filled_triggers && found == filled_triggers; j++)
if (rfxbuilder->
triggers[j].
when == tnum) found = j;
3560 if (found == filled_triggers) filled_triggers++;
3563 tmp = lives_strconcat(rfxbuilder->
triggers[found].
code, array[1], NULL);
3565 tmp = lives_strconcat(rfxbuilder->
triggers[found].
code,
"\n", array[1], NULL);
3572 lives_strfreev(array);
3578 listlen = lives_list_length(list);
3579 for (i = 0; i < listlen; i++) {
3580 tmp = lives_strconcat(rfxbuilder->
pre_code, lives_list_nth_data(list, i), NULL);
3588 listlen = lives_list_length(list);
3589 for (i = 0; i < listlen; i++) {
3590 tmp = lives_strconcat(rfxbuilder->
loop_code, lives_list_nth_data(list, i), NULL);
3598 listlen = lives_list_length(list);
3599 for (i = 0; i < listlen; i++) {
3600 tmp = lives_strconcat(rfxbuilder->
post_code, lives_list_nth_data(list, i), NULL);
3641 d_print(
_(
"Rebuilding custom RFX scripts..."));
3647 d_print(
_(
"Rebuilding test RFX scripts..."));
3656 d_print(
_(
"recreating dynamic menu entries..."));
3680 _(
"\n\nLiVES was unable to find the program %s.\nPlease check this program is in your path and executable.\n"),
3689 _(
"\n\nLiVES was unable to find the program %s.\nPlease check this program is in your path and executable.\n"),
3702 char *rfx_script_file, *rfx_exec_dir, *rfx_script_dir;
3706 if (!script_name)
return;
3708 if (strlen(script_name)) {
3713 rfx_script_file = lives_build_filename(rfx_script_dir, script_name, NULL);
3718 rfx_script_file = lives_build_filename(rfx_script_dir, script_name, NULL);
3738 d_print(
_(
"Deleting rfx script %s..."), rfx_script_file);
3740 if (!(ret =
lives_rm(rfx_script_file))) {
3746 msg =
lives_strdup_printf(
_(
"\n\nFailed to delete the script\n%s\nError code was %d\n"), rfx_script_file, ret);
3760 char *rfx_script_from = NULL;
3761 char *rfx_script_to = NULL;
3762 char *rfx_dir_from = NULL;
3763 char *rfx_dir_to = NULL;
3767 boolean failed =
TRUE;
3769 if (!script_name)
return;
3771 if (strlen(script_name)) {
3773 rfx_script_from = lives_build_filename(rfx_dir_from, script_name, NULL);
3776 rfx_script_to = lives_build_filename(rfx_dir_to, script_name, NULL);
3778 if (lives_file_test(rfx_script_to, LIVES_FILE_TEST_EXISTS)) {
3780 _(
"\nCustom script file:\n%s\nalready exists.\nPlease delete it first, or rename the test script.\n"),
3788 d_print(
_(
"Promoting rfx test plugin %s to custom..."), script_name);
3793 if (!(ret = rename(rfx_script_from, rfx_script_to))) {
3804 msg =
lives_strdup_printf(
_(
"\n\nFailed to move the plugin script from\n%s to\n%s\nReturn code was %d (%s)\n"),
3805 rfx_script_from, rfx_script_to, errno, strerror(errno));
3812 if (rfx_script_from) {
3825 char *rfx_script_from, *filename;
3828 if (!script_name || !*script_name)
return;
3830 filename =
choose_file(NULL, script_name, NULL, LIVES_FILE_CHOOSER_ACTION_SAVE,
_(
"Export Script"), NULL);
3832 if (!filename)
return;
3837 d_print(
_(
"Copying %s to %s..."), rfx_script_from, filename);
3839 lives_cp((tmp = lives_filename_from_utf8(rfx_script_from, -1, NULL, NULL, NULL)),
3840 (tmp2 = lives_filename_from_utf8(filename, -1, NULL, NULL, NULL)));
3852 char *rfx_script_to, *rfx_dir_to;
3853 char *tmp, *tmp2, *tmpx;
3856 char *filename =
choose_file(NULL, NULL, NULL, LIVES_FILE_CHOOSER_ACTION_OPEN,
_(
"Import Script"), NULL);
3858 if (!filename)
return;
3860 lives_snprintf(basename,
PATH_MAX,
"%s", filename);
3868 lives_mkdir_with_parents((tmp = lives_filename_from_utf8(rfx_dir_to, -1, NULL, NULL, NULL)),
capable->
umask);
3871 rfx_script_to = lives_build_filename(rfx_dir_to, basename, NULL);
3876 lives_mkdir_with_parents((tmp = lives_filename_from_utf8(rfx_dir_to, -1, NULL, NULL, NULL)),
capable->
umask);
3879 rfx_script_to = lives_build_filename(rfx_dir_to, basename, NULL);
3894 if (lives_file_test(rfx_script_to, LIVES_FILE_TEST_EXISTS)) {
3897 (
_(
"\nCustom script file:\n%s\nalready exists.\n"
3898 "Please delete it first, or rename the import script.\n"), basename)));
3903 d_print(
_(
"Copying %s to %s..."), filename, rfx_script_to);
3905 lives_cp((tmp = lives_filename_from_utf8(filename, -1, NULL, NULL, NULL)),
3906 (tmp2 = lives_filename_from_utf8(rfx_script_to, -1, NULL, NULL, NULL)));
3937 char *rfx_script_from;
3938 char *rfx_script_to;
3945 LiVESWidget *script_combo = NULL;
3946 LiVESWidget *name_entry = NULL;
3947 LiVESWidget *script_combo_entry = NULL;
3948 LiVESWidget *status_combo = NULL;
3949 LiVESWidget *status_combo_entry = NULL;
3950 LiVESWidget *dialog;
3952 LiVESList *status_list = NULL;
3954 boolean copy_mode =
FALSE;
3955 boolean rename_mode =
FALSE;
4003 if (!sname || copy_mode || rename_mode) {
4007 if (sname || copy_mode || rename_mode) {
4009 if (copy_mode || rename_mode) {
4015 sname, -1, 128, LIVES_BOX(hbox), NULL);
4018 lives_signal_sync_connect(LIVES_GUI_OBJECT(status_combo), LIVES_WIDGET_CHANGED_SIGNAL,
4019 LIVES_GUI_CALLBACK(on_script_status_changed), (livespointer)script_combo);
4033 if (status_combo) on_script_status_changed(LIVES_COMBO(status_combo), (livespointer)script_combo);
4034 else if (script_combo) populate_script_combo(LIVES_COMBO(script_combo), status);
4045 do_error_dialog(
_(
"\n\nThere is already a plugin with this name.\nName must be unique.\n"));
4058 if ((rfxbuilder = make_rfx_build_window(from_name, status)) == NULL) {
4074 LiVESList *nmlist = NULL;
4077 if (name && lives_list_find((nmlist =
get_script_list(status)), xname)) {
4078 do_error_dialog(
_(
"\n\nThere is already a test script with this name.\nScript name must be unique.\n"));
4087 d_print(
_(
"Renaming RFX test script %s to %s..."), from_name, xname);
4090 if ((ret = rename(rfx_script_from, rfx_script_to))) {
4094 "Return code was %d\n"),
4095 rfx_script_from, rfx_script_to, ret);
4116 static void populate_script_combo(LiVESCombo * script_combo,
lives_rfx_status_t status) {
4117 LiVESList *list = NULL;
4130 static void on_script_status_changed(LiVESCombo * status_combo, livespointer user_data) {
4132 LiVESWidget *script_combo = (LiVESWidget *)user_data;
4134 if (!script_combo || !LIVES_IS_COMBO(script_combo))
return;
4151 LiVESList *script_list = NULL;
4170 static int rfx_slot_count = 0;
4174 LiVESList *rfx_builtin_list = NULL, *rfx_custom_list = NULL, *rfx_test_list = NULL;
4179 #if LIVES_HAS_IMAGE_MENU_ITEM
4180 LiVESWidget *rfx_image;
4184 int rfx_builtin_list_length, rfx_custom_list_length, rfx_test_list_length;
4185 int rfx_list_length, old_list_length;
4199 old_list_length = rfx_builtin_list_length + rfx_custom_list_length + rfx_test_list_length;
4254 rfx_test_list_length = lives_list_length(rfx_test_list);
4259 rfx_custom_list_length = lives_list_length(rfx_custom_list);
4267 rfx_builtin_list_length = lives_list_length(rfx_builtin_list);
4272 rfx_list_length = rfx_builtin_list_length + rfx_custom_list_length + rfx_test_list_length;
4280 for (i = 0; i <= old_list_length; i++) {
4288 rendered_fx[0].
name = lives_strdup(
"realtime_fx");
4289 rendered_fx[0].
menu_text = (
_(
"_Apply Real Time Effects to Selection"));
4290 rendered_fx[0].
action_desc = (
_(
"Applying Current Real Time Effects to"));
4292 rendered_fx[0].
props = 0;
4297 rendered_fx[0].
params = NULL;
4298 rendered_fx[0].
flags = 0;
4304 rendered_fx[0].
source = NULL;
4309 if (rfx_list_length) {
4310 LiVESList *define = NULL;
4311 LiVESList *description = NULL;
4312 LiVESList *props = NULL;
4313 LiVESList *rfx_list = rfx_builtin_list;
4324 for (plugin_idx = 0; plugin_idx < rfx_list_length; plugin_idx++) {
4329 if (plugin_idx == rfx_builtin_list_length) {
4333 rfx_list = rfx_custom_list;
4334 offset = rfx_builtin_list_length;
4336 if (plugin_idx == rfx_builtin_list_length + rfx_custom_list_length) {
4340 rfx_list = rfx_test_list;
4341 offset += rfx_custom_list_length;
4346 plugin_name = lives_strdup((
char *)lives_list_nth_data(rfx_list, plugin_idx - offset));
4355 #ifdef DEBUG_RENDER_FX
4356 g_print(
"Checking plugin %s\n", plugin_name);
4360 #ifdef DEBUG_RENDER_FX
4361 g_print(
"No get_define in %s\n", plugin_name);
4367 def = lives_strdup((
char *)lives_list_nth_data(define, 0));
4370 if (strlen(def) < 2) {
4371 #ifdef DEBUG_RENDER_FX
4372 g_print(
"Invalid get_define in %s\n", plugin_name);
4379 #ifdef DEBUG_RENDER_FX
4380 g_print(
"Invalid version %s instead of %s in %s\n", def + 1,
RFX_VERSION, plugin_name);
4392 lives_list_length(description) > 3) {
4393 rfx = &rendered_fx[rfx_slot_count++];
4394 rfx->
name = lives_strdup(plugin_name);
4396 rfx->
menu_text = lives_strdup((
char *)lives_list_nth_data(description, 0));
4397 rfx->
action_desc = lives_strdup((
char *)lives_list_nth_data(description, 1));
4398 if (!(rfx->
min_frames = atoi((
char *)lives_list_nth_data(description, 2)))) rfx->
min_frames = 1;
4399 rfx->
num_in_channels = atoi((
char *)lives_list_nth_data(description, 3));
4401 lives_snprintf(rfx->
rfx_version, 64,
"%s", def + 1);
4402 rfx->
props = atoi((
char *)lives_list_nth_data(props, 0));
4447 for (rfx = &
mainw->
rendered_fx[(plugin_idx = 1)]; plugin_idx <= rfx_slot_count; rfx = &mainw->rendered_fx[++plugin_idx]) {
4482 LiVESWidget *menuitem;
4495 LIVES_KEY_e, LIVES_CONTROL_MASK, LIVES_ACCEL_VISIBLE);
4497 lives_signal_sync_connect(LIVES_GUI_OBJECT(menuitem), LIVES_WIDGET_ACTIVATE_SIGNAL,
4571 if (rfx_slot_count) {
4572 for (rfx = &
mainw->
rendered_fx[(plugin_idx = 1)]; plugin_idx <= rfx_slot_count; rfx = &mainw->rendered_fx[++plugin_idx]) {
4579 lives_snprintf(txt, 61,
"_%s",
_(rfx->
menu_text));
4586 if (!strcmp(rfx->
name,
"resize")) {
4627 = lives_signal_sync_connect(LIVES_GUI_OBJECT(menuitem), LIVES_WIDGET_ACTIVATE_SIGNAL,
4645 lives_signal_sync_connect(LIVES_GUI_OBJECT(menuitem), LIVES_WIDGET_ACTIVATE_SIGNAL,
4648 #if LIVES_HAS_IMAGE_MENU_ITEM