Is that why even relative paths (“./colorselect”) don’t work? I’d have thought it would at least know its working directory.
I made some changes to colorselect. There’s now command line parsing allowing you to pass in a base color and suppress output in case, uh, you just want to look up a color. The “Apply” button (or “OK” if --quiet is on) is now the default button. Some very minor refactoring was also done because I’m anal retentive. Now I just need some way of reading in and saving colorsets from my config…
[code]#include <gtk/gtk.h>
GdkColor ncolor;
GdkColor ocolor;
gboolean quiet;
gboolean revertable;
static gboolean delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) {
gtk_main_quit();
return TRUE;
}
static gboolean cancel(GtkWidget *widget, GdkEvent *event, gpointer data) {
if (!quiet) printf(“%02x%02x%02x”, ocolor.red / 256, ocolor.green / 256, ocolor.blue / 256);
delete_event(widget, event, data);
}
static gboolean apply(GtkWidget *widget, GdkEvent *event, gpointer data) {
if (!quiet) printf(“%02x%02x%02x”, ncolor.red / 256, ncolor.green / 256, ncolor.blue / 256);
delete_event(widget, event, data);
}
static void color_changed_cb(GtkWidget *widget, GtkColorSelection *colorselect) {
gtk_color_selection_get_current_color(colorselect, &ncolor);
}
static void printHelp() {
printf(“Usage: colorselect [hex value]\n\n”);
printf(“Available options:\n”);
printf(“\t-h,–help\tthis help\n”);
printf(“\t-q,–quiet\tdo not output a color value\n”);
printf(“\t-v,–version\tshow program version\n”);
printf(“\nHex value is a 6 digit RGB value.\n”);
}
static gboolean parseHex(char *argv) {
int i;
for (i = 0; i < 6; i++) {
if (argv[i]=='\0')
return FALSE;
if (argv[i] > 0x29 && argv[i] < 0x40 ) //if 0 to 9
argv[i] = argv[i] & 0x0f; //convert to int
else if (argv[i] >='a' && argv[i] <= 'f') //if a to f
argv[i] = (argv[i] & 0x0f) + 9; //convert to int
else if (argv[i] >='A' && argv[i] <= 'F') //if A to F
argv[i] = (argv[i] & 0x0f) + 9; //convert to int
else return FALSE;
}
ocolor.red = (argv[0] * 16 + argv[1]) * 257;
ocolor.green = (argv[2] * 16 + argv[3]) * 257;
ocolor.blue = (argv[4] * 16 + argv[5]) * 257;
return TRUE;
}
static gboolean parseArgs(int argc, char *argv) {
int i;
if (argc > 1) {
for (i = 1; i < argc; i++) {
if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) {
printHelp();
return FALSE;
} else if (!strcmp(argv[i], "-q") || !strcmp(argv[i], "--quiet")) {
quiet = TRUE;
} else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--version")) {
printf("colorselect, version 1.0\n");
return FALSE;
} else {
if (parseHex(argv[i])) {
revertable = TRUE;
} else{
printHelp();
return FALSE;
}
}
}
}
}
int main(int argc, char *argv) {
GtkWidget *window;
GtkWidget *colorselect;
GtkWidget *vbox;
GtkWidget *hbuttonbox;
GtkWidget *btCancel;
GtkWidget *btApply;
quiet = FALSE;
revertable = FALSE;
if (!parseArgs(argc, argv)) return 0;
ncolor = ocolor;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL); //create the window
gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
gtk_window_set_title(GTK_WINDOW(window), "Color Select");
vbox = gtk_vbox_new(FALSE, 5); //create a vertical box
gtk_container_add(GTK_CONTAINER(window), vbox); //add vbox to the window
gtk_container_set_border_width(GTK_CONTAINER(vbox), 5); //put a 5p border around the vbox
gtk_widget_show(vbox);
colorselect = gtk_color_selection_new(); //create a color selection widget
gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(colorselect), &ocolor);
gtk_color_selection_set_has_opacity_control(GTK_COLOR_SELECTION(colorselect), FALSE);
gtk_color_selection_set_has_palette(GTK_COLOR_SELECTION(colorselect), TRUE);
gtk_box_pack_start(GTK_BOX(vbox), colorselect, TRUE, TRUE, 0); //put colorselect in the vertical box
gtk_widget_show(colorselect);
hbuttonbox = gtk_hbutton_box_new(); //create a horizontal box
gtk_box_pack_start(GTK_BOX(vbox), hbuttonbox, TRUE, TRUE, 0); //put the horizontal box in the vertical box
gtk_container_set_border_width(GTK_CONTAINER(hbuttonbox), 5);
gtk_button_box_set_layout(GTK_BUTTON_BOX(hbuttonbox), GTK_BUTTONBOX_END);
gtk_box_set_spacing(GTK_BOX(hbuttonbox), 5);
gtk_widget_show(hbuttonbox);
btCancel = gtk_button_new_from_stock("gtk-cancel"); //create a cancel button
gtk_container_add(GTK_CONTAINER(hbuttonbox), btCancel); //put the cancel button in the horizontal box
if (revertable && !quiet) gtk_widget_show(btCancel);
if (quiet) btApply = gtk_button_new_from_stock("gtk-ok"); //create an apply button
else btApply = gtk_button_new_from_stock("gtk-apply"); //create an apply button
gtk_container_add(GTK_CONTAINER(hbuttonbox), btApply); //put the apply button in the horizontal box
GTK_WIDGET_SET_FLAGS(btApply, GTK_CAN_DEFAULT);
gtk_widget_grab_default(btApply); //make this button the default
gtk_widget_show(btApply);
g_signal_connect((gpointer)btCancel, "clicked", G_CALLBACK(cancel), NULL);
g_signal_connect((gpointer)btApply, "clicked", G_CALLBACK(apply), NULL);
g_signal_connect(G_OBJECT(colorselect), "color_changed", G_CALLBACK(color_changed_cb), (gpointer)colorselect);
if (revertable) g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(cancel), NULL);
else g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(apply), NULL);
gtk_widget_show(window);
gtk_main();
return 0;
}
[/code]