summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--FL/Fl_Color_Chooser.H8
-rw-r--r--FL/platform_types.h6
-rw-r--r--examples/Makefile2
-rw-r--r--src/Fl_Color_Chooser.cxx77
4 files changed, 89 insertions, 4 deletions
diff --git a/FL/Fl_Color_Chooser.H b/FL/Fl_Color_Chooser.H
index e9a5c5775..db4fae37a 100644
--- a/FL/Fl_Color_Chooser.H
+++ b/FL/Fl_Color_Chooser.H
@@ -3,7 +3,7 @@
//
// Color chooser header file for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2019 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -94,6 +94,10 @@ public:
them. The pull-down menu lets the user set the input fields to show RGB,
HSV, or 8-bit RGB (0 to 255).
+ The user can press CTRL-C to copy the currently selected color value as
+ text in RGB hex format with leading zeroes to the clipboard, for instance
+ \p FL_GREEN would be '00FF00' (since FLTK 1.4.0).
+
fl_color_chooser() returns non-zero if the user picks ok, and updates the
RGB values. If the user picks cancel or closes the window this returns
zero and leaves RGB unchanged.
@@ -119,6 +123,8 @@ class FL_EXPORT Fl_Color_Chooser : public Fl_Group {
static void mode_cb(Fl_Widget*, void*);
public:
+ int handle(int e);
+
/**
Returns which Fl_Color_Chooser variant is currently active
\return color modes are rgb(0), byte(1), hex(2), or hsv(3)
diff --git a/FL/platform_types.h b/FL/platform_types.h
index 771f611a9..c13448614 100644
--- a/FL/platform_types.h
+++ b/FL/platform_types.h
@@ -116,7 +116,11 @@ typedef int FL_SOCKET;
# endif
typedef struct HGLRC__ *GLContext;
#include <sys/stat.h>
-struct dirent {char d_name[1];};
+#ifdef __MINGW32__
+# include <dirent.h>
+#else
+ struct dirent {char d_name[1];};
+#endif
#elif defined(__ANDROID__)
diff --git a/examples/Makefile b/examples/Makefile
index 6bc8d305b..1b82250f0 100644
--- a/examples/Makefile
+++ b/examples/Makefile
@@ -2,7 +2,7 @@ include Makefile.FLTK
RM = rm -f
SHELL = /bin/sh
-#.SILENT:
+.SILENT:
# Executables
ALL = browser-simple$(EXEEXT) \
diff --git a/src/Fl_Color_Chooser.cxx b/src/Fl_Color_Chooser.cxx
index bf0003ff8..283424fca 100644
--- a/src/Fl_Color_Chooser.cxx
+++ b/src/Fl_Color_Chooser.cxx
@@ -3,7 +3,7 @@
//
// Color chooser for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2019 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -460,6 +460,81 @@ void Fl_Color_Chooser::mode(int newMode)
choice.do_callback();
}
+// Small local helper function:
+// Copy hex color value ('RRGGBB') of Fl_Color_Chooser to clipboard.
+// Always returns 1 (event was used).
+
+static int copy_rgb(double r, double g, double b) {
+ char buf[8];
+ int len;
+ len = sprintf(buf, "%02X%02X%02X", int(r * 255 + .5), int(g * 255 + .5), int(b * 255 + .5));
+ Fl::copy(buf, len, 1);
+ // printf("copied '%s' to clipboard\n", buf); // Debug
+ return 1;
+}
+
+/**
+ Handles all events received by this widget.
+
+ This specific handle() method processes the standard 'copy' function
+ as seen in other input widgets. It copies the current color value to
+ the clipboard as a string in RGB format ('RRGGBB').
+
+ This format is independent of the Fl_Color_Chooser display format
+ setting. No other formats are supplied.
+
+ The keyboard events handled are:
+ - ctrl-c
+ - ctrl-x
+ - ctrl-Insert
+
+ All other events are processed by the parent class \c Fl_Group.
+
+ This enables the \b user to choose a color value, press
+ \p ctrl-c to copy the value to the clipboard and paste it into
+ a color selection widget in another application window or any
+ other text input (e.g. a preferences dialog or an editor).
+
+ \note Keyboard event handling by the current focus widget has
+ priority, hence moving the focus to one of the buttons or
+ selecting text in one of the input widgets effectively
+ disables this special method.
+
+ \param[in] e current event
+ \returns 1 if event has been handled, 0 otherwise
+
+ \see Fl_Group::handle(int)
+*/
+
+int Fl_Color_Chooser::handle(int e) {
+
+ unsigned int mods = Fl::event_state() & (FL_META | FL_CTRL | FL_ALT);
+ unsigned int shift = Fl::event_state() & FL_SHIFT;
+
+ switch (e) {
+ case FL_KEYBOARD:
+ case FL_SHORTCUT:
+ // ignore CTRL-SHIFT-C, CTRL-SHIFT-X and CTRL-SHIFT-Insert
+ if (shift)
+ return Fl_Group::handle(e);
+ switch (Fl::event_key()) {
+ case FL_Insert:
+ if (mods == FL_CTRL)
+ return copy_rgb(r_, g_, b_);
+ break;
+ case 'c':
+ case 'x':
+ if (mods == FL_COMMAND)
+ return copy_rgb(r_, g_, b_);
+ break;
+ default:
+ break;
+ }
+ default:
+ break;
+ }
+ return Fl_Group::handle(e);
+}
////////////////////////////////////////////////////////////////