From 6deefa821444efc64abc78144af5de35ff78f5c0 Mon Sep 17 00:00:00 2001 From: Philip Balister Date: Sat, 21 Feb 2009 10:41:48 -0500 Subject: libnetfilter_queue : Use default configure method. Resolves issue on 64 bit build machine. --- packages/libnetfilter-queue/libnetfilter-queue_0.0.13.bb | 6 ------ 1 file changed, 6 deletions(-) (limited to 'packages') diff --git a/packages/libnetfilter-queue/libnetfilter-queue_0.0.13.bb b/packages/libnetfilter-queue/libnetfilter-queue_0.0.13.bb index 97af3a7da5..2d4deb2a97 100644 --- a/packages/libnetfilter-queue/libnetfilter-queue_0.0.13.bb +++ b/packages/libnetfilter-queue/libnetfilter-queue_0.0.13.bb @@ -18,12 +18,6 @@ S = "${WORKDIR}/libnetfilter_queue-${PV}" inherit autotools pkgconfig -do_configure() { - gnu-configize - libtoolize --force - oe_runconf -} - do_stage() { autotools_stage_all } -- cgit v1.2.3 From 3d46f2e2910c308f012ada33321ba18170d44aad Mon Sep 17 00:00:00 2001 From: Philip Balister Date: Sat, 21 Feb 2009 10:47:09 -0500 Subject: libnetfilter-queue : Convert recipe to use include file. * Remove versioned dependency on libtool as OE uses libtool-2,x now. --- packages/libnetfilter-queue/libnetfilter-queue.inc | 22 ++++++++++++++++++++ .../libnetfilter-queue_0.0.13.bb | 24 +--------------------- 2 files changed, 23 insertions(+), 23 deletions(-) create mode 100644 packages/libnetfilter-queue/libnetfilter-queue.inc (limited to 'packages') diff --git a/packages/libnetfilter-queue/libnetfilter-queue.inc b/packages/libnetfilter-queue/libnetfilter-queue.inc new file mode 100644 index 0000000000..96ec16c330 --- /dev/null +++ b/packages/libnetfilter-queue/libnetfilter-queue.inc @@ -0,0 +1,22 @@ +DESCRIPTION = "libnetfilter_queue is a userspace library providing an API to \ +packets that have been queued by the kernel packet filter. It is is part of a \ +system that deprecates the old ip_queue / libipq mechanism." + +SECTION = "devel/libs" +LICENSE = "GPL" +HOMEPAGE = "http://www.netfilter.org/projects/libnetfilter_queue/index.html" +PR = "r0" + + +DEPENDS = "libnfnetlink" + +SRC_URI = "http://www.netfilter.org/projects/libnetfilter_queue/files/libnetfilter_queue-${PV}.tar.bz2" + +S = "${WORKDIR}/libnetfilter_queue-${PV}" + +inherit autotools pkgconfig + +do_stage() { + autotools_stage_all +} + diff --git a/packages/libnetfilter-queue/libnetfilter-queue_0.0.13.bb b/packages/libnetfilter-queue/libnetfilter-queue_0.0.13.bb index 2d4deb2a97..b9c14546ed 100644 --- a/packages/libnetfilter-queue/libnetfilter-queue_0.0.13.bb +++ b/packages/libnetfilter-queue/libnetfilter-queue_0.0.13.bb @@ -1,24 +1,2 @@ -DESCRIPTION = "libnetfilter_queue is a userspace library providing an API to \ -packets that have been queued by the kernel packet filter. It is is part of a \ -system that deprecates the old ip_queue / libipq mechanism." - -SECTION = "devel/libs" -LICENSE = "GPL" -HOMEPAGE = "http://www.netfilter.org/projects/libnetfilter_queue/index.html" -PR = "r0" - - -# This package requires libtool-cross-1.5.24 which is not the default libtool -# used by OE (25AUG2007) -DEPENDS = "libnfnetlink libtool-cross (>=1.5.24)" - -SRC_URI = "http://www.netfilter.org/projects/libnetfilter_queue/files/libnetfilter_queue-${PV}.tar.bz2" - -S = "${WORKDIR}/libnetfilter_queue-${PV}" - -inherit autotools pkgconfig - -do_stage() { - autotools_stage_all -} +include libnetfilter_queue.inc -- cgit v1.2.3 From 2e1e0234daf63222937cf1c6eff514087c8b5f89 Mon Sep 17 00:00:00 2001 From: Philip Balister Date: Sat, 21 Feb 2009 10:50:56 -0500 Subject: libnetfilter-queue : Add recipe for version 0.0.16. * libnetfilter_queue is a userspace library providing an API to packets that have been queued by the kernel packet filter. --- packages/libnetfilter-queue/libnetfilter-queue_0.0.16.bb | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 packages/libnetfilter-queue/libnetfilter-queue_0.0.16.bb (limited to 'packages') diff --git a/packages/libnetfilter-queue/libnetfilter-queue_0.0.16.bb b/packages/libnetfilter-queue/libnetfilter-queue_0.0.16.bb new file mode 100644 index 0000000000..b9c14546ed --- /dev/null +++ b/packages/libnetfilter-queue/libnetfilter-queue_0.0.16.bb @@ -0,0 +1,2 @@ +include libnetfilter_queue.inc + -- cgit v1.2.3 From 5977fc00770abf068b5cca68b15150d41c91b7a8 Mon Sep 17 00:00:00 2001 From: Philip Balister Date: Sat, 21 Feb 2009 21:30:45 -0500 Subject: libnetfilter_queue : Fix "I am an idiot" type problem. --- packages/libnetfilter-queue/libnetfilter-queue_0.0.13.bb | 2 +- packages/libnetfilter-queue/libnetfilter-queue_0.0.16.bb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'packages') diff --git a/packages/libnetfilter-queue/libnetfilter-queue_0.0.13.bb b/packages/libnetfilter-queue/libnetfilter-queue_0.0.13.bb index b9c14546ed..044777c0ce 100644 --- a/packages/libnetfilter-queue/libnetfilter-queue_0.0.13.bb +++ b/packages/libnetfilter-queue/libnetfilter-queue_0.0.13.bb @@ -1,2 +1,2 @@ -include libnetfilter_queue.inc +include libnetfilter-queue.inc diff --git a/packages/libnetfilter-queue/libnetfilter-queue_0.0.16.bb b/packages/libnetfilter-queue/libnetfilter-queue_0.0.16.bb index b9c14546ed..044777c0ce 100644 --- a/packages/libnetfilter-queue/libnetfilter-queue_0.0.16.bb +++ b/packages/libnetfilter-queue/libnetfilter-queue_0.0.16.bb @@ -1,2 +1,2 @@ -include libnetfilter_queue.inc +include libnetfilter-queue.inc -- cgit v1.2.3 From 34a486a5b0e0e1fe2eb217bd9cfd80d53328fbe4 Mon Sep 17 00:00:00 2001 From: Philipp Zabel Date: Sun, 22 Feb 2009 10:44:32 +0100 Subject: busybox-static-1.11.3: Add missing B921600 patch to fix build. * This patch was added to busybox 1.11.3, but not busybox-static. --- packages/busybox/busybox-static-1.11.3/B921600.patch | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 packages/busybox/busybox-static-1.11.3/B921600.patch (limited to 'packages') diff --git a/packages/busybox/busybox-static-1.11.3/B921600.patch b/packages/busybox/busybox-static-1.11.3/B921600.patch new file mode 100644 index 0000000000..61cc32b0e5 --- /dev/null +++ b/packages/busybox/busybox-static-1.11.3/B921600.patch @@ -0,0 +1,13 @@ +diff -upNr busybox-1.7.2/libbb/speed_table.c busybox-1.7.2-921600/libbb/speed_table.c +--- busybox-1.7.2/libbb/speed_table.c 2007-09-03 13:48:41.000000000 +0200 ++++ busybox-1.7.2-921600/libbb/speed_table.c 2008-10-09 16:23:26.269592899 +0200 +@@ -52,6 +52,9 @@ static const struct speed_map speeds[] = + #ifdef B460800 + {B460800, 460800/256 + 0x8000U}, + #endif ++#ifdef B921600 ++ {B921600, 921600/256 + 0x8000U}, ++#endif + }; + + enum { NUM_SPEEDS = ARRAY_SIZE(speeds) }; -- cgit v1.2.3 From 871a0a944e8c16c2bb7f012e5411618d11106d2e Mon Sep 17 00:00:00 2001 From: Koen Kooi Date: Sun, 22 Feb 2009 10:58:02 +0100 Subject: gstreamer-ti: bump PR for memleak fixes --- packages/dsplink/gstreamer-ti_svn.bb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'packages') diff --git a/packages/dsplink/gstreamer-ti_svn.bb b/packages/dsplink/gstreamer-ti_svn.bb index b7ad411e32..dbf6671f08 100644 --- a/packages/dsplink/gstreamer-ti_svn.bb +++ b/packages/dsplink/gstreamer-ti_svn.bb @@ -1,7 +1,7 @@ DEPENDS = "ti-codec-engine ti-dmai gstreamer gst-plugins-base gst-plugins-good gst-plugins-ugly libid3tag liboil libmad" SRC_URI = "svn://omapzoom.org/svn/gstreamer_ti/trunk;module=gstreamer_ti;proto=https" -SRCREV = "87" +SRCREV = "110" PR = "r1" -- cgit v1.2.3 From 1ac31da6db392f743b5f75e31ac91e12fcb27b26 Mon Sep 17 00:00:00 2001 From: Koen Kooi Date: Sun, 22 Feb 2009 11:07:15 +0100 Subject: run-postinsts: add from poky --- packages/meta/run-postinsts/run-postinsts | 36 +++++++++++++++++++++++++++ packages/meta/run-postinsts/run-postinsts.awk | 30 ++++++++++++++++++++++ packages/meta/run-postinsts_1.0.bb | 30 ++++++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100755 packages/meta/run-postinsts/run-postinsts create mode 100644 packages/meta/run-postinsts/run-postinsts.awk create mode 100644 packages/meta/run-postinsts_1.0.bb (limited to 'packages') diff --git a/packages/meta/run-postinsts/run-postinsts b/packages/meta/run-postinsts/run-postinsts new file mode 100755 index 0000000000..f632d1c7d3 --- /dev/null +++ b/packages/meta/run-postinsts/run-postinsts @@ -0,0 +1,36 @@ +#!/bin/sh +# +# Copyright 2007 Openedhand Ltd. +# +# Author: Richard Purdie +# + +PKGSYSTEM=/var/dpkg + +if [ ! -e $PKGSYSTEM/status ]; then + if [ -e /usr/lib/opkg/status ]; then + PKGSYSTEM=/usr/lib/opkg + else + echo "No package system found" + exit 1 + fi +fi + +STAMP=$PKGSYSTEM/postinsts-done +STATFILE=$PKGSYSTEM/status +STATFILE2=$PKGSYSTEM/status2 + +if [ -e $STAMP ]; then + exit 0 +fi + +awk -f /usr/share/run-postinsts/run-postinsts.awk $STATFILE > $STATFILE2 +if [ $? = 0 ]; then + mv $STATFILE2 $STATFILE + touch $STAMP + exit 0 +else + rm -f $STATFILE2 + rm -f $STAMP + exit 1 +fi diff --git a/packages/meta/run-postinsts/run-postinsts.awk b/packages/meta/run-postinsts/run-postinsts.awk new file mode 100644 index 0000000000..09a1400cf4 --- /dev/null +++ b/packages/meta/run-postinsts/run-postinsts.awk @@ -0,0 +1,30 @@ +# +# Copyright 2007 Openedhand Ltd. +# +# Author: Richard Purdie +# +# Rather hacky proof of concept +# + +BEGIN { + rc=system("test -d /usr/dpkg/info/") + if (rc==0) + pkgdir="/var/dpkg/info" + else + pkgdir="/usr/lib/opkg/info" + package="" +} +/Package:.*/ { + package = substr($0, 10) +} +/Status:.*unpacked.*/ { + print "Configuring: " package > "/dev/stderr" + ret = system(pkgdir "/" package ".postinst 1>&2") + if (ret == 0) + $0 = gensub("unpacked", "installed", 1) + else + print "Postinstall failed for " package > "/dev/stderr" +} +{ + print $0 +} diff --git a/packages/meta/run-postinsts_1.0.bb b/packages/meta/run-postinsts_1.0.bb new file mode 100644 index 0000000000..79333dc7fe --- /dev/null +++ b/packages/meta/run-postinsts_1.0.bb @@ -0,0 +1,30 @@ +DESCRIPTION = "Run postinstall scripts on device using awk" +SECTION = "devel" +PR = "r6" + +SRC_URI = "file://run-postinsts file://run-postinsts.awk" + +INITSCRIPT_NAME = "run-postinsts" +INITSCRIPT_PARAMS = "start 98 S ." + +inherit update-rc.d + +do_configure() { + : +} + +do_compile () { + : +} + +do_install() { + install -d ${D}${sysconfdir}/init.d/ + install -m 0755 ${WORKDIR}/run-postinsts ${D}${sysconfdir}/init.d/ + + install -d ${D}${datadir}/${PN}/ + install -m 0644 ${WORKDIR}/run-postinsts.awk ${D}${datadir}/${PN}/ +} + +do_stage () { + : +} -- cgit v1.2.3 From dc5457b68bfccca1f7a3be247b0af7500422e8a3 Mon Sep 17 00:00:00 2001 From: Koen Kooi Date: Sun, 22 Feb 2009 19:22:45 +0100 Subject: motion: fix ffmpeg support --- .../motion-3.2.11/ffmpeg-0.4.9.15594svn-20081010.diff | 14 ++++++++++++++ packages/motion/motion_3.2.11.bb | 7 ++++--- 2 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 packages/motion/motion-3.2.11/ffmpeg-0.4.9.15594svn-20081010.diff (limited to 'packages') diff --git a/packages/motion/motion-3.2.11/ffmpeg-0.4.9.15594svn-20081010.diff b/packages/motion/motion-3.2.11/ffmpeg-0.4.9.15594svn-20081010.diff new file mode 100644 index 0000000000..af85599f20 --- /dev/null +++ b/packages/motion/motion-3.2.11/ffmpeg-0.4.9.15594svn-20081010.diff @@ -0,0 +1,14 @@ +Index: ffmpeg.c +=================================================================== +--- trunk/ffmpeg.c (revision 434) ++++ trunk/ffmpeg.c (working copy) +@@ -164,7 +164,8 @@ + return write(fd, buf, size); + } + +-static offset_t file_seek(URLContext *h, offset_t pos, int whence) ++ ++static int64_t file_seek(URLContext *h, int64_t pos, int whence) + { + int fd = (size_t)h->priv_data; + return lseek(fd, pos, whence); diff --git a/packages/motion/motion_3.2.11.bb b/packages/motion/motion_3.2.11.bb index dc7c0ecdbb..999a0ab6bd 100644 --- a/packages/motion/motion_3.2.11.bb +++ b/packages/motion/motion_3.2.11.bb @@ -7,13 +7,14 @@ DEPENDS = "jpeg ffmpeg mysql postgresql" RSUGGESTS = "mysql-client postgresql-client" -PR = "r0" +PR = "r1" -SRC_URI = "${SOURCEFORGE_MIRROR}/${PN}/${PN}-${PV}.tar.gz" +SRC_URI = "${SOURCEFORGE_MIRROR}/${PN}/${PN}-${PV}.tar.gz \ + file://ffmpeg-0.4.9.15594svn-20081010.diff;patch=1 " inherit autotools -EXTRA_OECONF = " --with-ffmpeg=${STAGING_LIBDIR} \ +EXTRA_OECONF = " --with-ffmpeg=${STAGING_LIBDIR}/../ \ --with-mysql-lib=${STAGING_LIBDIR} \ --with-mysql-include=${STAGING_INCDIR}/mysql \ --with-pgsql-lib=${STAGING_LIBDIR} \ -- cgit v1.2.3 From 3bde687e5755fd6675cd66b00f6628dab87ae85a Mon Sep 17 00:00:00 2001 From: Frans Meulenbroeks Date: Sun, 22 Feb 2009 22:05:42 +0100 Subject: gpsd: moved to 2.38 --- packages/gpsd/gpsd.inc | 2 +- packages/gpsd/gpsd_2.37.bb | 3 --- packages/gpsd/gpsd_2.38.bb | 3 +++ 3 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 packages/gpsd/gpsd_2.37.bb create mode 100644 packages/gpsd/gpsd_2.38.bb (limited to 'packages') diff --git a/packages/gpsd/gpsd.inc b/packages/gpsd/gpsd.inc index e4f5a9988b..1022091c6c 100644 --- a/packages/gpsd/gpsd.inc +++ b/packages/gpsd/gpsd.inc @@ -24,7 +24,7 @@ inherit autotools update-rc.d INITSCRIPT_NAME = "gpsd" INITSCRIPT_PARAMS = "defaults 35" -export LDFLAGS = "-L${STAGING_LIBDIR} -lm" +LDFLAGS += "-L${STAGING_LIBDIR} -lm" export STAGING_INCDIR export STAGING_LIBDIR diff --git a/packages/gpsd/gpsd_2.37.bb b/packages/gpsd/gpsd_2.37.bb deleted file mode 100644 index 726ba42481..0000000000 --- a/packages/gpsd/gpsd_2.37.bb +++ /dev/null @@ -1,3 +0,0 @@ -require gpsd.inc - -PR = "r2" diff --git a/packages/gpsd/gpsd_2.38.bb b/packages/gpsd/gpsd_2.38.bb new file mode 100644 index 0000000000..58e9ebeee2 --- /dev/null +++ b/packages/gpsd/gpsd_2.38.bb @@ -0,0 +1,3 @@ +require gpsd.inc + +PR = "r0" -- cgit v1.2.3 From d9e91db37a15e939b3b6197111954ad3c77b9faf Mon Sep 17 00:00:00 2001 From: Koen Kooi Date: Mon, 23 Feb 2009 00:36:44 +0100 Subject: task-gstreamer-ti: add task to get a load of gstreamer stuff --- packages/tasks/task-gstreamer-ti.bb | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 packages/tasks/task-gstreamer-ti.bb (limited to 'packages') diff --git a/packages/tasks/task-gstreamer-ti.bb b/packages/tasks/task-gstreamer-ti.bb new file mode 100644 index 0000000000..e6d34be966 --- /dev/null +++ b/packages/tasks/task-gstreamer-ti.bb @@ -0,0 +1,16 @@ + +# Task for dsp accelerated gstreamer plugins + +DEPENDS = "gst-plugins-base gst-plugins-good gst-plugins-ugly gst-ffmpeg gstreamer-ti gst-openmax" + +RDEPENDS_${PN} = " \ +gst-plugins-base-meta \ +gst-plugins-good-meta \ +gst-plugins-ugly-meta \ +gst-ffmpeg \ +gst-openmax \ +gstreamer-ti \ +" + +inherit task + -- cgit v1.2.3 From d5ab9dee3874c2b0e871e626cf3bc0220cd038c4 Mon Sep 17 00:00:00 2001 From: Elena Grandi Date: Mon, 23 Feb 2009 10:09:54 +0100 Subject: tuxtype 1.7.3: new recipe Tuxtype is a typing game --- packages/tuxtype/tuxtype_1.7.3.bb | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 packages/tuxtype/tuxtype_1.7.3.bb (limited to 'packages') diff --git a/packages/tuxtype/tuxtype_1.7.3.bb b/packages/tuxtype/tuxtype_1.7.3.bb new file mode 100644 index 0000000000..9712bcb753 --- /dev/null +++ b/packages/tuxtype/tuxtype_1.7.3.bb @@ -0,0 +1,20 @@ +DESCRIPTION = "Typing game" +HOMEPAGE = "http://tux4kids.alioth.debian.org/" +PRIORITY = "optional" +LICENSE = "GPL" +DEPENDS = "virtual/libsdl libsdl-mixer libsdl-image libsdl-ttf sdlpango" + +# warning: when changing package version the download number (2767) +# must be changed as well +SRC_URI = "http://alioth.debian.org/frs/download.php/2767/tuxtype_w_fonts-1.7.3.tar.gz" + +S = "${WORKDIR}/tuxtype_w_fonts-${PV}" + +inherit autotools + +FILES_${PN} = "/" + +export SDL_CONFIG = "${STAGING_BINDIR_CROSS}/sdl-config" +export MKDIR_P = "mkdir -p" + +PARALLEL_MAKE = "" -- cgit v1.2.3 From d28f108c6c42d9616c5dd98f372ed10633a45b67 Mon Sep 17 00:00:00 2001 From: Frans Meulenbroeks Date: Mon, 23 Feb 2009 15:54:00 +0100 Subject: bluez: add dependency on libusb --- packages/bluez/bluez4_4.30.bb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'packages') diff --git a/packages/bluez/bluez4_4.30.bb b/packages/bluez/bluez4_4.30.bb index 6499e3ff43..258ee92ce6 100644 --- a/packages/bluez/bluez4_4.30.bb +++ b/packages/bluez/bluez4_4.30.bb @@ -4,7 +4,7 @@ PRIORITY = "optional" DEPENDS = "gst-plugins-base alsa-lib libusb-compat libusb1 dbus-glib" HOMEPAGE = "http://www.bluez.org" LICENSE = "GPL" -PR = "r0" +PR = "r1" SRC_URI = "\ http://www.kernel.org/pub/linux/bluetooth/bluez-${PV}.tar.gz \ @@ -14,6 +14,7 @@ SRC_URI = "\ " S = "${WORKDIR}/bluez-${PV}" +DEPENDS = "libusb" inherit autotools pkgconfig OE_LT_RPATH_ALLOW = "any" -- cgit v1.2.3 From a7653f0e9ca08570b88dc35c9e9866eb64818ce8 Mon Sep 17 00:00:00 2001 From: Stanislav Brabec Date: Mon, 23 Feb 2009 15:09:57 +0000 Subject: matchbox-panel: Prevent crashes in system-monitor applet (just a work-around). --- .../mb-applet-system-monitor-crash.patch | 85 ++++++++++++++++++++++ packages/matchbox-panel/matchbox-panel_0.9.3.bb | 5 +- 2 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 packages/matchbox-panel/matchbox-panel-0.9.3/mb-applet-system-monitor-crash.patch (limited to 'packages') diff --git a/packages/matchbox-panel/matchbox-panel-0.9.3/mb-applet-system-monitor-crash.patch b/packages/matchbox-panel/matchbox-panel-0.9.3/mb-applet-system-monitor-crash.patch new file mode 100644 index 0000000000..8773003b34 --- /dev/null +++ b/packages/matchbox-panel/matchbox-panel-0.9.3/mb-applet-system-monitor-crash.patch @@ -0,0 +1,85 @@ +Program received signal SIGSEGV, Segmentation fault. +0x4002dfbc in mb_pixbuf_img_plot_pixel (pb=, img=0x1ba40, x=22, + y=-434, r=255 'ÿ', g=0 '\0', b=0 '\0') at mbpixbuf.c:2087 +(gdb) bt +#0 0x4002dfbc in mb_pixbuf_img_plot_pixel (pb=, img=0x1ba40, x=22, + y=-434, r=255 'ÿ', g=0 '\0', b=0 '\0') at mbpixbuf.c:2087 +#1 0x0000966c in paint_callback (app=, drw=46137348) + at mb-applet-system-monitor.c:272 +#2 0x4002b8f6 in handle_expose (mb=0x1ba40, event=) at mbtray.c:820 +#3 0x4002b922 in mb_tray_app_repaint (mb=0x1ba40) at mbtray.c:833 +#4 0x00008fd4 in timeout_callback (app=0x1ba40) at mb-applet-system-monitor.c:347 +#5 0x4002c580 in mb_tray_app_main (mb=0x14008) at mbtray.c:302 +#6 0x00009878 in main (argc=1, argv=0xbecf1ca4) at mb-applet-system-monitor.c:410 +(gdb) up +(gdb) print membox_h +$1 = 20 +(gdb) print mem_pixels +$2 = 18798069 +(gdb) print memsize +$3 = 1597228901 +(gdb) print msd +$4 = {loadIndex = 15, samples = 16, load = 0x18a90, total = 0x18b18, + mem_used = 18446744073706139648, mem_max = 63750144, swap_used = 0, swap_max = 0, + swap_percent = 0, mem_percent = 1597228901} + +Huh, mem_used doesn't look good! + +root@zaurus:~# printf %lx\\n -18446744073706139648 +341000 + +Well, it's negative. The algorithm is a bit stange. + +root@zaurus:~# cat /proc/meminfo +MemTotal: 62256 kB +MemFree: 8504 kB +Buffers: 1508 kB +Cached: 24692 kB +SwapCached: 8604 kB +Active: 22632 kB +Inactive: 21344 kB +SwapTotal: 131064 kB +SwapFree: 72060 kB +Dirty: 0 kB +Writeback: 0 kB +AnonPages: 12636 kB +Mapped: 5532 kB +Slab: 4300 kB +SReclaimable: 1456 kB +SUnreclaim: 2844 kB +PageTables: 1116 kB +NFS_Unstable: 0 kB +Bounce: 0 kB +WritebackTmp: 0 kB +CommitLimit: 162192 kB +Committed_AS: 81568 kB +VmallocTotal: 581632 kB +VmallocUsed: 9112 kB +VmallocChunk: 565244 kB + +Now let's compute what's happening: + +cache_used = cache_total - cache_free; +my_mem_used = cache_used + used - cached - buffers; +12636 - 5532 + 8604 - 24692 - 1508 = -10492 + ====== + +Well, I don't know, how to compute a really used memory, but I could at +least sanitize the value. Here you are: + +Index: matchbox-panel-0.9.3/applets/mb-applet-system-monitor.c +=================================================================== +--- matchbox-panel-0.9.3/applets/mb-applet-system-monitor.c 2006-02-07 22:19:12.000000000 +0000 ++++ matchbox-panel-0.9.3/applets/mb-applet-system-monitor.c 2009-02-21 13:19:41.000000000 +0000 +@@ -195,6 +195,11 @@ + my_mem_max = total; + my_swap_max = cache_total; + my_mem_used = cache_used + used - cached - buffers; ++ /* Ugly hack! Fix mem-used algorithm is needed. */ ++ if (my_mem_used < 0) ++ my_mem_used = 0; ++ if (my_mem_used > my_mem_max) ++ my_mem_used = my_mem_max; + msd.mem_used = my_mem_used; + msd.mem_max = my_mem_max; + msd.mem_percent = (100 * msd.mem_used) / msd.mem_max; diff --git a/packages/matchbox-panel/matchbox-panel_0.9.3.bb b/packages/matchbox-panel/matchbox-panel_0.9.3.bb index b7b12edc63..555912260e 100644 --- a/packages/matchbox-panel/matchbox-panel_0.9.3.bb +++ b/packages/matchbox-panel/matchbox-panel_0.9.3.bb @@ -1,4 +1,5 @@ require matchbox-panel.inc -PR ="r3" +PR ="r4" SRC_URI = "http://projects.o-hand.com/matchbox/sources/${PN}/0.9/${PN}-${PV}.tar.gz \ - file://mb-applet-battery-repaint-093.patch;patch=1" + file://mb-applet-battery-repaint-093.patch;patch=1 \ + file://mb-applet-system-monitor-crash.patch;patch=1" -- cgit v1.2.3 From 2598f7b63e147f15f07a2b66d89fd97863196993 Mon Sep 17 00:00:00 2001 From: Stanislav Brabec Date: Mon, 23 Feb 2009 15:14:35 +0000 Subject: mc: Updated to 4.6.2 + openSUSE and Debian UTF-8 patches. --- packages/mc/mc-4.6.2/00-70-utf8-common.patch | 46 + .../mc-4.6.2/00-73-utf8-bottom-buttons-width.patch | 21 + packages/mc/mc-4.6.2/00-75-utf8-cmdline-help.patch | 63 + .../mc/mc-4.6.2/00-76-utf8-hotlist-highlight.patch | 23 + .../00-77-utf8-filename-search-highlight.patch | 17 + packages/mc/mc-4.6.2/mc-utf8-look-and-feel.patch | 206 + packages/mc/mc-4.6.2/mc-utf8-nlink.patch | 11 + packages/mc/mc-4.6.2/mc-utf8.patch | 5357 ++++++++++++++++++++ packages/mc/mc-4.6.2/mhl-stdbool.patch | 16 + packages/mc/mc_4.6.2.bb | 60 + 10 files changed, 5820 insertions(+) create mode 100644 packages/mc/mc-4.6.2/00-70-utf8-common.patch create mode 100644 packages/mc/mc-4.6.2/00-73-utf8-bottom-buttons-width.patch create mode 100644 packages/mc/mc-4.6.2/00-75-utf8-cmdline-help.patch create mode 100644 packages/mc/mc-4.6.2/00-76-utf8-hotlist-highlight.patch create mode 100644 packages/mc/mc-4.6.2/00-77-utf8-filename-search-highlight.patch create mode 100644 packages/mc/mc-4.6.2/mc-utf8-look-and-feel.patch create mode 100644 packages/mc/mc-4.6.2/mc-utf8-nlink.patch create mode 100644 packages/mc/mc-4.6.2/mc-utf8.patch create mode 100644 packages/mc/mc-4.6.2/mhl-stdbool.patch create mode 100644 packages/mc/mc_4.6.2.bb (limited to 'packages') diff --git a/packages/mc/mc-4.6.2/00-70-utf8-common.patch b/packages/mc/mc-4.6.2/00-70-utf8-common.patch new file mode 100644 index 0000000000..244a01580a --- /dev/null +++ b/packages/mc/mc-4.6.2/00-70-utf8-common.patch @@ -0,0 +1,46 @@ +Some common stuff used by other UTF-8 patches. + +================================================================================ +--- mc-4.6.2/src/util.c ++++ mc-4.6.2/src/util.c +@@ -145,6 +145,30 @@ + return strlen (str); + } + ++int ++columns_to_bytes (const char *str, int col) ++{ ++ int bytes = 0; ++ int columns = 0; ++ int i; ++#ifdef UTF8 ++ if (SLsmg_Is_Unicode) { ++ static mbstate_t s; ++ while (columns < col) { ++ memset (&s, 0, sizeof (s)); ++ i = mbrlen (str + bytes, -1, &s); ++ if (i <= 0) { ++ return col + bytes - columns; ++ } ++ bytes += i; ++ columns ++; ++ } ++ return col + bytes - columns; ++ } else ++#endif ++ return col; ++} ++ + #ifdef UTF8 + + void +--- mc-4.6.2/src/util.h ++++ mc-4.6.2/src/util.h +@@ -104,6 +104,7 @@ + + void fix_utf8(char *str); + size_t mbstrlen (const char *); ++int columns_to_bytes (const char *, int); + wchar_t *mbstr_to_wchar (const char *); + char *wchar_to_mbstr (const wchar_t *); + char *utf8_to_local(char *str); diff --git a/packages/mc/mc-4.6.2/00-73-utf8-bottom-buttons-width.patch b/packages/mc/mc-4.6.2/00-73-utf8-bottom-buttons-width.patch new file mode 100644 index 0000000000..a7bc41c59b --- /dev/null +++ b/packages/mc/mc-4.6.2/00-73-utf8-bottom-buttons-width.patch @@ -0,0 +1,21 @@ +Use six character width cyan rectangles for bottom row's buttons. + +================================================================================ +--- mc-4.6.2/src/widget.c ++++ mc-4.6.2/src/widget.c +@@ -2562,11 +2562,14 @@ + attrset (DEFAULT_COLOR); + tty_printf ("%-*s", bb->widget.cols, ""); + for (i = 0; i < COLS / 8 && i < 10; i++) { ++ int j; + widget_move (&bb->widget, 0, i * 8); + attrset (DEFAULT_COLOR); + tty_printf ("%d", i + 1); + attrset (SELECTED_COLOR); +- tty_printf ("%-*s", ((i + 1) * 8 == COLS ? 5 : 6), ++ j = columns_to_bytes(bb->labels [i].text ? bb->labels [i].text : "", ++ ((i + 1) * 8 == COLS ? 5 : 6)); ++ tty_printf ("%-*s", j, + bb->labels[i].text ? bb->labels[i].text : ""); + attrset (DEFAULT_COLOR); + } diff --git a/packages/mc/mc-4.6.2/00-75-utf8-cmdline-help.patch b/packages/mc/mc-4.6.2/00-75-utf8-cmdline-help.patch new file mode 100644 index 0000000000..5f1227d30a --- /dev/null +++ b/packages/mc/mc-4.6.2/00-75-utf8-cmdline-help.patch @@ -0,0 +1,63 @@ +Fix formatting the output of "mc --help". + +================================================================================ +--- mc-4.6.2/src/main.c ++++ mc-4.6.2/src/main.c +@@ -1865,7 +1865,7 @@ + + /* print help for options */ + leftColWidth = poptPrintHelp (ctx, stream, 0); +- fprintf (stream, " %-*s %s\n", leftColWidth, _("+number"), ++ fprintf (stream, " %-*s %s\n", leftColWidth + strlen(_("+number")) - mbstrlen(_("+number")), _("+number"), + _("Set initial line number for the internal editor")); + fputs (_ + ("\n" +--- mc-4.6.2/src/popthelp.c ++++ mc-4.6.2/src/popthelp.c +@@ -101,7 +101,7 @@ + goto out; + } + +- helpLength = strlen(help); ++ helpLength = mbstrlen(help); + while (helpLength > lineLength) { + ch = help + lineLength - 1; + while (ch > help && !isspace((unsigned char) *ch)) ch--; +@@ -112,7 +112,7 @@ + fprintf(f, "%.*s\n%*s", (int) (ch - help), help, indentLength, " "); + help = ch; + while (isspace((unsigned char) *help) && *help) help++; +- helpLength = strlen(help); ++ helpLength = mbstrlen(help); + } + + if (helpLength) fprintf(f, "%s\n", help); +@@ -233,7 +233,7 @@ + if (len == 3) return cursor; + + if (argDescrip) +- len += strlen(argDescrip) + 1; ++ len += mbstrlen(argDescrip) + 1; + + if ((cursor + len) > 79) { + fprintf(f, "\n "); +@@ -304,7 +304,7 @@ + singleTableUsage(f, cursor, con->options, NULL); + + if (con->otherHelp) { +- cursor += strlen(con->otherHelp) + 1; ++ cursor += mbstrlen(con->otherHelp) + 1; + if (cursor > 79) fprintf(f, "\n "); + fprintf(f, " %s", con->otherHelp); + } +--- mc-4.6.2/src/util.c ++++ mc-4.6.2/src/util.c +@@ -152,7 +152,7 @@ + int columns = 0; + int i; + #ifdef UTF8 +- if (SLsmg_Is_Unicode) { ++ if (1) { + static mbstate_t s; + while (columns < col) { + memset (&s, 0, sizeof (s)); diff --git a/packages/mc/mc-4.6.2/00-76-utf8-hotlist-highlight.patch b/packages/mc/mc-4.6.2/00-76-utf8-hotlist-highlight.patch new file mode 100644 index 0000000000..38e0337ad6 --- /dev/null +++ b/packages/mc/mc-4.6.2/00-76-utf8-hotlist-highlight.patch @@ -0,0 +1,23 @@ +Highlight the lines of hotlist in full width. + +================================================================================ +--- mc-4.6.2/src/widget.c ++++ mc-4.6.2/src/widget.c +@@ -1994,6 +1994,7 @@ + { + WLEntry *e; + int i; ++ int j; + int sel_line; + Dlg_head *h = l->widget.parent; + int normalc = DLG_NORMALC (h); +@@ -2024,7 +2025,8 @@ + text = e->text; + e = e->next; + } +- tty_printf (" %-*s ", l->width-2, name_trunc (text, l->width-2)); ++ j = columns_to_bytes (name_trunc (text, l->width-2), l->width-2); ++ tty_printf (" %-*s ", j, name_trunc (text, l->width-2)); + } + l->cursor_y = sel_line; + if (!l->scrollbar) diff --git a/packages/mc/mc-4.6.2/00-77-utf8-filename-search-highlight.patch b/packages/mc/mc-4.6.2/00-77-utf8-filename-search-highlight.patch new file mode 100644 index 0000000000..912d8eb72b --- /dev/null +++ b/packages/mc/mc-4.6.2/00-77-utf8-filename-search-highlight.patch @@ -0,0 +1,17 @@ +Quick filename search (^S) highlights correct width. + +================================================================================ +--- mc-4.6.2/src/screen.c ++++ mc-4.6.2/src/screen.c +@@ -771,8 +771,10 @@ + widget_move (&panel->widget, llines (panel)+3, 1); + + if (panel->searching){ ++ int j; + attrset (INPUT_COLOR); +- tty_printf ("/%-*s", panel->widget.cols-3, panel->search_buffer); ++ j = columns_to_bytes (panel->search_buffer, panel->widget.cols-3); ++ tty_printf ("/%-*s", j, panel->search_buffer); + attrset (NORMAL_COLOR); + return; + } diff --git a/packages/mc/mc-4.6.2/mc-utf8-look-and-feel.patch b/packages/mc/mc-4.6.2/mc-utf8-look-and-feel.patch new file mode 100644 index 0000000000..83ad60135d --- /dev/null +++ b/packages/mc/mc-4.6.2/mc-utf8-look-and-feel.patch @@ -0,0 +1,206 @@ +Index: mc-4.6.2~git20080311/src/main.c +================================================================================ +--- mc-4.6.2/src/main.c ++++ mc-4.6.2/src/main.c +@@ -276,6 +276,9 @@ + /* The user's shell */ + const char *shell = NULL; + ++/* Is the LANG UTF-8 ? */ ++gboolean is_utf8 = FALSE; ++ + /* mc_home: The home of MC */ + char *mc_home = NULL; + +@@ -2126,6 +2129,16 @@ + int + main (int argc, char *argv[]) + { ++ /* Check whether we have UTF-8 locale */ ++ char *lang = getenv("LANG"); ++ size_t len = 0; ++ ++ if ( lang ) ++ len = strlen(lang); ++ ++ if ( len >= 5 && !strcasecmp(&lang[len-5],"UTF-8") ) ++ is_utf8 = TRUE; ++ + /* We had LC_CTYPE before, LC_ALL includs LC_TYPE as well */ + setlocale (LC_ALL, ""); + bindtextdomain ("mc", LOCALEDIR); +--- mc-4.6.2/src/main.h ++++ mc-4.6.2/src/main.h +@@ -69,6 +69,7 @@ + extern int only_leading_plus_minus; + extern int output_starts_shell; + extern int midnight_shutdown; ++extern gboolean is_utf8; + extern char cmd_buf [512]; + extern const char *shell; + +--- mc-4.6.2/src/screen.c ++++ mc-4.6.2/src/screen.c +@@ -892,6 +892,9 @@ + } + #endif /* HAVE_SLANG */ + ++ vscrollbar (panel->widget, panel->widget.lines, panel->widget.cols-1, 2, 2, ++ panel->selected, panel->count, TRUE); ++ + if (panel->active) + attrset (REVERSE_COLOR); + +@@ -1493,7 +1496,7 @@ + panel->dirty = 1; + + /* Status needn't to be split */ +- usable_columns = ((panel->widget.cols-2)/((isstatus) ++ usable_columns = ((panel->widget.cols-3)/((isstatus) + ? 1 + : (panel->split+1))) - (!isstatus && panel->split); + +--- mc-4.6.2/src/widget.c ++++ mc-4.6.2/src/widget.c +@@ -1944,52 +1944,86 @@ + return in; + } + +- +-/* Listbox widget */ ++/* Vertical scrollbar widget */ + +-/* Should draw the scrollbar, but currently draws only +- * indications that there is more information +- */ +-static int listbox_cdiff (WLEntry *s, WLEntry *e); +- +-static void +-listbox_drawscroll (WListbox *l) ++void ++vscrollbar (Widget widget, int height, int width, int tpad, int bpad, ++ int selected, int count, gboolean color) + { + int line; +- int i, top; +- int max_line = l->height-1; +- ++ int i; ++ + /* Are we at the top? */ +- widget_move (&l->widget, 0, l->width); +- if (l->list == l->top) +- one_vline (); ++ widget_move (&widget, tpad, width); ++#ifndef UTF8 ++ if (!selected) ++ one_vline (); + else +- addch ('^'); ++ addch ('^'); ++#else ++ if (color) attrset (MARKED_COLOR); ++ if (is_utf8) ++ SLsmg_write_string("▴"); ++ else ++ addch ('^'); ++ if (color) attrset (NORMAL_COLOR); ++#endif + + /* Are we at the bottom? */ +- widget_move (&l->widget, max_line, l->width); +- top = listbox_cdiff (l->list, l->top); +- if ((top + l->height == l->count) || l->height >= l->count) +- one_vline (); ++ widget_move (&widget, height-1-bpad, width); ++#ifndef UTF8 ++ if (selected == count-1) ++ one_vline (); ++ else ++ addch ('v'); ++#else ++ if (color) attrset (MARKED_COLOR); ++ if (is_utf8) ++ SLsmg_write_string("▾"); + else +- addch ('v'); ++ addch('v'); ++ if (color) attrset (NORMAL_COLOR); ++#endif + + /* Now draw the nice relative pointer */ +- if (l->count) +- line = 1+ ((l->pos * (l->height-2)) / l->count); ++ if (count > 1) ++ line = tpad + 1 + ((selected * (height-3-tpad-bpad)) / (count-1)); + else +- line = 0; +- +- for (i = 1; i < max_line; i++){ +- widget_move (&l->widget, i, l->width); +- if (i != line) +- one_vline (); +- else +- addch ('*'); ++ line = 0; ++ ++ for (i = tpad + 1; i < height-1-bpad; i++){ ++ widget_move (&widget, i, width); ++ if (i != line) ++#ifndef UTF8 ++ one_vline (); ++ else ++ addch ('*'); ++#else ++ if (is_utf8) ++ SLsmg_write_string("▒"); ++ else ++ one_vline(); ++ else { ++ if (color) attrset (MARKED_COLOR); ++ if (is_utf8) ++ SLsmg_write_string("◈"); ++ else ++ addch('*'); ++ if (color) attrset (NORMAL_COLOR); ++ } ++#endif + } + } +- +-static void ++ ++ ++/* Listbox widget */ ++ ++/* Should draw the scrollbar, but currently draws only ++ * indications that there is more information ++ */ ++static int listbox_cdiff (WLEntry *s, WLEntry *e); ++ ++void + listbox_draw (WListbox *l, int focused) + { + WLEntry *e; +@@ -2032,7 +2066,7 @@ + if (!l->scrollbar) + return; + attrset (normalc); +- listbox_drawscroll (l); ++ vscrollbar (l->widget, l->height, l->width, 0, 0, l->pos, l->count, FALSE); + } + + /* Returns the number of items between s and e, +--- mc-4.6.2/src/widget.h ++++ mc-4.6.2/src/widget.h +@@ -187,6 +187,10 @@ + /* Listbox manager */ + WLEntry *listbox_get_data (WListbox *l, int pos); + ++/* Vertical scrollbar */ ++void vscrollbar (Widget widget, int height, int width, int tpad, int bpad, ++ int selected, int count, gboolean color); ++ + /* search text int listbox entries */ + WLEntry *listbox_search_text (WListbox *l, const char *text); + void listbox_select_entry (WListbox *l, WLEntry *dest); diff --git a/packages/mc/mc-4.6.2/mc-utf8-nlink.patch b/packages/mc/mc-4.6.2/mc-utf8-nlink.patch new file mode 100644 index 0000000000..9e361630c4 --- /dev/null +++ b/packages/mc/mc-4.6.2/mc-utf8-nlink.patch @@ -0,0 +1,11 @@ +--- mc-4.6.2/src/screen.c ++++ mc-4.6.2/src/screen.c +@@ -671,7 +671,7 @@ + SLsmg_write_nwchars (((wchar_t *) buffer) + + txtlen - n2, n2); + } else +- SLsmg_write_nwchars ((wchar_t *) buffer, len); ++ SLsmg_write_nwchars ((wchar_t *) buffer + still, len); + } else { + printw ("%*s", still, ""); + SLsmg_write_nwchars ((wchar_t *) buffer, txtlen); diff --git a/packages/mc/mc-4.6.2/mc-utf8.patch b/packages/mc/mc-4.6.2/mc-utf8.patch new file mode 100644 index 0000000000..5778604350 --- /dev/null +++ b/packages/mc/mc-4.6.2/mc-utf8.patch @@ -0,0 +1,5357 @@ +--- mc-4.6.2/acinclude.m4 ++++ mc-4.6.2/acinclude.m4 +@@ -399,14 +399,14 @@ + fi + + dnl Unless external S-Lang was requested, reject S-Lang with UTF-8 hacks +- if test x$with_screen = xslang; then +- : +- m4_if([$1], strict, , +- [AC_CHECK_LIB([slang], [SLsmg_write_nwchars], +- [AC_MSG_WARN([Rejecting S-Lang with UTF-8 support, \ +-it's not fully supported yet]) +- with_screen=mcslang])]) +- fi ++dnl if test x$with_screen = xslang; then ++dnl : ++dnl m4_if([$1], strict, , ++dnl [AC_CHECK_LIB([slang], [SLsmg_write_nwchars], ++dnl [AC_MSG_WARN([Rejecting S-Lang with UTF-8 support, \ ++dnl it's not fully supported yet]) ++dnl with_screen=mcslang])]) ++dnl fi + + if test x$with_screen = xslang; then + AC_DEFINE(HAVE_SYSTEM_SLANG, 1, +--- mc-4.6.2/edit/edit-widget.h ++++ mc-4.6.2/edit/edit-widget.h +@@ -30,6 +30,11 @@ + long command; + } edit_key_map_type; + ++struct action { ++ mc_wchar_t ch; ++ long flags; ++}; ++ + struct WEdit { + Widget widget; + +@@ -42,8 +47,17 @@ + /* dynamic buffers and cursor position for editor: */ + long curs1; /* position of the cursor from the beginning of the file. */ + long curs2; /* position from the end of the file */ ++#ifndef UTF8 + unsigned char *buffers1[MAXBUFF + 1]; /* all data up to curs1 */ + unsigned char *buffers2[MAXBUFF + 1]; /* all data from end of file down to curs2 */ ++#else /* UTF8 */ ++ mc_wchar_t *buffers1[MAXBUFF + 1]; /* all data up to curs1 */ ++ mc_wchar_t *buffers2[MAXBUFF + 1]; /* all data from end of file down to curs2 */ ++ ++ unsigned char charbuf[MB_LEN_MAX]; ++ int charpoint; ++#endif /* UTF8 */ ++ + + /* search variables */ + long search_start; /* First character to start searching from */ +@@ -87,7 +101,7 @@ + + /* undo stack and pointers */ + unsigned long stack_pointer; +- long *undo_stack; ++ struct action *undo_stack; + unsigned long stack_size; + unsigned long stack_size_mask; + unsigned long stack_bottom; +--- mc-4.6.2/edit/edit.c ++++ mc-4.6.2/edit/edit.c +@@ -105,7 +105,11 @@ + + static void user_menu (WEdit *edit); + ++#ifndef UTF8 + int edit_get_byte (WEdit * edit, long byte_index) ++#else ++mc_wchar_t edit_get_byte (WEdit * edit, long byte_index) ++#endif + { + unsigned long p; + if (byte_index >= (edit->curs1 + edit->curs2) || byte_index < 0) +@@ -134,7 +138,7 @@ + + edit->curs1 = 0; + edit->curs2 = 0; +- edit->buffers2[0] = g_malloc (EDIT_BUF_SIZE); ++ edit->buffers2[0] = g_malloc (EDIT_BUF_SIZE * sizeof(mc_wchar_t)); + } + + /* +@@ -159,7 +163,7 @@ + } + + if (!edit->buffers2[buf2]) +- edit->buffers2[buf2] = g_malloc (EDIT_BUF_SIZE); ++ edit->buffers2[buf2] = g_malloc (EDIT_BUF_SIZE * sizeof(mc_wchar_t)); + + mc_read (file, + (char *) edit->buffers2[buf2] + EDIT_BUF_SIZE - +@@ -169,7 +173,7 @@ + for (buf = buf2 - 1; buf >= 0; buf--) { + /* edit->buffers2[0] is already allocated */ + if (!edit->buffers2[buf]) +- edit->buffers2[buf] = g_malloc (EDIT_BUF_SIZE); ++ edit->buffers2[buf] = g_malloc (EDIT_BUF_SIZE * sizeof(mc_wchar_t)); + mc_read (file, (char *) edit->buffers2[buf], EDIT_BUF_SIZE); + } + +@@ -242,9 +246,44 @@ + { + int c; + long i = 0; +- while ((c = fgetc (f)) >= 0) { ++#ifndef UTF8 ++ while ((c = fgetc (f)) != EOF) { + edit_insert (edit, c); + i++; ++#else /* UTF8 */ ++ unsigned char buf[MB_LEN_MAX]; ++ int charpos = 0; ++ mbstate_t mbs; ++ ++ while ((c = fgetc (f)) != EOF) { ++ mc_wchar_t wc; ++ int size; ++ int j; ++ ++ buf[charpos++] = c; ++ ++ memset (&mbs, 0, sizeof (mbs)); ++ size = mbrtowc(&wc, (char *)buf, charpos, &mbs); ++ ++ if (size == -2) ++ continue; /* incomplete */ ++ ++ else if (size >= 0) { ++ edit_insert (edit, wc); ++ i++; ++ charpos = 0; ++ continue; ++ } ++ else { ++ ++ /* invalid */ ++#ifdef __STDC_ISO_10646__ ++ for (j=0; jlast_byte; i++) + if (fputc (edit_get_byte (edit, i), f) < 0) + break; ++#else /* UTF8 */ ++ for (i = 0; i < edit->last_byte; i++) { ++ mc_wchar_t wc = edit_get_byte (edit, i); ++ int res; ++ char tmpbuf[MB_LEN_MAX]; ++ mbstate_t mbs; ++ ++ memset (&mbs, 0, sizeof (mbs)); ++ ++#ifdef __STDC_ISO_10646__ ++ if (wc >= BINARY_CHAR_OFFSET && wc < (BINARY_CHAR_OFFSET + 256)) { ++ res = 1; ++ tmpbuf[0] = (char) (wc - BINARY_CHAR_OFFSET); ++ } else ++#endif ++ res = wcrtomb(tmpbuf, wc, &mbs); ++ if (res > 0) { ++ if (fwrite(tmpbuf, res, 1, f) != 1) ++ break; ++ } ++ } ++#endif /* UTF8 */ + return i; + } + +@@ -293,12 +355,46 @@ + int i, file, blocklen; + long current = edit->curs1; + unsigned char *buf; ++#ifdef UTF8 ++ mbstate_t mbs; ++ int bufstart = 0; ++ ++ memset (&mbs, 0, sizeof (mbs)); ++#endif /* UTF8 */ + if ((file = mc_open (filename, O_RDONLY | O_BINARY)) == -1) + return 0; + buf = g_malloc (TEMP_BUF_LEN); ++#ifndef UTF8 + while ((blocklen = mc_read (file, (char *) buf, TEMP_BUF_LEN)) > 0) { + for (i = 0; i < blocklen; i++) + edit_insert (edit, buf[i]); ++#else /* UTF8 */ ++ while ((blocklen = mc_read (file, (char *) buf + bufstart, TEMP_BUF_LEN - bufstart)) > 0) { ++ blocklen += bufstart; ++ bufstart = 0; ++ for (i = 0; i < blocklen; ) { ++ mc_wchar_t wc; ++ int j; ++ int size = mbrtowc(&wc, (char *)buf + i, blocklen - i, &mbs); ++ if (size == -2) { /*incomplete char*/ ++ bufstart = blocklen - i; ++ memcpy(buf, buf+i, bufstart); ++ i = blocklen; ++ memset (&mbs, 0, sizeof (mbs)); ++ } ++ else if (size <= 0) { ++#ifdef __STDC_ISO_10646__ ++ edit_insert (edit, BINARY_CHAR_OFFSET + (mc_wchar_t)buf[i]); ++#endif ++ memset (&mbs, 0, sizeof (mbs)); ++ i++; /* skip broken char */ ++ } ++ else { ++ edit_insert (edit, wc); ++ i+=size; ++ } ++ } ++#endif /* UTF8 */ + } + edit_cursor_move (edit, current - edit->curs1); + g_free (buf); +@@ -388,7 +484,11 @@ + static int + edit_load_file (WEdit *edit) + { ++#ifndef UTF8 + int fast_load = 1; ++#else /* UTF8 */ ++ int fast_load = 0; /* can't be used with multibyte characters */ ++#endif /* UTF8 */ + + /* Cannot do fast load if a filter is used */ + if (edit_find_filter (edit->filename) >= 0) +@@ -454,6 +554,7 @@ + edit->prev_col = column; + edit_move_to_prev_col (edit, edit_bol (edit, edit->curs1)); + edit_move_display (edit, line - (edit->num_widget_lines / 2)); ++ edit->charpoint = 0; + } + + /* Save cursor position in the file */ +@@ -537,7 +638,7 @@ + edit_set_filename (edit, filename); + edit->stack_size = START_STACK_SIZE; + edit->stack_size_mask = START_STACK_SIZE - 1; +- edit->undo_stack = g_malloc ((edit->stack_size + 10) * sizeof (long)); ++ edit->undo_stack = g_malloc ((edit->stack_size + 10) * sizeof (struct action)); + if (edit_load_file (edit)) { + /* edit_load_file already gives an error message */ + if (to_free) +@@ -692,14 +793,23 @@ + { + unsigned long sp = edit->stack_pointer; + unsigned long spm1; +- long *t; ++ ++ struct action *t; ++ mc_wchar_t ch = 0; ++ ++ if (c == CHAR_INSERT || c == CHAR_INSERT_AHEAD) { ++ va_list ap; ++ va_start (ap, c); ++ ch = va_arg (ap, mc_wint_t); ++ va_end (ap); ++ } + + /* first enlarge the stack if necessary */ + if (sp > edit->stack_size - 10) { /* say */ + if (option_max_undo < 256) + option_max_undo = 256; + if (edit->stack_size < (unsigned long) option_max_undo) { +- t = g_realloc (edit->undo_stack, (edit->stack_size * 2 + 10) * sizeof (long)); ++ t = g_realloc (edit->undo_stack, (edit->stack_size * 2 + 10) * sizeof (struct action)); + if (t) { + edit->undo_stack = t; + edit->stack_size <<= 1; +@@ -714,7 +824,7 @@ + #ifdef FAST_MOVE_CURSOR + if (c == CURS_LEFT_LOTS || c == CURS_RIGHT_LOTS) { + va_list ap; +- edit->undo_stack[sp] = c == CURS_LEFT_LOTS ? CURS_LEFT : CURS_RIGHT; ++ edit->undo_stack[sp].flags = c == CURS_LEFT_LOTS ? CURS_LEFT : CURS_RIGHT; + edit->stack_pointer = (edit->stack_pointer + 1) & edit->stack_size_mask; + va_start (ap, c); + c = -(va_arg (ap, int)); +@@ -725,12 +835,14 @@ + && spm1 != edit->stack_bottom + && ((sp - 2) & edit->stack_size_mask) != edit->stack_bottom) { + int d; +- if (edit->undo_stack[spm1] < 0) { +- d = edit->undo_stack[(sp - 2) & edit->stack_size_mask]; +- if (d == c) { +- if (edit->undo_stack[spm1] > -1000000000) { ++ mc_wchar_t d_ch; ++ if (edit->undo_stack[spm1].flags < 0) { ++ d = edit->undo_stack[(sp - 2) & edit->stack_size_mask].flags; ++ d_ch = edit->undo_stack[(sp - 2) & edit->stack_size_mask].ch; ++ if (d == c && d_ch == ch) { ++ if (edit->undo_stack[spm1].flags > -1000000000) { + if (c < KEY_PRESS) /* --> no need to push multiple do-nothings */ +- edit->undo_stack[spm1]--; ++ edit->undo_stack[spm1].flags--; + return; + } + } +@@ -738,19 +850,20 @@ + #ifndef NO_STACK_CURSMOVE_ANIHILATION + else if ((c == CURS_LEFT && d == CURS_RIGHT) + || (c == CURS_RIGHT && d == CURS_LEFT)) { /* a left then a right anihilate each other */ +- if (edit->undo_stack[spm1] == -2) ++ if (edit->undo_stack[spm1].flags == -2) + edit->stack_pointer = spm1; + else +- edit->undo_stack[spm1]++; ++ edit->undo_stack[spm1].flags++; + return; + } + #endif + } else { +- d = edit->undo_stack[spm1]; +- if (d == c) { ++ d = edit->undo_stack[spm1].flags; ++ d_ch = edit->undo_stack[spm1].ch; ++ if (d == c && d_ch == ch) { + if (c >= KEY_PRESS) + return; /* --> no need to push multiple do-nothings */ +- edit->undo_stack[sp] = -2; ++ edit->undo_stack[sp].flags = -2; + goto check_bottom; + } + #ifndef NO_STACK_CURSMOVE_ANIHILATION +@@ -762,7 +875,9 @@ + #endif + } + } +- edit->undo_stack[sp] = c; ++ edit->undo_stack[sp].flags = c; ++ edit->undo_stack[sp].ch = ch; ++ + check_bottom: + + edit->stack_pointer = (edit->stack_pointer + 1) & edit->stack_size_mask; +@@ -775,10 +890,10 @@ + (((unsigned long) c + 1) & edit->stack_size_mask) == edit->stack_bottom) + do { + edit->stack_bottom = (edit->stack_bottom + 1) & edit->stack_size_mask; +- } while (edit->undo_stack[edit->stack_bottom] < KEY_PRESS && edit->stack_bottom != edit->stack_pointer); ++ } while (edit->undo_stack[edit->stack_bottom].flags < KEY_PRESS && edit->stack_bottom != edit->stack_pointer); + + /*If a single key produced enough pushes to wrap all the way round then we would notice that the [stack_bottom] does not contain KEY_PRESS. The stack is then initialised: */ +- if (edit->stack_pointer != edit->stack_bottom && edit->undo_stack[edit->stack_bottom] < KEY_PRESS) ++ if (edit->stack_pointer != edit->stack_bottom && edit->undo_stack[edit->stack_bottom].flags < KEY_PRESS) + edit->stack_bottom = edit->stack_pointer = 0; + } + +@@ -787,30 +902,30 @@ + then the file should be as it was when he loaded up. Then set edit->modified to 0. + */ + static long +-pop_action (WEdit * edit) ++pop_action (WEdit * edit, struct action *c) + { +- long c; + unsigned long sp = edit->stack_pointer; + if (sp == edit->stack_bottom) { +- return STACK_BOTTOM; ++ c->flags = STACK_BOTTOM; ++ return c->flags; + } + sp = (sp - 1) & edit->stack_size_mask; +- if ((c = edit->undo_stack[sp]) >= 0) { +-/* edit->undo_stack[sp] = '@'; */ ++ *c = edit->undo_stack[sp]; ++ if (edit->undo_stack[sp].flags >= 0) { + edit->stack_pointer = (edit->stack_pointer - 1) & edit->stack_size_mask; +- return c; ++ return c->flags; + } + if (sp == edit->stack_bottom) { + return STACK_BOTTOM; + } +- c = edit->undo_stack[(sp - 1) & edit->stack_size_mask]; +- if (edit->undo_stack[sp] == -2) { +-/* edit->undo_stack[sp] = '@'; */ ++ *c = edit->undo_stack[(sp - 1) & edit->stack_size_mask]; ++ ++ if (edit->undo_stack[sp].flags == -2) { + edit->stack_pointer = sp; + } else +- edit->undo_stack[sp]++; ++ edit->undo_stack[sp].flags++; + +- return c; ++ return c->flags; + } + + /* is called whenever a modification is made by one of the four routines below */ +@@ -831,7 +946,7 @@ + */ + + void +-edit_insert (WEdit *edit, int c) ++edit_insert (WEdit *edit, mc_wchar_t c) + { + /* check if file has grown to large */ + if (edit->last_byte >= SIZE_LIMIT) +@@ -869,12 +984,11 @@ + /* add a new buffer if we've reached the end of the last one */ + if (!(edit->curs1 & M_EDIT_BUF_SIZE)) + edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE] = +- g_malloc (EDIT_BUF_SIZE); ++ g_malloc (EDIT_BUF_SIZE * sizeof(mc_wchar_t)); + + /* perform the insertion */ +- edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE][edit-> +- curs1 & M_EDIT_BUF_SIZE] +- = (unsigned char) c; ++ edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE] ++ [edit->curs1 & M_EDIT_BUF_SIZE] = c; + + /* update file length */ + edit->last_byte++; +@@ -885,7 +999,7 @@ + + + /* same as edit_insert and move left */ +-void edit_insert_ahead (WEdit * edit, int c) ++void edit_insert_ahead (WEdit * edit, mc_wchar_t c) + { + if (edit->last_byte >= SIZE_LIMIT) + return; +@@ -908,7 +1022,7 @@ + edit->last_get_rule += (edit->last_get_rule >= edit->curs1); + + if (!((edit->curs2 + 1) & M_EDIT_BUF_SIZE)) +- edit->buffers2[(edit->curs2 + 1) >> S_EDIT_BUF_SIZE] = g_malloc (EDIT_BUF_SIZE); ++ edit->buffers2[(edit->curs2 + 1) >> S_EDIT_BUF_SIZE] = g_malloc (EDIT_BUF_SIZE * sizeof(mc_wchar_t)); + edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE][EDIT_BUF_SIZE - (edit->curs2 & M_EDIT_BUF_SIZE) - 1] = c; + + edit->last_byte++; +@@ -918,7 +1032,7 @@ + + int edit_delete (WEdit * edit) + { +- int p; ++ mc_wint_t p; + if (!edit->curs2) + return 0; + +@@ -942,7 +1056,7 @@ + edit->total_lines--; + edit->force |= REDRAW_AFTER_CURSOR; + } +- edit_push_action (edit, p + 256); ++ edit_push_action (edit, CHAR_INSERT_AHEAD, p); + if (edit->curs1 < edit->start_display) { + edit->start_display--; + if (p == '\n') +@@ -956,7 +1070,7 @@ + static int + edit_backspace (WEdit * edit) + { +- int p; ++ mc_wint_t p; + if (!edit->curs1) + return 0; + +@@ -980,7 +1094,7 @@ + edit->total_lines--; + edit->force |= REDRAW_AFTER_CURSOR; + } +- edit_push_action (edit, p); ++ edit_push_action (edit, CHAR_INSERT, p); + + if (edit->curs1 < edit->start_display) { + edit->start_display--; +@@ -993,10 +1107,18 @@ + + #ifdef FAST_MOVE_CURSOR + +-static void memqcpy (WEdit * edit, unsigned char *dest, unsigned char *src, int n) ++static void memqcpy (WEdit * edit, mc_wchar_t *dest, mc_wchar_t *src, int n) + { + unsigned long next; ++#ifndef UTF8 + while ((next = (unsigned long) memccpy (dest, src, '\n', n))) { ++#else /* UTF8 */ ++ while (n) { ++ next = 0; ++ while (next < n && src[next]!='\n') next++; ++ if (next < n) next++; ++ wmemcpy (dest, src, next) ++#endif /* UTF8 */ + edit->curs_line--; + next -= (unsigned long) dest; + n -= next; +@@ -1009,7 +1131,7 @@ + edit_move_backward_lots (WEdit *edit, long increment) + { + int r, s, t; +- unsigned char *p; ++ mc_wchar_t *p; + + if (increment > edit->curs1) + increment = edit->curs1; +@@ -1049,7 +1171,7 @@ + edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE] = p; + else + edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE] = +- g_malloc (EDIT_BUF_SIZE); ++ g_malloc (EDIT_BUF_SIZE * sizeof(mc_wchar_t)); + } else { + g_free (p); + } +@@ -1087,7 +1209,7 @@ + edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE] = p; + else + edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE] = +- g_malloc (EDIT_BUF_SIZE); ++ g_malloc (EDIT_BUF_SIZE * sizeof(mc_wchar_t)); + } else { + g_free (p); + } +@@ -1120,7 +1242,7 @@ + + c = edit_get_byte (edit, edit->curs1 - 1); + if (!((edit->curs2 + 1) & M_EDIT_BUF_SIZE)) +- edit->buffers2[(edit->curs2 + 1) >> S_EDIT_BUF_SIZE] = g_malloc (EDIT_BUF_SIZE); ++ edit->buffers2[(edit->curs2 + 1) >> S_EDIT_BUF_SIZE] = g_malloc (EDIT_BUF_SIZE * sizeof(mc_wchar_t)); + edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE][EDIT_BUF_SIZE - (edit->curs2 & M_EDIT_BUF_SIZE) - 1] = c; + edit->curs2++; + c = edit->buffers1[(edit->curs1 - 1) >> S_EDIT_BUF_SIZE][(edit->curs1 - 1) & M_EDIT_BUF_SIZE]; +@@ -1144,7 +1266,7 @@ + + c = edit_get_byte (edit, edit->curs1); + if (!(edit->curs1 & M_EDIT_BUF_SIZE)) +- edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE] = g_malloc (EDIT_BUF_SIZE); ++ edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE] = g_malloc (EDIT_BUF_SIZE * sizeof(mc_wchar_t)); + edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE][edit->curs1 & M_EDIT_BUF_SIZE] = c; + edit->curs1++; + c = edit->buffers2[(edit->curs2 - 1) >> S_EDIT_BUF_SIZE][EDIT_BUF_SIZE - ((edit->curs2 - 1) & M_EDIT_BUF_SIZE) - 1]; +@@ -1249,7 +1371,7 @@ + q = edit->last_byte + 2; + + for (col = 0, p = current; p < q; p++) { +- int c; ++ mc_wchar_t c; + if (cols != -10) { + if (col == cols) + return p; +@@ -1267,7 +1389,7 @@ + } else if (c < 32 || c == 127) + col += 2; /* Caret notation for control characters */ + else +- col++; ++ col += wcwidth(c); + } + return col; + } +@@ -1400,12 +1522,16 @@ + is_blank (WEdit *edit, long offset) + { + long s, f; +- int c; ++ mc_wchar_t c; + s = edit_bol (edit, offset); + f = edit_eol (edit, offset) - 1; + while (s <= f) { + c = edit_get_byte (edit, s++); ++#ifndef UTF8 + if (!isspace (c)) ++#else ++ if (!iswspace (c)) ++#endif /* UTF8 */ + return 0; + } + return 1; +@@ -1660,6 +1786,7 @@ + return 2; + return 0x80000000UL; + } ++#ifndef UTF8 + if (isupper (c)) + c = 'A'; + else if (islower (c)) +@@ -1670,6 +1797,18 @@ + c = '0'; + else if (isspace (c)) + c = ' '; ++#else ++ if (iswupper (c)) ++ c = 'A'; ++ else if (iswlower (c)) ++ c = 'a'; ++ else if (iswalpha (c)) ++ c = 'a'; ++ else if (iswdigit (c)) ++ c = '0'; ++ else if (iswspace (c)) ++ c = ' '; ++#endif /* UTF8 */ + q = strchr (option_chars_move_whole_word, c); + if (!q) + return 0xFFFFFFFFUL; +@@ -1694,10 +1833,18 @@ + c2 = edit_get_byte (edit, edit->curs1); + if (!(my_type_of (c1) & my_type_of (c2))) + break; ++#ifndef UTF8 + if (isspace (c1) && !isspace (c2)) ++#else ++ if (iswspace (c1) && !iswspace (c2)) ++#endif /* UTF8 */ + break; + if (s) ++#ifndef UTF8 + if (!isspace (c1) && isspace (c2)) ++#else ++ if (!iswspace (c1) && iswspace (c2)) ++#endif /* UTF8 */ + break; + } + } +@@ -1720,10 +1867,18 @@ + c2 = edit_get_byte (edit, edit->curs1); + if (!(my_type_of (c1) & my_type_of (c2))) + break; ++#ifndef UTF8 + if (isspace (c1) && !isspace (c2)) ++#else ++ if (iswspace (c1) && !iswspace (c2)) ++#endif /* UTF8 */ + break; + if (s) ++#ifndef UTF8 + if (!isspace (c1) && isspace (c2)) ++#else ++ if (!iswspace (c1) && iswspace (c2)) ++#endif /* UTF8 */ + break; + } + } +@@ -1743,7 +1898,11 @@ + break; + c1 = edit_delete (edit); + c2 = edit_get_byte (edit, edit->curs1); ++#ifndef UTF8 + if ((isspace (c1) == 0) != (isspace (c2) == 0)) ++#else ++ if ((iswspace (c1) == 0) != (iswspace (c2) == 0)) ++#endif /* UTF8 */ + break; + if (!(my_type_of (c1) & my_type_of (c2))) + break; +@@ -1758,7 +1917,11 @@ + break; + c1 = edit_backspace (edit); + c2 = edit_get_byte (edit, edit->curs1 - 1); ++#ifndef UTF8 + if ((isspace (c1) == 0) != (isspace (c2) == 0)) ++#else ++ if ((iswspace (c1) == 0) != (iswspace (c2) == 0)) ++#endif /* UTF8 */ + break; + if (!(my_type_of (c1) & my_type_of (c2))) + break; +@@ -1772,13 +1935,13 @@ + static void + edit_do_undo (WEdit * edit) + { +- long ac; ++ struct action ac; + long count = 0; + + edit->stack_disable = 1; /* don't record undo's onto undo stack! */ + +- while ((ac = pop_action (edit)) < KEY_PRESS) { +- switch ((int) ac) { ++ while (pop_action (edit, &ac) < KEY_PRESS) { ++ switch ((int) ac.flags) { + case STACK_BOTTOM: + goto done_undo; + case CURS_RIGHT: +@@ -1799,31 +1962,33 @@ + case COLUMN_OFF: + column_highlighting = 0; + break; ++ case CHAR_INSERT: ++ edit_insert (edit, ac.ch); ++ break; ++ case CHAR_INSERT_AHEAD: ++ edit_insert_ahead (edit, ac.ch); ++ break; + } +- if (ac >= 256 && ac < 512) +- edit_insert_ahead (edit, ac - 256); +- if (ac >= 0 && ac < 256) +- edit_insert (edit, ac); + +- if (ac >= MARK_1 - 2 && ac < MARK_2 - 2) { +- edit->mark1 = ac - MARK_1; ++ if (ac.flags >= MARK_1 - 2 && ac.flags < MARK_2 - 2) { ++ edit->mark1 = ac.flags - MARK_1; + edit->column1 = edit_move_forward3 (edit, edit_bol (edit, edit->mark1), 0, edit->mark1); +- } else if (ac >= MARK_2 - 2 && ac < KEY_PRESS) { +- edit->mark2 = ac - MARK_2; ++ } else if (ac.flags >= MARK_2 - 2 && ac.flags < KEY_PRESS) { ++ edit->mark2 = ac.flags - MARK_2; + edit->column2 = edit_move_forward3 (edit, edit_bol (edit, edit->mark2), 0, edit->mark2); + } + if (count++) + edit->force |= REDRAW_PAGE; /* more than one pop usually means something big */ + } + +- if (edit->start_display > ac - KEY_PRESS) { +- edit->start_line -= edit_count_lines (edit, ac - KEY_PRESS, edit->start_display); ++ if (edit->start_display > ac.flags - KEY_PRESS) { ++ edit->start_line -= edit_count_lines (edit, ac.flags - KEY_PRESS, edit->start_display); + edit->force |= REDRAW_PAGE; +- } else if (edit->start_display < ac - KEY_PRESS) { +- edit->start_line += edit_count_lines (edit, edit->start_display, ac - KEY_PRESS); ++ } else if (edit->start_display < ac.flags - KEY_PRESS) { ++ edit->start_line += edit_count_lines (edit, edit->start_display, ac.flags - KEY_PRESS); + edit->force |= REDRAW_PAGE; + } +- edit->start_display = ac - KEY_PRESS; /* see push and pop above */ ++ edit->start_display = ac.flags - KEY_PRESS; /* see push and pop above */ + edit_update_curs_row (edit); + + done_undo:; +@@ -2103,7 +2268,7 @@ + * passed as -1. Commands are executed, and char_for_insertion is + * inserted at the cursor. + */ +-void edit_execute_key_command (WEdit *edit, int command, int char_for_insertion) ++void edit_execute_key_command (WEdit *edit, int command, mc_wint_t char_for_insertion) + { + if (command == CK_Begin_Record_Macro) { + edit->macro_i = 0; +@@ -2138,7 +2303,7 @@ + all of them. It also does not check for the Undo command. + */ + void +-edit_execute_cmd (WEdit *edit, int command, int char_for_insertion) ++edit_execute_cmd (WEdit *edit, int command, mc_wint_t char_for_insertion) + { + edit->force |= REDRAW_LINE; + +@@ -2171,7 +2336,7 @@ + } + + /* An ordinary key press */ +- if (char_for_insertion >= 0) { ++ if (char_for_insertion != (mc_wint_t) -1) { + if (edit->overwrite) { + if (edit_get_byte (edit, edit->curs1) != '\n') + edit_delete (edit); +--- mc-4.6.2/edit/edit.h ++++ mc-4.6.2/edit/edit.h +@@ -25,6 +25,27 @@ + + #include + ++#include "src/tty.h" ++ ++#ifdef UTF8 ++#include ++#include ++ ++#define mc_wchar_t wchar_t ++#define mc_wint_t wint_t ++ ++#else ++ ++#define mc_wchar_t unsigned char ++#define mc_wint_t int ++ ++#endif ++ ++ ++/* unicode private use area */ ++#define BINARY_CHAR_OFFSET 0xFFE00 ++ ++ + #define N_menus 5 + + #define SEARCH_DIALOG_OPTION_NO_SCANF (1 << 0) +@@ -86,6 +107,8 @@ + #define START_STACK_SIZE 32 + + /* Some codes that may be pushed onto or returned from the undo stack */ ++#define CHAR_INSERT 65 ++#define CHAR_INSERT_AHEAD 66 + #define CURS_LEFT 601 + #define CURS_RIGHT 602 + #define DELCHAR 603 +@@ -105,7 +128,7 @@ + + struct macro { + short command; +- short ch; ++ mc_wchar_t ch; + }; + + struct WEdit; +@@ -120,8 +143,12 @@ + void menu_save_mode_cmd (void); + int edit_raw_key_query (const char *heading, const char *query, int cancel); + int edit_file (const char *_file, int line); +-int edit_translate_key (WEdit *edit, long x_key, int *cmd, int *ch); ++int edit_translate_key (WEdit *edit, long x_key, int *cmd, mc_wint_t *ch); ++#ifndef UTF8 + int edit_get_byte (WEdit * edit, long byte_index); ++#else /* UTF8 */ ++mc_wchar_t edit_get_byte (WEdit * edit, long byte_index); ++#endif /* UTF8 */ + int edit_count_lines (WEdit * edit, long current, int upto); + long edit_move_forward (WEdit * edit, long current, int lines, long upto); + long edit_move_forward3 (WEdit * edit, long current, int cols, long upto); +@@ -148,11 +175,11 @@ + void edit_delete_line (WEdit * edit); + + int edit_delete (WEdit * edit); +-void edit_insert (WEdit * edit, int c); ++void edit_insert (WEdit * edit, mc_wchar_t c); + void edit_cursor_move (WEdit * edit, long increment); + void edit_push_action (WEdit * edit, long c, ...); + void edit_push_key_press (WEdit * edit); +-void edit_insert_ahead (WEdit * edit, int c); ++void edit_insert_ahead (WEdit * edit, mc_wchar_t c); + long edit_write_stream (WEdit * edit, FILE * f); + char *edit_get_write_filter (const char *writename, const char *filename); + int edit_save_confirm_cmd (WEdit * edit); +@@ -183,7 +210,7 @@ + int eval_marks (WEdit * edit, long *start_mark, long *end_mark); + void edit_status (WEdit * edit); + void edit_execute_key_command (WEdit *edit, int command, +- int char_for_insertion); ++ mc_wint_t char_for_insertion); + void edit_update_screen (WEdit * edit); + int edit_print_string (WEdit * e, const char *s); + void edit_move_to_line (WEdit * e, long line); +@@ -233,7 +260,7 @@ + void format_paragraph (WEdit *edit, int force); + + /* either command or char_for_insertion must be passed as -1 */ +-void edit_execute_cmd (WEdit *edit, int command, int char_for_insertion); ++void edit_execute_cmd (WEdit *edit, int command, mc_wint_t char_for_insertion); + + #define get_sys_error(s) (s) + +--- mc-4.6.2/edit/editcmd.c ++++ mc-4.6.2/edit/editcmd.c +@@ -60,7 +60,7 @@ + #include "../src/selcodepage.h" + + struct selection { +- unsigned char * text; ++ mc_wchar_t *text; + int len; + }; + +@@ -83,12 +83,16 @@ + #define MAX_REPL_LEN 1024 + + static int edit_save_cmd (WEdit *edit); +-static unsigned char *edit_get_block (WEdit *edit, long start, ++static mc_wchar_t *edit_get_block (WEdit *edit, long start, + long finish, int *l); + +-static inline int my_lower_case (int c) ++static inline mc_wchar_t my_lower_case (mc_wchar_t c) + { ++#ifndef UTF8 + return tolower(c & 0xFF); ++#else ++ return towlower(c); ++#endif + } + + static const char * +@@ -123,11 +127,11 @@ + #endif /* !HAVE_MEMMOVE */ + + /* #define itoa MY_itoa <---- this line is now in edit.h */ +-static char * ++static mc_wchar_t * + MY_itoa (int i) + { +- static char t[14]; +- char *s = t + 13; ++ static mc_wchar_t t[14]; ++ mc_wchar_t *s = t + 13; + int j = i; + *s-- = 0; + do { +@@ -212,6 +216,48 @@ + doupdate(); + } + ++#ifdef UTF8 ++ ++static size_t ++wchar_write(int fd, mc_wchar_t *buf, size_t len) ++{ ++ char *tmpbuf = g_malloc(len + MB_LEN_MAX); ++ mbstate_t mbs; ++ size_t i; ++ size_t outlen = 0; ++ size_t res; ++ ++ for (i = 0; i < len; i++) { ++ if (outlen >= len) { ++ if ((res = mc_write(fd, tmpbuf, outlen)) != outlen) { ++ g_free(tmpbuf); ++ return -1; ++ } ++ outlen = 0; ++ } ++ memset (&mbs, 0, sizeof (mbs)); ++#ifdef __STDC_ISO_10646__ ++ if (buf[i] >= BINARY_CHAR_OFFSET && buf[i] < (BINARY_CHAR_OFFSET + 256)) { ++ res = 1; ++ tmpbuf[outlen] = (char) (buf[i] - BINARY_CHAR_OFFSET); ++ ++ } else ++#endif ++ res = wcrtomb(tmpbuf + outlen, buf[i], &mbs); ++ if (res > 0) { ++ outlen += res; ++ } ++ } ++ if ((res = mc_write(fd, tmpbuf, outlen)) != outlen) { ++ g_free(tmpbuf); ++ return -1; ++ } ++ g_free(tmpbuf); ++ return len; ++} ++ ++#endif /* UTF8 */ ++ + /* If 0 (quick save) then a) create/truncate file, + b) save to ; + if 1 (safe save) then a) save to , +@@ -359,32 +405,48 @@ + buf = 0; + filelen = edit->last_byte; + while (buf <= (edit->curs1 >> S_EDIT_BUF_SIZE) - 1) { ++#ifndef UTF8 + if (mc_write (fd, (char *) edit->buffers1[buf], EDIT_BUF_SIZE) ++#else /* UTF8 */ ++ if (wchar_write (fd, edit->buffers1[buf], EDIT_BUF_SIZE) ++#endif /* UTF8 */ + != EDIT_BUF_SIZE) { + mc_close (fd); + goto error_save; + } + buf++; + } ++#ifndef UTF8 + if (mc_write + (fd, (char *) edit->buffers1[buf], ++#else /* UTF8 */ ++ if (wchar_write ++ (f