code: purgatorio

Download patch

ref: 79c64a79a248c31733d4ec0ff9fe1a1e57a58f51
parent: acc58dfee42368825f7595d63240fd6e88559776
author: henesy <devnull@localhost>
date: Sun Dec 13 23:21:38 EST 2020

wm/clock: create context if none exists ;; wmclient(2): correct and align with current implementation

--- a/appl/wm/clock.b
+++ b/appl/wm/clock.b
@@ -44,6 +44,9 @@
 	sys->pctl(Sys->NEWPGRP, nil);
 	wmclient->init();
 
+	if(ctxt == nil)
+		ctxt = wmclient->makedrawcontext();
+
 	w := wmclient->window(ctxt, "clock", Wmclient->Appl);	# Plain?
 	display := w.display;
 	back = display.colormix(Draw->Palebluegreen, Draw->White);
@@ -53,10 +56,10 @@
 	dots = display.newimage(Rect((0,0),(1,1)), Draw->CMAP8, 1, Draw->Blue);
 
 	w.reshape(Rect((0, 0), (100, 100)));
+	w.onscreen("place");
 	w.startinput("ptr" :: nil);
 
 	now := daytime->now();
-	w.onscreen(nil);
 	drawclock(w.image, now);
 
 	ticks := chan of int;
@@ -67,8 +70,10 @@
 		w.wmctl(ctl);
 		if(ctl != nil && ctl[0] == '!')
 			drawclock(w.image, now);
+
 	p := <-w.ctxt.ptr =>
 		w.pointer(*p);
+
 	<-ticks =>
 		t := daytime->now();
 		if(t != now){
--- a/appl/wm/wm.b
+++ b/appl/wm/wm.b
@@ -207,6 +207,7 @@
 	n := len args;
 	if(req[0] == '!' && n < 3)
 		return "bad arg count";
+
 	case hd args {
 	"key" =>
 		# XXX should we restrict this capability to certain clients only?
@@ -217,6 +218,7 @@
 			spawn bufferproc(fakekbdin, fakekbd);
 		}
 		fakekbdin <-= hd tl args;
+
 	"ptr" =>
 		# ptr x y
 		if(n != 3)
@@ -228,6 +230,7 @@
 			c.ptr <-= nil;		# flush queue
 			c.ptr <-= ref Pointer(buttons, (int hd tl args, int hd tl tl args), sys->millisec());
 		}
+
 	"cursor" =>
 		# cursor hotx hoty dx dy data
 		if(n != 6 && n != 1)
@@ -235,6 +238,7 @@
 		c.cursor = req;
 		if(ptrfocus == c || kbdfocus == c)
 			return wmclient->win.wmctl(c.cursor);
+
 	"start" =>
 		if(n != 2)
 			return "bad arg count";
@@ -255,6 +259,7 @@
 		* =>
 			return "unknown input source";
 		}
+
 	"!reshape" =>
 		# reshape tag reqid rect [how]
 		# XXX allow "how" to specify that the origin of the window is never
@@ -285,6 +290,7 @@
 			}
 		}
 		return reshape(c, tag, r);
+
 	"delete" =>
 		# delete tag
 		if(tl args == nil)
@@ -292,10 +298,13 @@
 		c.setimage(hd tl args, nil);
 		if(c.wins == nil && c == kbdfocus)
 			setfocus(win, nil);
+
 	"raise" =>
 		c.top();
+
 	"lower" =>
 		c.bottom();
+
 	"!move" or
 	"!size" =>
 		# !move tag reqid startx starty
@@ -318,10 +327,13 @@
 				return "bad arg count";
 			sizewin(wmctxt.ptr, c, w, Point(int hd args, int hd tl args));
 		}
+
 	"fixedorigin" =>
 		c.flags |= Fixedorigin;
+
 	"rect" =>
 		;
+
 	"kbdfocus" =>
 		if(n != 2)
 			return "bad arg count";
@@ -329,10 +341,12 @@
 			setfocus(win, c);
 		else if(c == kbdfocus)
 			setfocus(win, nil);
+
 	# controller specific messages:
 	"request" =>		# can be used to test for control.
 		if((c.flags & Controller) == 0)
 			return "you are not in control";
+
 	"ctl" =>
 		# ctl id msg
 		if((c.flags & Controlstarted) == 0)
@@ -346,6 +360,7 @@
 		if(z == nil)
 			return "no such client";
 		z.ctl <-= str->quoted(tl tl args);
+
 	"endcontrol" =>
 		if(c != controller)
 			return "invalid request";
@@ -352,6 +367,7 @@
 		controller = nil;
 		allowcontrol = 1;
 		c.flags &= ~(Controlstarted | Controller);
+
 	* =>
 		if(c == controller || controller == nil || (controller.flags & Controlstarted) == 0)
 			return "unknown control request";
--- a/man/2/wmclient
+++ b/man/2/wmclient
@@ -1,6 +1,6 @@
 .TH WMCLIENT 2
 .SH NAME
-wmclient: makedrawcontext, window, snarfput, snarfget \-
+wmclient: makedrawcontext, window, snarfput, snarfget, cursorspec \-
 window manager interface for Draw-based applications.
 .SH SYNOPSIS
 .EX
@@ -12,32 +12,36 @@
 Hide,
 Help,
 OK,
-Plain:     con 1 << iota;
+Popup,
+Plain:  con 1 << iota;
 
 Appl:   con Resize | Hide;
 
-init:       fn();
-makedrawcontext: fn():  ref Draw->Context;
-window:	fn(ctxt: ref Draw->Context, title: string, buts: int): ref Window;
-snarfput:   fn(buf: string);
-snarfget:   fn(): string;
+init:             fn();
+makedrawcontext:  fn():  ref Draw->Context;
+window:           fn(ctxt: ref Draw->Context, title: string, buts: int): ref Window;
+snarfput:         fn(buf: string);
+snarfget:         fn(): string;
+cursorspec:       fn(img: ref Draw->Image): string;
+
 Window: adt{
-	display:	ref Draw->Display;
-	r: Draw->Rect;		# full rectangle of window, including titlebar.
-	image: ref Draw->Image;
-	screenr: Draw->Rect;
-	ctxt: ref Draw->Wmcontext;
-	focused:	int;
-	ctl:		chan of string;
+	display:   ref Draw->Display;
+	r:         Draw->Rect;
+	image:     ref Draw->Image;
+	displayr:  Draw->Rect;
+	ctxt:      ref Draw->Wmcontext;
+	bd:        int;
+	focused:   int;
+	ctl:       chan of string;
 
-	startinput:	fn(w: self ref Window, devs: list of string);
-	wmctl:	fn(w: self ref Window, request: string): string;
-	settitle:	fn(w: self ref Window, name: string): string;
-	reshape:	fn(w: self ref Window, r: Draw->Rect);
-	onscreen:	fn(w: self ref Window, how: string);
-	screenr2imager:	fn(w: self ref Window, sr: Draw->Rect): Draw->Rect;
-	imager2screenr:	fn(w: self ref Window, ir: Draw->Rect): Draw->Rect;
-	pointer:	fn(w: self ref Window, p: Draw->Pointer): int;
+	startinput:  fn(w: self ref Window, devs: list of string);
+	wmctl:       fn(w: self ref Window, request: string): string;
+	settitle:    fn(w: self ref Window, name: string): string;
+	reshape:     fn(w: self ref Window, r: Draw->Rect);
+	onscreen:    fn(w: self ref Window, how: string);
+	screenr:     fn(w: self ref Window, sr: Draw->Rect): Draw->Rect;
+	imager:      fn(w: self ref Window, ir: Draw->Rect): Draw->Rect;
+	pointer:     fn(w: self ref Window, p: Draw->Pointer): int;
 };
 
 .EE
@@ -49,10 +53,12 @@
 containing an image that can be drawn on with the
 routines described in
 .IR draw-image (2).
+
 .PP
 .B Init
 should be called once to initialise the internal state of
 .BR wmclient .
+
 .PP
 .B Makedrawcontext
 establishes an initial connection with the window manager,
@@ -61,6 +67,7 @@
 context suitable for creating new windows. It is only
 necessary to call this if the application has not already
 been provided with a context.
+
 .PP
 .B Window
 creates a new window through
@@ -80,6 +87,7 @@
 If
 .B Plain
 is given, the window is given no decoration at all.
+
 .PP
 When a window, say
 .IR w ,
@@ -94,17 +102,19 @@
 gives the requested rectangle of the new
 image, excluding window decoration, such as the
 title bar and the window border.
+
 An application can use
-.IB w .screenr2imager
+.IB w .imager
 to find out the usable rectangle within screen
 rectangle
-.I sr
+.I ir
 when window decorations are taken into account.
-.IB W .imager2screenr
+.IB W .screenr
 converts in the other direction.
 .IB W .screenr
 contains the current rectangle of the screen containing
 the window.
+
 .PP
 .IB W .image
 holds the window's image when it has been successfully created;
@@ -121,6 +131,8 @@
 sets the title that is shown on the window's title bar;
 it can make the window's size (and therefore the window's image)
 change.
+
+
 .PP
 .IB W .ctl
 is a channel down which requests from the titlebar are sent.
@@ -133,6 +145,7 @@
 in
 .IR string (2).
 The messages include:
+
 .TP
 .B exit
 The window should be closed.
@@ -139,6 +152,7 @@
 .IB W .wmctl
 will kill all processes in the current
 process group.
+
 .TP
 .B !move \fIx\fP \fIy\fP
 The user has started to try to drag the window.
@@ -146,6 +160,7 @@
 and
 .I y
 give the location of the initial pointer click.
+
 .TP
 .B !size \fImindx\fP \fImindy\fP
 The user wishes to resize the window.
@@ -153,6 +168,7 @@
 and
 .I mindy
 give the minimum size acceptable for the window.
+
 .TP
 .B help
 The help button has been clicked.
@@ -159,6 +175,7 @@
 .TP
 .B ok
 The OK  button has been clicked.
+
 .TP
 .B hide
 The Hide button has been clicked.
@@ -165,6 +182,8 @@
 .IB W .wmctl
 will delete the window, and an entry
 will be shown on the toolbar.
+
+
 .PP
 In order to function correctly, an application
 should process not only events from the
@@ -186,6 +205,7 @@
 application should process the pointer event,
 otherwise the event has been consumed by the
 titlebar.
+
 .PP
 When created, the window is not visible;
 .IB w .onscreen
@@ -193,7 +213,8 @@
 position and a size for it.
 .I How
 specifies what sort of placement is required
-for the window; it can be one of
+for the window; it can be one of:
+
 .TP
 .B place
 tries to choose a suitable place on the screen
@@ -202,6 +223,7 @@
 (if
 .I how
 is nil).
+
 .TP
 .B onscreen
 tries to keep the position and size the same
@@ -208,10 +230,17 @@
 as specified on the window, adjusting them only
 to bring the window fully on screen, and making sure
 that the window is no bigger than the entire display.
+
 .TP
 .B exact
 does not change the specified size or position
 of the window unless absolutely necessary.
+
+.TP
+.B max
+makes the window take up the entire display. 
+
+
 .PP
 .B Snarfget
 and
@@ -218,6 +247,7 @@
 .B snarfput
 retrieve and replace the contents of the window
 manager's snarf buffer.
+
 .SH FILES
 .TF /chan/snarf
 .TP
@@ -224,10 +254,13 @@
 .B /chan/snarf
 snarf buffer maintained by
 .IR wm (1)
+
 .TP
-.B /chan/wm
+.B /chan/wmctl
 channel for interaction with
 .IR wm (1)
+
+
 .SH SOURCE
 .B /appl/lib/wmclient.b
 .SH SEE ALSO