From: Christophe CURIS <christophe.cu...@free.fr>

There was a probable bug when reading settings, because the function used
was 'getInt' which would try to store the result in a 'char'. As it would
be probably easier for user to have the value directly in pixels, the
storage is now done in an int so there won't be problem anymore.

Changed the behaviour of the constant APERCU_BORDER, which would be assumed
to be the size of the border in pixel, but in previous code it was actually
the sum of the two border (1 on each side). All maths have been changed to
have it as a single border width.

Took opportunity to group variable assignation for titleHeight and
shortenTitle in a single place, because it is not convenient to have them
spread around (one value in the beginning and others later in the code) and
using default values prevents some checks that modern compiler can do to
help produce safer code.

Signed-off-by: Christophe CURIS <christophe.cu...@free.fr>
---
 src/WindowMaker.h |  2 +-
 src/balloon.c     | 29 +++++++++++++++++------------
 src/defaults.c    | 15 +++++++++++++++
 src/icon.c        |  4 ++--
 src/icon.h        |  3 ++-
 5 files changed, 37 insertions(+), 16 deletions(-)

diff --git a/src/WindowMaker.h b/src/WindowMaker.h
index 17462f8..0663b54 100644
--- a/src/WindowMaker.h
+++ b/src/WindowMaker.h
@@ -444,7 +444,7 @@ extern struct WPreferences {
        char cycle_ignore_minimized;        /* Ignore minimized windows when 
cycling */
        char strict_windoze_cycle;          /* don't close switch panel when 
shift is released */
        char panel_only_open;               /* Only open the switch panel; 
don't switch */
-       char apercu_size;                   /* Size of apercu preview as a 
multiple of icon size */
+       int apercu_size;                    /* Size of apercu preview in pixels 
*/
 
        /* All delays here are in ms. 0 means instant auto-action. */
        int clip_auto_raise_delay;          /* Delay after which the clip will 
be raised when entered */
diff --git a/src/balloon.c b/src/balloon.c
index de003aa..c989803 100644
--- a/src/balloon.c
+++ b/src/balloon.c
@@ -376,26 +376,33 @@ static void showText(WScreen *scr, int x, int y, int h, 
int w, const char *text)
 }
 #endif                         /* !SHAPED_BALLOON */
 
-static void showApercu(WScreen *scr, int x, int y, int height, int width, char 
*title, Pixmap apercu)
+static void showApercu(WScreen *scr, int x, int y, const char *title, Pixmap 
apercu)
 {
        Pixmap pixmap;
        WMFont *font = scr->info_text_font;
-       int titleHeight = 0;
-       char *shortenTitle = title;
+       int width, height;
+       int titleHeight;
+       char *shortenTitle;
 
        if (scr->balloon->contents)
                XFreePixmap(dpy, scr->balloon->contents);
 
+       width  = wPreferences.apercu_size;
+       height = wPreferences.apercu_size;
+
        if (wPreferences.miniwin_title_balloon) {
-               shortenTitle = ShrinkString(font, title, width - APERCU_BORDER);
+               shortenTitle = ShrinkString(font, title, width - APERCU_BORDER 
* 2);
                titleHeight = countLines(shortenTitle) * WMFontHeight(font) + 4;
                height += titleHeight;
+       } else {
+               shortenTitle = NULL;
+               titleHeight = 0;
        }
 
        if (x < 0)
                x = 0;
        else if (x + width > scr->scr_width - 1)
-               x = scr->scr_width - width - APERCU_BORDER;
+               x = scr->scr_width - width - 1;
 
        if (y - height - 2 < 0) {
                y += wPreferences.icon_size;
@@ -413,16 +420,16 @@ static void showApercu(WScreen *scr, int x, int y, int 
height, int width, char *
        pixmap = XCreatePixmap(dpy, scr->root_win, width, height, scr->w_depth);
        XFillRectangle(dpy, pixmap, scr->draw_gc, 0, 0, width, height);
 
-       if (shortenTitle && wPreferences.miniwin_title_balloon) {
+       if (shortenTitle != NULL) {
                drawMultiLineString(scr->wmscreen, pixmap, 
scr->window_title_color[0], font,
                                                APERCU_BORDER, APERCU_BORDER, 
shortenTitle, strlen(shortenTitle));
                wfree(shortenTitle);
        }
 
        XCopyArea(dpy, apercu, pixmap, scr->draw_gc,
-                               0, 0, (wPreferences.icon_size - 1 - 
APERCU_BORDER) * wPreferences.apercu_size,
-                               (wPreferences.icon_size - 1 - APERCU_BORDER) * 
wPreferences.apercu_size,
-                               APERCU_BORDER, APERCU_BORDER + titleHeight);
+                 0, 0, (wPreferences.apercu_size - 1 - APERCU_BORDER * 2),
+                 (wPreferences.apercu_size - 1 - APERCU_BORDER * 2),
+                 APERCU_BORDER, APERCU_BORDER + titleHeight);
 
 #ifdef SHAPED_BALLOON
        XShapeCombineMask(dpy, scr->balloon->window, ShapeBounding, 0, 0, None, 
ShapeSet);
@@ -457,9 +464,7 @@ static void showBalloon(WScreen *scr)
 
        if (wPreferences.miniwin_apercu_balloon && scr->balloon->apercu != None)
                /* used to display either the apercu alone or the apercu and 
the title */
-               showApercu(scr, x, y, (wPreferences.icon_size - 1) * 
wPreferences.apercu_size,
-                                       (wPreferences.icon_size - 1) * 
wPreferences.apercu_size,
-                                       scr->balloon->text, 
scr->balloon->apercu);
+               showApercu(scr, x, y, scr->balloon->text, scr->balloon->apercu);
        else
                showText(scr, x, y, scr->balloon->h, w, scr->balloon->text);
 }
diff --git a/src/defaults.c b/src/defaults.c
index cf34424..b069d08 100644
--- a/src/defaults.c
+++ b/src/defaults.c
@@ -1181,6 +1181,21 @@ void wReadDefaults(WScreen * scr, WMPropList * new_dict)
                }
        }
 
+       /*
+        * Backward Compatibility:
+        * the option 'apercu_size' used to be coded as a multiple of the icon 
size in v0.95.6
+        * it is now expressed directly in pixels, but to avoid breaking user's 
setting we check
+        * for old coding and convert it now.
+        * This code should probably stay for at least 2 years, you should not 
consider removing
+        * it before year 2017
+        */
+       if (wPreferences.apercu_size < 24) {
+               /* 24 is the minimum icon size proposed in WPref's settings */
+               wPreferences.apercu_size *= wPreferences.icon_size;
+               wwarning(_("your ApercuSize setting is using old syntax, it is 
converted to %d pixels; consider running WPrefs.app to update your settings"),
+                        wPreferences.apercu_size);
+       }
+
        if (needs_refresh != 0 && !scr->flags.startup) {
                int foo;
 
diff --git a/src/icon.c b/src/icon.c
index d8265b5..75f5293 100644
--- a/src/icon.c
+++ b/src/icon.c
@@ -593,8 +593,8 @@ void set_icon_apercu(WIcon *icon, RImage *image)
        RImage *scaled_apercu;
        WScreen *scr = icon->core->screen_ptr;
 
-       scaled_apercu = RSmoothScaleImage(image, (wPreferences.icon_size - 1 - 
APERCU_BORDER) * wPreferences.apercu_size,
-                                               (wPreferences.icon_size - 1 - 
APERCU_BORDER) * wPreferences.apercu_size);
+       scaled_apercu = RSmoothScaleImage(image, wPreferences.apercu_size - 2 * 
APERCU_BORDER,
+                                         wPreferences.apercu_size - 2 * 
APERCU_BORDER);
 
        if (RConvertImage(scr->rcontext, scaled_apercu, &tmp)) {
                if (icon->apercu != None)
diff --git a/src/icon.h b/src/icon.h
index af82f5c..80e9acf 100644
--- a/src/icon.h
+++ b/src/icon.h
@@ -29,7 +29,8 @@
 #define TILE_CLIP      1
 #define TILE_DRAWER    2
 
-#define APERCU_BORDER 2
+/* This is the border, in pixel, drawn around an Aperçu */
+#define APERCU_BORDER 1
 
 typedef struct WIcon {
        WCoreWindow     *core;
-- 
2.1.1


-- 
To unsubscribe, send mail to wmaker-dev-unsubscr...@lists.windowmaker.org.

Reply via email to