From Bill:

The attached patch rearranges things so the function
Fl::get_system_colors
parses the switches passed by -fg, -bg, or -bg2.  This allows you to
interpret these switches without using Fl_Window::show(argc,argv), which
is inconvenent for a program that displays many windows, none of which
are the "main" window.


git-svn-id: file:///fltk/svn/fltk/trunk@114 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Michael R Sweet 1998-12-02 16:00:48 +00:00
parent c4c164a707
commit e467c3e8a9
2 changed files with 74 additions and 71 deletions

View File

@ -1,5 +1,5 @@
//
// "$Id: Fl_arg.cxx,v 1.3 1998/10/21 14:20:31 mike Exp $"
// "$Id: Fl_arg.cxx,v 1.4 1998/12/02 16:00:47 mike Exp $"
//
// Optional argument initialization code for the Fast Light Tool Kit (FLTK).
//
@ -46,7 +46,7 @@ int XParseGeometry(const char*, int*, int*, unsigned int*, unsigned int*);
#define YNegative 0x0020
#endif
static int match(const char *a, const char *match, int atleast = 2) {
static int match(const char *a, const char *match, int atleast = 1) {
const char *b = match;
while (*a && (*a == *b || tolower(*a) == *b)) {a++; b++;}
return !*a && b >= match+atleast;
@ -57,11 +57,12 @@ extern char fl_show_iconic; // in Fl_x.C
static char arg_called;
static char return_i;
static const char *name;
static const char *fg;
static const char *bg;
static const char *bg2;
static const char *geometry;
static const char *title;
// these are in Fl_get_system_colors and are set by the switches:
extern const char *fl_fg;
extern const char *fl_bg;
extern const char *fl_bg2;
// consume a switch from argv. Returns number of words eaten, 0 on error:
int Fl::arg(int argc, char **argv, int &i) {
@ -107,13 +108,13 @@ int Fl::arg(int argc, char **argv, int &i) {
name = v;
} else if (match(s, "bg2", 3) || match(s, "background2", 11)) {
bg2 = v;
fl_bg2 = v;
} else if (match(s, "bg") || match(s, "background")) {
bg = v;
fl_bg = v;
} else if (match(s, "fg") || match(s, "foreground")) {
fg = v;
fl_fg = v;
} else return 0; // unrecognized
@ -137,47 +138,6 @@ int Fl::args(int argc, char** argv, int& i, int (*cb)(int,char**,int&)) {
return i;
}
#ifdef WIN32
#include <stdio.h>
// simulation of XParseColor:
int fl_parse_color(const char* p, uchar& r, uchar& g, uchar& b) {
if (*p == '#') p++;
int n = strlen(p);
int m = n/3;
const char *pattern = 0;
switch(m) {
case 1: pattern = "%1x%1x%1x"; break;
case 2: pattern = "%2x%2x%2x"; break;
case 3: pattern = "%3x%3x%3x"; break;
case 4: pattern = "%4x%4x%4x"; break;
default: return 0;
}
int R,G,B; if (sscanf(p,pattern,&R,&G,&B) != 3) return 0;
r = R; g = G; b = B;
return 1;
}
static void parsecolor(const char *name, void (*func)(uchar,uchar,uchar)) {
uchar r,g,b;
if (!name) return;
if (!fl_parse_color(name, r,g,b))
Fl::error("Unknown color: %s", name);
else
func(r,g,b);
}
#else
static void parsecolor(const char *name, void (*func)(uchar,uchar,uchar)) {
XColor x;
if (!name) return;
if (!XParseColor(fl_display, fl_colormap, name, &x))
Fl::error("Unknown color: %s", name);
else
func(x.red>>8, x.green>>8, x.blue>>8);
}
#endif
// show a main window, use any parsed arguments
void Fl_Window::show(int argc, char **argv) {
@ -188,9 +148,6 @@ void Fl_Window::show(int argc, char **argv) {
if (!beenhere) {
beenhere = 1;
Fl::get_system_colors(); // opens display! May call Fl::fatal()
parsecolor(fg, Fl::foreground);
parsecolor(bg, Fl::background);
parsecolor(bg2,Fl::background2);
if (geometry) {
int flags = 0, gx = x(), gy = y(); unsigned int gw = w(), gh = h();
flags = XParseGeometry(geometry, &gx, &gy, &gw, &gh);
@ -240,11 +197,11 @@ void Fl_Window::show(int argc, char **argv) {
static const char * const helpmsg =
"options are:\n"
" -di[splay] host:n.n\n"
" -ge[ometry] WxH+X+Y\n"
" -ti[tle] windowtitle\n"
" -na[me] classname\n"
" -ic[onic]\n"
" -d[isplay] host:n.n\n"
" -g[eometry] WxH+X+Y\n"
" -t[itle] windowtitle\n"
" -n[ame] classname\n"
" -i[conic]\n"
" -fg color\n"
" -bg color\n"
" -bg2 color";
@ -394,5 +351,5 @@ int XParseGeometry(const char* string, int* x, int* y,
#endif // ifdef WIN32
//
// End of "$Id: Fl_arg.cxx,v 1.3 1998/10/21 14:20:31 mike Exp $".
// End of "$Id: Fl_arg.cxx,v 1.4 1998/12/02 16:00:47 mike Exp $".
//

View File

@ -1,5 +1,5 @@
//
// "$Id: Fl_get_system_colors.cxx,v 1.3 1998/10/21 14:20:34 mike Exp $"
// "$Id: Fl_get_system_colors.cxx,v 1.4 1998/12/02 16:00:48 mike Exp $"
//
// System color support for the Fast Light Tool Kit (FLTK).
//
@ -61,33 +61,79 @@ void Fl::background2(uchar r, uchar g, uchar b) {
set_others();
}
// these are set by Fl::args() and override any system colors:
const char *fl_fg;
const char *fl_bg;
const char *fl_bg2;
#ifdef WIN32
static void getsyscolor(int what, void (*func)(uchar,uchar,uchar)) {
DWORD x = GetSysColor(what);
uchar r = uchar(x&255);
uchar g = uchar(x>>8);
uchar b = uchar(x>>16);
func(r,g,b);
#include <stdio.h>
// simulation of XParseColor:
int fl_parse_color(const char* p, uchar& r, uchar& g, uchar& b) {
if (*p == '#') p++;
int n = strlen(p);
int m = n/3;
const char *pattern = 0;
switch(m) {
case 1: pattern = "%1x%1x%1x"; break;
case 2: pattern = "%2x%2x%2x"; break;
case 3: pattern = "%3x%3x%3x"; break;
case 4: pattern = "%4x%4x%4x"; break;
default: return 0;
}
int R,G,B; if (sscanf(p,pattern,&R,&G,&B) != 3) return 0;
r = R; g = G; b = B;
return 1;
}
static void
getsyscolor(int what, const char* arg, void (*func)(uchar,uchar,uchar))
{
if (arg) {
uchar r,g,b;
if (!fl_parse_color(arg, r,g,b))
Fl::error("Unknown color: %s", arg);
else
func(r,g,b);
} else {
DWORD x = GetSysColor(what);
func(uchar(x&255), uchar(x>>8), uchar(x>>16));
}
}
void Fl::get_system_colors() {
getsyscolor(COLOR_WINDOWTEXT, Fl::foreground);
getsyscolor(COLOR_BTNFACE, Fl::background);
getsyscolor(COLOR_WINDOW, Fl::background2);
getsyscolor(COLOR_WINDOWTEXT, fl_fg, Fl::foreground);
getsyscolor(COLOR_BTNFACE, fl_bg, Fl::background);
getsyscolor(COLOR_WINDOW, fl_bg2,Fl::background2);
}
#else
// For X we should do something. KDE stores these colors in some standard
// place, where?
// For X we should do something. KDE and Gnome store these colors in
// some standard places, where?
static void
getsyscolor(const char *arg, void (*func)(uchar,uchar,uchar)) {
if (arg) {
XColor x;
if (!XParseColor(fl_display, fl_colormap, arg, &x))
Fl::error("Unknown color: %s", arg);
else
func(x.red>>8, x.green>>8, x.blue>>8);
}
}
void Fl::get_system_colors()
{
fl_open_display();
getsyscolor(fl_fg, Fl::foreground);
getsyscolor(fl_bg, Fl::background);
getsyscolor(fl_bg2,Fl::background2);
}
#endif
//
// End of "$Id: Fl_get_system_colors.cxx,v 1.3 1998/10/21 14:20:34 mike Exp $".
// End of "$Id: Fl_get_system_colors.cxx,v 1.4 1998/12/02 16:00:48 mike Exp $".
//