ref: ec1b85c429d3fb56bb9fe1cd22309b38a6849e2b
parent: b57b54c2d8223debedae9844098b89c6b5475637
author: Tevo <estevan.cps@gmail.com>
date: Mon Jan 11 13:51:32 EST 2021
Manpage stub
--- a/libwidget/base.c
+++ b/libwidget/base.c
@@ -63,6 +63,12 @@
switch(alt(chans))
{
case MOUSE:
+ /*
+ * FIXME if the user clicks once, the widget handles it, then
+ * the user drags and the widget claims to not have handled it
+ * a menu will be shown for that button (if there's one), but
+ * it probably shouldn't
+ */
if(!mouseevent(ctl->root, ctl->image, ctl->image->r, mouse, ctl->c))
{
if((mouse.buttons & M_LEFT) && ctl->left != nil)
--- a/libwidget/base.h
+++ b/libwidget/base.h
@@ -75,24 +75,21 @@
u32int what;
};
-Widgetmsg* newmsg(Widget*, u32int what);
-
-#define C2I(a, b, c, d) ((a) << 24 | (b) << 16 | (c) << 8 | (d))
-
-extern void (*werror)(char*, ...);
-
Widgetctl* initwidget(Image*, Keyboardctl*, Mousectl*, Widget *root, int flags);
+void redrawwctl(Widgetctl*);
void closewidget(Widgetctl*);
-void wdefaults(Widget*);
-
-int nextid(void);
-
Point redrawwidget(Widget*, Image*, Rectangle);
-void redrawwctl(Widgetctl*);
+void freewidget(Widget*);
int kbdevent(Widget*, Image*, Rectangle, Rune, Channel* /*(Widgetmsg*)*/);
int mouseevent(Widget*, Image*, Rectangle, Mouse, Channel* /*(Widgetmsg*)*/);
-void freewidget(Widget*);
+void wdefaults(Widget*);
+int nextid(void);
+Widgetmsg* newmsg(Widget*, u32int what);
+
+#define C2I(a, b, c, d) ((a) << 24 | (b) << 16 | (c) << 8 | (d))
+
+extern void (*werror)(char*, ...);
--- a/libwidget/button.h
+++ b/libwidget/button.h
@@ -18,7 +18,7 @@
Button* newbutton(Widget*);
Button* newtextbutton(Font*, char *content);
-enum
+enum /* messages */
{
M_BUTTON_PRESSED = C2I('b', 't', 'n', 'p'),
M_BUTTON_RELEASED = C2I('b', 't', 'n', 'r')
--- a/libwidget/mkfile
+++ b/libwidget/mkfile
@@ -20,7 +20,16 @@
/sys/include/$HDR \
w-internal.h
+MANPAGES=\
+ /sys/man/2/widget
+
</sys/src/cmd/mksyslib
+install:V: $MANPAGES
+
/sys/include/$HDR: $HCOMP
cat $prereq >$target
+
+# TODO generalize
+/sys/man/2/widget: widget.2.man
+ cp $prereq $target
--- /dev/null
+++ b/libwidget/widget.2.man
@@ -1,0 +1,166 @@
+.TH WIDGET 2
+.SH NAME
+initwidget, closewidget, freewidget, redrawwidget, redrawwctl, kbdevent, mouseevent, wdefaults, nextid, newmsg, istextbox, newtextbox, isbox, newbox, newcenterbox, isbutton, newbutton, newtextbutton \- interface widgets
+.SH SYNOPSIS
+.de PB
+.PP
+.ft L
+.nf
+..
+.PB
+#include <u.h>
+#include <libc.h>
+#include <draw.h>
+#include <thread.h>
+#include <mouse.h>
+#include <keyboard.h>
+#include <String.h>
+#include <widget.h>
+.PB
+typedef struct Widget Widget;
+struct Widget
+{
+ int id;
+ char *kind;
+
+ void *aux;
+ Image *bg, *fg;
+
+ Point (*redraw)(Widget*, Image*, Rectangle);
+
+ int (*kbdevent)(Widget*, Image*, Rectangle, Rune, Channel* /*(Widgetmsg*)*/);
+ int (*mouseevent)(Widget*, Image*, Rectangle, Mouse, Channel* /*(Widgetmsg*)*/);
+
+ void (*cleanup)(Widget*);
+};
+.PB
+typedef struct Widgetctl Widgetctl;
+struct Widgetctl
+{
+ Channel *c; /* chan(Widgetmsg*)[16] */
+ Channel *kbdc; /* chan(Rune)[20] */
+ Channel *menuc; /* chan(Menumsg)[16] */
+ Channel *mousec; /* chan(Mouse)[16] */
+ Channel *resizec;
+ Widget *root;
+
+ Keyboardctl *kbd;
+ Mousectl *mouse;
+
+ Menu *left, *middle, *right;
+
+ Image *image;
+
+ int flags;
+ ...
+};
+.PB
+enum /* flags */
+{
+ FORWARD_KBD = 1<<0,
+ FORWARD_MOUSE = 1<<1
+};
+.PB
+enum /* mouse buttons */
+{
+ M_LEFT = 1<<0,
+ M_MIDDLE = 1<<1,
+ M_RIGHT = 1<<2
+};
+.PB
+typedef struct Menumsg Menumsg;
+struct Menumsg
+{
+ Menu *menu;
+ int button, hit;
+};
+.PB
+typedef struct Widgetmsg Widgetmsg;
+struct Widgetmsg
+{
+ Widget *sender;
+ u32int what;
+};
+.PB
+Widgetctl* initwidget(Image*, Keyboardctl*, Mousectl*, Widget *root, int flags);
+void redrawwctl(Widgetctl*);
+void closewidget(Widgetctl*);
+.PB
+Point redrawwidget(Widget*, Image*, Rectangle);
+void freewidget(Widget*);
+.PB
+int kbdevent(Widget*, Image*, Rectangle, Rune, Channel* /*(Widgetmsg*)*/);
+int mouseevent(Widget*, Image*, Rectangle, Mouse, Channel* /*(Widgetmsg*)*/);
+.PB
+void wdefaults(Widget*);
+int nextid(void);
+Widgetmsg* newmsg(Widget*, u32int what);
+.PB
+#define C2I(a, b, c, d) ((a) << 24 | (b) << 16 | (c) << 8 | (d))
+.PB
+extern void (*werror)(char*, ...) = sysfatal;
+.PB
+typedef struct Textbox Textbox;
+struct Textbox
+{
+ Widget;
+
+ Font *font;
+ String *content;
+ Point lastpt;
+ int selectable;
+ int editable;
+};
+.PB
+int istextbox(Widget*);
+.PB
+Textbox* newtextbox(int selectable, int editable, Font*, char *content);
+.PB
+typedef struct Box Box;
+struct Box
+{
+ Widget;
+
+ Widget *content;
+ int flags;
+
+ Point maxsize;
+ ...
+};
+.PB
+enum /* flags */
+{
+ B_CENTER_CONTENT = 1<<0
+};
+.PB
+int isbox(Widget*);
+.PB
+Box* newbox(Widget*, int flags);
+Box* newcenterbox(Widget*);
+.PB
+typedef struct Button Button;
+struct Button
+{
+ Widget;
+
+ Widget *content;
+ int pressed;
+ ...
+};
+.PB
+int isbutton(Widget*);
+.PB
+Button* newbutton(Widget*);
+Button* newtextbutton(Font*, char *content);
+.PB
+enum /* messages */
+{
+ M_BUTTON_PRESSED
+ M_BUTTON_RELEASED
+};
+.SH DESCRIPTION
+<we describe libwidget here>
+.SH DIAGNOSTICS
+These routines call the function pointed to by werror on fatal errors. The function should not return.
+.SH BUGS
+Writing widgets involves too much boilerplate code.