// // "$Id$" // // Startup, scheme and theme handling code for the Fast Light // Tool Kit (FLTK). // // Copyright 1998-1999 by Bill Spitzak and others. // // 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. // // // The "scheme" theme. This reads an earlier design for configuring fltk, // a text-based "scheme" file, which described exactly what to put into // the style structures for each widget class. We rejected this design // because it was apparent that all interesting themes were completely // defined by plugin code and thus the only part that was being used was // the "themes" line from the file. // The scheme argument (set by Fl_Style::scheme() or by the -scheme // switch when Fl::arg() is used) is used to choose the scheme file to // read, by adding ".scheme" to the end. If not specified or null, // "default" is used. There are some sample scheme files provided for // your amusement, such as OldMotif.scheme. // // Modified for use with EDE by Martin Pekar 07/02/2002 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef _WIN32 #include #else #include #define access(a,b) _access(a,b) #define R_OK 04 #endif #ifndef PATH_MAX #define PATH_MAX 128 #endif static Fl_Color grok_color(FLE_Config* cf, const char *colstr) { char *val=0; const char *p = colstr; val = cf->read_string("aliases", colstr); if(val) p = val; char* q; long l = strtoul(p, &q, 0); if(!*q) return (Fl_Color)l; //if(val) delete []val; //LEAK!! return fl_rgb(p); } static Fl_Font grok_font(FLE_Config *cf, const char* fontstr) { char *val; const char *p = fontstr; val = cf->read_string("aliases", fontstr); if(val) p = val; char* q; long l = strtoul(p, &q, 0); if(!*q) return fl_fonts+l; //if(val) delete []val; //LEAK!! return fl_find_font(p); } //////////////////////////////////////////////////////////////// extern "C" bool fltk_theme() { char temp[PATH_MAX]; /* const char* scheme = Fl_Style::scheme(); if (!scheme || !*scheme) scheme = "default"; char temp[PATH_MAX]; snprintf(temp, PATH_MAX, "%s.scheme", scheme); char sfile_buf[PATH_MAX];*/ const char* sfile = fle_find_config_file("schemes/Active.scheme", 0); if (!sfile) { fprintf(stderr, "Cannot find default scheme \"%s\"\n", sfile); return false; } static bool recurse=false; if (recurse) { fprintf(stderr, "%s recusively loaded scheme.theme\n", sfile); return false; } //conf_clear_cache(); FLE_Config conf(sfile); //if (!::getconf(sfile, "general/themes", temp, sizeof(temp))) char *themefile = conf.read_string("general", "themes"); if(themefile && !conf.error()) { recurse = true; Fl_Theme f = Fl_Style::load_theme(themefile); if(f) f(); else fprintf(stderr,"Unable to load %s theme\n", themefile); recurse = false; delete []themefile; } char *valstr; Fl_Color col; //if(!::getconf(sfile, "global colors/background", valstr, sizeof(valstr))) { valstr = conf.read_string("global colors", "background"); if(valstr && !conf.error()) { col = grok_color(&conf, valstr); fl_background(fl_get_color(col)); delete []valstr; } static struct { const char* key; Fl_Color col; } colors[] = { { "DARK1", FL_DARK1 }, { "DARK2", FL_DARK2 }, { "DARK3", FL_DARK3 }, { "LIGHT1", FL_LIGHT1 }, { "LIGHT2", FL_LIGHT2 }, { "LIGHT3", FL_LIGHT3 }, { 0, 0 } }; for (int i = 0; colors[i].key; i++) { snprintf(temp, sizeof(temp)-1, "%s", colors[i].key); //int res = ::getconf(sfile, temp, valstr, sizeof(valstr)); valstr = conf.read_string("global colors", temp); int res = conf.error(); if(!res && valstr) { col = grok_color(&conf, valstr); fl_set_color(colors[i].col, col); delete []valstr; } } //conf_list section_list = 0, key_list = 0; //conf_entry* cent; SectionList *section_list; Section *cent=0; Fl_Font font; Fl_Labeltype labeltype; Fl_Boxtype boxtype; //if(!getconf_sections(sfile, "widgets", §ion_list)) section_list = conf.section_list("widgets"); if(section_list) { //for (cent = section_list; cent; cent = cent->next) for(cent = section_list->first(); cent; cent=section_list->next()) { //Fl_Style* style = Fl_Style::find(cent->key); Fl_Style* style = Fl_Style::find(cent->name); if(!style) continue; conf.set_section(cent); // box around widget //if(!getconf_list(key_list, "box", valstr, sizeof(valstr))) if( (valstr=conf.read_string("box")) ) { if ( (boxtype = Fl_Boxtype_::find(valstr)) ) style->box = boxtype; delete []valstr; } // box around buttons within widget //if (!getconf_list(key_list, "button box", valstr, sizeof(valstr))) if( (valstr=conf.read_string("button box")) ) { if ( (boxtype = Fl_Boxtype_::find(valstr)) ) style->button_box = boxtype; delete []valstr; } // color of widget background //if (!getconf_list(key_list, "color", valstr, sizeof(valstr))) if( (valstr=conf.read_string("color")) ) { style->color = grok_color(&conf, valstr); delete []valstr; } // color of widget's label //if (!getconf_list(key_list, "label color", valstr, sizeof(valstr))) if( (valstr=conf.read_string("label color")) ) { style->label_color = grok_color(&conf, valstr); delete []valstr; } // color of widget's background when widget is selected //if (!getconf_list(key_list, "selection color", valstr, sizeof(valstr))) if( (valstr=conf.read_string("selection color" )) ) { style->selection_color = grok_color(&conf, valstr); delete []valstr; } // color of widget's text when text selected // color of widget's label when widget selected // color of widget's glyph when widget selected and no glyph box //if (!getconf_list(key_list, "selection text color", valstr, sizeof(valstr))) if( (valstr=conf.read_string("selection text color")) ) { style->selection_text_color = grok_color(&conf, valstr); delete []valstr; } // color of widget's background when widget is highlighted //if (!getconf_list(key_list, "highlight color", valstr, sizeof(valstr))) if( (valstr=conf.read_string("highlight color" ))) { style->highlight_color = grok_color(&conf, valstr); delete []valstr; } // color of widget's label when widget highlighted // color of widget's glyph/text when widget highlighted and no text/glyph box //if (!getconf_list(key_list, "highlight label color", valstr, sizeof(valstr))) if( (valstr=conf.read_string("highlight label color" ))) { style->highlight_label_color = grok_color(&conf, valstr); delete []valstr; } // color of text/glyph within widget //if (!getconf_list(key_list, "text color", valstr, sizeof(valstr))) if( (valstr=conf.read_string("text color")) ) { style->text_color = grok_color(&conf, valstr); delete []valstr; } // font used for widget's label //if (!getconf_list(key_list, "label font", valstr, sizeof(valstr))) if( (valstr=conf.read_string("label font")) ) { if ( (font = grok_font(&conf, valstr)) ) style->label_font = font; delete []valstr; } // font used for text within widget //if (!getconf_list(key_list, "text font", valstr, sizeof(valstr))) if( (valstr=conf.read_string("text font" )) ) { if ( (font = grok_font(&conf, valstr)) ) style->text_font = font; delete []valstr; } // type of widget's label //if (!getconf_list(key_list, "label type", valstr, sizeof(valstr))) if( (valstr=conf.read_string("label type" )) ) { if ( (labeltype = Fl_Labeltype_::find(valstr)) ) style->label_type = labeltype; delete []valstr; } // font size of widget's label //if (!getconf_list(key_list, "label size", valstr, sizeof(valstr))) if( (valstr=conf.read_string("label size")) ) { style->label_size = (int)strtol(valstr,0,0); delete []valstr; } // font size of text within widget //if (!getconf_list(key_list, "text size", valstr, sizeof(valstr))) if( (valstr=conf.read_string("text size")) ) { style->text_size = (int)strtol(valstr,0,0); delete []valstr; } // leading //if (!getconf_list(key_list, "leading", valstr, sizeof(valstr))) if( (valstr=conf.read_string("leading")) ) { style->leading = (int)strtol(valstr,0,0); delete []valstr; } // font encoding //if (!getconf_list(key_list, "font encoding", valstr, sizeof(valstr))) if( (valstr=conf.read_string("font encoding")) ) { fl_encoding(valstr); //delete []valstr; //LEAK?? } //conf_list_free(&key_list); } //conf_list_free(§ion_list); } return true; } // // End of "$Id$". //