about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--Doc/Zsh/zle.yo22
-rw-r--r--Src/Zle/zle_params.c19
3 files changed, 37 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 946995c59..d65cbe194 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2004-09-10  Peter Stephenson  <pws@csr.com>
+
+	* 20348: Doc/Zsh/zle.yo, Src/Zle/zle_params.c: Rejig WIDGETSTYLE
+	and add WIDGETFUNC.
+
 2004-09-09  Peter Stephenson  <pws@csr.com>
 
 	* 20332: Src/Zle/zle_params.c, Doc/Zsh/zle.yo: add WIDGETSTYLE zle
diff --git a/Doc/Zsh/zle.yo b/Doc/Zsh/zle.yo
index 036c0284c..9af41e820 100644
--- a/Doc/Zsh/zle.yo
+++ b/Doc/Zsh/zle.yo
@@ -732,15 +732,21 @@ vindex(WIDGET)
 item(tt(WIDGET) (scalar))(
 The name of the widget currently being executed; read-only.
 )
+vindex(WIDGETFUNC)
+item(tt(WIDGETFUNC) (scalar))(
+The name of the shell function that implements a widget defined with
+either tt(zle -N) or tt(zle -C).  In the former case, this is the second
+argument to the tt(zle -N) command that defined the widget, or
+the first argument if there was no second argument.  In the latter case
+this is the the third argument to the tt(zle -C) command that defined the
+widget.  Read-only.
+)
 vindex(WIDGETSTYLE)
-item(tt(WIDGET) (scalar))(
-Describes the implementation behind the widget currently being executed;
-the second argument that followed tt(zle -C) or tt(zle -N) when the widget
-was defined, if any.  If the widget was defined with tt(zle -N) and there was
-no second argument this is the same as the first argument.  Hence for
-tt(zle -N) this gives the name of the function that implements the widget,
-and for tt(zle -C) this gives the internal completion widget that defines
-the type of completion.  Read-only.
+item(tt(WIDGETSTYLE) (scalar))(
+Describes the implementation behind the completion widget currently being
+executed; the second argument that followed tt(zle -C) when the widget was
+defined.  This is the name of a builtin completion widget.  For widgets
+defined with tt(zle -N) this is set to the empty string.  Read-only.
 )
 enditem()
 
diff --git a/Src/Zle/zle_params.c b/Src/Zle/zle_params.c
index efbad97f5..d5fa6dd26 100644
--- a/Src/Zle/zle_params.c
+++ b/Src/Zle/zle_params.c
@@ -93,6 +93,8 @@ static struct zleparam {
 	zleunsetfn, NULL },
     { "WIDGET", PM_SCALAR | PM_READONLY, NULL, FN(get_widget),
         zleunsetfn, NULL },
+    { "WIDGETFUNC", PM_SCALAR | PM_READONLY, NULL, FN(get_widgetfunc),
+        zleunsetfn, NULL },
     { "WIDGETSTYLE", PM_SCALAR | PM_READONLY, NULL, FN(get_widgetstyle),
 	zleunsetfn, NULL },
     { NULL, 0, NULL, NULL, NULL, NULL }
@@ -282,6 +284,21 @@ get_widget(UNUSED(Param pm))
 
 /**/
 static char *
+get_widgetfunc(UNUSED(Param pm))
+{
+    Widget widget = bindk->widget;
+    int flags = widget->flags;
+
+    if (flags & WIDGET_INT)
+	return ".internal";	/* Don't see how this can ever be returned... */
+    else if (flags & WIDGET_NCOMP)
+	return widget->u.comp.func;
+    else
+	return widget->u.fnnam;
+}
+
+/**/
+static char *
 get_widgetstyle(UNUSED(Param pm))
 {
     Widget widget = bindk->widget;
@@ -292,7 +309,7 @@ get_widgetstyle(UNUSED(Param pm))
     else if (flags & WIDGET_NCOMP)
 	return widget->u.comp.wid;
     else
-	return widget->u.fnnam;
+	return "";
 }
 
 /**/