GNU bug report logs - #37858
27.0.50; Ensure a minimum width for `space` display prop

Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.

Package: emacs; Reported by: Stefan Monnier <monnier@HIDDEN>; dated Mon, 21 Oct 2019 20:05:02 UTC; Maintainer for emacs is bug-gnu-emacs@HIDDEN.

Message received at 37858 <at> debbugs.gnu.org:


Received: (at 37858) by debbugs.gnu.org; 22 Oct 2019 15:08:56 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue Oct 22 11:08:56 2019
Received: from localhost ([127.0.0.1]:60314 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1iMvmK-0005sn-Be
	for submit <at> debbugs.gnu.org; Tue, 22 Oct 2019 11:08:56 -0400
Received: from eggs.gnu.org ([209.51.188.92]:44866)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <eliz@HIDDEN>) id 1iMvmI-0005sa-Dr
 for 37858 <at> debbugs.gnu.org; Tue, 22 Oct 2019 11:08:54 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:58458)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <eliz@HIDDEN>)
 id 1iMvmD-00008b-5c; Tue, 22 Oct 2019 11:08:49 -0400
Received: from [176.228.60.248] (port=4171 helo=home-c4e4a596f7)
 by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <eliz@HIDDEN>)
 id 1iMvmC-0005zI-BK; Tue, 22 Oct 2019 11:08:48 -0400
Date: Tue, 22 Oct 2019 18:08:43 +0300
Message-Id: <837e4w24xw.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: Stefan Monnier <monnier@HIDDEN>
In-reply-to: <jwvy2xdams1.fsf@HIDDEN> (message from Stefan Monnier
 on Mon, 21 Oct 2019 16:03:58 -0400)
Subject: Re: bug#37858: 27.0.50;
 Ensure a minimum width for `space` display prop
References: <jwvy2xdams1.fsf@HIDDEN>
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 37858
Cc: 37858 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> From: Stefan Monnier <monnier@HIDDEN>
> Date: Mon, 21 Oct 2019 16:03:58 -0400
> 
> So, I'd like to extend our `space` specifications so as to be able to
> specify a minimum width.  I came up with the patch below which lets you
> write:
> 
>     (space :align-to FOO :min-width BAR)
> 
> which seems to work fine, but while trying to update the Elisp doc for
> it I realized that maybe a better option is to extend the acceptable
> forms for FOO so it can be of the form:
> 
>     (space :align-to (max FOO (+ BAR current-x)))

Since :align-to already supports expressions of the forms described in
the node "Pixel Specification", to have the latter you'd need:

  . implement a new OP called 'max' (and probably also 'min' for a
    good measure);
  . implement a new POS called, say, 'beg', which will evaluate to the
    x coordinate of where the space display property begins

and then you will have your feature for free, I think.





Information forwarded to bug-gnu-emacs@HIDDEN:
bug#37858; Package emacs. Full text available.

Message received at 37858 <at> debbugs.gnu.org:


Received: (at 37858) by debbugs.gnu.org; 22 Oct 2019 08:03:56 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue Oct 22 04:03:56 2019
Received: from localhost ([127.0.0.1]:58199 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1iMp92-0007bQ-Hl
	for submit <at> debbugs.gnu.org; Tue, 22 Oct 2019 04:03:56 -0400
Received: from mail-wm1-f47.google.com ([209.85.128.47]:55208)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <rpluim@HIDDEN>) id 1iMp90-0007bB-FU
 for 37858 <at> debbugs.gnu.org; Tue, 22 Oct 2019 04:03:54 -0400
Received: by mail-wm1-f47.google.com with SMTP id p7so16055528wmp.4
 for <37858 <at> debbugs.gnu.org>; Tue, 22 Oct 2019 01:03:54 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=from:to:cc:subject:references:mail-copies-to:gmane-reply-to-list
 :date:in-reply-to:message-id:mime-version:content-transfer-encoding;
 bh=w5rWEuC5SQ/xd0BUyhvPJrUYt/wugWYCX7fi8DEdPgU=;
 b=q9JKxS9BXGWSckPVDdcEaN+Mw8yOVJkF7aQfiGMEi9pAyC5Soqin2Ot8yU7lX5+Ak9
 ketUNoZbIKJp5/sJDhAEx5M3jVxq35Igk2WvFg/R95GhF8HSfT3/tErx0oP8QgeFshki
 KcHtAi8cqZ8nEZD6tVMYfUlKElWq+sfd5/BkYBdbFvp/WU9wi4ewAMG5WTDe5txPoIw2
 CecTwEPJtGz5HG7nOPGAJecJKtwcS5FBbq6u9joZlHxGOu3kxzeB9RJRQgHBt/YOVlgX
 R9HP8F3W75Hf+0oRUeeE+4ALo06ohgQ4NuS2ArOECIZxaRuDvnyiT7G8nAruw73B1duo
 4f3w==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:from:to:cc:subject:references:mail-copies-to
 :gmane-reply-to-list:date:in-reply-to:message-id:mime-version
 :content-transfer-encoding;
 bh=w5rWEuC5SQ/xd0BUyhvPJrUYt/wugWYCX7fi8DEdPgU=;
 b=KotO0nBCJ8U1/vqyilQzx+B3J6fqZneyHSTnf5qWd384nQX/O2I6oBQr6p4bRWE3vk
 X/biBJe1oKCDsqUUfCvcKr32cNUtNEe8ZfWsETHDjqtE3JhdRLNhV0cRxoBkB16poOQR
 i/Rp0zlBknPFCU3YMMUr+VgWLWXUlj/smvrf8U8CuQGcVzbPgRdKnwmeiptcNZOAQRln
 5PrwxixxikI92nU4h4jOnjmtEc+TLqilngcuH3f4gR1CvdxrPX/Dq4xMwcC9UFPKrSV5
 rX7saIXVR9dx/BAeCieiht10gE5r/ncYi5S+GjnRVcpsesoIGOYPNiABNAwH2ThAHVHp
 qPNQ==
X-Gm-Message-State: APjAAAXD7GIPk9tDfLly4LmePVWn35tzJyz07dZyKbqgb6NxC1qfvWgc
 2mlPZxFCZVh6pbPteHlQ9eaU3jZL
X-Google-Smtp-Source: APXvYqyALAj2DSY5y3ixDopOgNRx2rDbTsDT862ABFW+4x627Lh2dg0qVkOKTW/7K7jtcuo273W13A==
X-Received: by 2002:a1c:a70e:: with SMTP id q14mr1601436wme.86.1571731428220; 
 Tue, 22 Oct 2019 01:03:48 -0700 (PDT)
Received: from rpluim-mac ([149.5.228.1])
 by smtp.gmail.com with ESMTPSA id t10sm21213321wrw.23.2019.10.22.01.03.47
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Tue, 22 Oct 2019 01:03:47 -0700 (PDT)
From: Robert Pluim <rpluim@HIDDEN>
To: Stefan Monnier <monnier@HIDDEN>
Subject: Re: bug#37858: 27.0.50; Ensure a minimum width for `space` display
 prop
References: <jwvy2xdams1.fsf@HIDDEN>
X-Debbugs-No-Ack: yes
Mail-Copies-To: never
Gmane-Reply-To-List: yes
Date: Tue, 22 Oct 2019 10:03:46 +0200
In-Reply-To: <jwvy2xdams1.fsf@HIDDEN> (Stefan Monnier's message of
 "Mon, 21 Oct 2019 16:03:58 -0400")
Message-ID: <m2ftjlurz1.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 37858
Cc: 37858 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

>>>>> On Mon, 21 Oct 2019 16:03:58 -0400, Stefan Monnier <monnier@HIDDEN=
real.ca> said:

    Stefan> Package: Emacs
    Stefan> Version: 27.0.50


    Stefan> For text displayed in columns, alignment is generally obtained =
with
    Stefan> a `display` text-property of the form

    Stefan>     (space :align-to FOO)

    Stefan> This works great when the previous text ends before FOO, but wh=
en we
    Stefan> mis-calculate (or didn't calculate at all) and the previous tex=
t already
    Stefan> extends further than the desired alignment of the following tex=
t, such
    Stefan> space is reduced down to 0 pixels which is often not what we wa=
nt.

    Stefan> Sometimes one can workaround this by placing 2 spaces in the bu=
ffer: one
    Stefan> with the :align-to and another fixed size space.  But it can be
    Stefan> cumbersome to do that and it leads to undesirable artifacts (e.=
g. the
    Stefan> cursor can be placed between the two space).

    Stefan> So, I'd like to extend our `space` specifications so as to be a=
ble to
    Stefan> specify a minimum width.  I came up with the patch below which =
lets you
    Stefan> write:

    Stefan>     (space :align-to FOO :min-width BAR)

    Stefan> which seems to work fine, but while trying to update the Elisp =
doc for
    Stefan> it I realized that maybe a better option is to extend the accep=
table
    Stefan> forms for FOO so it can be of the form:

    Stefan>     (space :align-to (max FOO (+ BAR current-x)))

Hmm, I think I probably prefer the former. Perhaps when you've
documented the semantics of your :min-relative-width addition I=CA=BCll be
able to judge better :-)

Robert




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#37858; Package emacs. Full text available.

Message received at submit <at> debbugs.gnu.org:


Received: (at submit) by debbugs.gnu.org; 21 Oct 2019 20:04:18 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Mon Oct 21 16:04:18 2019
Received: from localhost ([127.0.0.1]:57884 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1iMduc-0005zZ-7t
	for submit <at> debbugs.gnu.org; Mon, 21 Oct 2019 16:04:18 -0400
Received: from lists.gnu.org ([209.51.188.17]:60737)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <monnier@HIDDEN>) id 1iMdua-0005zQ-6s
 for submit <at> debbugs.gnu.org; Mon, 21 Oct 2019 16:04:16 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10]:37056)
 by lists.gnu.org with esmtp (Exim 4.90_1)
 (envelope-from <monnier@HIDDEN>) id 1iMduY-000174-Ro
 for bug-gnu-emacs@HIDDEN; Mon, 21 Oct 2019 16:04:16 -0400
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org
X-Spam-Level: 
X-Spam-Status: No, score=0.1 required=5.0 tests=BAYES_50,RCVD_IN_DNSWL_LOW,
 URIBL_BLOCKED autolearn=disabled version=3.3.2
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
 (envelope-from <monnier@HIDDEN>) id 1iMduW-0005Cm-Mh
 for bug-gnu-emacs@HIDDEN; Mon, 21 Oct 2019 16:04:13 -0400
Received: from mailscanner.iro.umontreal.ca ([132.204.25.50]:57577)
 by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)
 (Exim 4.71) (envelope-from <monnier@HIDDEN>)
 id 1iMduW-0005CO-FY
 for bug-gnu-emacs@HIDDEN; Mon, 21 Oct 2019 16:04:12 -0400
Received: from pmg1.iro.umontreal.ca (localhost.localdomain [127.0.0.1])
 by pmg1.iro.umontreal.ca (Proxmox) with ESMTP id 5DDC810079A
 for <bug-gnu-emacs@HIDDEN>; Mon, 21 Oct 2019 16:04:11 -0400 (EDT)
Received: from mail01.iro.umontreal.ca (unknown [172.31.2.1])
 by pmg1.iro.umontreal.ca (Proxmox) with ESMTP id 08B561002CF
 for <bug-gnu-emacs@HIDDEN>; Mon, 21 Oct 2019 16:04:10 -0400 (EDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=iro.umontreal.ca;
 s=mail; t=1571688250;
 bh=18B0FzfBdQEix8NasBq59NxnRvs8kFgaxy8JvGReXYk=;
 h=From:To:Subject:Date:From;
 b=kSOesySqmhZ2bsGDQluP9lyrLvG6B00UZu2+b1LuMIOit8UHVKYxEYuOuz0BZg2w8
 CsSdxNTkuFOx+N2a2LymWWP2e39Y60KGxgCYYiIbKNpvsYZdf5iffSM9WXjrFb+wv9
 FOiiKuWIJrLPS5dq0ayQVJGByn527AjafIuu0YsDhnX4V5YYy3fZcCd6YnDJFDDDST
 xjAy/2Nq0K0r5hECFdV0uhTVvMcro8EAne4kVWIrW2pmrpqvdmma2xaq6XqHDbV2LJ
 gIlc+XwdzbpOQEQkvzxoLRqd9CJSorNTM1sO1YQju1IQKO7fAJW/rZEXQY4zkIGbqt
 9Kun+lAGjrPUg==
Received: from alfajor (unknown [216.154.30.71])
 by mail01.iro.umontreal.ca (Postfix) with ESMTPSA id A00CF120BB5
 for <bug-gnu-emacs@HIDDEN>; Mon, 21 Oct 2019 16:04:09 -0400 (EDT)
From: Stefan Monnier <monnier@HIDDEN>
To: bug-gnu-emacs@HIDDEN
Subject: 27.0.50; Ensure a minimum width for `space` display prop
Date: Mon, 21 Oct 2019 16:03:58 -0400
Message-ID: <jwvy2xdams1.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
 [fuzzy]
X-Received-From: 132.204.25.50
X-Spam-Score: -1.3 (-)
X-Debbugs-Envelope-To: submit
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -2.3 (--)

Package: Emacs
Version: 27.0.50


For text displayed in columns, alignment is generally obtained with
a `display` text-property of the form

    (space :align-to FOO)

This works great when the previous text ends before FOO, but when we
mis-calculate (or didn't calculate at all) and the previous text already
extends further than the desired alignment of the following text, such
space is reduced down to 0 pixels which is often not what we want.

Sometimes one can workaround this by placing 2 spaces in the buffer: one
with the :align-to and another fixed size space.  But it can be
cumbersome to do that and it leads to undesirable artifacts (e.g. the
cursor can be placed between the two space).

So, I'd like to extend our `space` specifications so as to be able to
specify a minimum width.  I came up with the patch below which lets you
write:

    (space :align-to FOO :min-width BAR)

which seems to work fine, but while trying to update the Elisp doc for
it I realized that maybe a better option is to extend the acceptable
forms for FOO so it can be of the form:

    (space :align-to (max FOO (+ BAR current-x)))

WDYT?


        Stefan


diff --git a/src/xdisp.c b/src/xdisp.c
index be1c209553..fd825d2dfe 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -29218,6 +29218,28 @@ append_stretch_glyph (struct it *it, Lisp_Object object,
 
 #endif	/* HAVE_WINDOW_SYSTEM */
 
+static int
+compute_relative_width (struct it *it, Lisp_Object prop)
+{
+  struct it it2;
+  unsigned char *p = BYTE_POS_ADDR (IT_BYTEPOS (*it));
+
+  it2 = *it;
+  if (it->multibyte_p)
+    it2.c = it2.char_to_display = STRING_CHAR_AND_LENGTH (p, it2.len);
+  else
+    {
+      it2.c = it2.char_to_display = *p, it2.len = 1;
+      if (! ASCII_CHAR_P (it2.c))
+	it2.char_to_display = BYTE8_TO_CHAR (it2.c);
+    }
+
+  it2.glyph_row = NULL;
+  it2.what = IT_CHARACTER;
+  PRODUCE_GLYPHS (&it2);
+  return NUMVAL (prop) * it2.pixel_width;
+}
+
 /* Produce a stretch glyph for iterator IT.  IT->object is the value
    of the glyph property displayed.  The value must be a list
    `(space KEYWORD VALUE ...)' with the following KEYWORD/VALUE pairs
@@ -29288,23 +29310,7 @@ produce_stretch_glyph (struct it *it)
       /* Relative width `:relative-width FACTOR' specified and valid.
 	 Compute the width of the characters having the `glyph'
 	 property.  */
-      struct it it2;
-      unsigned char *p = BYTE_POS_ADDR (IT_BYTEPOS (*it));
-
-      it2 = *it;
-      if (it->multibyte_p)
-	it2.c = it2.char_to_display = STRING_CHAR_AND_LENGTH (p, it2.len);
-      else
-	{
-	  it2.c = it2.char_to_display = *p, it2.len = 1;
-	  if (! ASCII_CHAR_P (it2.c))
-	    it2.char_to_display = BYTE8_TO_CHAR (it2.c);
-	}
-
-      it2.glyph_row = NULL;
-      it2.what = IT_CHARACTER;
-      PRODUCE_GLYPHS (&it2);
-      width = NUMVAL (prop) * it2.pixel_width;
+      width = compute_relative_width (it, prop);
     }
   else if ((prop = Fplist_get (plist, QCalign_to), !NILP (prop))
 	   && calc_pixel_width_or_height (&tem, it, prop, font, true,
@@ -29323,6 +29329,21 @@ produce_stretch_glyph (struct it *it)
     /* Nothing specified -> width defaults to canonical char width.  */
     width = FRAME_COLUMN_WIDTH (it->f);
 
+  if ((prop = Fplist_get (plist, QCmin_width), !NILP (prop))
+      && calc_pixel_width_or_height (&tem, it, prop, font, true, 0))
+    {
+      /* Absolute minimum width `:min-width WIDTH' specified and valid.  */
+      if (width < tem)
+        width = tem;
+    }
+  else if (prop = Fplist_get (plist, QCmin_relative_width), NUMVAL (prop) > 0)
+    {
+      /* Relative width `:min-relative-width FACTOR' specified and valid.  */
+      int tem = compute_relative_width (it, prop);
+      if (width < tem)
+        width = tem;
+    }
+
   if (width <= 0 && (width < 0 || !zero_width_ok_p))
     width = 1;
 
@@ -34275,6 +34296,8 @@ syms_of_xdisp (void)
   DEFSYM (QCalign_to, ":align-to");
   DEFSYM (QCrelative_width, ":relative-width");
   DEFSYM (QCrelative_height, ":relative-height");
+  DEFSYM (QCmin_relative_width, ":min-relative-width");
+  DEFSYM (QCmin_width, ":min-width");
   DEFSYM (QCeval, ":eval");
   DEFSYM (QCpropertize, ":propertize");
   DEFSYM (QCfile, ":file");





Acknowledgement sent to Stefan Monnier <monnier@HIDDEN>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs@HIDDEN. Full text available.
Report forwarded to bug-gnu-emacs@HIDDEN:
bug#37858; Package emacs. Full text available.
Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.
Last modified: Mon, 25 Nov 2019 12:00:02 UTC

GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997 nCipher Corporation Ltd, 1994-97 Ian Jackson.