13static int old_rte_keys_virtual = 0;
15static LiVESWidget **key_checks;
16static LiVESWidget **key_grabs;
17static LiVESWidget **mode_radios;
18static LiVESWidget **combos;
19static LiVESWidget **combo_entries;
20static LiVESWidget *dummy_radio;
21static LiVESWidget **nlabels;
22static LiVESWidget **type_labels;
23static LiVESWidget **param_buttons;
24static LiVESWidget **conx_buttons;
25static LiVESWidget **clear_buttons;
26static LiVESWidget **info_buttons;
27static LiVESWidget *clear_all_button;
28static LiVESWidget *save_keymap_button;
29static LiVESWidget *load_keymap_button;
31static LiVESWidget *datacon_dialog = NULL;
35static ulong *mode_ra_fns;
37static int keyw = -1, modew = -1;
39static LiVESList *hash_list = NULL;
40static LiVESList *name_list = NULL;
41static LiVESList *extended_name_list = NULL;
43static boolean ca_canc;
45static char *empty_string =
"";
49static void set_param_and_con_buttons(
int key,
int mode);
50static void check_clear_all_button(
void);
52static boolean rte_window_is_hidden =
TRUE;
56 return rte_window_is_hidden;
70 for (j = modes - 1; j >= 0; j--) {
83 for (j = modes - 1; j >= 0; j--) {
85 set_param_and_con_buttons(i, j);
88 check_clear_all_button();
101 LIVES_POINTER_TO_INT(lives_widget_object_get_data(LIVES_WIDGET_OBJECT(key_checks[i]),
110 int idx = key * modes + mode;
140 if (user_data)
if (!
do_warning_dialog(
_(
"\n\nUnbind all effects from all keys/modes.\n\nAre you sure ?\n\n"))) {
151 lives_widget_object_set_data(LIVES_WIDGET_OBJECT(key_checks[i]),
"active", LIVES_INT_TO_POINTER(
FALSE));
153 for (j = modes - 1; j >= 0; j--) {
168static boolean save_keymap2_file(
char *kfname) {
177 char *hashname, *tmp;
187 if (
THREADVAR(write_failed) == kfd + 1)
break;
188 for (j = 0; j < modes; j++) {
191 if (
THREADVAR(write_failed) == kfd + 1)
break;
207 if (
THREADVAR(write_failed) == kfd + 1) {
212 }
while (retval == LIVES_RESPONSE_RETRY);
214 if (retval == LIVES_RESPONSE_CANCEL)
return FALSE;
219static boolean save_keymap3_file(
char *kfname) {
229 int count = 0, totcons, nconns;
253 if (
THREADVAR(write_failed))
goto write_failed1;
261 if (
THREADVAR(write_failed))
goto write_failed1;
264 if (
THREADVAR(write_failed))
goto write_failed1;
273 nchans = cconx->nchans;
275 if (
THREADVAR(write_failed))
goto write_failed1;
277 for (i = 0; i < nchans; i++) {
279 if (
THREADVAR(write_failed))
goto write_failed1;
281 nconns = cconx->nconns[i];
283 if (
THREADVAR(write_failed))
goto write_failed1;
287 while (j < totcons) {
289 if (
THREADVAR(write_failed))
goto write_failed1;
292 if (
THREADVAR(write_failed))
goto write_failed1;
303 if (
THREADVAR(write_failed))
goto write_failed1;
313 if (
THREADVAR(write_failed))
goto write_failed1;
329 if (
THREADVAR(write_failed) == kfd + 1)
goto write_failed1;
337 if (
THREADVAR(write_failed) == kfd + 1)
goto write_failed1;
340 if (
THREADVAR(write_failed) == kfd + 1)
goto write_failed1;
350 nparams = pconx->nparams;
352 if (
THREADVAR(write_failed) == kfd + 1)
goto write_failed1;
354 for (i = 0; i < nparams; i++) {
356 if (
THREADVAR(write_failed) == kfd + 1)
goto write_failed1;
358 nconns = pconx->nconns[i];
360 if (
THREADVAR(write_failed) == kfd + 1)
goto write_failed1;
364 while (j < totcons) {
366 if (
THREADVAR(write_failed))
goto write_failed1;
369 if (
THREADVAR(write_failed) == kfd + 1)
goto write_failed1;
380 if (
THREADVAR(write_failed) == kfd + 1)
goto write_failed1;
383 if (
THREADVAR(write_failed) == kfd + 1)
goto write_failed1;
393 if (
THREADVAR(write_failed) == kfd + 1)
goto write_failed1;
399 if (
THREADVAR(write_failed) == kfd + 1) {
404 }
while (retval == LIVES_RESPONSE_RETRY);
406 if (retval == LIVES_RESPONSE_CANCEL)
return FALSE;
411static boolean on_save_keymap_clicked(LiVESButton *button, livespointer user_data) {
420 LiVESResponseType retval = LIVES_RESPONSE_NONE;
423 if (!
do_warning_dialog(
_(
"\n\nClick 'OK' to save this keymap as your default\n\n"))) {
428 d_print(
_(
"Saving keymap to %s\n"), keymap_file2);
430 d_print(
_(
"\nUpdating keymap file %s..."), keymap_file2);
434 if (!save_keymap2_file(keymap_file2)) {
436 retval = LIVES_RESPONSE_CANCEL;
441 if (!save_keymap3_file(keymap_file3)) {
443 retval = LIVES_RESPONSE_CANCEL;
480 retval = LIVES_RESPONSE_NONE;
497 for (i = 0; i < numfx; i++) {
507 }
while (retval == LIVES_RESPONSE_RETRY);
509 if (retval == LIVES_RESPONSE_CANCEL) {
517 retval = LIVES_RESPONSE_NONE;
531 for (i = 0; i < numfx; i++) {
542 }
while (retval == LIVES_RESPONSE_RETRY);
544 if (retval == LIVES_RESPONSE_CANCEL) {
580 if (bytes == (ssize_t)msglen && !
lives_strncmp((
char *)buf, msg, msglen)) {
589 if (bytes < (ssize_t)msglen) {
599 }
while (retval == LIVES_RESPONSE_RETRY);
611 if (retval == LIVES_RESPONSE_CANCEL)
return;
619 if (bytes == (ssize_t)msglen && !strncmp((
char *)buf, msg, msglen)) {
628 if (bytes < (ssize_t)msglen) {
637 }
while (retval == LIVES_RESPONSE_RETRY);
644static void check_clear_all_button(
void) {
647 boolean hasone =
FALSE;
650 for (j = modes - 1; j >= 0; j--) {
659static boolean read_perkey_defaults(
int kfd,
int key,
int mode,
int version) {
664 if (nparams > 65536) {
665 lives_printerr(
"Too many params, file is probably broken.\n");
680static boolean load_datacons(
const char *fname, uint8_t **badkeymap) {
681 weed_plant_t **ochans, **ichans, **iparams;
683 weed_plant_t *filter;
690 boolean is_valid, is_valid2;
699 int version, nchans, nparams, nconns, ncconx, npconx;
701 int nichans, nochans, niparams, noparams,
error;
703 int okey, omode, ocnum, opnum, ikey, imode, icnum, ipnum, autoscale;
707 register int i, j, k, count;
728 for (count = 0; count < ncconx; count++) {
767 if (omode < 0 || omode >= maxmodes) is_valid =
FALSE;
771 for (i = 0; i < omode; i++) omode -= badkeymap[okey][omode];
774 if (omode < 0 || omode >= maxmodes) is_valid =
FALSE;
778 if (fidx == -1) is_valid =
FALSE;
782 if (strcmp(hashname, hashname2)) is_valid =
FALSE;
786 if (!strcmp(hashname, hashname2)) is_valid =
TRUE;
800 for (i = 0; i < nchans; i++) {
801 is_valid2 = is_valid;
811 nochans = weed_leaf_num_elements(filter, WEED_LEAF_OUT_CHANNEL_TEMPLATES);
812 if (ocnum >= nochans) is_valid2 =
FALSE;
814 ochans = weed_get_plantptr_array(filter, WEED_LEAF_OUT_CHANNEL_TEMPLATES, &
error);
825 for (j = 0; j < nconns; j++) {
860 if (imode < 0 || (ikey >= 0 && imode >= maxmodes)) is_valid2 =
FALSE;
864 for (k = 0; k < imode; k++) imode -= badkeymap[ikey][imode];
867 if (imode < 0 || (ikey >= 0 && imode >= maxmodes)) is_valid2 =
FALSE;
871 if (fidx == -1) is_valid2 =
FALSE;
875 if (strcmp(hashname, hashname2)) is_valid2 =
FALSE;
879 if (!strcmp(hashname, hashname2)) is_valid2 =
TRUE;
895 nichans = weed_leaf_num_elements(filter, WEED_LEAF_IN_CHANNEL_TEMPLATES);
896 if (icnum >= nichans) is_valid2 =
FALSE;
898 ichans = weed_get_plantptr_array(filter, WEED_LEAF_IN_CHANNEL_TEMPLATES, &
error);
922 for (count = 0; count < npconx; count++) {
961 if (omode < 0 || omode >= maxmodes) is_valid =
FALSE;
965 for (i = 0; i < omode; i++) omode -= badkeymap[okey][omode];
968 if (omode < 0 || omode >= maxmodes) is_valid =
FALSE;
972 if (fidx == -1) is_valid =
FALSE;
976 if (strcmp(hashname, hashname2)) is_valid =
FALSE;
980 if (!strcmp(hashname, hashname2)) is_valid =
TRUE;
994 for (i = 0; i < nparams; i++) {
995 is_valid2 = is_valid;
1005 noparams = weed_leaf_num_elements(filter, WEED_LEAF_OUT_PARAMETER_TEMPLATES);
1006 if (opnum >= noparams) is_valid2 =
FALSE;
1014 for (j = 0; j < nconns; j++) {
1049 if (imode < 0 || (ikey >= 0 && imode >= maxmodes)) is_valid2 =
FALSE;
1051 if (is_valid2 && ikey >= 0) {
1053 for (k = 0; k < imode; k++) imode -= badkeymap[ikey][imode];
1056 if (imode < 0 || (ikey >= 0 && imode >= maxmodes)) is_valid2 =
FALSE;
1058 if (is_valid2 && ikey >= 0) {
1060 if (fidx == -1) is_valid2 =
FALSE;
1064 if (strcmp(hashname, hashname2)) is_valid2 =
FALSE;
1068 if (!strcmp(hashname, hashname2)) is_valid2 =
TRUE;
1085 niparams = weed_leaf_num_elements(filter, WEED_LEAF_IN_PARAMETER_TEMPLATES);
1086 if (ipnum >= niparams) is_valid2 =
FALSE;
1089 iparams = weed_get_plantptr_array(filter, WEED_LEAF_IN_PARAMETER_TEMPLATES, &
error);
1115 }
while (retval == LIVES_RESPONSE_RETRY);
1117 if (retval == LIVES_RESPONSE_CANCEL) {
1126static void set_param_and_con_buttons(
int key,
int mode) {
1130 int idx = key * modes + mode;
1155 LiVESList *list = NULL, *new_list = NULL;
1162 char *whole = lives_strdup(
""), *whole2;
1163 char *hashname, *hashname_new = NULL;
1172 int *def_modes = NULL;
1173 uint8_t **badkeymap = NULL;
1175 boolean notfound =
FALSE;
1176 boolean has_error =
FALSE;
1177 boolean eof =
FALSE;
1190 if (lives_file_test(keymap_file2, LIVES_FILE_TEST_EXISTS)) {
1193 keymap_file = keymap_file2;
1198 d_print(
_(
"Loading default keymap from %s..."), keymap_file);
1200 if (!lives_file_test(keymap_file, LIVES_FILE_TEST_EXISTS)) {
1201 d_print(
_(
"file not found, skipping.\n"));
1213 if (!(kfile = fopen(keymap_file,
"r"))) {
1219 msg =
lives_strdup_printf(
_(
"\n\nUnable to read from keymap file\n%s\nError code %d\n"), keymap_file, errno);
1223 if (retval == LIVES_RESPONSE_CANCEL) {
1229 }
while (retval == LIVES_RESPONSE_RETRY);
1249 if (!keymap_file2) {
1251 while (fgets(buff, 65536, kfile)) {
1253 line = (lives_strstrip(buff));
1255 whole2 = lives_strconcat(whole, line, NULL);
1258 if (linelen < (
size_t)65535) {
1259 list = lives_list_append(list, lives_strdup(whole));
1261 whole = lives_strdup(
"");
1268 if (!strcmp((
char *)lives_list_nth_data(list, 0),
"LiVES keymap file version 2") ||
1269 !strcmp((
char *)lives_list_nth_data(list, 0),
"LiVES keymap file version 1")) update = 1;
1271 if (!strcmp((
char *)lives_list_nth_data(list, 0),
"LiVES keymap file version 3")) update = 2;
1287 for (i = 1; (!keymap_file2 && i < lives_list_length(list)) || (keymap_file2 && !eof); i++) {
1290 if (!keymap_file2) {
1293 line = (
char *)lives_list_nth_data(list, i);
1296 d_print(
_(
"Invalid line %d in %s\n"), i, keymap_file2 ? keymap_file2 : keymap_file);
1300 array = lives_strsplit(line,
"|", -1);
1302 if (!strcmp(array[0],
"defaults")) {
1303 lives_strfreev(array);
1304 array = lives_strsplit(line,
"|", 2);
1307 lives_strfreev(array);
1311 if (!strcmp(array[0],
"sizes")) {
1312 lives_strfreev(array);
1313 array = lives_strsplit(line,
"|", 2);
1316 lives_strfreev(array);
1320 key = atoi(array[0]);
1322 hashname = lives_strdup(array[1]);
1323 lives_strfreev(array);
1328 new_list = lives_list_append(new_list, hashname_new);
1358 g_print(
"keyl %d wanted %d got %ld\n", i, hlen, bytes);
1366 array = lives_strsplit(hashname,
"|", -1);
1368 hashname = lives_strdup(array[0]);
1369 lives_strfreev(array);
1380 if (!read_perkey_defaults(kfd, -1, -1,
version))
break;
1385 def_modes[key - 1]++;
1387 if (strncmp(hashname,
"Weed", 4) ||
lives_strlen(hashname) < 5) {
1393 badkeymap[key - 1][def_modes[key - 1]]++;
1396 if (!read_perkey_defaults(kfd, -1, -1,
version))
break;
1398 def_modes[key - 1]--;
1403 whashname = hashname + 4;
1414 badkeymap[key - 1][def_modes[key - 1]]++;
1417 if (!read_perkey_defaults(kfd, -1, -1,
version))
break;
1419 def_modes[key - 1]--;
1427 (
_(
"This version of LiVES cannot mix generators/non-generators on the same key (%d) !\n"), key)));
1430 badkeymap[key - 1][def_modes[key - 1]]++;
1433 if (!read_perkey_defaults(kfd, -1, -1,
version))
break;
1435 def_modes[key - 1]--;
1444 if (!read_perkey_defaults(kfd, -1, -1,
version))
break;
1446 def_modes[key - 1]--;
1450 int idx = (key - 1) * modes + mode;
1457 hashname = (
char *)lives_list_nth_data(hash_list, fx_idx);
1458 lives_widget_object_set_data(LIVES_WIDGET_OBJECT(combos[idx]),
"hashname", hashname);
1459 }
else lives_widget_object_set_data(LIVES_WIDGET_OBJECT(combos[idx]),
"hashname", empty_string);
1462 set_param_and_con_buttons(key - 1, mode);
1467 if (!read_perkey_defaults(kfd, key - 1, def_modes[key - 1],
version))
break;
1471 if (!keymap_file2) {
1476 on_save_keymap_clicked(NULL, NULL);
1483 on_save_keymap_clicked(NULL, NULL);
1489 if (lives_file_test(keymap_file3, LIVES_FILE_TEST_EXISTS)) {
1490 d_print(
_(
"Loading data connection map from %s..."), keymap_file3);
1492 if (load_datacons(keymap_file3, badkeymap))
d_print_done();
1496 check_clear_all_button();
1521 weed_plant_t *filter;
1523 LiVESWidget *dialog;
1528 LiVESWidget *textview;
1529 LiVESWidget *scrolledwindow;
1530 LiVESWidget *ok_button;
1532 char *filter_name, *filter_author, *filter_copyright;
1533 char *filter_extra_authors = NULL;
1534 char *filter_description;
1535 char *url, *license, *type;
1536 char *plugin_name, *plname, *package_name;
1539 boolean has_desc =
FALSE;
1540 boolean has_url =
FALSE;
1541 boolean has_license =
FALSE;
1542 boolean has_copyright =
FALSE;
1547 int key_mode = LIVES_POINTER_TO_INT(user_data);
1549 int key = (int)(key_mode / modes);
1550 int mode = key_mode - key * modes;
1561 filter_name = weed_get_string_value(filter, WEED_LEAF_NAME, &weed_error);
1563 filter_author = weed_get_string_value(filter,
WEED_LEAF_AUTHOR, &weed_error);
1564 if (weed_plant_has_leaf(filter, WEED_LEAF_EXTRA_AUTHORS)) filter_extra_authors = weed_get_string_value(filter,
1565 WEED_LEAF_EXTRA_AUTHORS, &weed_error);
1566 if (weed_plant_has_leaf(filter, WEED_LEAF_COPYRIGHT)) {
1567 filter_copyright = weed_get_string_value(filter, WEED_LEAF_COPYRIGHT, &weed_error);
1568 has_copyright =
TRUE;
1570 if (weed_plant_has_leaf(filter, WEED_LEAF_DESCRIPTION)) {
1571 filter_description = weed_get_string_value(filter, WEED_LEAF_DESCRIPTION, &weed_error);
1574 if (weed_plant_has_leaf(filter, WEED_LEAF_URL)) {
1575 url = weed_get_string_value(filter, WEED_LEAF_URL, &weed_error);
1579 if (weed_plant_has_leaf(filter, WEED_LEAF_LICENSE)) {
1580 license = weed_get_string_value(filter, WEED_LEAF_LICENSE, &weed_error);
1584 filter_version = weed_get_int_value(filter, WEED_LEAF_VERSION, &weed_error);
1618 if (filter_extra_authors) {
1663 if (has_copyright) {
1685 if (has_desc)
lives_free(filter_description);
1688 if (has_copyright)
lives_free(filter_copyright);
1700 int idx = LIVES_POINTER_TO_INT(user_data);
1702 int key = (int)(idx / modes);
1703 int mode = idx - key * modes;
1731 idx = key * modes + i;
1735 char *hashname = (
char *)lives_list_nth_data(hash_list, fx_idx);
1736 lives_widget_object_set_data(LIVES_WIDGET_OBJECT(combos[idx]),
"hashname", hashname);
1737 }
else lives_widget_object_set_data(LIVES_WIDGET_OBJECT(combos[idx]),
"hashname", empty_string);
1740 set_param_and_con_buttons(key, i);
1747 lives_widget_object_set_data(LIVES_WIDGET_OBJECT(combos[idx]),
"hashname", empty_string);
1750 set_param_and_con_buttons(key, i);
1763static void on_datacon_clicked(LiVESButton * button, livespointer user_data) {
1764 int idx = LIVES_POINTER_TO_INT(user_data);
1766 int key = (int)(idx / modes);
1767 int mode = idx - key * modes;
1777 weed_plant_t *gui, *tgui;
1778 for (
int i = 0; i < nparams; i++) {
1781 weed_leaf_copy(tgui, WEED_LEAF_CHOICES, gui, WEED_LEAF_CHOICES);
1787static void on_params_clicked(LiVESButton * button, livespointer user_data) {
1788 int idx = LIVES_POINTER_TO_INT(user_data);
1790 int key = (int)(idx / modes);
1791 int mode = idx - key * modes;
1856 rte_window_is_hidden =
TRUE;
1883static boolean on_rtew_ok_clicked(LiVESButton * button, livespointer user_data) {
1892 "generators and non-generators on the same key.\n\n"));
1914 LiVESTreeIter iter1;
1915 LiVESTreeModel *model;
1920 char *hashname2 = (
char *)lives_widget_object_get_data(LIVES_WIDGET_OBJECT(combo),
"hashname");
1922 int key_mode = LIVES_POINTER_TO_INT(user_data);
1924 int key = (int)(key_mode / modes);
1925 int mode = key_mode - key * modes;
1941 if (!strcmp(hashname1, hashname2)) {
1947 for (i = mode - 1; i >= 0; i--) {
1952 if (i == 0) mode = 0;
1977 lives_widget_object_set_data(LIVES_WIDGET_OBJECT(combo),
"hashname", hashname1);
1980 set_param_and_con_buttons(key, mode);
1982 check_clear_all_button();
1993static LiVESTreeStore *tstore = NULL;
1995static LiVESTreeModel *rte_window_fx_model(
void) {
1996 weed_plant_t *pinfo;
1997 LiVESTreeIter iter1, iter2, iter3;
1999 LiVESList *list = extended_name_list;
2000 LiVESList *pname_list = name_list;
2001 LiVESList *phash_list = hash_list;
2005 char *pkg = NULL, *pkgstring, *fxname, *typestr;
2009 if (tstore)
return (LiVESTreeModel *)tstore;
2024 pname_list = pname_list->next;
2025 phash_list = phash_list->next;
2029 fxname = lives_strdup((
const char *)pname_list->data);
2035 pinfo = weed_get_plantptr_value(filter, WEED_LEAF_PLUGIN_INFO, NULL);
2036 if (weed_plant_has_leaf(pinfo, WEED_LEAF_PACKAGE_NAME))
2037 pkgstring = weed_get_string_value(pinfo, WEED_LEAF_PACKAGE_NAME, NULL);
2038 else pkgstring = NULL;
2063 HASH_COLUMN, lives_list_nth_data(hash_list, fx_idx), -1);
2071 HASH_COLUMN, lives_list_nth_data(hash_list, fx_idx), -1);
2078 pname_list = pname_list->next;
2079 phash_list = phash_list->next;
2084 return (LiVESTreeModel *)tstore;
2094 LiVESWidget *vbox, *vbox2;
2097 LiVESWidget *ok_button;
2098 LiVESWidget *top_vbox;
2099 LiVESWidget *hbuttonbox;
2101 LiVESWidget *scrolledwindow;
2103 LiVESSList *mode_group = NULL;
2104 LiVESSList *grab_group = NULL;
2106 LiVESAccelGroup *rtew_accel_group;
2108 LiVESTreeModel *model;
2110 char *tmp, *tmp2, *labelt;
2136 goto rte_window_ready;
2179 model = rte_window_fx_model();
2189 (LiVESAttachOptions)(LIVES_EXPAND | LIVES_FILL),
2190 (LiVESAttachOptions)(LIVES_EXPAND | LIVES_FILL), 0, 0);
2197 labelt = (
_(
"minus"));
break;
2199 labelt = (
_(
"equals"));
break;
2201 labelt = lives_strdup(
"????");
2222 lives_widget_object_set_data(LIVES_WIDGET_OBJECT(key_checks[i]),
"active",
2225 ch_fns[i] = lives_signal_connect_after(LIVES_GUI_OBJECT(key_checks[i]), LIVES_WIDGET_TOGGLED_SIGNAL,
2232 (tmp2 = (
_(
"Grab keyboard for this effect key"))));
2237 gr_fns[i] = lives_signal_connect_after(LIVES_GUI_OBJECT(key_grabs[i]), LIVES_WIDGET_TOGGLED_SIGNAL,
2242 for (j = 0; j < modes; j++) {
2243 idx = i * modes + j;
2246 (LiVESAttachOptions)(LIVES_EXPAND | LIVES_FILL),
2247 (LiVESAttachOptions)(LIVES_EXPAND | LIVES_FILL), 0, 0);
2258 mode_ra_fns[idx] = lives_signal_connect_after(LIVES_GUI_OBJECT(mode_radios[idx]), LIVES_WIDGET_TOGGLED_SIGNAL,
2299 lives_widget_object_set_data(LIVES_WIDGET_OBJECT(combo),
"hashname", empty_string);
2314 lives_signal_sync_connect(LIVES_GUI_OBJECT(combo), LIVES_WIDGET_CHANGED_SIGNAL,
2317 lives_signal_sync_connect(LIVES_GUI_OBJECT(info_buttons[idx]), LIVES_WIDGET_CLICKED_SIGNAL,
2320 lives_signal_sync_connect(LIVES_GUI_OBJECT(clear_buttons[idx]), LIVES_WIDGET_CLICKED_SIGNAL,
2323 lives_signal_sync_connect(LIVES_GUI_OBJECT(param_buttons[idx]), LIVES_WIDGET_CLICKED_SIGNAL,
2324 LIVES_GUI_CALLBACK(on_params_clicked), LIVES_INT_TO_POINTER(idx));
2326 lives_signal_sync_connect(LIVES_GUI_OBJECT(conx_buttons[idx]), LIVES_WIDGET_CLICKED_SIGNAL,
2327 LIVES_GUI_CALLBACK(on_datacon_clicked), LIVES_INT_TO_POINTER(idx));
2334 set_param_and_con_buttons(i, j);
2354 LIVES_RESPONSE_RESET);
2359 LIVES_RESPONSE_ACCEPT);
2364 LIVES_RESPONSE_BROWSE);
2391 LIVES_KEY_Escape, (LiVESXModifierType)0, (LiVESAccelFlags)0);
2394 LIVES_GUI_CALLBACK(on_rtew_ok_clicked), NULL);
2396 lives_signal_sync_connect(LIVES_GUI_OBJECT(ok_button), LIVES_WIDGET_CLICKED_SIGNAL,
2397 LIVES_GUI_CALLBACK(on_rtew_ok_clicked), NULL);
2400 LIVES_GUI_CALLBACK(on_save_keymap_clicked), NULL);
2404 LIVES_INT_TO_POINTER(1));
2408 LIVES_INT_TO_POINTER(1));
2413 rte_window_is_hidden =
FALSE;
2468 lives_widget_object_set_data(LIVES_WIDGET_OBJECT(key_checks[key]),
"active", LIVES_INT_TO_POINTER(on));
2514 int idx = LIVES_POINTER_TO_INT(user_data);
2534 LiVESWidget *textwidget = (LiVESWidget *)lives_widget_object_get_data(LIVES_WIDGET_OBJECT(
mainw->
textwidget_focus),
2548 weed_plant_t *ptmpl, *filter;
2555 LiVESWidget *textwidget = (LiVESWidget *)lives_widget_object_get_data(LIVES_WIDGET_OBJECT(
mainw->
textwidget_focus),
2577 if (weed_leaf_seed_type(ptmpl, WEED_LEAF_DEFAULT) == WEED_SEED_DOUBLE)
2600 weed_plant_t **ptmpls, **inp, **xinp;
2601 weed_plant_t **ctmpls;
2603 weed_plant_t *filter, *inst;
2605 LiVESList *child_list;
2607 LiVESWidget *pbox, *cancelbutton;
2609 boolean is_generic_defs =
FALSE;
2610 boolean add_pcons =
FALSE;
2614 int poffset = 0, ninpar, x;
2620 if (cancelbutton) is_generic_defs =
TRUE;
2622 inst = (weed_plant_t *)rfx->
source;
2627 if (is_generic_defs) {
2629 ptmpls = weed_get_plantptr_array(filter, WEED_LEAF_IN_PARAMETER_TEMPLATES, NULL);
2645 if (ninpar == 0) xinp = NULL;
2647 xinp = (weed_plant_t **)
lives_malloc((ninpar + 1) *
sizeof(weed_plant_t *));
2649 for (i = poffset; i < poffset + ninpar; i++) xinp[x++] = inp[i];
2665 inst = (weed_plant_t *)rfx->
source;
2678 if (is_generic_defs) {
2681 if (weed_plant_has_leaf(filter, WEED_LEAF_OUT_CHANNEL_TEMPLATES)) {
2682 ctmpls = weed_get_plantptr_array(filter, WEED_LEAF_OUT_CHANNEL_TEMPLATES, NULL);
2683 nchans = weed_leaf_num_elements(filter, WEED_LEAF_OUT_CHANNEL_TEMPLATES);
2684 for (i = 0; i < nchans; i++) {
2695 if (!LIVES_IS_WIDGET(
fx_dialog[1]->dialog))
return;
2702 for (i = 0; i < lives_list_length(child_list); i++) {
2703 LiVESWidget *widget = (LiVESWidget *)lives_list_nth_data(child_list, i);
2708 if (child_list) lives_list_free(child_list);
void ce_thumbs_reset_combos(void)
void ce_thumbs_set_keych(int key, boolean on)
void ce_thumbs_reset_combo(int key)
void ce_thumbs_set_mode_combo(int key, int mode)
LIVES_GLOBAL_INLINE LiVESWindow * get_transient_full(void)
LiVESResponseType do_read_failed_error_s_with_retry(const char *fname, const char *errtext)
void do_threaded_dialog(const char *trans_text, boolean has_cancel)
LIVES_GLOBAL_INLINE LiVESResponseType do_abort_cancel_retry_dialog(const char *text)
LiVESResponseType do_write_failed_error_s_with_retry(const char *fname, const char *errtext)
void end_threaded_dialog(void)
LIVES_GLOBAL_INLINE LiVESResponseType do_error_dialog(const char *text)
LIVES_GLOBAL_INLINE boolean do_warning_dialog(const char *text)
void threaded_dialog_spin(double fraction)
void pconx_delete_all(void)
void cconx_add_connection(int okey, int omode, int ocnum, int ikey, int imode, int icnum)
add a new connection from out_chan okey/omode/ocnum to in_chan ikey/imode/icnum
void cconx_delete(int okey, int omode, int ocnum, int ikey, int imode, int icnum)
LiVESWidget * make_datacon_window(int key, int mode)
void pconx_delete(int okey, int omode, int opnum, int ikey, int imode, int ipnum)
void pconx_add_connection(int okey, int omode, int opnum, int ikey, int imode, int ipnum, boolean autoscale)
add a new connection from out_param okey/omode/opnum to in_param ikey/imode/ipnum
void cconx_remap_mode(int key, int omode, int nmode)
void cconx_delete_all(void)
void pconx_remap_mode(int key, int omode, int nmode)
#define FX_DATA_WILDCARD_KEEP_ACTIVATED
char * make_weed_hashname(int filter_idx, boolean fullname, boolean use_extra_authors, char sep, boolean subs)
return value should be freed after use
LIVES_GLOBAL_INLINE int filter_mutex_unlock(int key)
int rte_get_numfilters(void)
boolean rte_keymode_valid(int key, int mode, boolean is_userkey)
returns TRUE if a filter_class is bound to key/mode, is_userkey should be set to TRUE
int rte_key_getmode(int key)
returns current active mode for a key (or -1)
weed_plant_t * weed_instance_get_filter(weed_plant_t *inst, boolean get_compound_parent)
int enabled_out_channels(weed_plant_t *plant, boolean count_repeats)
boolean has_video_chans_in(weed_plant_t *filter, boolean count_opt)
LIVES_GLOBAL_INLINE int filter_mutex_lock(int key)
boolean read_generator_sizes(int fd)
int weed_add_effectkey(int key, const char *hashname, boolean fullname)
bind a filter_class to key/mode using its hashname
weed_plant_t * rte_keymode_get_instance(int key, int mode)
returns refcounted filter_instance bound to key/mode (or NULL)
boolean has_alpha_palette(weed_plant_t *ctmpl, weed_plant_t *filter)
int weed_flagset_array_count(weed_plant_t **array, boolean set_readonly)
int weed_get_idx_for_hashname(const char *hashname, boolean fullname)
fullname includes author and version
boolean write_generator_sizes(int fd, int idx)
weed_plant_t * rte_keymode_get_filter(int key, int mode)
returns filter_class bound to key/mode (or NULL)
char * rte_keymode_get_plugin_name(int key, int mode)
returns name of plugin package containing filter_class (or "")
int num_in_params(weed_plant_t *plant, boolean skip_hidden, boolean skip_internal)
void weed_in_parameters_free(weed_plant_t *inst)
weed_plant_t ** weed_params_create(weed_plant_t *filter, boolean in)
int rte_keymode_get_filter_idx(int key, int mode)
returns filter_class index of key/mode (or -1 if no filter bound)
boolean read_key_defaults(int fd, int nparams, int key, int mode, int ver)
char * rte_keymode_get_filter_name(int key, int mode, boolean add_notes)
returns name of filter_class bound to key/mode (or "")
int rte_switch_keymode(int key, int mode, const char *hashname)
int enabled_in_channels(weed_plant_t *plant, boolean count_repeats)
LIVES_GLOBAL_INLINE int weed_instance_ref(weed_plant_t *inst)
void add_param_connections(weed_plant_t *inst)
LiVESList * weed_get_all_names(lives_fx_list_t list_type)
boolean weed_delete_effectkey(int key, int mode)
unbinds a filter_class from a key/mode
char * rte_keymode_get_type(int key, int mode)
returns a string filter/instance type (or "")
void apply_key_defaults(weed_plant_t *inst, int key, int mode)
boolean write_filter_defaults(int fd, int idx)
weed_plant_t * weed_filter_in_paramtmpl(weed_plant_t *filter, int param_num, boolean skip_internal)
LIVES_GLOBAL_INLINE int weed_instance_unref(weed_plant_t *inst)
weed_plant_t * get_weed_filter(int idx)
boolean read_filter_defaults(int fd)
void set_key_defaults(weed_plant_t *inst, int key, int mode)
lives_fx_cat_t weed_filter_categorise(weed_plant_t *pl, int in_channels, int out_channels)
void write_key_defaults(int fd, int key, int mode)
weed_plant_t * weed_instance_from_filter(weed_plant_t *filter)
lives_filter_error_t weed_reinit_effect(weed_plant_t *inst, boolean reinit_compound)
#define WEED_LEAF_HOST_NORECORD
#define WEED_LEAF_HOST_NEXT_INSTANCE
#define WEED_LEAF_HOST_WIDTH
#define WEED_LEAF_HOST_KEY
#define WEED_LEAF_HOST_DEFAULT
#define WEED_LEAF_HOST_FPS
#define WEED_LEAF_HOST_INTERNAL_CONNECTION
#define WEED_LEAF_HOST_MENU_HIDE
#define WEED_LEAF_HOST_HEIGHT
boolean rte_on_off_callback_hook(LiVESToggleButton *button, livespointer user_data)
for widgets
boolean rtemode_callback_hook(LiVESToggleButton *button, livespointer user_data)
for widgets
boolean grabkeys_callback_hook(LiVESToggleButton *button, livespointer user_data)
for widgets
LIVES_GLOBAL_INLINE int rte_getmodespk(void)
char * lives_fx_cat_to_text(lives_fx_cat_t cat, boolean plural)
error("LSD_RANDFUNC(ptr, size) must be defined")
LIVES_GLOBAL_INLINE boolean lives_strcmp(const char *st1, const char *st2)
returns FALSE if strings match
LIVES_GLOBAL_INLINE size_t lives_strlen(const char *s)
LIVES_GLOBAL_INLINE boolean lives_strncmp(const char *st1, const char *st2, size_t len)
returns FALSE if strings match
_palette * palette
interface colour settings
ssize_t lives_read_buffered(int fd, void *buf, ssize_t count, boolean allow_less)
int lives_close_buffered(int fd)
void lives_list_free_all(LiVESList **)
size_t get_token_count(const char *string, int delim)
void d_print_cancelled(void)
void d_print_file_error_failed(void)
ssize_t lives_write_buffered(int fd, const char *buf, ssize_t count, boolean allow_fail)
#define DEF_FILE_PERMS
non-executable, is modified by the umask
int lives_create_buffered(const char *pathname, int mode)
ssize_t lives_read_le_buffered(int fd, void *buf, ssize_t count, boolean allow_less)
#define LIVES_LOCAL_INLINE
ssize_t lives_write_le_buffered(int fd, livesconstpointer buf, ssize_t count, boolean allow_fail)
int lives_open_buffered_rdonly(const char *pathname)
int lives_rm(const char *file)
void d_print(const char *fmt,...)
boolean lives_freep(void **ptr)
#define DEF_BUTTON_HEIGHT
#define SCR_HEIGHT_SAFETY
#define LIVES_MAIN_WINDOW_WIDGET
#define DLG_BUTTON_HEIGHT
#define STYLE_1
turn on theming if set
#define RFX_WINSIZE_H
size of the fx dialog windows scrollwindow
_fx_dialog * fx_dialog[2]
#define SCR_WIDTH_SAFETY
sepwin/screen size safety margins in pixels
#define GUI_SCREEN_HEIGHT
int set_param_from_list(LiVESList *plist, lives_param_t *param, int pnum, boolean with_min_max, boolean upd)
update values for param using values in plist if upd is TRUE, the widgets for that param also are upd...
void on_paramwindow_button_clicked(LiVESButton *button, lives_rfx_t *rfx)
_fx_dialog * on_fx_pre_activate(lives_rfx_t *rfx, boolean is_realtime, LiVESWidget *pbox)
void after_param_text_changed(LiVESWidget *textwidget, lives_rfx_t *rfx)
void update_weed_color_value(weed_plant_t *plant, int pnum, int c1, int c2, int c3, int c4, lives_rfx_t *rfx)
boolean make_param_box(LiVESVBox *top_vbox, lives_rfx_t *rfx)
make a dynamic parameter window
lives_param_t * weed_params_to_rfx(int npar, weed_plant_t *inst, boolean show_reinits)
void rfx_params_free(lives_rfx_t *rfx)
lives_rfx_t * weed_to_rfx(weed_plant_t *plant, boolean show_reinits)
@ LIVES_PARAM_STRING_LIST
boolean on_load_keymap_clicked(LiVESButton *button, livespointer user_data)
void on_clear_clicked(LiVESButton *button, livespointer user_data)
void type_label_set_text(int key, int mode)
void rtew_set_keych(int key, boolean on)
void on_save_rte_defs_activate(LiVESMenuItem *menuitem, livespointer user_data)
void on_rte_info_clicked(LiVESButton *button, livespointer user_data)
boolean on_clear_all_clicked(LiVESButton *button, livespointer user_data)
void fx_changed(LiVESCombo *combo, livespointer user_data)
void rtew_set_keygr(int key)
void rte_set_key_defs(LiVESButton *button, lives_rfx_t *rfx)
void update_pwindow(int key, int i, LiVESList *list)
void check_string_choice_params(weed_plant_t *inst)
void rtew_set_key_check_state(void)
LiVESWidget * refresh_rte_window(void)
boolean rte_window_hidden(void)
void rte_window_set_interactive(boolean interactive)
LiVESWidget * create_rte_window(void)
void rte_set_defs_cancel(LiVESButton *button, lives_rfx_t *rfx)
void rtew_set_mode_radio(int key, int mode)
LIVES_LOCAL_INLINE void do_mix_error(void)
void rte_reset_defs_clicked(LiVESButton *button, lives_rfx_t *rfx)
void rte_set_defs_activate(LiVESMenuItem *menuitem, livespointer user_data)
void rte_set_defs_ok(LiVESButton *button, lives_rfx_t *rfx)
void load_default_keymap(void)
boolean on_rtew_delete_event(LiVESWidget *widget, LiVESXEventDelete *event, livespointer user_data)
void on_assign_rte_keys_activate(LiVESMenuItem *menuitem, livespointer user_data)
void rtew_combo_set_text(int key, int mode, const char *txt)
#define DEF_KEYMAP_FILE_OLD
#define FX_SIZES_FILENAME
#define FX_SIZES_VERSIONSTRING_2
#define FX_DEFS_VERSIONSTRING_1_1
LiVESWidget * cancelbutton
LiVESWidgetColor normal_fore
LiVESWidgetColor menu_and_bars
LiVESWidgetColor normal_back
LiVESWidgetColor menu_and_bars_fore
char config_datadir[PATH_MAX]
kept in locale encoding (general config files) (default ~/.local/share/lives)
short startup_phase
0 = normal , -1 or 1: fresh install, 2: workdir set, 3: startup tests passed, 4: aud pl chosen,...
void * value
current value(s)
void * source
points to the source (e.g. a weed_plant_t)
int min_frames
for Weed, 1
volatile uint64_t rte
current max for VJ mode == 64 effects on fg clip
boolean block_param_updates
block visual param changes from updating real values
LiVESAccelGroup * accel_group
LiVESWidget * rte_defs_menu
boolean no_context_update
may be set temporarily to block wodget context updates
LiVESWidget * play_window
LiVESWidget * textwidget_focus
lives_cconnect_t * cconx
list of out -> in alpha channel connections
int rte_keys
which effect is bound to keyboard (m) modechange and ctrl-alt-up-arrow / ctrl-alt-down-arrow param ch...
lives_pconnect_t * pconx
list of out -> in param connections
#define lives_strdup_printf(fmt,...)
const char * version(void)
WEED_GLOBAL_INLINE weed_plant_t * weed_paramtmpl_get_gui(weed_plant_t *paramt, int create_if_not_exists)
WEED_GLOBAL_INLINE int weed_filter_hints_unstable(weed_plant_t *filter)
WEED_GLOBAL_INLINE weed_plant_t * weed_param_get_template(weed_plant_t *param)
WEED_GLOBAL_INLINE int weed_paramtmpl_value_irrelevant(weed_plant_t *paramtmpl)
WEED_GLOBAL_INLINE weed_plant_t * weed_param_get_gui(weed_plant_t *param, int create_if_not_exists)
WEED_GLOBAL_INLINE int weed_filter_hints_hidden(weed_plant_t *filter)
WEED_GLOBAL_INLINE int weed_filter_is_converter(weed_plant_t *filter)
WEED_GLOBAL_INLINE char * weed_filter_get_package_name(weed_plant_t *filter)
WEED_GLOBAL_INLINE weed_plant_t ** weed_instance_get_in_params(weed_plant_t *instance, int *nparams)