Use GTK color picker instead of R, G, B and D buttons
authorH.G.Muller <hgm@hgm-xboard.(none)>
Fri, 1 Apr 2016 20:01:40 +0000 (22:01 +0200)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Fri, 1 Apr 2016 20:01:40 +0000 (22:01 +0200)
By an awful hack in the generic dialog constructor ever Button Option
with the name R, G or B is now completely ignored, while Buttons with
name D will be replaced by GtkColorButtons. Instead of catching the
"clicked" signal these will respond to the "color-set" signal, invoking
a handler private to the GTK front end, which will set the color text
and colorof the reset button as the platform-independent handler of the
RGBD buttons would normally have done.
Unfortunately this had to use deprecated GTK2 stuff, as the recommended
GTK3 equivalents are not understood on Ubuntu 10.04.

gtk/xoptions.c

index c643d64..8df9c44 100644 (file)
@@ -296,6 +296,18 @@ FontCallback (GtkWidget *widget, gpointer gdata)
     ApplyFont(opt, p);
 }
 
+void
+ColorCallback (GtkWidget *widget, gpointer gdata)
+{
+    Option *opt = (Option *) gdata;
+    GdkColor rgba;
+    char buf[MSG_SIZ]; 
+    gtk_color_button_get_color(GTK_COLOR_BUTTON(widget), &rgba);
+    snprintf(buf, MSG_SIZ, "#%02x%02x%02x", rgba.red>>8, rgba.green>>8, rgba.blue>>8);
+    gtk_widget_modify_bg ( GTK_WIDGET(opt[1].handle), GTK_STATE_NORMAL, &rgba );
+    SetWidgetText(opt, buf, TransientDlg);
+}
+
 void
 SetListBoxItem (GtkListStore *store, int n, char *msg)
 {
@@ -1536,6 +1548,12 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width);
                 Pack(hbox, table, fbutton, left, left+r, top, 0);
                 break;
             }
+            if(!strcmp(option[i].name, "R") || !strcmp(option[i].name, "G") || !strcmp(option[i].name, "B")) {
+                break;
+            } else
+            if(!strcmp(option[i].name, "D")) {
+                option[i].handle = (void *) (button = gtk_color_button_new());
+            } else
             button = gtk_button_new_with_label (_(option[i].name));
             SetWidgetFont(gtk_bin_get_child(GTK_BIN(button)), option[i].font);
 
@@ -1560,6 +1578,9 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width);
             }
 
             Pack(hbox, table, button, left, left+1, top, 0);
+            if(!strcmp(option[i].name, "D")) // color button
+            g_signal_connect (button, "color-set", G_CALLBACK (ColorCallback), (gpointer) &option[i-5]);
+            else
             if(option[i].value == 666 && !strcmp(option[i].name, "*")) // font-assignment buttons
             g_signal_connect (button, "clicked", G_CALLBACK (FontCallback), (gpointer) &option[i-5]);
             else