shithub: 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	Sat Dec 12 05:03:13 2020
+++ b/appl/wm/clock.b	Sun Dec 13 23:21:38 2020
@@ -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	Sat Dec 12 05:03:13 2020
+++ b/appl/wm/wm.b	Sun Dec 13 23:21:38 2020
@@ -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,12 +360,14 @@
 		if(z == nil)
 			return "no such client";
 		z.ctl <-= str->quoted(tl tl args);
+
 	"endcontrol" =>
 		if(c != controller)
 			return "invalid request";
 		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	Sat Dec 12 05:03:13 2020
+++ b/man/2/wmclient	Sun Dec 13 23:21:38 2020
@@ -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;
-
-	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;
+	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);
+	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,12 +145,14 @@
 in
 .IR string (2).
 The messages include:
+
 .TP
 .B exit
 The window should be closed.
 .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,18 +168,22 @@
 and
 .I mindy
 give the minimum size acceptable for the window.
+
 .TP
 .B help
 The help button has been clicked.
 .TP
 .B ok
 The OK  button has been clicked.
+
 .TP
 .B hide
 The Hide button has been clicked.
 .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,32 +223,44 @@
 (if
 .I how
 is nil).
+
 .TP
 .B onscreen
 tries to keep the position and size the same
 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
 .B snarfput
 retrieve and replace the contents of the window
 manager's snarf buffer.
+
 .SH FILES
 .TF /chan/snarf
 .TP
 .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