Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package dmenu for openSUSE:Factory checked 
in at 2023-01-09 17:23:47
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/dmenu (Old)
 and      /work/SRC/openSUSE:Factory/.dmenu.new.32243 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "dmenu"

Mon Jan  9 17:23:47 2023 rev:19 rq:1056996 version:5.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/dmenu/dmenu.changes      2022-05-17 
17:25:03.091204589 +0200
+++ /work/SRC/openSUSE:Factory/.dmenu.new.32243/dmenu.changes   2023-01-09 
17:23:47.451154470 +0100
@@ -1,0 +2,16 @@
+Thu Jan  5 19:36:23 UTC 2023 - Dirk Müller <dmuel...@suse.com>
+
+- update to 5.2:
+  * dmenu: use die() to print usage message
+  * remove workaround for a crash in emojis, fixed in Xft 2.3.5
+  * tab-complete: determine size before copying
+  * readstdin: use getline
+  * improve correctness and startup performance
+  * drw_text: account for fallback fonts in ellipsis width
+  * drw_text: don't segfault when called with 0 width
+  * fix UB with the function iscntrl()
+  * avoid redraw when there's no change
+  * inputw: improve correctness and startup performance
+  * signifcantly improve performance on large strings 
+
+-------------------------------------------------------------------

Old:
----
  dmenu-5.1.tar.gz

New:
----
  dmenu-5.2.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ dmenu.spec ++++++
--- /var/tmp/diff_new_pack.NOd1j7/_old  2023-01-09 17:23:48.039157797 +0100
+++ /var/tmp/diff_new_pack.NOd1j7/_new  2023-01-09 17:23:48.043157819 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package dmenu
 #
-# Copyright (c) 2022 SUSE LLC
+# Copyright (c) 2023 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
 
 
 Name:           dmenu
-Version:        5.1
+Version:        5.2
 Release:        0
 Summary:        A generic and efficient menu for X
 License:        MIT
@@ -28,7 +28,7 @@
 BuildRequires:  pkgconfig
 BuildRequires:  pkgconfig(fontconfig)
 BuildRequires:  pkgconfig(x11)
-BuildRequires:  pkgconfig(xft)
+BuildRequires:  pkgconfig(xft) >= 2.3.5
 BuildRequires:  pkgconfig(xinerama)
 
 %description

++++++ dmenu-5.1.tar.gz -> dmenu-5.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmenu-5.1/config.mk new/dmenu-5.2/config.mk
--- old/dmenu-5.1/config.mk     2022-02-11 12:31:56.000000000 +0100
+++ new/dmenu-5.2/config.mk     2022-10-04 19:36:58.000000000 +0200
@@ -1,5 +1,5 @@
 # dmenu version
-VERSION = 5.1
+VERSION = 5.2
 
 # paths
 PREFIX = /usr/local
@@ -17,6 +17,7 @@
 FREETYPEINC = /usr/include/freetype2
 # OpenBSD (uncomment)
 #FREETYPEINC = $(X11INC)/freetype2
+#MANPREFIX = ${PREFIX}/man
 
 # includes and libs
 INCS = -I$(X11INC) -I$(FREETYPEINC)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmenu-5.1/dmenu.c new/dmenu-5.2/dmenu.c
--- old/dmenu-5.1/dmenu.c       2022-02-11 12:31:56.000000000 +0100
+++ new/dmenu-5.2/dmenu.c       2022-10-04 19:36:58.000000000 +0200
@@ -58,6 +58,13 @@
 static int (*fstrncmp)(const char *, const char *, size_t) = strncmp;
 static char *(*fstrstr)(const char *, const char *) = strstr;
 
+static unsigned int
+textw_clamp(const char *str, unsigned int n)
+{
+       unsigned int w = drw_fontset_getwidth_clamp(drw, str, n) + lrpad;
+       return MIN(w, n);
+}
+
 static void
 appenditem(struct item *item, struct item **list, struct item **last)
 {
@@ -82,10 +89,10 @@
                n = mw - (promptw + inputw + TEXTW("<") + TEXTW(">"));
        /* calculate which items will begin the next page and previous page */
        for (i = 0, next = curr; next; next = next->right)
-               if ((i += (lines > 0) ? bh : MIN(TEXTW(next->text), n)) > n)
+               if ((i += (lines > 0) ? bh : textw_clamp(next->text, n)) > n)
                        break;
        for (i = 0, prev = curr; prev && prev->left; prev = prev->left)
-               if ((i += (lines > 0) ? bh : MIN(TEXTW(prev->left->text), n)) > 
n)
+               if ((i += (lines > 0) ? bh : textw_clamp(prev->left->text, n)) 
> n)
                        break;
 }
 
@@ -97,6 +104,9 @@
        XUngrabKey(dpy, AnyKey, AnyModifier, root);
        for (i = 0; i < SchemeLast; i++)
                free(scheme[i]);
+       for (i = 0; items && items[i].text; ++i)
+               free(items[i].text);
+       free(items);
        drw_free(drw);
        XSync(dpy, False);
        XCloseDisplay(dpy);
@@ -172,7 +182,7 @@
                }
                x += w;
                for (item = curr; item != next; item = item->right)
-                       x = drawitem(item, x, 0, MIN(TEXTW(item->text), mw - x 
- TEXTW(">")));
+                       x = drawitem(item, x, 0, textw_clamp(item->text, mw - x 
- TEXTW(">")));
                if (next) {
                        w = TEXTW(">");
                        drw_setscheme(drw, scheme[SchemeNorm]);
@@ -232,7 +242,7 @@
        /* separate input text into tokens to be matched individually */
        for (s = strtok(buf, " "); s; tokv[tokc - 1] = s, s = strtok(NULL, " "))
                if (++tokc > tokn && !(tokv = realloc(tokv, ++tokn * sizeof 
*tokv)))
-                       die("cannot realloc %u bytes:", tokn * sizeof *tokv);
+                       die("cannot realloc %zu bytes:", tokn * sizeof *tokv);
        len = tokc ? strlen(tokv[0]) : 0;
 
        matches = lprefix = lsubstr = matchend = prefixend = substrend = NULL;
@@ -405,7 +415,7 @@
        switch(ksym) {
        default:
 insert:
-               if (!iscntrl(*buf))
+               if (!iscntrl((unsigned char)*buf))
                        insert(buf, len);
                break;
        case XK_Delete:
@@ -507,9 +517,9 @@
        case XK_Tab:
                if (!sel)
                        return;
-               strncpy(text, sel->text, sizeof text - 1);
-               text[sizeof text - 1] = '\0';
-               cursor = strlen(text);
+               cursor = strnlen(sel->text, sizeof text - 1);
+               memcpy(text, sel->text, cursor);
+               text[cursor] = '\0';
                match();
                break;
        }
@@ -539,29 +549,22 @@
 static void
 readstdin(void)
 {
-       char buf[sizeof text], *p;
-       size_t i, imax = 0, size = 0;
-       unsigned int tmpmax = 0;
+       char *line = NULL;
+       size_t i, junk, size = 0;
+       ssize_t len;
 
        /* read each line from stdin and add it to the item list */
-       for (i = 0; fgets(buf, sizeof buf, stdin); i++) {
+       for (i = 0; (len = getline(&line, &junk, stdin)) != -1; i++, line = 
NULL) {
                if (i + 1 >= size / sizeof *items)
                        if (!(items = realloc(items, (size += BUFSIZ))))
-                               die("cannot realloc %u bytes:", size);
-               if ((p = strchr(buf, '\n')))
-                       *p = '\0';
-               if (!(items[i].text = strdup(buf)))
-                       die("cannot strdup %u bytes:", strlen(buf) + 1);
+                               die("cannot realloc %zu bytes:", size);
+               if (line[len - 1] == '\n')
+                       line[len - 1] = '\0';
+               items[i].text = line;
                items[i].out = 0;
-               drw_font_getexts(drw->fonts, buf, strlen(buf), &tmpmax, NULL);
-               if (tmpmax > inputw) {
-                       inputw = tmpmax;
-                       imax = i;
-               }
        }
        if (items)
                items[i].text = NULL;
-       inputw = items ? TEXTW(items[imax].text) : 0;
        lines = MIN(lines, i);
 }
 
@@ -652,7 +655,7 @@
                /* no focused window is on screen, so use pointer location 
instead */
                if (mon < 0 && !area && XQueryPointer(dpy, root, &dw, &dw, &x, 
&y, &di, &di, &du))
                        for (i = 0; i < n; i++)
-                               if (INTERSECT(x, y, 1, 1, info[i]))
+                               if (INTERSECT(x, y, 1, 1, info[i]) != 0)
                                        break;
 
                x = info[i].x_org;
@@ -670,7 +673,7 @@
                mw = wa.width;
        }
        promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0;
-       inputw = MIN(inputw, mw/3);
+       inputw = mw / 3; /* input width: ~33% of monitor width */
        match();
 
        /* create menu window */
@@ -707,9 +710,8 @@
 static void
 usage(void)
 {
-       fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m 
monitor]\n"
-             "             [-nb color] [-nf color] [-sb color] [-sf color] [-w 
windowid]\n", stderr);
-       exit(1);
+       die("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m 
monitor]\n"
+           "             [-nb color] [-nf color] [-sb color] [-sf color] [-w 
windowid]");
 }
 
 int
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmenu-5.1/drw.c new/dmenu-5.2/drw.c
--- old/dmenu-5.1/drw.c 2022-02-11 12:31:56.000000000 +0100
+++ new/dmenu-5.2/drw.c 2022-10-04 19:36:58.000000000 +0200
@@ -133,19 +133,6 @@
                die("no font specified.");
        }
 
-       /* Do not allow using color fonts. This is a workaround for a BadLength
-        * error from Xft with color glyphs. Modelled on the Xterm workaround. 
See
-        * https://bugzilla.redhat.com/show_bug.cgi?id=1498269
-        * https://lists.suckless.org/dev/1701/30932.html
-        * https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=916349
-        * and lots more all over the internet.
-        */
-       FcBool iscol;
-       if(FcPatternGetBool(xfont->pattern, FC_COLOR, 0, &iscol) == 
FcResultMatch && iscol) {
-               XftFontClose(drw->dpy, xfont);
-               return NULL;
-       }
-
        font = ecalloc(1, sizeof(Fnt));
        font->xfont = xfont;
        font->pattern = pattern;
@@ -251,12 +238,10 @@
 int
 drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int 
lpad, const char *text, int invert)
 {
-       char buf[1024];
-       int ty;
-       unsigned int ew;
+       int i, ty, ellipsis_x = 0;
+       unsigned int tmpw, ew, ellipsis_w = 0, ellipsis_len;
        XftDraw *d = NULL;
        Fnt *usedfont, *curfont, *nextfont;
-       size_t i, len;
        int utf8strlen, utf8charlen, render = x || y || w || h;
        long utf8codepoint = 0;
        const char *utf8str;
@@ -264,13 +249,17 @@
        FcPattern *fcpattern;
        FcPattern *match;
        XftResult result;
-       int charexists = 0;
+       int charexists = 0, overflow = 0;
+       /* keep track of a couple codepoints for which we have no match. */
+       enum { nomatches_len = 64 };
+       static struct { long codepoint[nomatches_len]; unsigned int idx; } 
nomatches;
+       static unsigned int ellipsis_width = 0;
 
-       if (!drw || (render && !drw->scheme) || !text || !drw->fonts)
+       if (!drw || (render && (!drw->scheme || !w)) || !text || !drw->fonts)
                return 0;
 
        if (!render) {
-               w = ~w;
+               w = invert ? invert : ~invert;
        } else {
                XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : 
ColBg].pixel);
                XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
@@ -282,8 +271,10 @@
        }
 
        usedfont = drw->fonts;
+       if (!ellipsis_width && render)
+               ellipsis_width = drw_fontset_getwidth(drw, "...");
        while (1) {
-               utf8strlen = 0;
+               ew = ellipsis_len = utf8strlen = 0;
                utf8str = text;
                nextfont = NULL;
                while (*text) {
@@ -291,9 +282,27 @@
                        for (curfont = drw->fonts; curfont; curfont = 
curfont->next) {
                                charexists = charexists || 
XftCharExists(drw->dpy, curfont->xfont, utf8codepoint);
                                if (charexists) {
-                                       if (curfont == usedfont) {
+                                       drw_font_getexts(curfont, text, 
utf8charlen, &tmpw, NULL);
+                                       if (ew + ellipsis_width <= w) {
+                                               /* keep track where the 
ellipsis still fits */
+                                               ellipsis_x = x + ew;
+                                               ellipsis_w = w - ew;
+                                               ellipsis_len = utf8strlen;
+                                       }
+
+                                       if (ew + tmpw > w) {
+                                               overflow = 1;
+                                               /* called from 
drw_fontset_getwidth_clamp():
+                                                * it wants the width AFTER the 
overflow
+                                                */
+                                               if (!render)
+                                                       x += tmpw;
+                                               else
+                                                       utf8strlen = 
ellipsis_len;
+                                       } else if (curfont == usedfont) {
                                                utf8strlen += utf8charlen;
                                                text += utf8charlen;
+                                               ew += tmpw;
                                        } else {
                                                nextfont = curfont;
                                        }
@@ -301,36 +310,25 @@
                                }
                        }
 
-                       if (!charexists || nextfont)
+                       if (overflow || !charexists || nextfont)
                                break;
                        else
                                charexists = 0;
                }
 
                if (utf8strlen) {
-                       drw_font_getexts(usedfont, utf8str, utf8strlen, &ew, 
NULL);
-                       /* shorten text if necessary */
-                       for (len = MIN(utf8strlen, sizeof(buf) - 1); len && ew 
> w; len--)
-                               drw_font_getexts(usedfont, utf8str, len, &ew, 
NULL);
-
-                       if (len) {
-                               memcpy(buf, utf8str, len);
-                               buf[len] = '\0';
-                               if (len < utf8strlen)
-                                       for (i = len; i && i > len - 3; 
buf[--i] = '.')
-                                               ; /* NOP */
-
-                               if (render) {
-                                       ty = y + (h - usedfont->h) / 2 + 
usedfont->xfont->ascent;
-                                       XftDrawStringUtf8(d, 
&drw->scheme[invert ? ColBg : ColFg],
-                                                         usedfont->xfont, x, 
ty, (XftChar8 *)buf, len);
-                               }
-                               x += ew;
-                               w -= ew;
+                       if (render) {
+                               ty = y + (h - usedfont->h) / 2 + 
usedfont->xfont->ascent;
+                               XftDrawStringUtf8(d, &drw->scheme[invert ? 
ColBg : ColFg],
+                                                 usedfont->xfont, x, ty, 
(XftChar8 *)utf8str, utf8strlen);
                        }
+                       x += ew;
+                       w -= ew;
                }
+               if (render && overflow)
+                       drw_text(drw, ellipsis_x, y, ellipsis_w, h, 0, "...", 
invert);
 
-               if (!*text) {
+               if (!*text || overflow) {
                        break;
                } else if (nextfont) {
                        charexists = 0;
@@ -340,6 +338,12 @@
                         * character must be drawn. */
                        charexists = 1;
 
+                       for (i = 0; i < nomatches_len; ++i) {
+                               /* avoid calling XftFontMatch if we know we 
won't find a match */
+                               if (utf8codepoint == nomatches.codepoint[i])
+                                       goto no_match;
+                       }
+
                        fccharset = FcCharSetCreate();
                        FcCharSetAddChar(fccharset, utf8codepoint);
 
@@ -351,7 +355,6 @@
                        fcpattern = FcPatternDuplicate(drw->fonts->pattern);
                        FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset);
                        FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue);
-                       FcPatternAddBool(fcpattern, FC_COLOR, FcFalse);
 
                        FcConfigSubstitute(NULL, fcpattern, FcMatchPattern);
                        FcDefaultSubstitute(fcpattern);
@@ -368,6 +371,8 @@
                                        curfont->next = usedfont;
                                } else {
                                        xfont_free(usedfont);
+                                       nomatches.codepoint[++nomatches.idx % 
nomatches_len] = utf8codepoint;
+no_match:
                                        usedfont = drw->fonts;
                                }
                        }
@@ -397,6 +402,15 @@
        return drw_text(drw, 0, 0, 0, 0, 0, text, 0);
 }
 
+unsigned int
+drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n)
+{
+       unsigned int tmp = 0;
+       if (drw && drw->fonts && text && n)
+               tmp = drw_text(drw, 0, 0, 0, 0, 0, text, n);
+       return MIN(n, tmp);
+}
+
 void
 drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int 
*w, unsigned int *h)
 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmenu-5.1/drw.h new/dmenu-5.2/drw.h
--- old/dmenu-5.1/drw.h 2022-02-11 12:31:56.000000000 +0100
+++ new/dmenu-5.2/drw.h 2022-10-04 19:36:58.000000000 +0200
@@ -35,6 +35,7 @@
 Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount);
 void drw_fontset_free(Fnt* set);
 unsigned int drw_fontset_getwidth(Drw *drw, const char *text);
+unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned 
int n);
 void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned 
int *w, unsigned int *h);
 
 /* Colorscheme abstraction */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmenu-5.1/util.c new/dmenu-5.2/util.c
--- old/dmenu-5.1/util.c        2022-02-11 12:31:56.000000000 +0100
+++ new/dmenu-5.2/util.c        2022-10-04 19:36:58.000000000 +0200
@@ -6,18 +6,9 @@
 
 #include "util.h"
 
-void *
-ecalloc(size_t nmemb, size_t size)
-{
-       void *p;
-
-       if (!(p = calloc(nmemb, size)))
-               die("calloc:");
-       return p;
-}
-
 void
-die(const char *fmt, ...) {
+die(const char *fmt, ...)
+{
        va_list ap;
 
        va_start(ap, fmt);
@@ -33,3 +24,13 @@
 
        exit(1);
 }
+
+void *
+ecalloc(size_t nmemb, size_t size)
+{
+       void *p;
+
+       if (!(p = calloc(nmemb, size)))
+               die("calloc:");
+       return p;
+}

Reply via email to