Raw File
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

back to top