create_preferences.sh.in
#!/bin/sh
tabs='gui core'
schemafile=$1
num=1
callbackfile=callback.c
resetfile=reset.c
cat > $resetfile << EOF
/** generated file, do not edit! */
#ifndef DT_PREFERENCES_H
#define DT_PREFERENCES_H
#include <gtk/gtk.h>
#include "control/conf.h"
EOF
# header of the callback function
cat > $callbackfile << EOF
static void
preferences_callback (GtkWidget *widget, gpointer user_data)
{
long int num = (long int)user_data;
switch(num)
{
EOF
# arg num setval
reset_callback() {
cat >> $resetfile << EOF
static gboolean
reset_widget_$1 (GtkWidget *label, GdkEventButton *event, GtkWidget *widget)
{
if(event->type == GDK_2BUTTON_PRESS)
{
$2
return TRUE;
}
return FALSE;
}
EOF
}
# do this for each key
# arg short long num
key_begin() {
cat >> $initfile << EOF
label = gtk_label_new(_("$1"));
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
labelev = gtk_event_box_new();
gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
gtk_container_add(GTK_CONTAINER(labelev), label);
EOF
}
# arg short long num def
key_end() {
cat >> $initfile << EOF
snprintf(tooltip, 1024, _("double click to reset to \`%s'"), $4);
gtk_object_set(GTK_OBJECT(labelev), "tooltip-text", tooltip, (char *)NULL);
gtk_event_box_set_visible_window(GTK_EVENT_BOX(labelev), FALSE);
EOF
if [ -n "$2" ]; then
printf " gtk_object_set(GTK_OBJECT(widget), \"tooltip-text\", _(\"%s\"), (char *)NULL);\n" "$2" >> $initfile
fi
cat >> $initfile << EOF
gtk_box_pack_start(GTK_BOX(vbox1), labelev, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox2), widget, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(labelev), "button-press-event", G_CALLBACK(reset_widget_$num), (gpointer)widget);
EOF
}
# split up in different tabs!
for tab in $tabs
do
initfile=init_$tab.c
# header of the init tab function
cat > $initfile << EOF
static void
init_tab_$tab (GtkWidget *tab)
{
GtkWidget *widget, *label, *labelev;
GtkWidget *hbox = gtk_hbox_new(5, FALSE);
GtkWidget *vbox1 = gtk_vbox_new(5, TRUE);
GtkWidget *vbox2 = gtk_vbox_new(5, TRUE);
char tooltip[1024];
gtk_box_pack_start(GTK_BOX(hbox), vbox1, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), vbox2, FALSE, FALSE, 0);
GtkWidget *alignment = gtk_alignment_new(0.5, 0.0, 1.0, 0.0);
gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 20, 20, 20, 20);
gtk_container_add(GTK_CONTAINER(alignment), hbox);
gtk_notebook_append_page(GTK_NOTEBOOK(tab), alignment, gtk_label_new(_("$tab options")));
EOF
# get key, type, default, short, long for each setting:
# grep for all relevant tags
# remove spaces
# remove new lines, insert only the one we want
# remove the ugly xml tag stuff and the gconf schema prefix.
grep -E '<key>|<type>|<default>|<short>|<long>|<schema>|</schema>' $schemafile |
sed -e 's/^[ \t]*//;s/[ \t]*$//' |
tr -d '\n' | sed -e 's/<\/schema>/#/g' | tr '#' '\n' | grep -E "tab:$tab" |
sed -e 's/<\/[^>]*>/#/g' -e 's/<[^>]*>//g' -e 's/\/schemas\/apps\/darktable\///g' > dreggn
# now read one line at the time and output code:
# label (short), input (type, default), tooltip (long) with callback (key)
echo " // tab: $tab" >> $callbackfile
for line0 in $(cat dreggn | tr ' ' '&')
do
line=$(printf "%s" "$line0" | tr '&' ' ')
key=$(printf "%s" "$line" | cut -d# -f1)
type=$(printf "%s" "$line" | cut -d# -f2)
def=$(printf "%s" "$line" | cut -d# -f3)
qdef=\"$def\"
short=$(printf "%s" "$line" | cut -d# -f4)
long=$(printf "%s" "$line" | cut -d# -f5)
# if we compile w/o opencl, we don't want this option in preferences
if [ "@HAVE_OPENCL@" = "0" ]; then
if [ "$key" = "opencl" ]; then
continue
fi
fi
key_begin "$short" "$long" $num
if [ "$type" = "string" ]; then
def=$qdef
val="gtk_entry_get_text(GTK_ENTRY(widget))"
setval="gtk_entry_set_text(GTK_ENTRY(widget), $def);"
cat >> $initfile << EOF
widget = gtk_entry_new();
gtk_entry_set_text(GTK_ENTRY(widget), dt_conf_get_string("$key"));
g_signal_connect(G_OBJECT(widget), "activate", G_CALLBACK(preferences_callback), (gpointer)(long int)$num);
EOF
elif [ "$type" = "int" ]; then
val="gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget))"
setval="gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), $def);"
cat >> $initfile << EOF
widget = gtk_spin_button_new_with_range(0, 1000000000, 1);
gtk_spin_button_set_digits(GTK_SPIN_BUTTON(widget), 0);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), dt_conf_get_int("$key"));
g_signal_connect(G_OBJECT(widget), "value-changed", G_CALLBACK(preferences_callback), (gpointer)(long int)$num);
EOF
elif [ "$type" = "bool" ]; then
if [ "$def" = "true" ]; then def="TRUE"; else def="FALSE"; fi
qdef=\"$def\"
val="gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))"
setval="gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), $def);"
cat >> $initfile << EOF
widget = gtk_check_button_new();
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), dt_conf_get_bool("$key"));
g_signal_connect(G_OBJECT(widget), "toggled", G_CALLBACK(preferences_callback), (gpointer)(long int)$num);
EOF
elif [ "$type" = "float" ]; then
val="gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget))"
setval="gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), $def);"
cat >> $initfile << EOF
widget = gtk_spin_button_new_with_range(-1000000000.0, 1000000000.0, 0.001);
gtk_spin_button_set_digits(GTK_SPIN_BUTTON(widget), 5);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), dt_conf_get_float("$key"));
g_signal_connect(G_OBJECT(widget), "value-changed", G_CALLBACK(preferences_callback), (gpointer)(long int)$num);
EOF
fi
key_end "$short" "$long" $num $qdef
reset_callback $num "$setval"
cat >> $callbackfile << EOF
case $num:
dt_conf_set_$type("$key", $val);
break;
EOF
num=$((num+1))
done
cat >> $initfile << EOF
}
EOF
done # end for all tabs
cat >> $callbackfile << EOF
default:
break;
}
}
EOF
cat $resetfile
cat $callbackfile
rm -f $callbackfile
rm -f $resetfile
for tab in $tabs;
do
cat init_$tab.c
rm -f init_$tab.c
done # end for all tabs
echo "#endif"
rm -f dreggn