// resource.cc for bbsmount - an tool for mounting in X11 // // Copyright (c) 2001 by Miroslav Jezbera, jezberam@upcase.inf.upol.cz // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program 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 General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // (See the included file COPYING / GPL-2.0) // #if HAVE_CONFIG_H # include "config.h" #endif /* HAVE_CONFIG_H */ #ifdef HAVE_STDARG_H # include #endif // HAVE_STDARG_H #include #include #if HAVE_LOCALE_H # include #endif /* HAVE_LOCALE_H */ #include using namespace std; #include "resource.hh" #include "bbsmount.hh" #include "blackboxstyle.hh" #include "i18n.hh" /* Hack */ #if !HAVE_STRCASESTR # define strcasestr strstr #endif /* !HAVE_STRCASESTR */ #ifndef FONT_ELEMENT_SIZE #define FONT_ELEMENT_SIZE 50 #endif // FONT_ELEMENT_SIZE const int modifiers_count = 8; const unsigned int max_button_number = 5; const char *modifiers[modifiers_count] = { "Shift", "Lock", "Control", "Mod1", "Mod2", "Mod3", "Mod4", "Mod5" }; const int modifiers_mask[modifiers_count] = { ShiftMask, LockMask, ControlMask, Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask }; Resource::Resource(ToolWindow *toolwindow): BaseResource(toolwindow) { mounts_count = 0; mounts = NULL; tooltip.font = NULL; tooltip.fontset = NULL; tooltip.fontset_extents = NULL; Load(); } Resource::~Resource() { Clean(); } void Resource::Clean() { CleanMounts(); if (tooltip.font) { XFreeFont(bbtool->getXDisplay(), tooltip.font); tooltip.font = NULL; } if (tooltip.fontset) { XFreeFontSet(bbtool->getXDisplay(), tooltip.fontset); tooltip.fontset = NULL; } } void Resource::CleanMounts(void) { for (; mounts_count > 0; mounts_count--) { free(mounts[mounts_count - 1].mount_point); XpmFreeXpmImage(&mounts[mounts_count - 1].mounted); XpmFreeXpmImage(&mounts[mounts_count - 1].not_mounted); } if (mounts) { free(mounts); mounts = NULL; } } void Resource::LoadBBToolResource(void) { /* XrmValue value; char *value_type; if (XrmGetResource(resource_db, "bbsmount.autoConfig", "Bbsmount.Autoconfig", &value_type, &value)) if (! strncasecmp("true", value.addr, value.size)) style.auto_config = True; else style.auto_config = False; else style.auto_config = False;*/ SizeAndPosition(); Frame(); App(); ImagePrefix(); Tooltip(); // bbsmount specific options MountPoints(); } void Resource::Frame() { XrmValue value; char *value_type; readTexture("bbsmount.frame", "Bbsmount.Frame", BB_FRAME, "Toolbar", "slategrey", "darkslategrey", "Raised Gradient Vertical Bevel1", &frame.texture); if (XrmGetResource(resource_db, "bbsmount.bevelWidth","Bbsmount.BevelWidth", &value_type, &value)) { if (sscanf(value.addr, "%u", &frame.bevelWidth) != 1) frame.bevelWidth = 4; else if (frame.bevelWidth == 0) frame.bevelWidth = 4; } else if (XrmGetResource(resource_db, BB_BEVELWIDTH,"BevelWidth", &value_type, &value)) { if (sscanf(value.addr, "%u", &frame.bevelWidth) != 1) frame.bevelWidth = 4; else if (frame.bevelWidth == 0) frame.bevelWidth = 4; } else frame.bevelWidth = 4; } void Resource::SizeAndPosition() { XrmValue value; char *value_type; unsigned int w,h; char positionstring[11]; if (!(bbtool->withdrawn)) { if (XrmGetResource(resource_db, "bbsmount.withdrawn", "Bbsmount.Withdrawn", &value_type, &value)) { if (! strncasecmp("true", value.addr, value.size)) bbtool->withdrawn = True; else bbtool->withdrawn = False; } else bbtool->withdrawn = False; } if (!(bbtool->shape)) { if (XrmGetResource(resource_db, "bbsmount.shape", "Bbsmount.Shape", &value_type, &value)) { if (! strncasecmp("true", value.addr, value.size)) bbtool->shape = True; else bbtool->shape = False; } else bbtool->shape = bbtool->withdrawn; } if (!(bbtool->position)) { if (!(XrmGetResource(resource_db, "bbsmount.position","Bbsmount.Position", &value_type, &value))) strncpy(positionstring, "-0-0", 5); else strncpy(positionstring, value.addr, strlen(value.addr)+1); } else strncpy(positionstring, bbtool->position, strlen(bbtool->position)+1); position.mask=XParseGeometry(positionstring, &position.x, &position.y, &w, &h); if (!(position.mask & XValue)) position.x=0; if (!(position.mask & YValue)) position.y=0; /* need this to compute the height */ /* const char *defaultFont = "-*-helvetica-medium-r-*-*-*-120-*-*-*-*-*-*"; if (frame.font) { XFreeFont(bbtool->dpy, frame.font); frame.font = 0; } if (XrmGetResource(resource_db, "bbsmount.heightBy.font","Bbsmount.heightBy.Font", &value_type, &value)) { if ((frame.font = XLoadQueryFont(bbtool->dpy, value.addr)) == NULL) { fprintf(stderr, " blackbox: couldn't load font '%s'\n" " ... reverting to default font.", value.addr); if ((frame.font = XLoadQueryFont(bbtool->dpy, defaultFont)) == NULL) { fprintf(stderr,"blackbox: couldn't load default font. please check to\n" "make sure the necessary font is installed '%s'\n", defaultFont); exit(2); } } } else if (XrmGetResource(resource_db, BB_FONT,"TitleFont", &value_type, &value)) { if ((frame.font = XLoadQueryFont(bbtool->dpy, value.addr)) == NULL) { fprintf(stderr, " blackbox: couldn't load font '%s'\n" " ... reverting to default font.", value.addr); if ((frame.font = XLoadQueryFont(bbtool->dpy, defaultFont)) == NULL) { fprintf(stderr, "blackbox: couldn't load default font. please check to\n" "make sure the necessary font is installed '%s'\n", defaultFont); exit(2); } } } else { if ((frame.font = XLoadQueryFont(bbtool->dpy, defaultFont)) == NULL) { fprintf(stderr, "blackbox: couldn't load default font. please check to\n" "make sure the necessary font is installed '%s'\n", defaultFont); exit(2); } }*/ } //void Resource::Label(void) //{ // XrmValue value; // char *value_type; // // /* text-label resources */ // if (XrmGetResource(resource_db, "bbsmount.label.transparent", // "Bbsmount.label.Transparent", &value_type, &value)) // { // if (! strncasecmp("true", value.addr, value.size)) // label.transparent = True; // else // label.transparent = False; // } // else // label.transparent = False; // // readDatabaseTexture("bbsmount.label", "Bbsmount.Label",BB_LABEL,"Toolbar.Label", // "slategrey","darkslategrey", // BImage_Sunken|BImage_Gradient|BImage_Vertical| // BImage_Bevel1,&label.texture); // // readDatabaseColor("bbsmount..textColor", // "Bbsmount.TextColor", // BB_LABEL_TEXTCOLOR, "Toolbar.TextColor", // "LightGrey",&label.textColor); // // // const char *defaultFont = "-*-helvetica-medium-r-*-*-*-120-*-*-*-*-*-*"; // // if (label.font) // { // XFreeFont(bbtool->dpy, label.font); // label.font = 0; // } // // if (XrmGetResource(resource_db, "bbsmount.label.font", "Bbsmount.Label.Font", // &value_type, &value)) // { // if ((label.font = XLoadQueryFont(bbtool->dpy, value.addr)) == NULL) // { // fprintf(stderr, " blackbox: couldn't load font '%s'\n" // " ... reverting to default font.", value.addr); // if ((label.font = XLoadQueryFont(bbtool->dpy, defaultFont)) == NULL) // { // fprintf(stderr, // "blackbox: couldn't load default font. please check to\n" // "make sure the necessary font is installed '%s'\n", // defaultFont); // exit(2); // } // } // } // else if (XrmGetResource(resource_db, BB_FONT, "TitleFont", &value_type, &value)) // { // if ((label.font = XLoadQueryFont(bbtool->dpy, value.addr)) == NULL) // { // fprintf(stderr, " blackbox: couldn't load font '%s'\n" // " ... reverting to default font.", value.addr); // if ((label.font = XLoadQueryFont(bbtool->dpy, defaultFont)) == NULL) // { // fprintf(stderr, // "blackbox: couldn't load default font. please check to\n" // "make sure the necessary font is installed '%s'\n", // defaultFont); // exit(2); // } // } // } // else // { // if ((label.font = XLoadQueryFont(bbtool->dpy, defaultFont)) == NULL) // { // fprintf(stderr,"blackbox: couldn't load default font. please check to\n" // "make sure the necessary font is installed '%s'\n", defaultFont); // exit(2); // } // } //} void Resource::App() { XrmValue value; char *value_type; if (XrmGetResource(resource_db, "bbsmount.columns", "Bbsmount.Columns", &value_type, &value)) { if (sscanf(value.addr, "%u", &app.columns) != 1) app.columns = 1; else if (app.columns == 0) app.columns = 1; } else app.columns = 1; if (XrmGetResource(resource_db, "bbsmount.rows", "Bbsmount.Rows", &value_type, &value)) { if (sscanf(value.addr, "%u", &app.rows) != 1) app.rows = 1; else if (app.rows == 0) app.rows = 1; } else app.rows = 1; if (XrmGetResource(resource_db, "bbsmount.column.width", "Bbsmount.Column.Width", &value_type, &value)) { if (sscanf(value.addr, "%u", &app.column_width) != 1) app.column_width = 32; else if (app.column_width == 0) app.column_width = 32; } else app.column_width = 32; if (XrmGetResource(resource_db, "bbsmount.row.height", "Bbsmount.Row.Height", &value_type, &value)) { if (sscanf(value.addr, "%u", &app.row_height) != 1) app.row_height = 32; else if (app.row_height == 0) app.row_height = 32; } else app.row_height = 32; readTexture("bbsmount.mount", "Bbsmount.Mount",BB_LABEL,"Toolbar.Button", "slategrey","darkslategrey", "Raised Gradient Vertical Bevel1", &app.mount_texture); readTexture("bbsmount.mount.pressed", "Bbsmount.Mount.Pressed",BB_LABEL,"Toolbar.Button.Pressed", "slategrey","darkslategrey", "Sunken Gradient Vertical Bevel1", &app.mount_texture_pressed); if (XrmGetResource(resource_db, "bbsmount.buttonpadding","Bbsmount.ButtonPadding", &value_type, &value)) { if (sscanf(value.addr, "%u", &app.button_padding) != 1) app.button_padding = 2; } else app.button_padding = 2; if (XrmGetResource(resource_db, "bbsmount.checkdelay", "Bbsmount.CheckDelay", &value_type, &value)) { if (sscanf(value.addr, "%u", &app.button_padding) != 1) app.refresh_time = 1; else if (app.refresh_time == 0) app.refresh_time = 1; } else app.refresh_time = 1; if (XrmGetResource(resource_db, "bbsmount.debuglevel", "Bbsmount.DebugLevel", &value_type, &value)) { if (sscanf(value.addr, "%u", &debug_level) != 1) debug_level = 2; } else debug_level = 2; } void Resource::ImagePrefix(void) { XrmValue value; char *value_type; if (XrmGetResource(resource_db, "bbsmount.imageprefix", "Bbsmount.ImagePrefix", &value_type, &value)) { image_prefix = value.addr; } else image_prefix = ""; } void Resource::Tooltip(void) { XrmValue value; char *value_type; readTexture("bbsmount.tooltip","Bbsmount.ToolTip", BB_TOOLTIP, "Window.Label.Focus", "slategrey","darkslategrey", "Flat Gradient Diagonal Bevel1", &tooltip.texture); readColor("bbsmount.tooltip.borderColor","Bbsmount.ToolTip.BorderColor", BB_BORDERCOLOR,"BorderColor", "DarkGrey",&tooltip.borderColor); readColor("bbsmount.tooltip.textColor","Bbsmount.ToolTip.TextColor", BB_MENU_TEXTCOLOR,"Menu.Frame.TextColor", "LightGrey",&tooltip.textColor); if (XrmGetResource(resource_db, "bbsmount.tooltip.bevelWidth", "Bbsmount.ToolTip.BevelWidth", &value_type, &value)) { if (sscanf(value.addr, "%u", &tooltip.bevelWidth) != 1) tooltip.bevelWidth = 2; } else tooltip.bevelWidth = 2; if (XrmGetResource(resource_db, "bbsmount.tooltip.borderWidth", "Bbsmount.ToolTip.BorderWidth", &value_type, &value)) { if (sscanf(value.addr, "%u", &tooltip.borderWidth) != 1) tooltip.borderWidth = 1; } else tooltip.borderWidth = 1; if (XrmGetResource(resource_db, "bbsmount.tooltip.timeout", "Bbsmount.ToolTip.Timeout", &value_type, &value)) { if (sscanf(value.addr, "%u", &tooltip.timeout) != 1) tooltip.timeout = 0; } else tooltip.timeout = 0; /* need this to compute the height */ const char *defaultFont = "-*-helvetica-medium-r-*-*-*-120-*-*-*-*-*-*"; if (tooltip.font) { XFreeFont(bbtool->getXDisplay(), tooltip.font); tooltip.font = NULL; } if (tooltip.fontset) { XFreeFontSet(bbtool->getXDisplay(), tooltip.fontset); tooltip.fontset = NULL; tooltip.fontset_extents = NULL; } if (XrmGetResource(resource_db, "bbsmount.tooltip.font","Bbsmount.ToolTip.Font", &value_type, &value)) { if (i18n.multibyte()) { if ((tooltip.fontset = createFontSet(value.addr)) == NULL) { fprintf(stderr, " blackbox: couldn't load font '%s'\n" " ... reverting to default font.", value.addr); if ((tooltip.fontset = createFontSet(defaultFont)) == NULL) { fprintf(stderr, "blackbox: couldn't load default font. please check to\n" "make sure the necessary font is installed '%s'\n", defaultFont); exit(2); } } tooltip.fontset_extents = XExtentsOfFontSet(tooltip.fontset); } else { if ((tooltip.font = XLoadQueryFont(bbtool->getXDisplay(), value.addr)) == NULL) { fprintf(stderr, " blackbox: couldn't load font '%s'\n" " ... reverting to default font.", value.addr); if ((tooltip.font = XLoadQueryFont(bbtool->getXDisplay(), defaultFont)) == NULL) { fprintf(stderr,"blackbox: couldn't load default font. please check to\n" "make sure the necessary font is installed '%s'\n", defaultFont); exit(2); } } } } else { if (XrmGetResource(resource_db, BB_FONT,"TitleFont", &value_type, &value)) { if (i18n.multibyte()) { if ((tooltip.fontset = createFontSet(value.addr)) == NULL) { fprintf(stderr, " blackbox: couldn't load font '%s'\n" " ... reverting to default font.", value.addr); if ((tooltip.fontset = createFontSet(defaultFont)) == NULL) { fprintf(stderr, "blackbox: couldn't load default font. please check to\n" "make sure the necessary font is installed '%s'\n", defaultFont); exit(2); } } } else { if ((tooltip.font = XLoadQueryFont(bbtool->getXDisplay(), value.addr)) == NULL) { fprintf(stderr, " blackbox: couldn't load font '%s'\n" " ... reverting to default font.", value.addr); if ((tooltip.font = XLoadQueryFont(bbtool->getXDisplay(), defaultFont)) == NULL) { fprintf(stderr, "blackbox: couldn't load default font. please check to\n" "make sure the necessary font is installed '%s'\n", defaultFont); exit(2); } } } } else { if (i18n.multibyte()) { if ((tooltip.fontset = createFontSet(defaultFont)) == NULL) { fprintf(stderr, "blackbox: couldn't load default font. please check to\n" "make sure the necessary font is installed '%s'\n", defaultFont); exit(2); } } else { if ((tooltip.font = XLoadQueryFont(bbtool->getXDisplay(), defaultFont)) == NULL) { fprintf(stderr, "blackbox: couldn't load default font. please check to\n" "make sure the necessary font is installed '%s'\n", defaultFont); exit(2); } } } } } //void Resource::Show() //{ // XrmValue value; // char *value_type; // // if (XrmGetResource(resource_db, "bbsmount.show.euStyle", // "Bbsmount.show.EuStyle", &value_type, &value)) // { // if (! strncasecmp("true", value.addr, value.size)) // { // report.euStyle = True; // } // else // report.euStyle = False; // } // else // report.euStyle = False; // // /* what to show.resources */ //} /*void Resource::MountPoints(void) { XrmValue value; char *value_type; char str1[30], str2[30]; int mount_counter = 1; bool next = true; CleanMounts(); while (next) { sprintf(str1, "bbsmount.mount%u", mount_counter); sprintf(str2, "Bbsmount.Mount%u", mount_counter); if (XrmGetResource(resource_db, str1, str2, &value_type, &value)) { if (!strncasecmp("true", value.addr, value.size)) { mounts = (MOUNT_POINT *)(++mounts_count > 1 ? realloc((void *)mounts, sizeof(MOUNT_POINT) * mounts_count) : malloc(sizeof(MOUNT_POINT))); sprintf(str1, "bbsmount.mount%u.mountpoint", mount_counter); sprintf(str2, "Bbsmount.Mount%u.MountPoint", mount_counter); if (XrmGetResource(resource_db, str1, str2, &value_type, &value)) { mounts[mounts_count - 1].mount_point = strdup(value.addr); } else { if (--mounts_count) mounts = (MOUNT_POINT *)realloc((void *)mounts, sizeof(MOUNT_POINT) * mounts_count); else mounts = NULL; continue; } sprintf(str1, "bbsmount.mount%u.mounted", mount_counter); sprintf(str2, "Bbsmount.Mount%u.Mounted", mount_counter); if (XrmGetResource(resource_db, str1, str2, &value_type, &value)) { XpmReadFileToXpmImage(value.addr, &mounts[mounts_count - 1].mounted, NULL); } sprintf(str1, "bbsmount.mount%u.notmounted", mount_counter); sprintf(str2, "Bbsmount.Mount%u.NotMounted", mount_counter); if (XrmGetResource(resource_db, str1, str2, &value_type, &value)) { XpmReadFileToXpmImage(value.addr, &mounts[mounts_count - 1].not_mounted, NULL); } sprintf(str1, "bbsmount.mount%u.eject", mount_counter); sprintf(str2, "Bbsmount.Mount%u.Eject", mount_counter); if (XrmGetResource(resource_db, str1, str2, &value_type, &value)) if (!strncasecmp("true", value.addr, value.size)) mounts[mounts_count - 1].can_eject = true; else mounts[mounts_count - 1].can_eject = false; else mounts[mounts_count - 1].can_eject = false; sprintf(str1, "bbsmount.mount%u.close", mount_counter); sprintf(str2, "Bbsmount.Mount%u.Close", mount_counter); if (XrmGetResource(resource_db, str1, str2, &value_type, &value)) if (!strncasecmp("true", value.addr, value.size)) mounts[mounts_count - 1].can_close = true; else mounts[mounts_count - 1].can_close = false; else mounts[mounts_count - 1].can_close = false; } else next = false; } else next = false; mount_counter++; } }*/ const string & Resource::GetImagePrefix(void) const { return image_prefix; } const vector & Resource::GetMountPoints(void) const { return mount_points; } const vector & Resource::GetCommands(void) const { return commands; } const vector & Resource::getInfoTexts(void) const { return infotexts; } const vector & Resource::GetImages(void) const { return images; } void Resource::FreeAll(void) { images.clear(); commands.clear(); infotexts.clear(); mount_points.clear(); image_prefix.erase(); } void Resource::MountPoints(void) { LoadImages(); LoadCommands(); LoadInfoTexts(); LoadMountPoints(); } void Resource::LoadImages(void) { XrmValue value; char *value_type, str1[30], str2[30]; bool exists = true; int image_counter = 1; images.clear(); do { sprintf(str1, "bbsmount.image%u", image_counter); sprintf(str2, "Bbsmount.Image%u", image_counter); if (XrmGetResource(resource_db, str1, str2, &value_type, &value)) { images.push_back(string(value.addr)); #if DEBUG if (debug_level >= dbg_all_work) printf("Saving image path nr. %d (%s).\n", image_counter, value.addr); #endif /* DEBUG */ } else exists = false; image_counter++; } while (exists); #if DEBUG if (debug_level >= dbg_summary) printf("%d image definitions found.\n", image_counter - 2); #endif /* DEBUG */ } void Resource::LoadCommands(void) { XrmValue value; char *value_type, str1[32], str2[32]; bool exists = true; int command_counter = 1; commands.clear(); commands.push_back(""); do { sprintf(str1, "bbsmount.command%u", command_counter); sprintf(str2, "Bbsmount.Command%u", command_counter); if (XrmGetResource(resource_db, str1, str2, &value_type, &value)) { commands.push_back(string(value.addr)); #if DEBUG if (debug_level >= dbg_all_work) printf("Saving command nr. %d (%s).\n", command_counter, value.addr); #endif /* DEBUG */ } else exists = false; command_counter++; } while (exists); #if DEBUG if (debug_level >= dbg_summary) printf("%d commands found.\n", command_counter - 2); #endif /* DEBUG */ } void Resource::LoadInfoTexts(void) { XrmValue value; char *value_type, str1[32], str2[32]; bool exists = true; int infotext_counter = 1; infotexts.clear(); infotexts.push_back(""); do { sprintf(str1, "bbsmount.infotext%u", infotext_counter); sprintf(str2, "Bbsmount.InfoText%u", infotext_counter); if (XrmGetResource(resource_db, str1, str2, &value_type, &value)) { infotexts.push_back(string(value.addr)); #if DEBUG if (debug_level >= dbg_all_work) printf("Saving infotext nr. %d (%s).\n", infotext_counter, value.addr); #endif /* DEBUG */ } else exists = false; infotext_counter++; } while (exists); #if DEBUG if (debug_level >= dbg_summary) printf("%d infotexts found.\n", infotext_counter - 2); #endif /* DEBUG */ } void Resource::LoadMountPoints(void) { XrmValue value; char *value_type, str1[45], str2[45]; bool exists = true; int mountpoint_counter = 1; unsigned int image_number; mount_points.clear(); do { sprintf(str1, "bbsmount.mount%u", mountpoint_counter); sprintf(str2, "Bbsmount.Mount%u", mountpoint_counter); if (XrmGetResource(resource_db, str1, str2, &value_type, &value)) { mount_points.push_back(MountPoint(string(value.addr))); LoadActions(mountpoint_counter); LoadInfoText(mountpoint_counter); sprintf(str1, "bbsmount.mount%u.mountedimage", mountpoint_counter); sprintf(str2, "Bbsmount.Mount%u.MountedImage", mountpoint_counter); if (XrmGetResource(resource_db, str1, str2, &value_type, &value)) { if (sscanf(value.addr, "%u", &image_number) == 1 && image_number <= images.size()) mount_points.back().SetMountedImage(image_number); #if DEBUG else printf("Image number assigned to mount point nr. %d is not correct (%s)!\n", mountpoint_counter, value.addr); #endif /* DEBUG */ } #if DEBUG else if (debug_level >= dbg_warning) printf("Mount point nr. %d don't have assigned mounted image!\n", mountpoint_counter); #endif /* DEBUG */ sprintf(str1, "bbsmount.mount%u.notmountedimage", mountpoint_counter); sprintf(str2, "Bbsmount.Mount%u.NotMountedImage", mountpoint_counter); if (XrmGetResource(resource_db, str1, str2, &value_type, &value)) { if (sscanf(value.addr, "%u", &image_number) == 1 && image_number <= images.size()) mount_points.back().SetNotMountedImage(image_number); #if DEBUG else printf("Image number assigned to mount point nr. %d is not correct (%s)!\n", mountpoint_counter, value.addr); #endif /* DEBUG */ } #if DEBUG else if (debug_level >= dbg_warning) printf("Mount point nr. %d don't have assigned not mounted image!\n", mountpoint_counter); #endif /* DEBUG */ sprintf(str1, "bbsmount.mount%u.description", mountpoint_counter); sprintf(str2, "Bbsmount.Mount%u.Description", mountpoint_counter); if (XrmGetResource(resource_db, str1, str2, &value_type, &value)) { mount_points.back().setDescription(value.addr); } #if DEBUG if (debug_level >= dbg_all_work) printf("Loading data about mount point nr. %d.\n", mountpoint_counter); #endif /* DEBUG */ } else exists = false; mountpoint_counter++; } while (exists); #if DEBUG if (debug_level >= dbg_summary) printf("%d mount point definitions found.\n", mountpoint_counter - 2); #endif /* DEBUG */ } void Resource::LoadActions(const int mount_point) { XrmValue value; char *value_type, str1[54], str2[54]; bool exists = true; int action_counter = 1; unsigned int number, number2; set positive_mod, negative_mod; int command_m = 0, command_n = 0, button = 0; do { positive_mod.clear(); negative_mod.clear(); sprintf(str1, "bbsmount.mount%u.action%u.command", mount_point, action_counter); sprintf(str2, "Bbsmount.Mount%u.Action%u.Command", mount_point, action_counter); if (XrmGetResource(resource_db, str1, str2, &value_type, &value)) { if (sscanf(value.addr, "%u,%u", &number, &number2) == 2 && number < commands.size() && number2 < commands.size()) { command_n = number; command_m = number2; } else { if (sscanf(value.addr, "%u", &number) == 1 && number < commands.size()) { command_n = number; command_m = number; #if DEBUG if (debug_level >= dbg_all_work) printf("Only one command found -- setting it to both mounted/not mounted commands.\n"); #endif /* DEBUG */ } else { #if DEBUG printf("Command number(s) assigned to mount point nr. %d is not correct (%s)!\n", mount_point, value.addr); #endif /* DEBUG */ continue; } } } else exists = false; sprintf(str1, "bbsmount.mount%u.action%u.button", mount_point, action_counter); sprintf(str2, "Bbsmount.Mount%u.Action%u.Button", mount_point, action_counter); if (XrmGetResource(resource_db, str1, str2, &value_type, &value)) { if (!exists) { exists = true; continue; } if (sscanf(value.addr, "%u", &number) == 1 && number > 0 && number < max_button_number) button = number; else { #if DEBUG printf("Button number assigned to mount point nr. %d is not correct (%s)!\n", mount_point, value.addr); #endif /* DEBUG */ continue; } } else exists = false; if (exists) { Action new_action; new_action.SetButton(button); new_action.SetCommand(command_m, true); new_action.SetCommand(command_n, false); sprintf(str1, "bbsmount.mount%u.action%u.modifiers", mount_point, action_counter); sprintf(str2, "Bbsmount.Mount%u.Action%u.Modifiers", mount_point, action_counter); if (XrmGetResource(resource_db, str1, str2, &value_type, &value)) { GetModifiers(value.addr, positive_mod, negative_mod); set::iterator pointer; for (pointer = positive_mod.begin(); pointer != positive_mod.end(); pointer++) new_action.AddModifier(*pointer); for (pointer = negative_mod.begin(); pointer != negative_mod.end(); pointer++) new_action.AddNegativeModifier(*pointer); #if DEBUG if (debug_level >= dbg_summary) printf("%u positive and %u negative modifiers added to action nr %d.\n", positive_mod.size(), negative_mod.size(), action_counter); #endif /* DEBUG */ } mount_points.back().AddAction(new_action); } action_counter++; } while (exists); #if DEBUG if (debug_level >= dbg_summary) printf("%d actions found for mount point nr %d.\n", action_counter - 2, mount_point); #endif /* DEBUG */ } void Resource::LoadInfoText(const int mount_point) { XrmValue value; char *value_type, str1[54], str2[54]; unsigned int number; sprintf(str1, "bbsmount.mount%u.mountedtext", mount_point); sprintf(str2, "Bbsmount.Mount%u.MountedText", mount_point); if (XrmGetResource(resource_db, str1, str2, &value_type, &value)) { if (sscanf(value.addr, "%u", &number) == 1 && number < infotexts.size()) mount_points.back().setMountedInfo(number); #if DEBUG else printf("Infotext number assigned to mount point nr. %d is not correct (%s)!\n", mount_point, value.addr); #endif /* DEBUG */ } sprintf(str1, "bbsmount.mount%u.notmountedtext", mount_point); sprintf(str2, "Bbsmount.Mount%u.NotMountedText", mount_point); if (XrmGetResource(resource_db, str1, str2, &value_type, &value)) { if (sscanf(value.addr, "%u", &number) == 1 && number < infotexts.size()) mount_points.back().setNotMountedInfo(number); #if DEBUG else printf("Infotext number assigned to mount point nr. %d is not correct (%s)!\n", mount_point, value.addr); #endif /* DEBUG */ } sprintf(str1, "bbsmount.mount%u.errortext", mount_point); sprintf(str2, "Bbsmount.Mount%u.ErrorText", mount_point); if (XrmGetResource(resource_db, str1, str2, &value_type, &value)) { if (sscanf(value.addr, "%u", &number) == 1 && number < infotexts.size()) mount_points.back().setErrorInfo(number); #if DEBUG else printf("Infotext number assigned to mount point nr. %d is not correct (%s)!\n", mount_point, value.addr); #endif /* DEBUG */ } } void Resource::GetModifiers(const string str, set &positive, set &negative) const { int start = 0, stop = 0; bool is_negative = false; const char **result; while (start < (int)str.length()) { if (isalnum(str[start])) { stop = start + 1; while (stop <= (int)str.length() && isalnum(str[stop])) stop++; const_cast(result) = find(modifiers, modifiers + modifiers_count, str.substr(start, stop - start)); if (result < modifiers + modifiers_count) { if (is_negative) negative.insert(modifiers_mask[distance(modifiers, result)]); else positive.insert(modifiers_mask[distance(modifiers, result)]); } #if DEBUG else printf("(%s) is not valid modifier!\n", str.substr(start, stop - start).c_str()); #endif /* DEBUG */ is_negative = false; start = stop; } else if (str[start] == '!') is_negative = true; start++; } } /* from blackbox/src/Screen.cc */ static const char * getFontElement(const char *pattern, char *buf, int bufsiz, ...) { const char *p, *v; char *p2; va_list va; va_start(va, bufsiz); buf[bufsiz-1] = 0; buf[bufsiz-2] = '*'; while((v = va_arg(va, char *)) != NULL) { p = strcasestr(pattern, v); if (p) { strncpy(buf, p+1, bufsiz-2); p2 = strchr(buf, '-'); if (p2) *p2=0; va_end(va); return p; } } va_end(va); strncpy(buf, "*", bufsiz); return NULL; } static const char * getFontSize(const char *pattern, int *size) { const char *p; const char *p2=NULL; int n=0; for (p=pattern; 1; p++) { if (!*p) { if (p2!=NULL && n>1 && n<72) { *size = n; return p2+1; } else { *size = 16; return NULL; } } else if (*p=='-') { if (n>1 && n<72 && p2!=NULL) { *size = n; return p2+1; } p2=p; n=0; } else if (*p>='0' && *p<='9' && p2!=NULL) { n *= 10; n += *p-'0'; } else { p2=NULL; n=0; } } } XFontSet Resource::createFontSet(const string &fontname) { XFontSet fs; char **missing, *def = "-"; int nmissing, pixel_size = 0, buf_size = 0; char weight[FONT_ELEMENT_SIZE], slant[FONT_ELEMENT_SIZE]; fs = XCreateFontSet(bbtool->getXDisplay(), fontname.c_str(), &missing, &nmissing, &def); if (fs && (! nmissing)) return fs; const char *nfontname = fontname.c_str(); #ifdef HAVE_SETLOCALE if (! fs) { if (nmissing) XFreeStringList(missing); setlocale(LC_CTYPE, "C"); fs = XCreateFontSet(bbtool->getXDisplay(), fontname.c_str(), &missing, &nmissing, &def); setlocale(LC_CTYPE, ""); } #endif // HAVE_SETLOCALE if (fs) { XFontStruct **fontstructs; char **fontnames; XFontsOfFontSet(fs, &fontstructs, &fontnames); nfontname = fontnames[0]; } getFontElement(nfontname, weight, FONT_ELEMENT_SIZE, "-medium-", "-bold-", "-demibold-", "-regular-", NULL); getFontElement(nfontname, slant, FONT_ELEMENT_SIZE, "-r-", "-i-", "-o-", "-ri-", "-ro-", NULL); getFontSize(nfontname, &pixel_size); if (! strcmp(weight, "*")) strncpy(weight, "medium", FONT_ELEMENT_SIZE); if (! strcmp(slant, "*")) strncpy(slant, "r", FONT_ELEMENT_SIZE); if (pixel_size < 3) pixel_size = 3; else if (pixel_size > 97) pixel_size = 97; buf_size = strlen(nfontname) + (FONT_ELEMENT_SIZE * 2) + 64; char *pattern2 = new char[buf_size]; sprintf(pattern2, "%s," "-*-*-%s-%s-*-*-%d-*-*-*-*-*-*-*," "-*-*-*-*-*-*-%d-*-*-*-*-*-*-*,*", nfontname, weight, slant, pixel_size, pixel_size); nfontname = pattern2; if (nmissing) XFreeStringList(missing); if (fs) XFreeFontSet(bbtool->getXDisplay(), fs); fs = XCreateFontSet(bbtool->getXDisplay(), nfontname, &missing, &nmissing, &def); delete [] pattern2; return fs; }