From 6284720098cb3682f950db427c95ac87c2a10b3c Mon Sep 17 00:00:00 2001 From: Manolo Gouy Date: Mon, 28 Mar 2016 09:25:11 +0000 Subject: Rewrite file src/Fl_arg.cxx under the driver model. Begin giving flesh to the Fl_System_Driver class. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11448 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- FL/Fl_System_Driver.H | 15 +- src/Fl_System_Driver.cxx | 143 +++++++++++++++++- src/Fl_arg.cxx | 193 ++----------------------- src/drivers/Darwin/Fl_Darwin_System_Driver.H | 2 + src/drivers/Darwin/Fl_Darwin_System_Driver.cxx | 17 +++ src/drivers/Posix/Fl_Posix_System_Driver.H | 2 + src/drivers/Posix/Fl_Posix_System_Driver.cxx | 17 ++- src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx | 5 + 8 files changed, 210 insertions(+), 184 deletions(-) diff --git a/FL/Fl_System_Driver.H b/FL/Fl_System_Driver.H index 81128fdcf..bf11d440c 100644 --- a/FL/Fl_System_Driver.H +++ b/FL/Fl_System_Driver.H @@ -54,9 +54,22 @@ typedef struct _XRegion *Fl_Region; \brief A base class for platform specific window handling code. */ class FL_EXPORT Fl_System_Driver { -public: +protected: Fl_System_Driver(); +public: virtual ~Fl_System_Driver(); + static Fl_System_Driver *driver(); + static const int flNoValue; + static const int flWidthValue; + static const int flHeightValue; + static const int flXValue; + static const int flYValue; + static const int flXNegative; + static const int flYNegative; + virtual int single_arg(const char *arg) { return 0; } + virtual int arg_and_value(const char *name, const char *value) { return 0; } + virtual void display_arg(const char *arg) { } + virtual int XParseGeometry(const char*, int*, int*, unsigned int*, unsigned int*); }; #endif // FL_SYSTEM_DRIVER_H diff --git a/src/Fl_System_Driver.cxx b/src/Fl_System_Driver.cxx index 8acd2d4b3..711d9abaa 100644 --- a/src/Fl_System_Driver.cxx +++ b/src/Fl_System_Driver.cxx @@ -17,8 +17,16 @@ // -#include "config_lib.h" #include +#include + +const int Fl_System_Driver::flNoValue = 0x0000; +const int Fl_System_Driver::flWidthValue = 0x0004; +const int Fl_System_Driver::flHeightValue = 0x0008; +const int Fl_System_Driver::flXValue = 0x0001; +const int Fl_System_Driver::flYValue = 0x0002; +const int Fl_System_Driver::flXNegative = 0x0010; +const int Fl_System_Driver::flYNegative = 0x0020; Fl_System_Driver::Fl_System_Driver() @@ -30,6 +38,139 @@ Fl_System_Driver::~Fl_System_Driver() { } +/* the following function was stolen from the X sources as indicated. */ + +/* Copyright Massachusetts Institute of Technology 1985, 1986, 1987 */ +/* $XConsortium: XParseGeom.c,v 11.18 91/02/21 17:23:05 rws Exp $ */ + +/* + Permission to use, copy, modify, distribute, and sell this software and its + documentation for any purpose is hereby granted without fee, provided that + the above copyright notice appear in all copies and that both that + copyright notice and this permission notice appear in supporting + documentation, and that the name of M.I.T. not be used in advertising or + publicity pertaining to distribution of the software without specific, + written prior permission. M.I.T. makes no representations about the + suitability of this software for any purpose. It is provided "as is" + without express or implied warranty. + */ + +/* + * XParseGeometry parses strings of the form + * "=x{+-}{+-}", where + * width, height, xoffset, and yoffset are unsigned integers. + * Example: "=80x24+300-49" + * The equal sign is optional. + * It returns a bitmask that indicates which of the four values + * were actually found in the string. For each value found, + * the corresponding argument is updated; for each value + * not found, the corresponding argument is left unchanged. + */ + +static int ReadInteger(char* string, char** NextString) +{ + int Result = 0; + int Sign = 1; + + if (*string == '+') + string++; + else if (*string == '-') { + string++; + Sign = -1; + } + for (; (*string >= '0') && (*string <= '9'); string++) { + Result = (Result * 10) + (*string - '0'); + } + *NextString = string; + if (Sign >= 0) + return (Result); + else + return (-Result); +} + +int Fl_System_Driver::XParseGeometry(const char* string, int* x, int* y, + unsigned int* width, unsigned int* height) +{ + int mask = Fl_System_Driver::flNoValue; + char *strind; + unsigned int tempWidth = 0, tempHeight = 0; + int tempX = 0, tempY = 0; + char *nextCharacter; + + if ( (string == NULL) || (*string == '\0')) return(mask); + if (*string == '=') + string++; /* ignore possible '=' at beg of geometry spec */ + + strind = (char *)string; + if (*strind != '+' && *strind != '-' && *strind != 'x') { + tempWidth = ReadInteger(strind, &nextCharacter); + if (strind == nextCharacter) + return (0); + strind = nextCharacter; + mask |= flWidthValue; + } + + if (*strind == 'x' || *strind == 'X') { + strind++; + tempHeight = ReadInteger(strind, &nextCharacter); + if (strind == nextCharacter) + return (0); + strind = nextCharacter; + mask |= flHeightValue; + } + + if ((*strind == '+') || (*strind == '-')) { + if (*strind == '-') { + strind++; + tempX = -ReadInteger(strind, &nextCharacter); + if (strind == nextCharacter) + return (0); + strind = nextCharacter; + mask |= flXNegative; + + } else { + strind++; + tempX = ReadInteger(strind, &nextCharacter); + if (strind == nextCharacter) + return(0); + strind = nextCharacter; + } + mask |= flXValue; + if ((*strind == '+') || (*strind == '-')) { + if (*strind == '-') { + strind++; + tempY = -ReadInteger(strind, &nextCharacter); + if (strind == nextCharacter) + return(0); + strind = nextCharacter; + mask |= flYNegative; + + } else { + strind++; + tempY = ReadInteger(strind, &nextCharacter); + if (strind == nextCharacter) + return(0); + strind = nextCharacter; + } + mask |= flYValue; + } + } + + /* If strind isn't at the end of the string the it's an invalid + geometry specification. */ + + if (*strind != '\0') return (0); + + if (mask & flXValue) + *x = tempX; + if (mask & flYValue) + *y = tempY; + if (mask & flWidthValue) + *width = tempWidth; + if (mask & flHeightValue) + *height = tempHeight; + return (mask); +} // // End of "$Id$". diff --git a/src/Fl_arg.cxx b/src/Fl_arg.cxx index 8d56ac22e..5be54dc5e 100644 --- a/src/Fl_arg.cxx +++ b/src/Fl_arg.cxx @@ -20,34 +20,15 @@ // You do not need to call this! Feel free to make up your own switches. #include -#include #include #include -#include +#include #include #include #include #include #include "flstring.h" -#if defined(WIN32) || defined(__APPLE__) // PORTME: Fl_System_Driver - command line arguments -#elif defined(FL_PORTING) -# pragma message "FL_PORTING: implement special command line handling" -#else -#endif - -#if defined(WIN32) || defined(__APPLE__) || defined(FL_PORTING) // PORTME: Fl_System_Driver - parse geometry -int XParseGeometry(const char*, int*, int*, unsigned int*, unsigned int*); -# define NoValue 0x0000 -# define XValue 0x0001 -# define YValue 0x0002 -# define WidthValue 0x0004 -# define HeightValue 0x0008 -# define AllValues 0x000F -# define XNegative 0x0010 -# define YNegative 0x0020 -#endif - static int fl_match(const char *a, const char *s, int atleast = 1) { const char *b = s; while (*a && (*a == *b || tolower(*a) == *b)) {a++; b++;} @@ -176,13 +157,8 @@ int Fl::arg(int argc, char **argv, int &i) { Fl_Tooltip::disable(); i++; return 1; -#ifdef __APPLE__ // PORTME: Fl_System_Driver - platform command line - // The Finder application in MacOS X passes the "-psn_N_NNNNN" option - // to all apps... - } else if (strncmp(s, "psn_", 4) == 0) { + } else if (Fl_System_Driver::driver()->single_arg(s)) { i++; - return 1; -#endif // __APPLE__ // PORTME: Fl_System_Driver - platform command line } const char *v = argv[i+1]; @@ -192,20 +168,15 @@ int Fl::arg(int argc, char **argv, int &i) { if (fl_match(s, "geometry")) { int flags, gx, gy; unsigned int gw, gh; - flags = XParseGeometry(v, &gx, &gy, &gw, &gh); + flags = Fl_System_Driver::driver()->XParseGeometry(v, &gx, &gy, &gw, &gh); if (!flags) return 0; geometry = v; -#if !defined(WIN32) && !defined(__APPLE__) // PORTME: Fl_System_Driver - platform command line } else if (fl_match(s, "display", 2)) { - Fl::display(v); -#endif + Fl_System_Driver::driver()->display_arg(v); -#ifdef __APPLE__ // PORTME: Fl_System_Driver - platform command line - // Xcode in MacOS X may pass "-NSDocumentRevisionsDebugMode YES" - } else if (strcmp(s, "NSDocumentRevisionsDebugMode") == 0) { + } else if (Fl_System_Driver::driver()->arg_and_value(s, v)) { // nothing to do -#endif // __APPLE__ // PORTME: Fl_System_Driver - platform command line } else if (fl_match(s, "title", 2)) { title = v; @@ -225,7 +196,9 @@ int Fl::arg(int argc, char **argv, int &i) { } else if (fl_match(s, "scheme", 1)) { Fl::scheme(v); - } else return 0; // unrecognized + } else { + return 0; // unrecognized + } i += 2; return 2; @@ -310,16 +283,16 @@ void Fl_Window::show(int argc, char **argv) { if (!beenhere) { if (geometry) { int fl = 0, gx = x(), gy = y(); unsigned int gw = w(), gh = h(); - fl = XParseGeometry(geometry, &gx, &gy, &gw, &gh); - if (fl & XNegative) gx = Fl::w()-w()+gx; - if (fl & YNegative) gy = Fl::h()-h()+gy; + fl = Fl_System_Driver::driver()->XParseGeometry(geometry, &gx, &gy, &gw, &gh); + if (fl & Fl_System_Driver::flXNegative) gx = Fl::w()-w()+gx; + if (fl & Fl_System_Driver::flYNegative) gy = Fl::h()-h()+gy; // int mw,mh; minsize(mw,mh); // if (mw > gw) gw = mw; // if (mh > gh) gh = mh; Fl_Widget *r = resizable(); if (!r) resizable(this); // for WIN32 we assume window is not mapped yet: - if (fl & (XValue | YValue)) + if (fl & (Fl_System_Driver::flXValue | Fl_System_Driver::flYValue)) x(-1), resize(gx,gy,gw,gh); else size(gw,gh); @@ -379,148 +352,6 @@ void Fl::args(int argc, char **argv) { int i; if (Fl::args(argc,argv,i) < argc) Fl::error(helpmsg); } -#if defined(WIN32) || defined(__APPLE__) // PORTME: Fl_System_Driver - platform command line arguments - -/* the following function was stolen from the X sources as indicated. */ - -/* Copyright Massachusetts Institute of Technology 1985, 1986, 1987 */ -/* $XConsortium: XParseGeom.c,v 11.18 91/02/21 17:23:05 rws Exp $ */ - -/* -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation, and that the name of M.I.T. not be used in advertising or -publicity pertaining to distribution of the software without specific, -written prior permission. M.I.T. makes no representations about the -suitability of this software for any purpose. It is provided "as is" -without express or implied warranty. -*/ - -/* - * XParseGeometry parses strings of the form - * "=x{+-}{+-}", where - * width, height, xoffset, and yoffset are unsigned integers. - * Example: "=80x24+300-49" - * The equal sign is optional. - * It returns a bitmask that indicates which of the four values - * were actually found in the string. For each value found, - * the corresponding argument is updated; for each value - * not found, the corresponding argument is left unchanged. - */ - -static int ReadInteger(char* string, char** NextString) -{ - int Result = 0; - int Sign = 1; - - if (*string == '+') - string++; - else if (*string == '-') { - string++; - Sign = -1; - } - for (; (*string >= '0') && (*string <= '9'); string++) { - Result = (Result * 10) + (*string - '0'); - } - *NextString = string; - if (Sign >= 0) - return (Result); - else - return (-Result); -} - -int XParseGeometry(const char* string, int* x, int* y, - unsigned int* width, unsigned int* height) -{ - int mask = NoValue; - char *strind; - unsigned int tempWidth = 0, tempHeight = 0; - int tempX = 0, tempY = 0; - char *nextCharacter; - - if ( (string == NULL) || (*string == '\0')) return(mask); - if (*string == '=') - string++; /* ignore possible '=' at beg of geometry spec */ - - strind = (char *)string; - if (*strind != '+' && *strind != '-' && *strind != 'x') { - tempWidth = ReadInteger(strind, &nextCharacter); - if (strind == nextCharacter) - return (0); - strind = nextCharacter; - mask |= WidthValue; - } - - if (*strind == 'x' || *strind == 'X') { - strind++; - tempHeight = ReadInteger(strind, &nextCharacter); - if (strind == nextCharacter) - return (0); - strind = nextCharacter; - mask |= HeightValue; - } - - if ((*strind == '+') || (*strind == '-')) { - if (*strind == '-') { - strind++; - tempX = -ReadInteger(strind, &nextCharacter); - if (strind == nextCharacter) - return (0); - strind = nextCharacter; - mask |= XNegative; - - } else { - strind++; - tempX = ReadInteger(strind, &nextCharacter); - if (strind == nextCharacter) - return(0); - strind = nextCharacter; - } - mask |= XValue; - if ((*strind == '+') || (*strind == '-')) { - if (*strind == '-') { - strind++; - tempY = -ReadInteger(strind, &nextCharacter); - if (strind == nextCharacter) - return(0); - strind = nextCharacter; - mask |= YNegative; - - } else { - strind++; - tempY = ReadInteger(strind, &nextCharacter); - if (strind == nextCharacter) - return(0); - strind = nextCharacter; - } - mask |= YValue; - } - } - - /* If strind isn't at the end of the string the it's an invalid - geometry specification. */ - - if (*strind != '\0') return (0); - - if (mask & XValue) - *x = tempX; - if (mask & YValue) - *y = tempY; - if (mask & WidthValue) - *width = tempWidth; - if (mask & HeightValue) - *height = tempHeight; - return (mask); -} - -#elif defined(FL_PORTING) - -int XParseGeometry(const char* string, int* x, int* y, unsigned int* width, unsigned int* height) { return 0; } - -#endif // ifdef WIN32 - // // End of "$Id$". // diff --git a/src/drivers/Darwin/Fl_Darwin_System_Driver.H b/src/drivers/Darwin/Fl_Darwin_System_Driver.H index edba76686..a95bac019 100644 --- a/src/drivers/Darwin/Fl_Darwin_System_Driver.H +++ b/src/drivers/Darwin/Fl_Darwin_System_Driver.H @@ -41,6 +41,8 @@ class Fl_Darwin_System_Driver : public Fl_System_Driver { public: + virtual int single_arg(const char *arg); + virtual int arg_and_value(const char *name, const char *value); }; #endif // FL_DARWIN_SYSTEM_DRIVER_H diff --git a/src/drivers/Darwin/Fl_Darwin_System_Driver.cxx b/src/drivers/Darwin/Fl_Darwin_System_Driver.cxx index fa6893784..bbab50be9 100644 --- a/src/drivers/Darwin/Fl_Darwin_System_Driver.cxx +++ b/src/drivers/Darwin/Fl_Darwin_System_Driver.cxx @@ -19,6 +19,7 @@ #include "../../config_lib.h" #include "Fl_Darwin_System_Driver.H" +#include //const char* fl_local_alt = "\xe2\x8c\xa5\\"; // U+2325 (option key) const char* fl_local_alt = "⌥\\"; // U+2325 (option key) @@ -29,6 +30,22 @@ const char* fl_local_meta = "⌘\\"; // U+2318 (place of interest sign) //const char* fl_local_shift = "\xe2\x87\xa7\\"; // U+21E7 (upwards white arrow) const char* fl_local_shift = "⇧\\"; // U+21E7 (upwards white arrow) +Fl_System_Driver *Fl_System_Driver::driver() { + static Fl_System_Driver *d = new Fl_Darwin_System_Driver(); + return d; +} + +int Fl_Darwin_System_Driver::single_arg(const char *arg) { + // The Finder application in MacOS X passes the "-psn_N_NNNNN" option to all apps. + return (strncmp(arg, "psn_", 4) == 0); +} + +int Fl_Darwin_System_Driver::arg_and_value(const char *name, const char *value) { + // Xcode in MacOS X may pass "-NSDocumentRevisionsDebugMode YES" + return strcmp(name, "NSDocumentRevisionsDebugMode") == 0; +} + + // // End of "$Id$". // diff --git a/src/drivers/Posix/Fl_Posix_System_Driver.H b/src/drivers/Posix/Fl_Posix_System_Driver.H index 9a1ca7d1d..c18e3be0e 100644 --- a/src/drivers/Posix/Fl_Posix_System_Driver.H +++ b/src/drivers/Posix/Fl_Posix_System_Driver.H @@ -41,6 +41,8 @@ class Fl_Posix_System_Driver : public Fl_System_Driver { public: + virtual void display_arg(const char *arg); + virtual int XParseGeometry(const char*, int*, int*, unsigned int*, unsigned int*); }; #endif // FL_POSIX_SYSTEM_DRIVER_H diff --git a/src/drivers/Posix/Fl_Posix_System_Driver.cxx b/src/drivers/Posix/Fl_Posix_System_Driver.cxx index 886397b35..16c71f56e 100644 --- a/src/drivers/Posix/Fl_Posix_System_Driver.cxx +++ b/src/drivers/Posix/Fl_Posix_System_Driver.cxx @@ -17,8 +17,9 @@ // -#include "../../config_lib.h" #include "Fl_Posix_System_Driver.H" +#include + // Pointers you can use to change FLTK to a foreign language. // Note: Similar pointers are defined in FL/fl_ask.H and src/fl_ask.cxx @@ -27,6 +28,20 @@ const char* fl_local_ctrl = "Ctrl"; const char* fl_local_meta = "Meta"; const char* fl_local_shift = "Shift"; +Fl_System_Driver *Fl_System_Driver::driver() { + static Fl_System_Driver *d = new Fl_Posix_System_Driver(); + return d; +} + +void Fl_Posix_System_Driver::display_arg(const char *arg) { + Fl::display(arg); +} + +int Fl_Posix_System_Driver::XParseGeometry(const char* string, int* x, int* y, + unsigned int* width, unsigned int* height) { + return ::XParseGeometry(string, x, y, width, height); +} + // // End of "$Id$". // diff --git a/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx b/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx index 1a59a2c05..b3678c097 100644 --- a/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx +++ b/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx @@ -27,6 +27,11 @@ const char* fl_local_meta = "Meta"; const char* fl_local_shift = "Shift"; #endif +Fl_System_Driver *Fl_System_Driver::driver() { + static Fl_System_Driver *d = new Fl_WinAPI_System_Driver(); + return d; +} + // // End of "$Id$". // -- cgit v1.2.3