tags 240989 + patch thanks Hi Jarrod, hi bts.
On Tue, Nov 03, 2009 at 07:24:27PM +0000, Jarrod Lowe wrote: > I have written a patch for this issue. I have mangled your patch into a dpatch file which applies after all other dpatch patches included in the current Debian package. Seems to work for me, but no guaranties... greetings, Uli diff -urN procps-3.2.8/debian/changelog procps-3.2.8~utf8/debian/changelog --- procps-3.2.8/debian/changelog 2010-01-08 12:49:03.000000000 +0100 +++ procps-3.2.8~utf8/debian/changelog 2010-01-08 12:46:53.000000000 +0100 @@ -1,3 +1,10 @@ +procps (1:3.2.8-2.1) UNRELEASED; urgency=low + + * No upload at all, not even an NMU... + * added watch-unicode patch by Jarrod Lowe Closes: #240989 + + -- Uli Martens <u...@youam.net> Fri, 08 Jan 2010 10:12:07 +0100 + procps (1:3.2.8-2) unstable; urgency=low * ps displays supplementary groups Closes: #506303 diff -urN procps-3.2.8/debian/control procps-3.2.8~utf8/debian/control --- procps-3.2.8/debian/control 2010-01-08 12:49:03.000000000 +0100 +++ procps-3.2.8~utf8/debian/control 2010-01-11 09:51:30.000000000 +0100 @@ -2,7 +2,7 @@ Section: admin Priority: required Maintainer: Craig Small <csm...@debian.org> -Build-Depends: debhelper (>= 7), libncurses5-dev, make (>= 3.78.1-8), dpatch +Build-Depends: debhelper (>= 7), libncurses5-dev, libncursesw5-dev, make (>= 3.78.1-8), dpatch Standards-Version: 3.8.3 Homepage: http://procps.sf.net/ diff -urN procps-3.2.8/debian/patches/00list procps-3.2.8~utf8/debian/patches/00list --- procps-3.2.8/debian/patches/00list 2010-01-08 12:49:03.000000000 +0100 +++ procps-3.2.8~utf8/debian/patches/00list 2010-01-08 12:46:53.000000000 +0100 @@ -51,3 +51,4 @@ 55_top_highlight 60_top_nohz 65_fix_partition_format +70_watch_unicode diff -urN procps-3.2.8/debian/patches/70_watch_unicode.dpatch procps-3.2.8~utf8/debian/patches/70_watch_unicode.dpatch --- procps-3.2.8/debian/patches/70_watch_unicode.dpatch 1970-01-01 01:00:00.000000000 +0100 +++ procps-3.2.8~utf8/debian/patches/70_watch_unicode.dpatch 2010-01-11 09:50:29.000000000 +0100 @@ -0,0 +1,301 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 70_watch-unicode.dpatch by Jarrod Lowe <pro...@rrod.net> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: add support for unicode characters + +...@dpatch@ +diff -urNad procps-3.2.8~/AUTHORS procps-3.2.8/AUTHORS +--- procps-3.2.8~/AUTHORS 2010-01-08 09:55:26.000000000 +0100 ++++ procps-3.2.8/AUTHORS 2010-01-08 09:59:12.000000000 +0100 +@@ -47,4 +47,5 @@ + watch: + Tony Rems <re...@unisoft.com> + Mike Coleman <m...@acm.org> ++Jarrod Lowe <pro...@rrod.net> + +diff -urNad procps-3.2.8~/Makefile procps-3.2.8/Makefile +--- procps-3.2.8~/Makefile 2010-01-08 09:58:52.000000000 +0100 ++++ procps-3.2.8/Makefile 2010-01-08 10:00:27.000000000 +0100 +@@ -68,6 +68,7 @@ + _TARFILES := Makefile + + CURSES := -lncurses ++CURSESW := -lncursesw + + # This seems about right for the dynamic library stuff. + # Something like this is probably needed to make the SE Linux +@@ -119,7 +120,7 @@ + # Unlike the kernel one, this check_gcc goes all the way to + # producing an executable. There might be a -m64 that works + # until you go looking for a 64-bit curses library. +-check_gcc = $(shell if $(CC) $(ALL_CPPFLAGS) $(ALL_CFLAGS) dummy.c $(ALL_LDFLAGS) $(1) -o will_this_file_really_exist.tmp $(CURSES) > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ; rm -f will_this_file_really_exist.tmp) ++check_gcc = $(shell if $(CC) $(ALL_CPPFLAGS) $(ALL_CFLAGS) dummy.c $(ALL_LDFLAGS) $(1) -o will_this_file_really_exist.tmp $(CURSES) $(CURSESW) > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ; rm -f will_this_file_really_exist.tmp) + + # Be 64-bit if at all possible. In a cross-compiling situation, one may + # do "make m64=-m32 lib64=lib" to produce 32-bit executables. DO NOT +@@ -250,7 +251,7 @@ + $(CC) $(ALL_CFLAGS) $^ $(ALL_LDFLAGS) -o $@ $(CURSES) + + watch: % : %.o +- $(CC) $(ALL_CFLAGS) $^ $(ALL_LDFLAGS) -o $@ $(CURSES) ++ $(CC) $(ALL_CFLAGS) $^ $(ALL_LDFLAGS) -o $@ $(CURSESW) + + ############ progX --> progY + +diff -urNad procps-3.2.8~/watch.1 procps-3.2.8/watch.1 +--- procps-3.2.8~/watch.1 2010-01-08 09:58:52.000000000 +0100 ++++ procps-3.2.8/watch.1 2010-01-08 10:04:37.000000000 +0100 +@@ -139,6 +139,16 @@ + Non-printing characters are stripped from program output. Use "cat -v" as + part of the command pipeline if you want to see them. + .PP ++Combining Characters that are supposed to display on the character at the ++last column on the screen may display one column early, or they may not ++display at all. ++.PP ++Combining Characters never count as different in ++.I --differences ++mode. Only the base character counts. ++.PP ++Blank lines directly after a line which ends in the last column do not ++display. + .I \-\-precise + mode doesn't yet have advanced temporal distortion technology to + compensate for a +@@ -161,6 +171,7 @@ + corrections by Francois Pinard. It was reworked and new features added by + Mike Coleman <m...@acm.org> in 1999. The beep, exec, and error handling + features were added by Morty Abzug <mo...@frakir.org> in 2008. ++Unicode support was added in 2009 by Jarrod Lowe <pro...@rrod.net>. + On a not so dark and stormy morning + in March of 2003, Anthony DeRobertis <a...@suespammers.org> got sick of + his watches that should update every minute eventually updating many +diff -urNad procps-3.2.8~/watch.c procps-3.2.8/watch.c +--- procps-3.2.8~/watch.c 2010-01-08 09:58:52.000000000 +0100 ++++ procps-3.2.8/watch.c 2010-01-08 10:09:51.000000000 +0100 +@@ -9,15 +9,17 @@ + * + * Changes by Albert Cahalan, 2002-2003. + * stderr handling, exec, and beep option added by Morty Abzug, 2008 ++ * Unicode Support added by Jarrod Lowe <pro...@rrod.net> in 2009. + */ + +-#define VERSION "0.2.0" ++#define VERSION "0.3.0" + ++#include <wchar.h> + #include <ctype.h> + #include <getopt.h> + #include <signal.h> +-#include <ncurses.h> + #include <stdio.h> ++#include <ncursesw/ncurses.h> + #include <stdlib.h> + #include <string.h> + #include <sys/ioctl.h> +@@ -27,6 +29,7 @@ + #include <termios.h> + #include <locale.h> + #include "proc/procps.h" ++#include <errno.h> + + #ifdef FORCE_8BIT + #undef isprint +@@ -150,6 +153,32 @@ + return USECS_PER_SEC*now.tv_sec + now.tv_usec; + } + ++// read a wide character from a popen'd stream ++#define MAX_ENC_BYTES 16 ++wint_t my_getwc(FILE *s); ++wint_t my_getwc(FILE *s) { ++ char i[MAX_ENC_BYTES]; //assuming no encoding ever consumes more than 16 bytes ++ int byte = 0; ++ int convert; ++ int x; ++ wchar_t rval; ++ while(1) { ++ i[byte] = getc(s); ++ if (i[byte]==EOF) { return WEOF; } ++ byte++; ++ errno = 0; ++ mbtowc(NULL, NULL, 0); ++ convert = mbtowc(&rval, i, byte); ++ x = errno; ++ if(convert > 0) { return rval; } //legal conversion ++ if(byte == MAX_ENC_BYTES) { ++ while(byte > 1) { ungetc(i[--byte], s); } //at least *try* to fix up ++ errno = -EILSEQ; ++ return WEOF; ++ } ++ } ++} ++ + int + main(int argc, char *argv[]) + { +@@ -162,7 +191,10 @@ + option_help = 0, option_version = 0; + double interval = 2; + char *command; ++ wchar_t *wcommand = NULL; + char **command_argv; ++ int wcommand_columns = 0; /* not including final \0 */ ++ int wcommand_characters = 0; /* not including final \0 */ + int command_length = 0; /* not including final \0 */ + watch_usec_t next_loop; /* next loop time in us, used for precise time + keeping only */ +@@ -259,6 +291,23 @@ + command[command_length] = '\0'; + } + ++ // convert to wide for printing purposes ++ //mbstowcs(NULL, NULL, 0); ++ wcommand_characters = mbstowcs(NULL, command, 0); ++ if(wcommand_characters < 0) { ++ fprintf(stderr, "Unicode Handling Error\n"); ++ exit(1); ++ } ++ wcommand = (wchar_t*)malloc((wcommand_characters+1) * sizeof(wcommand)); ++ if(wcommand == NULL) { ++ fprintf(stderr, "Unicode Handling Error (malloc)\n"); ++ exit(1); ++ } ++ mbstowcs(wcommand, command, wcommand_characters+1); ++ wcommand_columns = wcswidth(wcommand, -1); ++ ++ ++ + get_terminal_size(); + + /* Catch keyboard interrupts so we can put tty back in a sane state. */ +@@ -298,12 +347,44 @@ + if (show_title) { + // left justify interval and command, + // right justify time, clipping all to fit window width +- asprintf(&header, "Every %.1fs: %.*s", +- interval, min(width - 1, command_length), command); +- mvaddstr(0, 0, header); +- if (strlen(header) > (size_t) (width - tsl - 1)) +- mvaddstr(0, width - tsl - 4, "... "); +- mvaddstr(0, width - tsl + 1, ts); ++ ++ int hlen = asprintf(&header, "Every %.1fs: ", interval); ++ ++ // the rules: ++ // width < tsl : print nothing ++ // width < tsl + hlen + 1: print ts ++ // width = tsl + hlen + 1: print header, ts ++ // width < tsl + hlen + 4: print header, ..., ts ++ // width < tsl + hlen + wcommand_columns: print header, truncated wcommand, ..., ts ++ // width > "": print header, wcomand, ts ++ // this is slightly different from how it used to be ++ if(width >= tsl) { ++ if(width >= tsl + hlen + 1) { ++ mvaddstr(0, 0, header); ++ if(width >= tsl + hlen + 2) { ++ if(width < tsl + hlen + 4) { ++ mvaddstr(0, width - tsl - 4, "... "); ++ }else{ ++ if(width < tsl + hlen + wcommand_columns) { ++ // print truncated ++ int avail_columns = width - tsl - hlen; ++ int using_columns = wcommand_columns; ++ int using_characters = wcommand_characters; ++ while(using_columns > avail_columns - 4) { ++ using_characters--; ++ using_columns = wcswidth(wcommand, using_characters); ++ } ++ mvaddnwstr(0, hlen, wcommand, using_characters); ++ mvaddstr(0, width - tsl - 4, "... "); ++ }else{ ++ mvaddwstr(0, hlen, wcommand); ++ } ++ } ++ } ++ } ++ mvaddstr(0, width - tsl + 1, ts); ++ } ++ + free(header); + } + +@@ -360,47 +441,62 @@ + + for (y = show_title; y < height; y++) { + int eolseen = 0, tabpending = 0; ++ wint_t carry = WEOF; + for (x = 0; x < width; x++) { +- int c = ' '; ++ wint_t c = L' '; + int attr = 0; + + if (!eolseen) { + /* if there is a tab pending, just spit spaces until the + next stop instead of reading characters */ + if (!tabpending) +- do +- c = getc(p); +- while (c != EOF && !isprint(c) +- && c != '\n' +- && c != '\t'); +- if (c == '\n') ++ do { ++ if(carry == WEOF) { ++ c = my_getwc(p); ++ }else{ ++ c = carry; ++ carry = WEOF; ++ } ++ }while (c != WEOF && !isprint(c) && c<128 ++ && wcwidth(c) == 0 ++ && c != L'\n' ++ && c != L'\t'); ++ if (c == L'\n') + if (!oldeolseen && x == 0) { + x = -1; + continue; + } else + eolseen = 1; +- else if (c == '\t') ++ else if (c == L'\t') + tabpending = 1; +- if (c == EOF || c == '\n' || c == '\t') +- c = ' '; ++ if (x==width-1 && wcwidth(c)==2) { ++ y++; ++ x = -1; //process this double-width ++ carry = c; //character on the next line ++ continue; //because it won't fit here ++ } ++ if (c == WEOF || c == L'\n' || c == L'\t') ++ c = L' '; + if (tabpending && (((x + 1) % 8) == 0)) + tabpending = 0; + } + move(y, x); + if (option_differences) { +- chtype oldch = inch(); +- unsigned char oldc = oldch & A_CHARTEXT; ++ cchar_t oldc; ++ in_wch(&oldc); + attr = !first_screen +- && ((char)c != oldc ++ && ((wchar_t)c != oldc.chars[0] + || + (option_differences_cumulative +- && (oldch & A_ATTRIBUTES))); ++ && (oldc.attr & A_ATTRIBUTES))); + } + if (attr) + standout(); +- addch(c); ++ addnwstr((wchar_t*)&c,1); + if (attr) + standend(); ++ if(wcwidth(c) == 0) { x--; } ++ if(wcwidth(c) == 2) { x++; } + } + oldeolseen = eolseen; + } -- To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org