Include a stripped-down version of FLTK in tree and add a USE_INCLUDED_FLTK option to build against it.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4603 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/common/fltk/FL/Fl_Preferences.H b/common/fltk/FL/Fl_Preferences.H
new file mode 100644
index 0000000..8fa3f04
--- /dev/null
+++ b/common/fltk/FL/Fl_Preferences.H
@@ -0,0 +1,276 @@
+//
+// "$Id: Fl_Preferences.H 7949 2010-12-05 00:38:16Z greg.ercolano $"
+//
+// Preferences .
+//
+// Copyright 2002-2010 by Matthias Melcher.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Library General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Library General Public License for more details.
+//
+// You should have received a copy of the GNU Library General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+// USA.
+//
+// Please report all bugs and problems on the following page:
+//
+// http://www.fltk.org/str.php
+//
+
+/* \file
+ Fl_Preferences class . */
+
+#ifndef Fl_Preferences_H
+# define Fl_Preferences_H
+
+# include <stdio.h>
+# include "Fl_Export.H"
+
+/**
+ \brief Fl_Preferences provides methods to store user
+ settings between application starts.
+
+ It is similar to the
+ Registry on WIN32 and Preferences on MacOS, and provides a
+ simple configuration mechanism for UNIX.
+
+ Fl_Preferences uses a hierarchy to store data. It
+ bundles similar data into groups and manages entries into those
+ groups as name/value pairs.
+
+ Preferences are stored in text files that can be edited
+ manually. The file format is easy to read and relatively
+ forgiving. Preferences files are the same on all platforms. User
+ comments in preference files are preserved. Filenames are unique
+ for each application by using a vendor/application naming
+ scheme. The user must provide default values for all entries to
+ ensure proper operation should preferences be corrupted or not
+ yet exist.
+
+ Entries can be of any length. However, the size of each
+ preferences file should be kept small for performance
+ reasons. One application can have multiple preferences files.
+ Extensive binary data however should be stored in separate
+ files: see getUserdataPath().
+
+ \note Starting with FLTK 1.3, preference databases are expected to
+ be in utf8 encoding. Previous databases were stored in the
+ current chracter set or code page which renders them incompatible
+ for text entries using international characters.
+ */
+class FL_EXPORT Fl_Preferences {
+
+public:
+ /**
+ Define the scope of the preferences.
+ */
+ enum Root {
+ SYSTEM=0, ///< Preferences are used system-wide
+ USER ///< Preferences apply only to the current user
+ };
+
+ /**
+ Every Fl_Preferences-Group has a uniqe ID.
+
+ ID's can be retrieved from an Fl_Preferences-Group and can then be used
+ to create more Fl_Preference references to the same data set, as long as the
+ database remains open.
+ */
+ typedef void *ID;
+
+ static const char *newUUID();
+
+ Fl_Preferences( Root root, const char *vendor, const char *application );
+ Fl_Preferences( const char *path, const char *vendor, const char *application );
+ Fl_Preferences( Fl_Preferences &parent, const char *group );
+ Fl_Preferences( Fl_Preferences *parent, const char *group );
+ Fl_Preferences( Fl_Preferences &parent, int groupIndex );
+ Fl_Preferences( Fl_Preferences *parent, int groupIndex );
+ Fl_Preferences(const Fl_Preferences&);
+ Fl_Preferences( ID id );
+ virtual ~Fl_Preferences();
+
+ /** Return an ID that can later be reused to open more references to this dataset.
+ */
+ ID id() { return (ID)node; }
+
+ /** Remove the group with this ID from a database.
+ */
+ static char remove(ID id_) { return ((Node*)id_)->remove(); }
+
+ /** Return the name of this entry.
+ */
+ const char *name() { return node->name(); }
+
+ /** Return the the full path to this entry.
+ */
+ const char *path() { return node->path(); }
+
+ int groups();
+ const char *group( int num_group );
+ char groupExists( const char *key );
+ char deleteGroup( const char *group );
+ char deleteAllGroups();
+
+ int entries();
+ const char *entry( int index );
+ char entryExists( const char *key );
+ char deleteEntry( const char *entry );
+ char deleteAllEntries();
+
+ char clear();
+
+ char set( const char *entry, int value );
+ char set( const char *entry, float value );
+ char set( const char *entry, float value, int precision );
+ char set( const char *entry, double value );
+ char set( const char *entry, double value, int precision );
+ char set( const char *entry, const char *value );
+ char set( const char *entry, const void *value, int size );
+
+ char get( const char *entry, int &value, int defaultValue );
+ char get( const char *entry, float &value, float defaultValue );
+ char get( const char *entry, double &value, double defaultValue );
+ char get( const char *entry, char *&value, const char *defaultValue );
+ char get( const char *entry, char *value, const char *defaultValue, int maxSize );
+ char get( const char *entry, void *&value, const void *defaultValue, int defaultSize );
+ char get( const char *entry, void *value, const void *defaultValue, int defaultSize, int maxSize );
+
+ int size( const char *entry );
+
+ char getUserdataPath( char *path, int pathlen );
+
+ void flush();
+
+ // char export( const char *filename, Type fileFormat );
+ // char import( const char *filename );
+
+ /**
+ 'Name' provides a simple method to create numerical or more complex
+ procedural names for entries and groups on the fly.
+
+ Example: prefs.set(Fl_Preferences::Name("File%d",i),file[i]);.
+
+ See test/preferences.cxx as a sample for writing arrays into preferences.<p>
+ 'Name' is actually implemented as a class inside Fl_Preferences. It casts
+ into const char* and gets automatically destroyed after the enclosing call
+ ends.
+ */
+ class FL_EXPORT Name {
+
+ char *data_;
+
+ public:
+ Name( unsigned int n );
+ Name( const char *format, ... );
+
+ /**
+ Return the Name as a "C" string.
+ \internal
+ */
+ operator const char *() { return data_; }
+ ~Name();
+ };
+
+ /** \internal An entry associates a preference name to its corresponding value */
+ struct Entry {
+ char *name, *value;
+ };
+
+private:
+ Fl_Preferences() : node(0), rootNode(0) { }
+ Fl_Preferences &operator=(const Fl_Preferences&);
+
+ static char nameBuffer[128];
+ static char uuidBuffer[40];
+ static Fl_Preferences *runtimePrefs;
+
+ class RootNode;
+
+ class FL_EXPORT Node { // a node contains a list to all its entries
+ // and all means to manage the tree structure
+ Node *child_, *next_;
+ union { // these two are mutually exclusive
+ Node *parent_; // top_ bit clear
+ RootNode *root_; // top_ bit set
+ };
+ char *path_;
+ Entry *entry_;
+ int nEntry_, NEntry_;
+ unsigned char dirty_:1;
+ unsigned char top_:1;
+ unsigned char indexed_:1;
+ // indexing routines
+ Node **index_;
+ int nIndex_, NIndex_;
+ void createIndex();
+ void updateIndex();
+ void deleteIndex();
+ public:
+ static int lastEntrySet;
+ public:
+ Node( const char *path );
+ ~Node();
+ // node methods
+ int write( FILE *f );
+ const char *name();
+ const char *path() { return path_; }
+ Node *find( const char *path );
+ Node *search( const char *path, int offset=0 );
+ Node *childNode( int ix );
+ Node *addChild( const char *path );
+ void setParent( Node *parent );
+ Node *parent() { return top_?0L:parent_; }
+ void setRoot(RootNode *r) { root_ = r; top_ = 1; }
+ RootNode *findRoot();
+ char remove();
+ char dirty();
+ void deleteAllChildren();
+ // entry methods
+ int nChildren();
+ const char *child( int ix );
+ void set( const char *name, const char *value );
+ void set( const char *line );
+ void add( const char *line );
+ const char *get( const char *name );
+ int getEntry( const char *name );
+ char deleteEntry( const char *name );
+ void deleteAllEntries();
+ int nEntry() { return nEntry_; }
+ Entry &entry(int i) { return entry_[i]; }
+ };
+ friend class Node;
+
+ class FL_EXPORT RootNode { // the root node manages file paths and basic reading and writing
+ Fl_Preferences *prefs_;
+ char *filename_;
+ char *vendor_, *application_;
+ public:
+ RootNode( Fl_Preferences *, Root root, const char *vendor, const char *application );
+ RootNode( Fl_Preferences *, const char *path, const char *vendor, const char *application );
+ RootNode( Fl_Preferences * );
+ ~RootNode();
+ int read();
+ int write();
+ char getPath( char *path, int pathlen );
+ };
+ friend class RootNode;
+
+protected:
+ Node *node;
+ RootNode *rootNode;
+};
+
+#endif // !Fl_Preferences_H
+
+//
+// End of "$Id: Fl_Preferences.H 7949 2010-12-05 00:38:16Z greg.ercolano $".
+//