From c688967bc365872241697371e7bd12e2b5217028 Mon Sep 17 00:00:00 2001 From: Angus Leeming Date: Mon, 3 May 2004 15:41:16 +0000 Subject: [PATCH] Simplify the mechanics of generating the 'inactive' pixmap. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8729 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/frontends/xforms/ChangeLog | 4 ++ src/frontends/xforms/XFormsToolbar.C | 95 ++++++++++++++++------------ src/frontends/xforms/XFormsToolbar.h | 3 +- 3 files changed, 58 insertions(+), 44 deletions(-) diff --git a/src/frontends/xforms/ChangeLog b/src/frontends/xforms/ChangeLog index 14e7418b2d..ed62e17c6f 100644 --- a/src/frontends/xforms/ChangeLog +++ b/src/frontends/xforms/ChangeLog @@ -1,3 +1,7 @@ +2004-05-03 Angus Leeming + + * XFormsToolbar.[Ch] (generateInactivePixmaps): simpler mechanics. + 2004-05-02 Georg Baum * FormGraphics.C: #include (STLport compile fix for floor()) diff --git a/src/frontends/xforms/XFormsToolbar.C b/src/frontends/xforms/XFormsToolbar.C index 300f671a78..75f457b889 100644 --- a/src/frontends/xforms/XFormsToolbar.C +++ b/src/frontends/xforms/XFormsToolbar.C @@ -35,6 +35,9 @@ #include +#include +#include + using lyx::frontend::Box; using lyx::frontend::BoxList; @@ -43,6 +46,7 @@ using lyx::support::compare_ascii_no_case; using std::distance; using std::endl; using std::string; +using std::vector; // some constants @@ -79,9 +83,8 @@ XFormsToolbar::toolbarItem::toolbarItem() : icon(0), unused_pixmap(0), active_pixmap(0), - active_mask(0), inactive_pixmap(0), - inactive_mask(0) + mask(0) {} @@ -99,9 +102,8 @@ void XFormsToolbar::toolbarItem::kill_icon() unused_pixmap = 0; active_pixmap = 0; - active_mask = 0; inactive_pixmap = 0; - inactive_mask = 0; + mask = 0; icon = 0; } @@ -128,19 +130,21 @@ void XFormsToolbar::toolbarItem::generateInactivePixmaps() return; // Store the existing (active) pixmap. - fl_get_pixmap_pixmap(icon, &active_pixmap, &active_mask); + fl_get_pixmap_pixmap(icon, &active_pixmap, &mask); - if (active_pixmap == 0 || active_mask == 0) + if (active_pixmap == 0 || mask == 0) return; - // Create an XpmImage of this (active) pixmap. It's this that - // we're going to manipulate. - XpmImage xpm_image; - XpmCreateXpmImageFromPixmap(fl_get_display(), - active_pixmap, - active_mask, - &xpm_image, - 0); + // Ascertain the width and height of the pixmap. + Display * display = fl_get_display(); + unsigned int width; + unsigned int height; + unsigned int uidummy; + int idummy; + Window win; + + XGetGeometry(display, active_pixmap, &win, &idummy, &idummy, + &width, &height, &uidummy, &uidummy); // Produce a darker shade of the button background as the // inactive color. Note the 'hsv.v - 0.2'. @@ -150,32 +154,39 @@ void XFormsToolbar::toolbarItem::generateInactivePixmaps() hsv.v = std::max(0.0, hsv.v - 0.2); string const inactive_color = X11hexname(RGBColor(hsv)); - // Set all color table entries in xpm_image that aren't - // "none" to inactive_color - for (uint i = 0; i != xpm_image.ncolors; ++i) { - XpmColor & ct = xpm_image.colorTable[i]; - if (ct.c_color && - compare_ascii_no_case("none", ct.c_color) == 0) - continue; - - // Note that this is a c-struct, so use c memory funcs. - if (ct.c_color) - free(ct.c_color); - ct.c_color = (char *)malloc(inactive_color.size() + 1); - strcpy(ct.c_color, inactive_color.c_str()); - } - - // Generate pixmaps of this modified xpm_image. - Screen * screen = ScreenOfDisplay(fl_get_display(), fl_screen); - - XpmCreatePixmapFromXpmImage(fl_get_display(), - XRootWindowOfScreen(screen), - &xpm_image, - &inactive_pixmap, - &inactive_mask, - 0); - - XpmFreeXpmImage(&xpm_image); + // Generate an XPM dataset for a uniformly-colored pixmap with + // the same dimensions as active_pixmap. + + // The data set has the form: + // " ", + // "o c ", + // "oooooooooooooooo", // 'o' chars. + // repeated times. + + std::ostringstream line1_ss; + line1_ss << width << ' ' << height << " 1 1"; + string const line1 = line1_ss.str(); + string const line2 = "o c " + inactive_color; + string const data(width, 'o'); + vector inactive_data(height + 2, + const_cast(data.c_str())); + inactive_data[0] = const_cast(line1.c_str()); + inactive_data[1] = const_cast(line2.c_str()); + + char ** raw_inactive_data = + const_cast(&*inactive_data.begin()); + + // Generate a pixmap of this data set. + // Together with 'mask' above, this is sufficient to display + // an inactive version of our active_pixmap. + Screen * screen = ScreenOfDisplay(display, fl_screen); + + XpmCreatePixmapFromData(fl_get_display(), + XRootWindowOfScreen(screen), + raw_inactive_data, + &inactive_pixmap, + 0, + 0); } @@ -389,13 +400,13 @@ void XFormsToolbar::update() fl_activate_object(p->icon); fl_set_pixmap_pixmap(p->icon, p->active_pixmap, - p->active_mask); + p->mask); p->unused_pixmap = p->inactive_pixmap; } else { fl_deactivate_object(p->icon); fl_set_pixmap_pixmap(p->icon, p->inactive_pixmap, - p->inactive_mask); + p->mask); p->unused_pixmap = p->active_pixmap; } } diff --git a/src/frontends/xforms/XFormsToolbar.h b/src/frontends/xforms/XFormsToolbar.h index 95c91203bb..006e28162e 100644 --- a/src/frontends/xforms/XFormsToolbar.h +++ b/src/frontends/xforms/XFormsToolbar.h @@ -88,9 +88,8 @@ public: /// Pixmap unused_pixmap; Pixmap active_pixmap; - Pixmap active_mask; Pixmap inactive_pixmap; - Pixmap inactive_mask; + Pixmap mask; }; /// -- 2.39.2