12 new revisions:
Revision: 33c429f6b1
Author:
for...@vitanuova.com
Date: Sat Mar 20 15:42:50 2010
Log: 20100320-2242
http://code.google.com/p/inferno-npe/source/detail?r=33c429f6b1
Revision: a3135e5e94
Author:
for...@vitanuova.com
Date: Mon Mar 22 07:30:56 2010
Log: 20100322-1430
http://code.google.com/p/inferno-npe/source/detail?r=a3135e5e94
Revision: 1d881a60e9
Author:
for...@vitanuova.com
Date: Mon Mar 22 07:41:55 2010
Log: 20100322-1441
http://code.google.com/p/inferno-npe/source/detail?r=1d881a60e9
Revision: bebc24e3b3
Author:
for...@vitanuova.com
Date: Thu Mar 25 02:26:15 2010
Log: 20100325-0926
http://code.google.com/p/inferno-npe/source/detail?r=bebc24e3b3
Revision: 8d9ca3cef7
Author:
for...@vitanuova.com
Date: Thu Mar 25 03:14:25 2010
Log: 20100325-1014
http://code.google.com/p/inferno-npe/source/detail?r=8d9ca3cef7
Revision: d57859d8e3
Author:
for...@vitanuova.com
Date: Thu Mar 25 03:15:32 2010
Log: 20100325-1015
http://code.google.com/p/inferno-npe/source/detail?r=d57859d8e3
Revision: 57334add40
Author:
for...@vitanuova.com
Date: Thu Mar 25 03:17:00 2010
Log: 20100325-1016
http://code.google.com/p/inferno-npe/source/detail?r=57334add40
Revision: 810a16bd98
Author:
for...@vitanuova.com
Date: Thu Mar 25 11:25:10 2010
Log: 20100325-1824
http://code.google.com/p/inferno-npe/source/detail?r=810a16bd98
Revision: 59c08b24e3
Author:
for...@vitanuova.com
Date: Fri Apr 2 12:48:59 2010
Log: 20100402-2048
http://code.google.com/p/inferno-npe/source/detail?r=59c08b24e3
Revision: 77c336df67
Author:
for...@vitanuova.com
Date: Tue Apr 6 03:01:04 2010
Log: 20100406-1101
http://code.google.com/p/inferno-npe/source/detail?r=77c336df67
Revision: 1f88ded5a2
Author:
for...@vitanuova.com
Date: Tue Apr 6 11:59:10 2010
Log: 20100406-1957
http://code.google.com/p/inferno-npe/source/detail?r=1f88ded5a2
Revision: 6ff5ca2f89
Author: Venkatesh Srinivas <
m...@endeavour.zapto.org>
Date: Wed Apr 7 06:04:21 2010
Log: Merge with inferno-os 20100406-1957.
http://code.google.com/p/inferno-npe/source/detail?r=6ff5ca2f89
==============================================================================
Revision: 33c429f6b1
Author:
for...@vitanuova.com
Date: Sat Mar 20 15:42:50 2010
Log: 20100320-2242
http://code.google.com/p/inferno-npe/source/detail?r=33c429f6b1
Modified:
/CHANGES
/appl/lib/json.b
/dis/lib/json.dis
/include/version.h
=======================================
--- /CHANGES Wed Mar 10 08:12:19 2010
+++ /CHANGES Sat Mar 20 15:42:50 2010
@@ -1,3 +1,5 @@
+20100320
+ appl/lib/json.b dis/lib/json.dis - use %f not string <real-value> to
ensure json value acceptable [issue 230, powerman]
20100310
stop tabs(2) from issuing pointless tk cmd that produces diagnostics
20100305
=======================================
--- /appl/lib/json.b Wed Jan 30 01:43:09 2008
+++ /appl/lib/json.b Sat Mar 20 15:42:50 2010
@@ -576,7 +576,7 @@
Int =>
return string r.value;
Real =>
- return string r.value;
+ return sys->sprint("%f", r.value);
String =>
return quote(r.s); # quoted, or not?
Array =>
=======================================
--- /dis/lib/json.dis Wed Jan 30 01:43:09 2008
+++ /dis/lib/json.dis Sat Mar 20 15:42:50 2010
@@ -1,4 +1,4 @@
-À€0€`„°ƒî„
+À€0€`„°ƒò„
@ ƒä) ƒ¬ $- $ )
$ )
$ ) į$ (- ( v
@@ -18,15 +18,15 @@
0 - 0 ) 0$) į0 4)
$4 '
(4
-4‚–^’( €C) ƒØ ) ƒØ 4)
+4‚–^’( €C) ƒÜ ) ƒÜ 4)
$4 -
(4$
4‚
4)
$4 '- 4
-4€a) ƒØ ) ƒØ A ƒ¬8)
+4€a) ƒÜ ) ƒÜ A ƒ°8)
8 '
-€@8 H 8ƒ¬ 4) ƒt4 v
+€@8 H 8ƒ° 4) ƒx4 v
€@4(+m , 40'- 4 H 4ƒä ,)
, )
$,$
@@ -38,7 +38,7 @@
€a^’$
€k
€a`’$ €z^’$ €r €\) ƒ|€\ - €\ ) ƒð€\ ž €\ €\) ƒ|€\ - €\
-€X) ƒà€X '-€\ €X H €Xƒäž €\ $ €T)
+€X) ƒä€X '-€\ €X H €Xƒèž €\ $ €T)
€T '
$€T
€T‚–- $€X]J€}€X€µ €X)
@@ -47,7 +47,7 @@
€X‚ €X)
€X '
$€X
-€X‚–]’$"€ €\) ƒ|€\ - €\ ) ƒÔ€\ ž €\
+€X‚–]’$"€ €\) ƒ€€\ - €\ ) ƒØ€\ ž €\
€X)
€X -
$€X$'
@@ -55,16 +55,16 @@
€X j €T)
€T '
€X€T
-€T‚–]J:€X€ž €\) ƒ|€\ - €\ ) ƒÈ€\ ž €\) €L€d
+€T‚–]J:€X€ž €\) ƒ€€\ - €\ ) ƒÌ€\ ž €\) €L€d
€X)
€X '
€h€X
-€X€a I €d,) ƒØ€d) ƒØ€h) ƒØ€L €T)
+€X€a I €d,) ƒÜ€d) ƒÜ€h) ƒÜ€L €T)
€T '
$€T
€T‚–- $€X]J,€X€
-]‚,ƒØ€´%I ,€d I €d€H) ƒØ€d) ƒØ€h& ,,
- €) ƒØ,]’$€}€» €\) ƒ|€\ - €\ ) ƒÐ€\ ž €\ €\- €\ )
+]‚,ƒÜ€´%I ,€d I €d€H) ƒÜ€d) ƒÜ€h& ,,
+ €) ƒÜ,]’$€}€» €\) ƒ€€\ - €\ ) ƒÔ€\ ž €\ €\- €\ )
€H€\ )
€\ ) ƒØ€\ - 4 €T)
€T '
@@ -77,10 +77,10 @@
€X '
€\€X
€X€a
- €\0) ƒØ€\: 4 €T)
+ €\0) ƒÜ€\: 4 €T)
€T '
$€T
-€T‚–- $€X]J,€X€Ì]’$€]€ß €\) ƒ|€\ - €\ ) ƒÌ€\ ž €\ I 4€@= 4-
4€X_J €X€çr‰€X€@4"
+€T‚–- $€X]J,€X€Ì]’$€]€ß €\) ƒ€€\ - €\ ) ƒÐ€\ ž €\ I 4€@= 4-
4€X_J €X€çr‰€X€@4"
0€X & 00
€à €\- €\ )
€@€\ )
@@ -96,7 +96,7 @@
€X‚ €X)
€X '
€\€X
-€X ·S €\8) ƒØ€\ €X)
+€X ·S €\8) ƒÜ€\ €X)
€X '
$€X
€X‚
@@ -107,7 +107,7 @@
€X '
$€X
€X‚
-) ƒØ(]’$€e ^’$€E (QI $( €X)
+) ƒÜ(]’$€e ^’$€E (QI $( €X)
€X '
$€X
€X‚
@@ -119,12 +119,12 @@
€X‚ €X)
€X '
€\€X
-€X ·S €\() ƒØ€\
+€X ·S €\() ƒÜ€\
, €X)
€X -
$€X$
-€X‚ j‚€DƒØ .i‚(ƒØ 8 €\- €\ S 8 €`S €D€`S (€`8
-€`€\ ) ƒØ€`)
+€X‚ j‚€DƒÜ .i‚(ƒÜ 8 €\- €\ S 8 €`S €D€`S (€`8
+€`€\ ) ƒÜ€`)
€\ ) ƒØ€\ €`- €` Œ
8€` )
€` ) ƒØ€` T <€XQ‰€X$< €T)
@@ -134,11 +134,11 @@
- $€X_J€a€X Gb’$€z > €X)
€X -
$€X$
-€X‚ <€d €`- €` )
+€X‚ <€h €`- €` )
€` ) ƒØ€` €`- €` )
€` ) ƒØ€` €`- €` )
€` ) ƒØ€` €`) ƒ|€` - €` S̓¼<€` ž €` €`) ƒ|€` - €`
-€X) ƒì€X -
+€X) ƒð€X -
$€X$'-€` €X H €Xƒäž €`ž €P) ƒØ, <)
< '
(<
@@ -148,7 +148,7 @@
(<
<‚
`’( y
- — ( \- (
+ — ( `- (
”- (
”-
(
@@ -167,14 +167,14 @@
†
”T ,€DQ‰€D(,
k`’( ¦^’(~ ¡ €H) ƒ|€H - €H
-€D) ƒà€D '-€H €D H €Dƒäž €H €H) ƒ|€H - €H ) ƒô€H ž €H)
+€D) ƒä€D '-€H €D H €Dƒèž €H €H) ƒ€€H - €H ) ƒø€H ž €H)
, ž 4 ¬=• 0 =‘ €a$:M
$ =‘ €A$:M
$ () ƒ|( - ( ) ƒ¸( ž ( ,)
, '
$,
,‚
-a’$0 ½b’$9  0) ƒ|0 - 0 ) ƒ°0 ž 0) ƒØ(QI $( 4)
+a’$0 ½b’$9  0) ƒ€0 - 0 ) ƒ´0 ž 0) ƒÜ(QI $( 4)
4 '
$4
4‚
@@ -184,7 +184,7 @@
$4$
4‚ )
( ^‚$ƒØ Ú €@)
- €@ ) ƒÜ€@$
+ €@ ) ƒà€@$
€@‚o ) $( (( Ø €@)
€@ )-( €@$
€@‚6 €@)
@@ -193,7 +193,7 @@
€@ 7-( €@$
€@‚o €@)
€@ - €{€@$
-€@‚z))( ,]‚,ƒØ‚ ]ª,( ö €@)
+€@‚z))( ,]‚,ƒÜ‚ ]ª,( ö €@)
€@ - ,€@$
€@‚z%I ,4 €@)
€@ )
@@ -203,10 +203,10 @@
€@‚z €@)
€@ )
8€@$
-€@ Ô) ƒØ4) ƒØ8) ƒØ8& ,,
+€@ Ô) ƒÜ4) ƒÜ8) ƒÜ8& ,,
ð €@)
€@ - €}€@$
-€@‚z) ƒØ, €@)
+€@‚z) ƒÜ, €@)
€@ - €[€@$
€@‚z- 0U)( €@`Š0€@‚!]’0 ‚ €@)
€@ - ,€@$
@@ -216,11 +216,11 @@
‚ €D)
€D - €]€D$
€D‚z €D)
- €D ) ƒè€D$
+ €D ) ƒì€D$
€D‚o €D)
- €D ) ƒ´€D$
+ €D ) ƒ¸€D$
€D‚o €D)
- €D ) ƒÜ€D$
+ €D ) ƒà€D$
€D‚o ž < 4)
4 - "4$
4‚z- ,T $4`Š,4‚RR‰,$(]’("‚B]’(€\‚B]’(/‚B_’( ‚L <-
@@ -228,7 +228,7 @@
8<
<‚X 4)
4 )
-84$) į8
+84$) Ć8
4‚o
‚P <)
< -
@@ -236,21 +236,21 @@
<‚z: ,
‚; <)
< - "<$
-<‚z ž 0
‚@) ƒ„ ) ƒŒ ) ƒˆ ) ƒ ) ƒ” ) ƒ˜ ) ƒ ) ƒœ
-$) ƒ¤$ -
+<‚z ž 0
‚D) ƒˆ ) ƒ ) ƒŒ ) ƒ” ) ƒ˜ ) ƒœ ) ƒ¤ ) ƒ
+$) Ĭ$ -
$$'- $ H $Ċ A
-ƒ¬,)
+ƒ°,)
, )
$,$'
(, H
-,ƒ¬^J~(‚y 0) ƒx0 - 0 ž 0 Aƒ¬,)
+,ƒ°^J~(‚y 0) ƒ|0 - 0 ž 0 Aƒ°,)
, -
$,$'
-(, H,ƒ¬^J~(‚„ 0) ƒx0 - 0 ž 0 ]j ‚ˆ-- A ƒ¬()- ( '
-$( H (ƒ¬`’$ ‚Ž-
+(, H,ƒ°^J~(‚„ 0) ƒ|0 - 0 ž 0 ]j ‚ˆ-- A ƒ°()- ( '
+$( H (ƒ°`’$ ‚Ž-
$ -
$ a’$ ‚• A ƒ¬,)- , '
-(, H ,ƒ¬ ,)
+(, H ,ƒ° ,)
, '
$,
,‚
@@ -277,33 +277,33 @@
€X€d$'
€h€d
€d‚õ^J €hƒV- ) ƒØ€T) ƒØ€X) ƒØ€X) ƒØ€L) ƒØ€P) ƒØ€P& 00
- ƒA^‚8ƒØƒa- -
+ ƒA^‚8ƒÜƒa- -
ƒd- ) , (, €Ì)), (]‚(ƒØƒt%I (0jŠ$0ƒr) ƒØ0%I (0)
4 ) į0) į4 & ((
- ƒi) ƒØ ) ƒØ )
0 (0 €à))0 ,]‚,ƒØƒ %I ,8jŠ$8ƒ‰) ƒØ8& ,,]‚4ƒØƒ‡%I 48 I 8,) ƒØ8) ƒØ<& 44
+ ƒi) ƒÜ ) ƒÜ )
0 (0 €ä))0 ,]‚,ƒÜƒ %I ,8jŠ$8ƒ‰) ƒÜ8& ,,]‚4ƒÜƒ‡%I 48 I 8,) ƒÜ8) ƒÜ<& 44
ƒ€)
-,0 %I ,8 I 84) į8) į<& ,,
- ƒ{) $8) (< M 80 ) ƒØ8) ƒØ<) ƒØ,) ƒØ4 ž ƒÄ^‚ ƒØƒ›) ƒÜ )
$ ($ €ô) ƒè ) ƒ´ ) ƒÜ ‹-$ 7-$ 8)-$ 8 '- 8
-8ƒØ ) ƒ€0- ,U)$ 8`Š,8ƒ»]’, ƒ²S 0
+,0 %I ,8 I 84) Ć8) Ć<& ,,
+ ƒ{) $8) (< M 80 ) ƒÜ8) ƒÜ<) ƒÜ,) ƒÜ4 ž ƒÈ^‚ ƒÜƒ›) ƒà )
$ ($ €ø) ƒì ) ƒ¸ ) ƒà ‹-$ 8) 8 .-$ 8('- 8
H 8ď 8)-$ 8 '- 8
+8ƒÜ ) ƒ„0- ,U)$ 8`Š,8ƒ¿]’, ƒ¶S 0
8r©€@$ ,)-€@ 8 '
<8
-8ƒ˜S <0) ƒØ<: ,
- ĨS
-0ƒ¨ ) ƒü4))$ (]‚(ƒØƒÖ]ª($ ƒÂS 4 €@%I (€H)
-€H€@ ) ƒØ€H'
+8ƒ˜S <0) ƒÜ<: ,
+ ƒ²S
+0ƒ¬ ) „ 4))$ (]‚(ƒÜƒÚ]ª($ ƒÆS 4 €@%I (€H)
+€H€@ ) ƒÜ€H'
<€@
-€@ƒØS ƒp<
+€@ƒÜS ƒt<
€@%I (€H)
-€L€@ ) ƒØ€H) ƒØ€L'
+€L€@ ) ƒÜ€H) ƒÜ€L'
€D€@
-€@ƒ˜S €D<) ƒØ€DS <4) ƒØ<& ((
- ƒ¿S
-4„ ) $- ,T 0`Š,0ƒìR‰, (]’("ƒá]’(€\ƒá]’(/ƒá_’( ƒè 0-
+€@ƒ˜S €D<) ƒÜ€DS <4) ƒÜ<& ((
+ ƒÃS
+4„ ) $- ,T 0`Š,0ƒðR‰, (]’("ƒå]’(€\ƒå]’(/ƒå_’( ƒì 0-
(0 '
40
-0‚XS 4$) ƒØ4
- ƒêT $0Q‰0($: ,
- ƒÚS
+0‚XS 4$) ƒÜ4
+ ƒîT $0Q‰0($: ,
+ ƒÞS
$ „ !ø 6À ÿÿÿÿ€ € @ € À (
( @
( € ( À0
0
0 € 0 à 8 ˆ 8 ¨ 8 Ä 8 È 8 ð 8 ü €@ €@ Ê €@ ÿ €H Ø €H ÷ €P ;
@@ -318,7 +318,7 @@
d
2ƒp: 0"ƒtJSON syntax error (offset %bd): %s?ƒxJSON.0.Badwrite=ƒ|
JSON.0.Syntax1ƒ€[2ƒ„\"2ƒˆ\/2ƒŒ\\2ƒ \b2ƒ”\f2ƒ˜\n2ƒœ\r2ƒ \t7ƒ¤\u%.4ux1ƒ¨]0 ƒ°expected
integer literal5ƒ´false0 ƒ¸invalid hex digit0 ƒ¼invalid literal: >ƒÀjson:
bad copy0 ƒÄjson: set non-object;ƒÈmissing ':'0 ƒÌmissing ']' at end of
array0
-ƒÐmissing '}' at end of object0 ƒÔmissing member name4ƒÜnull>ƒàread
error: %r4ƒètrue0 ƒìunexpected character #%.4ux0 ƒðunexpected
end-of-input0 ƒôunterminated string0 ƒøwriteval: unknown
value1ƒü{1„ } JSON ‚Ð ã =¡JValue.copy ‚õ œ8ùDJValue.eq ƒf {ˆ»ãJValue.get
+ƒÔmissing '}' at end of object0 ƒØmissing member name4ƒànull>ƒäread
error: %r4ƒìtrue0 ƒðunexpected character #%.4ux0 ƒôunexpected
end-of-input0 Ŀunterminated string0 ğwriteval: unknown
value1„ {1„ } JSON ‚Ð ã =¡JValue.copy ‚õ œ8ùDJValue.eq ƒf {ˆ»ãJValue.get
5Öý init ‚¢
+{\BJValue.isarray ‚Æ
+{\BJValue.isfalse ‚§
=======================================
--- /include/version.h Sat Mar 13 07:04:35 2010
+++ /include/version.h Sat Mar 20 15:42:50 2010
@@ -1,1 +1,1 @@
-#define VERSION "Fourth Edition (20100311)"
+#define VERSION "Fourth Edition (20100320)"
==============================================================================
Revision: a3135e5e94
Author:
for...@vitanuova.com
Date: Mon Mar 22 07:30:56 2010
Log: 20100322-1430
http://code.google.com/p/inferno-npe/source/detail?r=a3135e5e94
Modified:
/CHANGES
/include/tk.h
/include/version.h
/libtk/image.c
/libtk/label.c
/libtk/label.h
/libtk/utils.c
=======================================
--- /CHANGES Sat Mar 20 15:42:50 2010
+++ /CHANGES Mon Mar 22 07:30:56 2010
@@ -1,3 +1,5 @@
+20100322
+ a few tweaks to Tk for later use
20100320
appl/lib/json.b dis/lib/json.dis - use %f not string <real-value> to
ensure json value acceptable [issue 230, powerman]
20100310
=======================================
--- /include/tk.h Wed Mar 10 08:12:19 2010
+++ /include/tk.h Mon Mar 22 07:30:56 2010
@@ -153,6 +153,7 @@
typedef struct TkAction TkAction;
typedef struct TkWin TkWin;
typedef struct TkCmdtab TkCmdtab;
+typedef struct TkMemimage TkMemimage;
typedef struct TkMouse TkMouse;
typedef struct TkVar TkVar;
typedef struct TkMsg TkMsg;
@@ -165,6 +166,8 @@
typedef struct TkGridbeam TkGridbeam;
typedef struct TkGridcell TkGridcell;
+#pragma incomplete TkCol
+
struct TkImg
{
TkTop* top;
@@ -228,6 +231,13 @@
int b;
};
+struct TkMemimage
+{
+ Rectangle r;
+ ulong chans;
+ uchar data[];
+};
+
struct TkCmdtab
{
char* name;
@@ -410,7 +420,8 @@
int height;
};
-struct TkGridbeam {
+struct TkGridbeam
+{
int equalise;
int minsize;
int maxsize;
@@ -420,12 +431,14 @@
char* name;
};
-struct TkGridcell {
+struct TkGridcell
+{
Tk* tk;
Point span;
};
-struct TkGrid {
+struct TkGrid
+{
TkGridcell** cells; /* 2D array of cells, y major, x minor */
Point dim; /* dimensions of table */
TkGridbeam* rows;
@@ -521,13 +534,6 @@
TkTtabstop* next;
};
-struct TkCol
-{
- ulong rgba;
- Image* i;
- TkCol* forw;
-};
-
struct TkCtxt
{
void* lock;
@@ -685,7 +691,7 @@
extern TkImg* tkname2img(TkTop*, char*);
extern void tkimgput(TkImg*);
extern void tksizeimage(Tk*, TkImg*);
-extern TkImg* tkauximage(TkTop*, char*, uchar*, int, int, Rectangle, int);
+extern TkImg* tkauximage(TkTop*, char*, TkMemimage*, int);
/* choicebuttons - menus.c */
extern Tk* tkfindchoicemenu(Tk*);
@@ -718,6 +724,8 @@
extern Image* tkgc(TkEnv*, int);
extern Image* tkgshade(TkEnv*, int, int);
extern Image* tkcolor(TkCtxt*, ulong);
+extern Image* tkcolormix(TkCtxt*, ulong, ulong);
+extern Image* tkgradient(TkCtxt*, Rectangle, int, ulong, ulong);
extern void tkclear(Image*, Rectangle);
extern TkEnv* tknewenv(TkTop*);
extern TkEnv* tkdefaultenv(TkTop*);
=======================================
--- /include/version.h Sat Mar 20 15:42:50 2010
+++ /include/version.h Mon Mar 22 07:30:56 2010
@@ -1,1 +1,1 @@
-#define VERSION "Fourth Edition (20100320)"
+#define VERSION "Fourth Edition (20100322)"
=======================================
--- /libtk/image.c Fri Dec 22 09:07:39 2006
+++ /libtk/image.c Mon Mar 22 07:30:56 2010
@@ -227,7 +227,6 @@
TkImg *tkim;
char *fmt, *e, *buf, *cmd;
- /* Note - could actually allocate buf and cmd in one buffer - DBK */
buf = mallocz(Tkmaxitem, 0);
if(buf == nil)
return TkNomem;
@@ -318,14 +317,14 @@
}
TkImg*
-tkauximage(TkTop *t, char* s, uchar* bytes, int nbytes, int chans,
Rectangle r, int repl)
+tkauximage(TkTop *t, char* s, TkMemimage *m, int repl)
{
TkName *name;
TkCtxt *c;
TkImg *tki;
Display *d;
Image *i;
- int locked;
+ int locked, nbytes;
tki = tkname2img(t, s);
if (tki != nil) {
@@ -336,7 +335,7 @@
name = tkmkname(s);
if (name == nil)
return nil;
- tki = mallocz(sizeof(*tki), 0);
+ tki = mallocz(sizeof(*tki), 1);
if (tki == nil)
goto err;
tki->env = tkdefaultenv(t);
@@ -346,15 +345,16 @@
c = t->ctxt;
d = c->display;
+ nbytes = bytesperline(m->r, chantodepth(m->chans))*Dy(m->r);
locked = lockdisplay(d);
- i = allocimage(d, r, chans, repl, DTransparent);
+ i = allocimage(d, m->r, m->chans, repl, DTransparent);
if (i != nil) {
- if (loadimage(i, r, bytes, nbytes) != nbytes) {
+ if (loadimage(i, m->r, m->data, nbytes) != nbytes) {
freeimage(i);
i = nil;
}
if (repl)
- replclipr(i, 1, huger);
+ replclipr(i, 1, huger); /* TO DO: doesn't allocimage do this? */
}
if (locked)
unlockdisplay(d);
@@ -363,8 +363,8 @@
tki->top = t;
tki->ref = 2; /* t->imgs ref and the ref we are returning */
tki->type = 0; /* bitmap */
- tki->w = Dx(r);
- tki->h = Dy(r);
+ tki->w = Dx(m->r);
+ tki->h = Dy(m->r);
tki->img = i;
tki->name = name;
tki->link = t->imgs;
=======================================
--- /libtk/label.c Fri Dec 22 09:07:39 2006
+++ /libtk/label.c Mon Mar 22 07:30:56 2010
@@ -128,19 +128,15 @@
if(tkl->img != nil) {
w = tkl->img->w + 2*Bitpadx;
h = tkl->img->h + 2*Bitpady;
- }
- else
- if(tkl->bitmap != nil) {
+ } else if(tkl->bitmap != nil) {
w = Dx(tkl->bitmap->r) + 2*Bitpadx;
h = Dy(tkl->bitmap->r) + 2*Bitpady;
- }
- else
- if(tkl->text != nil) {
+ } else if(tkl->text != nil) {
p = tkstringsize(tk, tkl->text);
w = p.x + 2*Textpadx;
h = p.y + 2*Textpady;
if(tkl->ul != -1 && tkl->ul > strlen(tkl->text))
- tkl->ul = -1;
+ tkl->ul = strlen(tkl->text); /* underline all */
tkl->textheight = p.y;
}
@@ -232,11 +228,7 @@
p[1].y = u.y + CheckButton;
p[2].x = u.x;
p[2].y = u.y;
- fillpoly(i, p, 3, ~0, tkgc(e, TkCbackgnddark), p[0]);
- for(j = 0; j < 3; j++)
- p[j].y -= 2;
-
- fillpoly(i, p, 3, ~0, tkgc(e, TkCbackgndlght), p[0]);
+ fillpoly(i, p, 3, ~0, tkgc(e, TkCforegnd), p[0]);
}
/*
@@ -297,14 +289,12 @@
dy = tk->act.height - tkl->h - tk->ipad.y;
if((tkl->anchor & (Tknorth|Tksouth)) == 0)
p.y += dy/2;
- else
- if(tkl->anchor & Tksouth)
+ else if(tkl->anchor & Tksouth)
p.y += dy;
if((tkl->anchor & (Tkeast|Tkwest)) == 0)
p.x += dx/2;
- else
- if(tkl->anchor & Tkeast)
+ else if(tkl->anchor & Tkeast)
p.x += dx;
switch(tk->type) {
=======================================
--- /libtk/label.h Fri Dec 22 09:07:39 2006
+++ /libtk/label.h Mon Mar 22 07:30:56 2010
@@ -54,8 +54,6 @@
extern TkOption tkcbopts[];
/* label.c */
-extern char* tklabelsaverelief(Tk*, char*, char**);
-extern char* tklabelrestorerelief(Tk*, char*, char**);
extern void tksizelabel(Tk*);
extern char* tkdrawlabel(Tk*, Point);
extern void tkfreelabel(Tk*);
=======================================
--- /libtk/utils.c Fri Dec 22 16:30:12 2006
+++ /libtk/utils.c Mon Mar 22 07:30:56 2010
@@ -2,6 +2,14 @@
#include "draw.h"
#include "tk.h"
+struct TkCol
+{
+ ulong rgba1;
+ ulong rgba3; /* if mixed, otherwise DNotacolor */
+ Image* i;
+ TkCol* forw;
+};
+
extern void rptwakeup(void*, void*);
extern void* rptproc(char*, int, void*, int (*)(void*), int
(*)(void*,int), void (*)(void*));
@@ -118,6 +126,48 @@
*B = ((rgba >> 8) & 0xFF);
}
}
+
+static int
+tkcachecol(TkCtxt *c, Image *i, ulong one, ulong three)
+{
+ TkCol *cc;
+
+ cc = malloc(sizeof(*cc));
+ if(cc == nil)
+ return 0;
+ cc->rgba1 = one;
+ cc->rgba3 = three;
+ cc->i = i;
+ cc->forw = c->chead;
+ c->chead = cc;
+ c->ncol++;
+ /* we'll do LRU management at some point */
+ if(c->ncol > TkColcachesize){
+ static int warn;
+ if(warn == 0){
+ warn = 1;
+ print("tk: %d colours cached\n", TkColcachesize);
+ }
+ }
+ return 1;
+}
+
+static Image*
+tkfindcol(TkCtxt *c, ulong one, ulong three)
+{
+ TkCol *cc, **l;
+
+ for(l = &c->chead; (cc = *l) != nil; l = &cc->forw)
+ if(cc->rgba1 == one && cc->rgba3 == three){
+ /* move it up in the list */
+ *l = cc->forw;
+ cc->forw = c->chead;
+ c->chead = cc;
+ /* we assume it will be used right away and not stored */
+ return cc->i;
+ }
+ return nil;
+}
void
tkfreecolcache(TkCtxt *c)
@@ -134,29 +184,42 @@
c->ctail = nil;
c->ncol = 0;
}
+
+Image*
+tkcolormix(TkCtxt *c, ulong one, ulong three)
+{
+ Image *i;
+ Display *d;
+
+ i = tkfindcol(c, one, three);
+ if(i != nil)
+ return i;
+ d = c->display;
+ i = allocimagemix(d, one, three);
+ if(i == nil)
+ return d->black;
+ if(!tkcachecol(c, i, one, three)){
+ freeimage(i);
+ return d->black;
+ }
+ return i;
+}
Image*
tkcolor(TkCtxt *c, ulong pix)
{
Image *i;
- TkCol *cc, **l;
Display *d;
Rectangle r;
- for(l = &c->chead; (cc = *l) != nil; l = &cc->forw)
- if(cc->rgba == pix){
- /* move it up in the list */
- *l = cc->forw;
- cc->forw = c->chead;
- c->chead = cc;
- /* we assume it will be used right away and not stored */
- return cc->i;
- }
d = c->display;
if(pix == DWhite)
return d->white;
if(pix == DBlack)
return d->black;
+ i = tkfindcol(c, pix, DNotacolor);
+ if(i != nil)
+ return i;
r.min = ZP;
r.max.x = 1;
r.max.y = 1;
@@ -166,24 +229,65 @@
i = allocimage(d, r, RGBA32, 1, pix);
if(i == nil)
return d->black;
- cc = malloc(sizeof(*cc));
- if(cc == nil){
+ if(!tkcachecol(c, i, pix, DNotacolor)) {
freeimage(i);
return d->black;
}
- cc->rgba = pix;
- cc->i = i;
- cc->forw = c->chead;
- c->chead = cc;
- c->ncol++;
- /* we'll do LRU management at some point */
- if(c->ncol > TkColcachesize){
- static int warn;
- if(warn == 0){
- warn = 1;
- print("tk: %d colours cached\n", TkColcachesize);
- }
- }
+ return i;
+}
+
+Image*
+tkgradient(TkCtxt *c, Rectangle r, int dir, ulong pix0, ulong pix1)
+{
+ Display *d;
+ Image *i;
+ uchar *b, *p, *e;
+ int c0[3], c1[3], delta[3], a, j, x, y, n, locked;
+ Rectangle s;
+
+ d = c->display;
+ y = Dy(r);
+ x = Dx(r);
+ if(x <= 0 || y <= 0)
+ return d->black;
+ /* TO DO: diagonal */
+ s = r;
+ if(dir == Tkhorizontal){
+ n = x;
+ r.max.y = r.min.y+1;
+ }else{
+ n = y;
+ r.max.x = r.min.x+1;
+ }
+ b = mallocz(3*n, 0);
+ if(b == nil)
+ return d->black;
+ locked = lockdisplay(d);
+ i = allocimage(d, r, RGB24, 1, DNofill);
+ if(i == nil)
+ goto Ret;
+ tkrgbavals(pix0, &c0[2], &c0[1], &c0[0], &a);
+ tkrgbavals(pix1, &c1[2], &c1[1], &c1[0], &a);
+ for(j = 0; j < 3; j++){
+ c0[j] <<= 12;
+ c1[j] <<= 12;
+ delta[j] = ((c1[j]-c0[j])+(1<<11))/n;
+ }
+ e = b+3*n;
+ for(p = b; p < e; p += 3) {
+ p[0] = c0[0]>>12;
+ p[1] = c0[1]>>12;
+ p[2] = c0[2]>>12;
+ c0[0] += delta[0];
+ c0[1] += delta[1];
+ c0[2] += delta[2];
+ }
+ loadimage(i, r, b, 3*n);
+ replclipr(i, 1, s);
+Ret:
+ if(locked)
+ unlockdisplay(d);
+ free(b);
return i;
}
@@ -816,7 +920,20 @@
return p;
}
-static char*
+static void
+tkulall(Image *i, Point o, Image *col, Font *f, char *text)
+{
+ Rectangle r;
+
+ r.max = stringsize(f, text);
+ r.max = addpt(r.max, o);
+ r.min.x = o.x;
+ r.min.y = r.max.y - 1;
+ r.max.y += 1;
+ draw(i, r, col, nil, ZP);
+}
+
+static void
tkul(Image *i, Point o, Image *col, int ul, Font *f, char *text)
{
char c, *v;
@@ -833,8 +950,6 @@
r.min.y = r.max.y - 1;
r.max.y += 2;
draw(i, r, col, nil, ZP);
-
- return nil;
}
char*
@@ -880,14 +995,13 @@
if(ul >= 0) {
n = strlen(text);
if(ul < n) {
- char *r;
-
- r = tkul(i, o, col, ul, e->font, text);
- if(r != nil)
- return r;
+ tkul(i, o, col, ul, e->font, text);
ul = -1;
- }
- ul -= n;
+ } else if(ul == n) {
+ tkulall(i, o, col, e->font, text);
+ ul = -1;
+ } else
+ ul -= n;
}
o.y += e->font->height;
if(q == nil)
@@ -1216,14 +1330,12 @@
dy = Dy(r) - size.y;
if((anchor & (Tknorth|Tksouth)) == 0)
p.y += dy/2;
- else
- if(anchor & Tksouth)
+ else if(anchor & Tksouth)
p.y += dy;
if((anchor & (Tkeast|Tkwest)) == 0)
p.x += dx/2;
- else
- if(anchor & Tkeast)
+ else if(anchor & Tkeast)
p.x += dx;
return p;
}
@@ -1779,12 +1891,12 @@
hit = 0;
j = np - 1;
- for (i = 0; i < np; j = i++) {
+ for(i = 0; i < np; j = i++) {
pi = poly[i];
pj = poly[j];
- if ((pi.y <= p.y && p.y < pj.y || pj.y <= p.y && p.y < pi.y) &&
+ if((pi.y <= p.y && p.y < pj.y || pj.y <= p.y && p.y < pi.y) &&
p.x < (pj.x - pi.x) * (p.y - pi.y) / (pj.y - pi.y) + pi.x) {
- if (winding == 1 || pi.y > p.y)
+ if(winding == 1 || pi.y > p.y)
hit++;
else
hit--;
==============================================================================
Revision: 1d881a60e9
Author:
for...@vitanuova.com
Date: Mon Mar 22 07:41:55 2010
Log: 20100322-1441
http://code.google.com/p/inferno-npe/source/detail?r=1d881a60e9
Modified:
/libtk/canvs.c
/libtk/ebind.c
/libtk/entry.c
/libtk/listb.c
/libtk/menus.c
/libtk/parse.c
/libtk/scale.c
/libtk/scrol.c
/libtk/textw.c
=======================================
--- /libtk/canvs.c Fri Dec 22 09:07:39 2006
+++ /libtk/canvs.c Mon Mar 22 07:41:55 2010
@@ -378,8 +378,6 @@
unlockdisplay(d);
}
}
-
-enum {Bufnone = 99};
char*
tkdrawcanv(Tk *tk, Point orig)
=======================================
--- /libtk/ebind.c Fri Dec 22 09:07:39 2006
+++ /libtk/ebind.c Mon Mar 22 07:41:55 2010
@@ -242,11 +242,9 @@
if (!(event & TkKey)) {
if(event & (TkButton1P|TkButton1R))
v = 1;
- else
- if(event & (TkButton2P|TkButton2R))
+ else if(event & (TkButton2P|TkButton2R))
v = 2;
- else
- if(event & (TkButton3P|TkButton3R))
+ else if(event & (TkButton3P|TkButton3R))
v = 3;
}
c += snprint(c, len, "%d", v);
@@ -260,11 +258,9 @@
case 's':
if((event & TkKey))
c += snprint(c, len, "%d", TKKEY(event));
- else
- if((event & (TkEmouse|TkEnter)))
+ else if((event & (TkEmouse|TkEnter)))
c += snprint(c, len, "%d", m->b);
- else
- if((event & TkFocusin))
+ else if((event & TkFocusin))
c += snprint(c, len, "%d", (int)data);
else
goto def;
@@ -298,8 +294,7 @@
v = TKKEY(event);
if(v == '{' || v == '}' || v == '\\')
c += snprint(c, len, "\\%C", v);
- else
- if(v != '\0')
+ else if(v != '\0')
c += snprint(c, len, "%C", v);
break;
case 'K':
@@ -319,8 +314,7 @@
t->execdepth = 0;
if(cmd[0] == '|')
tkexec(t, cmd+1, nil);
- else
- if(cmd[0] != '\0')
+ else if(cmd[0] != '\0')
e = tkexec(t, cmd, nil);
t->execdepth = -1;
=======================================
--- /libtk/entry.c Fri Dec 22 09:07:39 2006
+++ /libtk/entry.c Mon Mar 22 07:41:55 2010
@@ -245,7 +245,7 @@
return TkNomem;
tk->relief = TKsunken;
- tk->borderwidth = 2;
+ tk->borderwidth = 1;
tk->flag |= Tktakefocus;
tk->highlightwidth = 1;
=======================================
--- /libtk/listb.c Fri Dec 22 09:07:39 2006
+++ /libtk/listb.c Mon Mar 22 07:41:55 2010
@@ -90,7 +90,7 @@
tkl = TKobj(TkListbox, tk);
tkl->sborderwidth = 1;
tk->relief = TKsunken;
- tk->borderwidth = 2;
+ tk->borderwidth = 1;
tk->highlightwidth = 1;
tk->flag |= Tktakefocus;
tk->req.width = 170;
=======================================
--- /libtk/menus.c Fri Dec 22 09:07:39 2006
+++ /libtk/menus.c Mon Mar 22 07:41:55 2010
@@ -359,7 +359,7 @@
menu->relief = TKraised;
menu->flag |= Tknograb;
- menu->borderwidth = 2;
+ menu->borderwidth = 1;
tkputenv(menu->env);
menu->env = tkb->env;
menu->env->ref++;
@@ -662,7 +662,7 @@
tkw->di = (void*)-1; // XXX
tk->relief = TKraised;
tk->flag |= Tknograb;
- tk->borderwidth = 2;
+ tk->borderwidth = 1;
tko[0].ptr = tk;
tko[0].optab = tkgeneric;
=======================================
--- /libtk/parse.c Fri Dec 22 09:07:39 2006
+++ /libtk/parse.c Mon Mar 22 07:41:55 2010
@@ -97,15 +97,11 @@
if(c == '\\') {
if(*str == '}' || *str == '{' || *str == '\\')
c = *str++;
- }
- else
- if(c == '}') {
+ } else if(c == '}') {
lev--;
if(lev == 0)
break;
- }
- else
- if(c == '{')
+ } else if(c == '{')
lev++;
*buf++ = c;
}
@@ -127,15 +123,11 @@
if(c == '\\') {
if(*str == ']' || *str == '[' || *str == '\\')
c = *str++;
- }
- else
- if(c == ']') {
+ } else if(c == ']') {
lev--;
if(lev == 0)
break;
- }
- else
- if(c == '[')
+ } else if(c == '[')
lev++;
*p++ = c;
}
@@ -701,8 +693,7 @@
if(buf[0] == '@')
i = display_open(d, buf+1);
- else
- if(buf[0] == '<') {
+ else if(buf[0] == '<') {
buf++;
fd = strtoul(buf, &c, 0);
if(c == buf) {
=======================================
--- /libtk/scale.c Fri Dec 22 09:07:39 2006
+++ /libtk/scale.c Mon Mar 22 07:41:55 2010
@@ -81,7 +81,7 @@
{
Scalewidth = 18,
ScalePad = 2,
- ScaleBW = 2,
+ ScaleBW = 1,
ScaleSlider = 16,
ScaleLen = 80,
@@ -132,8 +132,7 @@
w += p.x + ScalePad;
if (tks->sv == BoolT)
w += digits + ScalePad;
- }
- else {
+ } else {
w = maximum(p.x, tks->len + ScaleBW + 2*ScalePad);
h = Scalewidth + 2*ScalePad + 2*ScaleBW;
fh = tk->env->font->height;
@@ -280,7 +279,7 @@
Image *d, *l;
Rectangle r, r2, sr;
Point p, q;
- int fh, sh, sl, v, w, h, len;
+ int fh, sh, gh, sl, v, w, h, len;
int fgnd;
e = tk->env;
@@ -347,7 +346,11 @@
p.y = sr.min.y;
q = p;
q.x += tks->sl/2 + 1;
- q.y++;
+ if(ScaleBW > 1) {
+ gh = sh;
+ q.y++;
+ } else
+ gh = sh-1;
if(tk->flag & Tkactivated) {
r2.min = p;
r2.max.x = p.x+sl;
@@ -357,11 +360,11 @@
switch(tks->relief) {
case TKsunken:
tkbevel(i, p, tks->sl, sh, ScaleBW, d, l);
- tkbevel(i, q, 0, sh, 1, l, d);
+ tkbevel(i, q, 0, gh, 1, l, d);
break;
case TKraised:
tkbevel(i, p, tks->sl, sh, ScaleBW, l, d);
- tkbevel(i, q, 0, sh, 1, d, l);
+ tkbevel(i, q, 0, gh, 1, d, l);
break;
}
tks->pixpos = p.x;
@@ -395,7 +398,7 @@
Image *d, *l;
Rectangle r, r2, sr;
Point p, q;
- int fh, v, sw, w, h, len, sl;
+ int fh, v, sw, gw, w, h, len, sl;
int fgnd;
e = tk->env;
@@ -464,7 +467,11 @@
p.y += ((vlong)v*h)/len;
p.x = sr.min.x;
q = p;
- q.x++;
+ if(ScaleBW > 1) {
+ q.x++;
+ gw = sw;
+ } else
+ gw = sw-1;
q.y += tks->sl/2 + 1;
if(tk->flag & Tkactivated) {
r2.min = p;
@@ -475,11 +482,11 @@
switch(tks->relief) {
case TKsunken:
tkbevel(i, p, sw, tks->sl, ScaleBW, d, l);
- tkbevel(i, q, sw, 0, 1, l, d);
+ tkbevel(i, q, sw, 0, gw, l, d);
break;
case TKraised:
tkbevel(i, p, sw, tks->sl, ScaleBW, l, d);
- tkbevel(i, q, sw, 0, 1, d, l);
+ tkbevel(i, q, sw, 0, gw, d, l);
break;
}
tks->pixpos = p.y;
@@ -611,11 +618,9 @@
}
if(x > tks->pixmin && x < tks->pixpos)
return trough1;
- else
- if(x >= tks->pixpos && x < tks->pixpos+tks->sl+2*ScaleBW)
+ else if(x >= tks->pixpos && x < tks->pixpos+tks->sl+2*ScaleBW)
return slider;
- else
- if(x >= tks->pixpos+tks->sl+2*ScaleBW && x < tks->pixmax)
+ else if(x >= tks->pixpos+tks->sl+2*ScaleBW && x < tks->pixmax)
return trough2;
return "";
=======================================
--- /libtk/scrol.c Sat Mar 13 07:04:35 2010
+++ /libtk/scrol.c Mon Mar 22 07:41:55 2010
@@ -7,7 +7,9 @@
/* Layout constants */
enum {
Triangle = 10, /* Height of scroll bar triangle */
- Elembw = 2, /* border around elements (triangles etc.) */
+ Elembw = 1, /* border around elements (triangles etc.) */
+ Scrollbw = 1, /* bevel border on scrollbar */
+ Tribw= 1, /* shadow border on triangle */
};
typedef struct TkScroll TkScroll;
@@ -103,8 +105,8 @@
tks = TKobj(TkScroll, tk);
- tk->relief = TKsunken;
- tk->borderwidth = 2;
+ tk->relief = TKflat;
+ tk->borderwidth = 1;
tks->activer = TKraised;
tks->orient = Tkvertical;
@@ -162,14 +164,61 @@
if(tks->cmd != nil)
free(tks->cmd);
}
+
+static void
+drawarrow(TkScroll *tks, Image *i, Point p[3], TkEnv *e, int activef, int
buttonf)
+{
+ Image *l, *d, *t;
+ int bgnd;
+
+ bgnd = TkCbackgnd;
+ if(tks->flag & (activef|buttonf)) {
+ bgnd = TkCactivebgnd;
+ fillpoly(i, p, 3, ~0, tkgc(e, bgnd), p[0]);
+ }
+
+ l = tkgc(e, bgnd+TkLightshade);
+ d = tkgc(e, bgnd+TkDarkshade);
+ if(tks->flag & buttonf) {
+ t = d;
+ d = l;
+ l = t;
+ }
+ line(i, p[1], p[2], 0, 0, Tribw-1, d, p[1]);
+ line(i, p[2], p[0], 0, 0, Tribw-1, d, p[2]);
+ line(i, p[0], p[1], 0, 0, Tribw-1, l, p[0]);
+}
+
+static void
+drawslider(TkScroll *tks, Image *i, Point o, int w, int h, TkEnv *e)
+{
+ Image *l, *d, *t;
+ Rectangle r;
+ int bgnd;
+
+ bgnd = TkCbackgnd;
+ if(tks->flag & (ActiveB1|ButtonB1)) {
+ r.min = o;
+ r.max.x = o.x + w + Elembw*2;
+ r.max.y = o.y + h + Elembw*2;
+ bgnd = TkCactivebgnd;
+ draw(i, r, tkgc(e, bgnd), nil, ZP);
+ }
+
+ l = tkgc(e, bgnd+TkLightshade);
+ d = tkgc(e, bgnd+TkDarkshade);
+ if(tks->flag & ButtonB1)
+ tkbevel(i, o, w, h, Scrollbw, d, l);
+ else
+ tkbevel(i, o, w, h, Scrollbw, l, d);
+}
static void
tkvscroll(Tk *tk, TkScroll *tks, Image *i, Point size)
{
TkEnv *e;
- Rectangle r;
Point p[3], o;
- Image *d, *l, *t;
+ Image *d, *l;
int bo, w, h, triangle, bgnd;
e = tk->env;
@@ -183,23 +232,7 @@
p[1].y = p[0].y + triangle;
p[2].x = p[0].x + triangle/2;
p[2].y = p[0].y + triangle;
-
- bgnd = TkCbackgnd;
- if(tks->flag & (ActiveA1|ButtonA1)) {
- bgnd = TkCactivebgnd;
- fillpoly(i, p, 3, ~0, tkgc(e, bgnd), p[0]);
- }
-
- l = tkgc(e, bgnd+TkLightshade);
- d = tkgc(e, bgnd+TkDarkshade);
- if(tks->flag & ButtonA1) {
- t = d;
- d = l;
- l = t;
- }
- line(i, p[1], p[2], 0, 0, 1, d, p[1]);
- line(i, p[2], p[0], 0, 0, 1, d, p[2]);
- line(i, p[0], p[1], 0, 0, 1, l, p[0]);
+ drawarrow(tks, i, p, e, ActiveA1, ButtonA1);
tks->a1 = p[2].y;
h = p[2].y + Elembw;
@@ -207,23 +240,7 @@
p[0].y = size.y - bo - 1;
p[1].y = p[0].y - triangle;
p[2].y = p[0].y - triangle;
-
- bgnd = TkCbackgnd;
- if(tks->flag & (ActiveA2|ButtonA2)) {
- bgnd = TkCactivebgnd;
- fillpoly(i, p, 3, ~0, tkgc(e, bgnd), p[0]);
- }
-
- l = tkgc(e, bgnd+TkLightshade);
- d = tkgc(e, bgnd+TkDarkshade);
- if(tks->flag & ButtonA2) {
- t = d;
- d = l;
- l = t;
- }
- line(i, p[1], p[2], 0, 0, 1, l, p[1]);
- line(i, p[2], p[0], 0, 0, 1, d, p[2]);
- line(i, p[0], p[1], 0, 0, 1, l, p[0]);
+ drawarrow(tks, i, p, e, ActiveA2, ButtonA2);
tks->a2 = p[2].y;
@@ -235,33 +252,19 @@
o.y += TKF2I(tks->top*h);
h *= tks->bot - tks->top;
h = TKF2I(h);
-
- bgnd = TkCbackgnd;
- if(tks->flag & (ActiveB1|ButtonB1)) {
- r.min = o;
- r.max.x = o.x + w + 2*2;
- r.max.y = o.y + h + 2*2;
- bgnd = TkCactivebgnd;
- draw(i, r, tkgc(e, bgnd), nil, ZP);
- }
tks->t1 = o.y - Elembw;
tks->t2 = o.y + h + Elembw;
- l = tkgc(e, bgnd+TkLightshade);
- d = tkgc(e, bgnd+TkDarkshade);
- if(tks->flag & ButtonB1)
- tkbevel(i, o, w, h, 2, d, l);
- else
- tkbevel(i, o, w, h, 2, l, d);
+
+ drawslider(tks, i, o, w, h, e);
}
static void
tkhscroll(Tk *tk, TkScroll *tks, Image *i, Point size)
{
TkEnv *e;
- Rectangle r;
Point p[3], o;
- Image *d, *l, *t;
+ Image *d, *l;
int bo, w, h, triangle, bgnd;
e = tk->env;
@@ -275,24 +278,7 @@
p[1].y = p[0].y - triangle/2 + 1;
p[2].x = p[0].x + triangle;
p[2].y = p[0].y + triangle/2 - 2;
-
- bgnd = TkCbackgnd;
- if(tks->flag & (ActiveA1|ButtonA1)) {
- bgnd = TkCactivebgnd;
- fillpoly(i, p, 3, ~0, tkgc(e, bgnd), p[0]);
- }
-
- l = tkgc(e, bgnd+TkLightshade);
- d = tkgc(e, bgnd+TkDarkshade);
-
- if(tks->flag & ButtonA1) {
- t = d;
- d = l;
- l = t;
- }
- line(i, p[1], p[2], 0, 0, 1, d, p[1]);
- line(i, p[2], p[0], 0, 0, 1, d, p[2]);
- line(i, p[0], p[1], 0, 0, 1, l, p[0]);
+ drawarrow(tks, i, p, e, ActiveA1, ButtonA1);
tks->a1 = p[2].x;
w = p[2].x + Elembw;
@@ -300,23 +286,7 @@
p[0].x = size.x - bo - 1;
p[1].x = p[0].x - triangle;
p[2].x = p[0].x - triangle;
-
- bgnd = TkCbackgnd;
- if(tks->flag & (ActiveA2|ButtonA2)) {
- bgnd = TkCactivebgnd;
- fillpoly(i, p, 3, ~0, tkgc(e, bgnd), p[0]);
- }
-
- l = tkgc(e, bgnd+TkLightshade);
- d = tkgc(e, bgnd+TkDarkshade);
- if(tks->flag & ButtonA2) {
- t = d;
- d = l;
- l = t;
- }
- line(i, p[1], p[2], 0, 0, 1, l, p[1]);
- line(i, p[2], p[0], 0, 0, 1, d, p[2]);
- line(i, p[0], p[1], 0, 0, 1, l, p[0]);
+ drawarrow(tks, i, p, e, ActiveA2, ButtonA2);
tks->a2 = p[2].x;
@@ -328,24 +298,11 @@
o.x += TKF2I(tks->top*w);
w *= tks->bot - tks->top;
w = TKF2I(w);
-
- bgnd = TkCbackgnd;
- if(tks->flag & (ActiveB1|ButtonB1)) {
- r.min = o;
- r.max.x = o.x + w + 2*2;
- r.max.y = o.y + h + 2*2;
- bgnd = TkCactivebgnd;
- draw(i, r, tkgc(e, bgnd), nil, ZP);
- }
tks->t1 = o.x - Elembw;
tks->t2 = o.x + w + Elembw;
- l = tkgc(e, bgnd+TkLightshade);
- d = tkgc(e, bgnd+TkDarkshade);
- if(tks->flag & ButtonB1)
- tkbevel(i, o, w, h, 2, d, l);
- else
- tkbevel(i, o, w, h, 2, l, d);
+
+ drawslider(tks, i, o, w, h, e);
}
char*
=======================================
--- /libtk/textw.c Fri Dec 22 16:30:12 2006
+++ /libtk/textw.c Mon Mar 22 07:41:55 2010
@@ -171,7 +171,7 @@
tkt = TKobj(TkText, tk);
tk->relief = TKsunken;
- tk->borderwidth = 2;
+ tk->borderwidth = 1;
tk->ipad.x = Textpadx * 2;
tk->ipad.y = Textpady * 2;
tk->flag |= Tktakefocus;
==============================================================================
Revision: bebc24e3b3
Author:
for...@vitanuova.com
Date: Thu Mar 25 02:26:15 2010
Log: 20100325-0926
http://code.google.com/p/inferno-npe/source/detail?r=bebc24e3b3
Added:
/libtk/varbl.c
Modified:
/CHANGES
/include/tk.h
/include/version.h
/libtk/buton.c
/libtk/label.c
/libtk/label.h
/libtk/menus.c
/libtk/mkfile
/libtk/scrol.c
/libtk/utils.c
=======================================
--- /dev/null
+++ /libtk/varbl.c Thu Mar 25 02:26:15 2010
@@ -0,0 +1,91 @@
+#include <lib9.h>
+#include <kernel.h>
+#include "draw.h"
+#include "tk.h"
+#include "label.h"
+
+char*
+tksetvar(TkTop *top, char *c, char *newval)
+{
+ TkVar *v;
+ TkWin *tkw;
+ Tk *f, *m;
+ void (*vc)(Tk*, char*, char*);
+
+ if (c == nil || c[0] == '\0')
+ return nil;
+
+ v = tkmkvar(top, c, TkVstring);
+ if(v == nil)
+ return TkNomem;
+ if(v->type != TkVstring)
+ return TkNotvt;
+
+ if(newval == nil)
+ newval = "";
+
+ if(v->value != nil) {
+ if (strcmp(v->value, newval) == 0)
+ return nil;
+ free(v->value);
+ }
+
+ v->value = strdup(newval);
+ if(v->value == nil)
+ return TkNomem;
+
+ for(f = top->root; f; f = f->siblings) {
+ if(f->type == TKmenu) {
+ tkw = TKobj(TkWin, f);
+ for(m = tkw->slave; m; m = m->next)
+ if ((vc = tkmethod[m->type]->varchanged) != nil)
+ (*vc)(m, c, newval);
+ } else
+ if ((vc = tkmethod[f->type]->varchanged) != nil)
+ (*vc)(f, c, newval);
+ }
+
+ return nil;
+}
+
+char*
+tkvariable(TkTop *t, char *arg, char **ret)
+{
+ TkVar *v;
+ char *fmt, *e, *buf, *ebuf, *val;
+ int l;
+
+ l = strlen(arg) + 2;
+ buf = malloc(l);
+ if(buf == nil)
+ return TkNomem;
+ ebuf = buf+l;
+
+ arg = tkword(t, arg, buf, ebuf, nil);
+ arg = tkskip(arg, " \t");
+ if (*arg == '\0') {
+ if(strcmp(buf, "lasterror") == 0) {
+ free(buf);
+ if(t->err == nil)
+ return nil;
+ fmt = "%s: %s";
+ if(strlen(t->errcmd) == sizeof(t->errcmd)-1)
+ fmt = "%s...: %s";
+ e = tkvalue(ret, fmt, t->errcmd, t->err);
+ t->err = nil;
+ return e;
+ }
+ v = tkmkvar(t, buf, 0);
+ free(buf);
+ if(v == nil || v->value == nil)
+ return nil;
+ if(v->type != TkVstring)
+ return TkNotvt;
+ return tkvalue(ret, "%s", v->value);
+ }
+ val = buf+strlen(buf)+1;
+ tkword(t, arg, val, ebuf, nil);
+ e = tksetvar(t, buf, val);
+ free(buf);
+ return e;
+}
=======================================
--- /CHANGES Mon Mar 22 07:30:56 2010
+++ /CHANGES Thu Mar 25 02:26:15 2010
@@ -1,3 +1,5 @@
+20100325
+ more swizzling of libtk for later use. revised radio and check buttons.
20100322
a few tweaks to Tk for later use
20100320
=======================================
--- /include/tk.h Mon Mar 22 07:30:56 2010
+++ /include/tk.h Thu Mar 25 02:26:15 2010
@@ -235,7 +235,7 @@
{
Rectangle r;
ulong chans;
- uchar data[];
+ uchar* data;
};
struct TkCmdtab
=======================================
--- /include/version.h Mon Mar 22 07:30:56 2010
+++ /include/version.h Thu Mar 25 02:26:15 2010
@@ -1,1 +1,1 @@
-#define VERSION "Fourth Edition (20100322)"
+#define VERSION "Fourth Edition (20100325)"
=======================================
--- /libtk/buton.c Fri Dec 22 09:07:39 2006
+++ /libtk/buton.c Thu Mar 25 02:26:15 2010
@@ -126,7 +126,7 @@
break;
default:
tk->relief = TKraised;
- tk->borderwidth = 2;
+ tk->borderwidth = 1;
tko[2].ptr = nil;
break;
}
@@ -219,12 +219,193 @@
return tk;
}
-void tksizebutton(Tk *tk)
-{
- tksizelabel(tk);
+/*
+ * draw TKbutton, TKcheckbutton, TKradiobutton
+ */
+char*
+tkdrawbutton(Tk *tk, Point orig)
+{
+ TkEnv *e;
+ TkLabel *tkl;
+ Rectangle r, s, mainr, focusr;
+ int dx, dy, h;
+ Point p, u, v, pp[4];
+ Image *i, *dst, *cd, *cl, *ct, *img;
+ char *o;
+ int relief, bgnd, fgnd;
+
+ e = tk->env;
+
+ dst = tkimageof(tk);
+ if(dst == nil)
+ return nil;
+
+ v.x = tk->act.width + 2*tk->borderwidth;
+ v.y = tk->act.height + 2*tk->borderwidth;
+
+ r.min = ZP;
+ r.max = v;
+ focusr = insetrect(r, tk->borderwidth);
+ mainr = insetrect(focusr, tk->highlightwidth);
+ relief = tk->relief;
+
+ tkl = TKobj(TkLabel, tk);
+
+ fgnd = TkCforegnd;
+ bgnd = TkCbackgnd;
+ if (tk->flag & Tkdisabled)
+ fgnd = TkCdisablefgnd;
+ else if ((tk->type == TKcheckbutton || tk->type == TKradiobutton) &&
tkl->indicator == BoolF && tkl->check)
+ bgnd = TkCselect;
+ else if (tk->flag & Tkactive) {
+ fgnd = TkCactivefgnd;
+ bgnd = TkCactivebgnd;
+ }
+
+ i = tkitmp(e, r.max, bgnd);
+ if(i == nil)
+ return nil;
+
+ if(tk->flag & Tkactive)
+ draw(i, r, tkgc(e, bgnd), nil, ZP);
+
+ p = mainr.min;
+ h = tkl->h - 2 * tk->highlightwidth;
+
+ dx = tk->act.width - tkl->w - tk->ipad.x;
+ dy = tk->act.height - tkl->h - tk->ipad.y;
+ if((tkl->anchor & (Tknorth|Tksouth)) == 0)
+ p.y += dy/2;
+ else if(tkl->anchor & Tksouth)
+ p.y += dy;
+
+ if((tkl->anchor & (Tkeast|Tkwest)) == 0)
+ p.x += dx/2;
+ else if(tkl->anchor & Tkeast)
+ p.x += dx;
+
+ switch(tk->type) {
+ case TKcheckbutton:
+ if(tkl->indicator == BoolF) {
+ relief = tkl->check? TKsunken: TKraised;
+ break;
+ }
+ u.x = p.x + ButtonBorder;
+ u.y = p.y + ButtonBorder + (h - CheckSpace) / 2;
+
+ cl = tkgc(e, bgnd+TkLightshade);
+ cd = tkgc(e, bgnd+TkDarkshade);
+ tkbevel(i, u, CheckButton, CheckButton, CheckButtonBW, cd, cl);
+ if(tkl->check) {
+ u.x += CheckButtonBW+1;
+ u.y += CheckButtonBW+1;
+ pp[0] = u;
+ pp[0].y += CheckButton/2-1;
+ pp[1] = pp[0];
+ pp[1].x += 2;
+ pp[1].y += 2;
+ pp[2] = u;
+ pp[2].x += CheckButton/4;
+ pp[2].y += CheckButton-2;
+ pp[3] = u;
+ pp[3].x += CheckButton-2;
+ pp[3].y++;
+ bezspline(i, pp, 4, Enddisc, Enddisc, 1, tkgc(e, TkCforegnd), ZP);
+ }
+ break;
+ case TKradiobutton:
+ if(tkl->indicator == BoolF) {
+ relief = tkl->check? TKsunken: TKraised;
+ break;
+ }
+ u.x = p.x + ButtonBorder;
+ u.y = p.y + ButtonBorder + (h - CheckSpace) / 2;
+ v = Pt(u.x+CheckButton/2,u.y+CheckButton/2);
+ ellipse(i, v, CheckButton/2, CheckButton/2, CheckButtonBW-1, tkgc(e,
bgnd+TkDarkshade), ZP);
+ if(tkl->check)
+ fillellipse(i, v, CheckButton/2-2, CheckButton/2-2, tkgc(e,
TkCforegnd), ZP); /* could be TkCselect */
+ break;
+ case TKbutton:
+ if ((tk->flag & (Tkactivated|Tkactive)) == (Tkactivated|Tkactive))
+ relief = TKsunken;
+ break;
+ }
+
+ p.x += tk->ipad.x/2;
+ p.y += tk->ipad.y/2;
+ u = ZP;
+ if(tk->type == TKbutton && relief == TKsunken) {
+ u.x++;
+ u.y++;
+ }
+ if((tk->type == TKcheckbutton || tk->type == TKradiobutton) &&
tkl->indicator != BoolF)
+ u.x += CheckSpace;
+
+ img = nil;
+ if (tkl->img != nil && tkl->img->img != nil)
+ img = tkl->img->img;
+ else if (tkl->bitmap != nil)
+ img = tkl->bitmap;
+ if (img != nil) {
+ s.min.x = p.x + Bitpadx;
+ s.min.y = p.y + Bitpady;
+ s.max.x = s.min.x + Dx(img->r);
+ s.max.y = s.min.y + Dy(img->r);
+ s = rectaddpt(s, u);
+ if(tkchanhastype(img->chan, CGrey))
+ draw(i, s, tkgc(e, fgnd), img, ZP);
+ else
+ draw(i, s, img, nil, ZP);
+ } else if(tkl->text != nil) {
+ u.x += Textpadx;
+ u.y += Textpady;
+ ct = tkgc(e, fgnd);
+
+ p.y += (h - tkl->textheight) / 2;
+ o = tkdrawstring(tk, i, addpt(u, p), tkl->text, tkl->ul, ct,
tkl->justify);
+ if(o != nil)
+ return o;
+ }
+
+// if(tkhaskeyfocus(tk))
+// tkbox(i, focusr, tk->highlightwidth, tkgc(e, TkChighlightfgnd));
+ tkdrawrelief(i, tk, ZP, bgnd, relief);
+
+ p.x = tk->act.x + orig.x;
+ p.y = tk->act.y + orig.y;
+ r = rectaddpt(r, p);
+ draw(dst, r, i, nil, ZP);
+
+ return nil;
}
-/* shame that this is separated from the sizing and rendering code in
label.c */
+void
+tksizebutton(Tk *tk)
+{
+ int w, h;
+ TkLabel *tkl;
+
+ tkl = TKobj(TkLabel, tk);
+ if(tkl->anchor == 0)
+ tkl->anchor = Tkcenter;
+
+ tksizelabel(tk); /* text, bitmap or image, and highlight */
+ w = tkl->w;
+ h = tkl->h;
+
+ if((tk->type == TKcheckbutton || tk->type == TKradiobutton) &&
tkl->indicator != BoolF) {
+ w += CheckSpace;
+ if(h < CheckSpace)
+ h = CheckSpace;
+ }
+ tkl->w = w;
+ tkl->h = h;
+ if((tk->flag & Tksetwidth) == 0)
+ tk->req.width = w;
+ if((tk->flag & Tksetheight) == 0)
+ tk->req.height = h;
+}
+
int
tkbuttonmargin(Tk *tk)
{
@@ -240,7 +421,13 @@
case TKradiobutton:
return CheckButton + 2*CheckButtonBW + 2*ButtonBorder;
}
- return 0;
+ return tklabelmargin(tk);
+}
+
+void
+tkfreebutton(Tk *tk)
+{
+ tkfreelabel(tk);
}
static char*
@@ -570,8 +757,8 @@
TkMethod buttonmethod = {
"button",
tkbuttoncmd,
- tkfreelabel,
- tkdrawlabel,
+ tkfreebutton,
+ tkdrawbutton,
nil,
tklabelgetimgs
};
@@ -579,8 +766,8 @@
TkMethod checkbuttonmethod = {
"checkbutton",
tkchkbuttoncmd,
- tkfreelabel,
- tkdrawlabel,
+ tkfreebutton,
+ tkdrawbutton,
nil,
tklabelgetimgs,
nil,
@@ -595,8 +782,8 @@
TkMethod radiobuttonmethod = {
"radiobutton",
tkradbuttoncmd,
- tkfreelabel,
- tkdrawlabel,
+ tkfreebutton,
+ tkdrawbutton,
nil,
nil,
nil,
=======================================
--- /libtk/label.c Mon Mar 22 07:30:56 2010
+++ /libtk/label.c Thu Mar 25 02:26:15 2010
@@ -6,11 +6,6 @@
#define O(t, e) ((long)(&((t*)0)->e))
-/* Layout constants */
-enum {
- CheckSpace = CheckButton + 2*CheckButtonBW + 2*ButtonBorder,
-};
-
TkOption tklabelopts[] =
{
"text", OPTtext, O(TkLabel, text), nil,
@@ -140,11 +135,7 @@
tkl->textheight = p.y;
}
- if((tk->type == TKcheckbutton || tk->type == TKradiobutton) &&
tkl->indicator != BoolF) {
- w += CheckSpace;
- if(h < CheckSpace)
- h = CheckSpace;
- } else if(tk->type == TKcascade) {
+ if(tk->type == TKcascade) {
w += CheckButton + 2*CheckButtonBW;
if(h < CheckButton)
h = CheckButton;
@@ -165,9 +156,12 @@
TkLabel *tkl;
Image *img;
- if (tk->type == TKseparator)
+ switch(tk->type){
+ case TKseparator:
return 0;
- if (tk->type == TKlabel || tk->type == TKcascade) {
+
+ case TKlabel:
+ case TKcascade:
tkl = TKobj(TkLabel, tk);
img = nil;
if (tkl->img != nil)
@@ -177,8 +171,11 @@
if (img != nil)
return Bitpadx;
return Textpadx;
- }
- return tkbuttonmargin(tk);
+
+ default:
+ fprint(2, "label margin: type %d\n", tk->type);
+ return 0;
+ }
}
void
@@ -218,7 +215,6 @@
static void
tktriangle(Point u, Image *i, TkEnv *e)
{
- int j;
Point p[3];
u.y++;
@@ -232,7 +228,7 @@
}
/*
- * draw TKlabel, TKcheckbutton, TKradiobutton
+ * draw TKlabel, TKseparator, and TKcascade (cascade should really be a
button)
*/
char*
tkdrawlabel(Tk *tk, Point orig)
@@ -241,8 +237,8 @@
TkLabel *tkl;
Rectangle r, s, mainr, focusr;
int dx, dy, h;
- Point p, u, v, *pp;
- Image *i, *dst, *cd, *cl, *ct, *img;
+ Point p, u, v;
+ Image *i, *dst, *ct, *img;
char *o;
int relief, bgnd, fgnd;
@@ -256,8 +252,7 @@
v.y = tk->act.height + 2*tk->borderwidth;
r.min = ZP;
- r.max.x = v.x;
- r.max.y = v.y;
+ r.max = v;
focusr = insetrect(r, tk->borderwidth);
mainr = insetrect(focusr, tk->highlightwidth);
relief = tk->relief;
@@ -268,8 +263,6 @@
bgnd = TkCbackgnd;
if (tk->flag & Tkdisabled)
fgnd = TkCdisablefgnd;
- else if ((tk->type == TKcheckbutton || tk->type == TKradiobutton) &&
tkl->indicator == BoolF && tkl->check)
- bgnd = TkCselect;
else if (tk->flag & Tkactive) {
fgnd = TkCactivefgnd;
bgnd = TkCactivebgnd;
@@ -297,95 +290,28 @@
else if(tkl->anchor & Tkeast)
p.x += dx;
- switch(tk->type) {
- case TKcheckbutton:
- if (tkl->indicator == BoolF) {
- relief = tkl->check?TKsunken:TKraised;
- break;
- }
- u.x = p.x + ButtonBorder;
- u.y = p.y + ButtonBorder + (h - CheckSpace) / 2;
-
- cl = tkgc(e, bgnd+TkLightshade);
- cd = tkgc(e, bgnd+TkDarkshade);
- if(tkl->check) {
- tkbevel(i, u, CheckButton, CheckButton, CheckButtonBW, cd, cl);
- u.x += CheckButtonBW;
- u.y += CheckButtonBW;
- s.min = u;
- s.max.x = u.x + CheckButton;
- s.max.y = u.y + CheckButton;
- draw(i, s, tkgc(e, TkCselect), nil, ZP);
- }
- else
- tkbevel(i, u, CheckButton, CheckButton, CheckButtonBW, cl, cd);
- break;
- case TKradiobutton:
- if (tkl->indicator == BoolF) {
- relief = tkl->check?TKsunken:TKraised;
- break;
- }
- u.x = p.x + ButtonBorder;
- u.y = p.y + ButtonBorder + (h - CheckSpace) / 2;
- pp = mallocz(4*sizeof(Point), 0);
- if(pp == nil)
- return TkNomem;
- pp[0].x = u.x + CheckButton/2;
- pp[0].y = u.y;
- pp[1].x = u.x + CheckButton;
- pp[1].y = u.y + CheckButton/2;
- pp[2].x = pp[0].x;
- pp[2].y = u.y + CheckButton;
- pp[3].x = u.x;
- pp[3].y = pp[1].y;
- cl = tkgc(e, bgnd+TkLightshade);
- cd = tkgc(e, bgnd+TkDarkshade);
- if(tkl->check)
- fillpoly(i, pp, 4, ~0, tkgc(e, TkCselect), pp[0]);
- else {
- ct = cl;
- cl = cd;
- cd = ct;
- }
- line(i, pp[0], pp[1], 0, Enddisc, CheckButtonBW/2, cd, pp[0]);
- line(i, pp[1], pp[2], 0, Enddisc, CheckButtonBW/2, cl, pp[1]);
- line(i, pp[2], pp[3], 0, Enddisc, CheckButtonBW/2, cl, pp[2]);
- line(i, pp[3], pp[0], 0, Enddisc, CheckButtonBW/2, cd, pp[3]);
- free(pp);
- break;
- case TKcascade:
- u.x = mainr.max.x - CheckButton - CheckButtonBW;
+ if(tk->type == TKcascade) {
+ u.x = mainr.max.x - CheckButton - CheckButtonBW; /* TO DO: CheckButton
etc is really the triangle/arrow */
u.y = p.y + ButtonBorder + (h-CheckSpace)/2;
tktriangle(u, i, e);
- break;
- case TKbutton:
- if ((tk->flag & (Tkactivated|Tkactive)) == (Tkactivated|Tkactive))
- relief = TKsunken;
- break;
}
p.x += tk->ipad.x/2;
p.y += tk->ipad.y/2;
u = ZP;
- if(tk->type == TKbutton && relief == TKsunken) {
- u.x++;
- u.y++;
- }
- if((tk->type == TKcheckbutton || tk->type == TKradiobutton) &&
tkl->indicator != BoolF)
- u.x += CheckSpace;
img = nil;
- if (tkl->img != nil && tkl->img->img != nil)
+ if(tkl->img != nil && tkl->img->img != nil)
img = tkl->img->img;
else if (tkl->bitmap != nil)
img = tkl->bitmap;
- if (img != nil) {
+ if(img != nil) {
s.min.x = p.x + Bitpadx;
s.min.y = p.y + Bitpady;
s.max.x = s.min.x + Dx(img->r);
s.max.y = s.min.y + Dy(img->r);
s = rectaddpt(s, u);
- if (tkchanhastype(img->chan, CGrey))
+ if(tkchanhastype(img->chan, CGrey))
draw(i, s, tkgc(e, fgnd), img, ZP);
else
draw(i, s, img, nil, ZP);
@@ -400,7 +326,7 @@
return o;
}
- if (tkhaskeyfocus(tk))
+ if(tkhaskeyfocus(tk))
tkbox(i, focusr, tk->highlightwidth, tkgc(e, TkChighlightfgnd));
tkdrawrelief(i, tk, ZP, bgnd, relief);
@@ -411,92 +337,6 @@
return nil;
}
-
-char*
-tksetvar(TkTop *top, char *c, char *newval)
-{
- TkVar *v;
- TkWin *tkw;
- Tk *f, *m;
- void (*vc)(Tk*, char*, char*);
-
- if (c == nil || c[0] == '\0')
- return nil;
-
- v = tkmkvar(top, c, TkVstring);
- if(v == nil)
- return TkNomem;
- if(v->type != TkVstring)
- return TkNotvt;
-
- if(newval == nil)
- newval = "";
-
- if(v->value != nil) {
- if (strcmp(v->value, newval) == 0)
- return nil;
- free(v->value);
- }
-
- v->value = strdup(newval);
- if(v->value == nil)
- return TkNomem;
-
- for(f = top->root; f; f = f->siblings) {
- if(f->type == TKmenu) {
- tkw = TKobj(TkWin, f);
- for(m = tkw->slave; m; m = m->next)
- if ((vc = tkmethod[m->type]->varchanged) != nil)
- (*vc)(m, c, newval);
- } else
- if ((vc = tkmethod[f->type]->varchanged) != nil)
- (*vc)(f, c, newval);
- }
-
- return nil;
-}
-
-char*
-tkvariable(TkTop *t, char *arg, char **ret)
-{
- TkVar *v;
- char *fmt, *e, *buf, *ebuf, *val;
- int l;
-
- l = strlen(arg) + 2;
- buf = malloc(l);
- if(buf == nil)
- return TkNomem;
- ebuf = buf+l;
-
- arg = tkword(t, arg, buf, ebuf, nil);
- arg = tkskip(arg, " \t");
- if (*arg == '\0') {
- if(strcmp(buf, "lasterror") == 0) {
- free(buf);
- if(t->err == nil)
- return nil;
- fmt = "%s: %s";
- if(strlen(t->errcmd) == sizeof(t->errcmd)-1)
- fmt = "%s...: %s";
- e = tkvalue(ret, fmt, t->errcmd, t->err);
- t->err = nil;
- return e;
- }
- v = tkmkvar(t, buf, 0);
- free(buf);
- if(v == nil || v->value == nil)
- return nil;
- if(v->type != TkVstring)
- return TkNotvt;
- return tkvalue(ret, "%s", v->value);
- }
- val = buf+strlen(buf)+1;
- tkword(t, arg, val, ebuf, nil);
- e = tksetvar(t, buf, val);
- free(buf);
- return e;
-}
void
tklabelgetimgs(Tk *tk, Image **image, Image **mask)
=======================================
--- /libtk/label.h Mon Mar 22 07:30:56 2010
+++ /libtk/label.h Thu Mar 25 02:26:15 2010
@@ -45,8 +45,9 @@
Bitpadx = 0, /* Bitmap padding in labels */
Bitpady = 0,
CheckButton = 10,
- CheckButtonBW = 2,
+ CheckButtonBW = 1,
ButtonBorder = 4,
+ CheckSpace = CheckButton + 2*CheckButtonBW + 2*ButtonBorder,
};
extern TkOption tkbutopts[];
@@ -63,8 +64,10 @@
/* buton.c */
extern Tk* tkmkbutton(TkTop*, int);
extern void tksizebutton(Tk*);
+extern char* tkdrawbutton(Tk*, Point);
extern char* tkbuttoninvoke(Tk*, char*, char**);
extern char* tkradioinvoke(Tk*, char*, char**);
+extern void tkfreebutton(Tk*);
/* support for menus */
extern int tklabelmargin(Tk*);
=======================================
--- /libtk/menus.c Mon Mar 22 07:41:55 2010
+++ /libtk/menus.c Thu Mar 25 02:26:15 2010
@@ -155,7 +155,7 @@
TkLabel *tkl = TKobj(TkLabel, tk);
tksizelabel(tk);
- if (tk->type != TKchoicebutton)
+ if(tk->type != TKchoicebutton)
return;
w = tk->req.width;
h = tk->req.height;
@@ -789,7 +789,7 @@
/* determine padding for item text alignment */
for (tk = tkw->slave; tk != nil; tk = tk->next) {
- m = tklabelmargin(tk);
+ m = tkbuttonmargin(tk); /* TO DO: relies on buttonmargin defaulting to
labelmargin */
tk->act.x = m; /* temp store */
if (m > maxmargin)
maxmargin = m;
=======================================
--- /libtk/mkfile Fri Dec 22 09:07:39 2006
+++ /libtk/mkfile Thu Mar 25 02:26:15 2010
@@ -10,6 +10,7 @@
panel.$O\
parse.$O\
utils.$O\
+ varbl.$O\
windw.$O\
xdata.$O\
=======================================
--- /libtk/scrol.c Mon Mar 22 07:41:55 2010
+++ /libtk/scrol.c Thu Mar 25 02:26:15 2010
@@ -192,7 +192,7 @@
static void
drawslider(TkScroll *tks, Image *i, Point o, int w, int h, TkEnv *e)
{
- Image *l, *d, *t;
+ Image *l, *d;
Rectangle r;
int bgnd;
@@ -218,8 +218,7 @@
{
TkEnv *e;
Point p[3], o;
- Image *d, *l;
- int bo, w, h, triangle, bgnd;
+ int bo, w, h, triangle;
e = tk->env;
@@ -264,8 +263,7 @@
{
TkEnv *e;
Point p[3], o;
- Image *d, *l;
- int bo, w, h, triangle, bgnd;
+ int bo, w, h, triangle;
e = tk->env;
=======================================
--- /libtk/utils.c Mon Mar 22 07:30:56 2010
+++ /libtk/utils.c Thu Mar 25 02:26:15 2010
@@ -1541,7 +1541,8 @@
{
Rectangle r;
int bd;
- bd = withborder ? tk->borderwidth : 0;
+
+ bd = withborder? tk->borderwidth: 0;
r.min.x = -bd;
r.min.y = -bd;
r.max.x = tk->act.width + bd;
@@ -1910,6 +1911,7 @@
{
Point *b;
int z, nx, ny, nrm;
+
while(np-- > 1) {
b = a+1;
nx = a->y - b->y;
==============================================================================
Revision: 8d9ca3cef7
Author:
for...@vitanuova.com
Date: Thu Mar 25 03:14:25 2010
Log: 20100325-1014
http://code.google.com/p/inferno-npe/source/detail?r=8d9ca3cef7
Modified:
/include/tk.h
/libtk/buton.c
/libtk/label.c
=======================================
--- /include/tk.h Thu Mar 25 02:26:15 2010
+++ /include/tk.h Thu Mar 25 03:14:25 2010
@@ -742,7 +742,7 @@
extern void tkbevel(Image*, Point, int, int, int, Image*, Image*);
extern void tkdrawrelief(Image*, Tk*, Point, int, int);
extern Point tkstringsize(Tk*, char*);
-extern char* tkdrawstring(Tk*, Image*, Point, char*, int, Image *, int);
+extern void tkdrawstring(Tk*, Image*, Point, char*, int, Image *, int);
extern int tkeventfmt(Fmt*);
extern Tk* tkdeliver(Tk*, int, void*);
extern int tksubdeliver(Tk*, TkAction*, int, void*, int);
=======================================
--- /libtk/buton.c Thu Mar 25 02:26:15 2010
+++ /libtk/buton.c Thu Mar 25 03:14:25 2010
@@ -362,9 +362,7 @@
ct = tkgc(e, fgnd);
p.y += (h - tkl->textheight) / 2;
- o = tkdrawstring(tk, i, addpt(u, p), tkl->text, tkl->ul, ct,
tkl->justify);
- if(o != nil)
- return o;
+ tkdrawstring(tk, i, addpt(u, p), tkl->text, tkl->ul, ct, tkl->justify);
}
// if(tkhaskeyfocus(tk))
=======================================
--- /libtk/label.c Thu Mar 25 02:26:15 2010
+++ /libtk/label.c Thu Mar 25 03:14:25 2010
@@ -321,9 +321,7 @@
ct = tkgc(e, fgnd);
p.y += (h - tkl->textheight) / 2;
- o = tkdrawstring(tk, i, addpt(u, p), tkl->text, tkl->ul, ct,
tkl->justify);
- if(o != nil)
- return o;
+ tkdrawstring(tk, i, addpt(u, p), tkl->text, tkl->ul, ct, tkl->justify);
}
if(tkhaskeyfocus(tk))
==============================================================================
Revision: d57859d8e3
Author:
for...@vitanuova.com
Date: Thu Mar 25 03:15:32 2010
Log: 20100325-1015
http://code.google.com/p/inferno-npe/source/detail?r=d57859d8e3
Modified:
/libtk/utils.c
=======================================
--- /libtk/utils.c Thu Mar 25 02:26:15 2010
+++ /libtk/utils.c Thu Mar 25 03:15:32 2010
@@ -952,7 +952,7 @@
draw(i, r, col, nil, ZP);
}
-char*
+void
tkdrawstring(Tk *tk, Image *i, Point o, char *text, int ul, Image *col,
int j)
{
int n, l, maxl, sox;
@@ -1009,7 +1009,6 @@
text = q+1;
*q = '\n';
}
- return nil;
}
/* for debugging */
==============================================================================
Revision: 57334add40
Author:
for...@vitanuova.com
Date: Thu Mar 25 03:17:00 2010
Log: 20100325-1016
http://code.google.com/p/inferno-npe/source/detail?r=57334add40
Modified:
/libtk/buton.c
/libtk/label.c
=======================================
--- /libtk/buton.c Thu Mar 25 03:14:25 2010
+++ /libtk/buton.c Thu Mar 25 03:17:00 2010
@@ -231,7 +231,6 @@
int dx, dy, h;
Point p, u, v, pp[4];
Image *i, *dst, *cd, *cl, *ct, *img;
- char *o;
int relief, bgnd, fgnd;
e = tk->env;
=======================================
--- /libtk/label.c Thu Mar 25 03:14:25 2010
+++ /libtk/label.c Thu Mar 25 03:17:00 2010
@@ -239,7 +239,6 @@
int dx, dy, h;
Point p, u, v;
Image *i, *dst, *ct, *img;
- char *o;
int relief, bgnd, fgnd;
e = tk->env;
==============================================================================
Revision: 810a16bd98
Author:
for...@vitanuova.com
Date: Thu Mar 25 11:25:10 2010
Log: 20100325-1824
http://code.google.com/p/inferno-npe/source/detail?r=810a16bd98
Modified:
/libtk/scale.c
/libtk/utils.c
/man/9/checkbutton
/man/9/radiobutton
=======================================
--- /libtk/scale.c Mon Mar 22 07:41:55 2010
+++ /libtk/scale.c Thu Mar 25 11:25:10 2010
@@ -482,11 +482,11 @@
switch(tks->relief) {
case TKsunken:
tkbevel(i, p, sw, tks->sl, ScaleBW, d, l);
- tkbevel(i, q, sw, 0, gw, l, d);
+ tkbevel(i, q, gw, 0, 1, l, d);
break;
case TKraised:
tkbevel(i, p, sw, tks->sl, ScaleBW, l, d);
- tkbevel(i, q, sw, 0, gw, d, l);
+ tkbevel(i, q, gw, 0, 1, d, l);
break;
}
tks->pixpos = p.y;
=======================================
--- /libtk/utils.c Thu Mar 25 03:15:32 2010
+++ /libtk/utils.c Thu Mar 25 11:25:10 2010
@@ -929,7 +929,6 @@
r.max = addpt(r.max, o);
r.min.x = o.x;
r.min.y = r.max.y - 1;
- r.max.y += 1;
draw(i, r, col, nil, ZP);
}
@@ -948,7 +947,7 @@
*v = c;
r.min.x = r.max.x - r.min.x;
r.min.y = r.max.y - 1;
- r.max.y += 2;
+ r.max.y++;
draw(i, r, col, nil, ZP);
}
=======================================
--- /man/9/checkbutton Fri Dec 22 12:52:35 2006
+++ /man/9/checkbutton Thu Mar 25 11:25:10 2010
@@ -105,12 +105,12 @@
.PP
In addition, checkbuttons can be \fIselected\fR.
If a checkbutton is selected then the indicator is normally
-drawn with a sunken relief and a special colour, and
+drawn with a sunken relief and a tick (check) mark, and
a Tk variable associated with the checkbutton is set to the
.B onvalue
(normally 1).
-If the checkbutton is not selected, then the indicator is drawn with a
-raised relief and no special colour, and the associated variable is
+If the checkbutton is not selected, then the indicator is drawn as an
empty box with
+raised relief, and the associated variable is
set to the
.B offvalue
(normally 0).
=======================================
--- /man/9/radiobutton Fri Dec 22 12:52:35 2006
+++ /man/9/radiobutton Thu Mar 25 11:25:10 2010
@@ -85,7 +85,7 @@
there must not exist a window named \fIpathName\fR.
.PP
A radiobutton is a widget that displays a textual string, bitmap or image
-and a diamond called an \fIindicator\fR.
+and a circle called an \fIindicator\fR.
If text is displayed, it must all be in a single font, but it
can occupy multiple lines on the screen (if it contains newlines) and
one of the characters may optionally be underlined using the
@@ -99,11 +99,11 @@
.PP
In addition, radiobuttons can be \fIselected\fR.
If a radiobutton is selected, the indicator is normally
-drawn with a sunken relief and a special colour, and
+drawn as a circle containing a disc (possibly in a special colour), and
a Tk variable associated with the radiobutton is set to a particular
value.
-If the radiobutton is not selected, the indicator is drawn with a
-raised relief and no special colour.
+If the radiobutton is not selected, the indicator is drawn as an
+empty circle.
Typically, several radiobuttons share a single variable and the
value of the variable indicates which radiobutton is to be selected.
When a radiobutton is selected it sets the value of the variable to
==============================================================================
Revision: 59c08b24e3
Author:
for...@vitanuova.com
Date: Fri Apr 2 12:48:59 2010
Log: 20100402-2048
http://code.google.com/p/inferno-npe/source/detail?r=59c08b24e3
Modified:
/CHANGES
/appl/cmd/limbo/types.b
/include/tk.h
/include/version.h
/libtk/buton.c
/libtk/colrs.c
/libtk/parse.c
/limbo/typecheck.c
/limbo/types.c
=======================================
--- /CHANGES Thu Mar 25 02:26:15 2010
+++ /CHANGES Fri Apr 2 12:48:59 2010
@@ -1,3 +1,5 @@
+20100402
+ add new option OPTflags to libtk for later use
20100325
more swizzling of libtk for later use. revised radio and check buttons.
20100322
=======================================
--- /appl/cmd/limbo/types.b Fri Dec 22 09:07:39 2006
+++ /appl/cmd/limbo/types.b Fri Apr 2 12:48:59 2010
@@ -574,7 +574,7 @@
#
# assemble the data structure for an adt with a pick clause.
# since the scoping rules for adt pick fields are strange,
-# we have a cutomized check for overlapping defitions.
+# we have a customized check for overlapping definitions.
#
pickdefd(t: ref Type, tg: ref Decl): ref Decl
{
@@ -3837,7 +3837,7 @@
}
#
-# convert an instantiated exception type to it's underlying type
+# convert an instantiated exception type to its underlying type
#
mkextuptype(t: ref Type): ref Type
{
=======================================
--- /include/tk.h Thu Mar 25 03:14:25 2010
+++ /include/tk.h Fri Apr 2 12:48:59 2010
@@ -99,6 +99,7 @@
OPTignore, /* ignore this option */
OPTsticky, /* sticky (any comb. of chars n, s, e, w) */
OPTlist, /* list of text values */
+ OPTflags, /* more than one OPTflag */
BoolX = 0,
BoolT,
=======================================
--- /include/version.h Thu Mar 25 02:26:15 2010
+++ /include/version.h Fri Apr 2 12:48:59 2010
@@ -1,1 +1,1 @@
-#define VERSION "Fourth Edition (20100325)"
+#define VERSION "Fourth Edition (20100402)"
=======================================
--- /libtk/buton.c Thu Mar 25 03:17:00 2010
+++ /libtk/buton.c Fri Apr 2 12:48:59 2010
@@ -198,15 +198,16 @@
tkl = TKobj(TkLabel, tk);
tkl->ul = -1;
tkl->justify = Tkleft;
- if (btype == TKradiobutton)
- tkl->variable = strdup(tkselbut);
switch (btype) {
case TKbutton:
e = tkbindings(t, tk, bb, nelem(bb));
break;
case TKcheckbutton:
+ e = tkbindings(t, tk, cb, nelem(cb));
+ break;
case TKradiobutton:
+ tkl->variable = strdup(tkselbut);
e = tkbindings(t, tk, cb, nelem(cb));
break;
}
=======================================
--- /libtk/colrs.c Fri Dec 22 09:07:39 2006
+++ /libtk/colrs.c Fri Apr 2 12:48:59 2010
@@ -73,6 +73,9 @@
TkChighlightfgnd,
RGB(0, 0, 0),
TkSameshade,
+ TkCtransparent,
+ DTransparent,
+ TkSameshade,
-1,
};
=======================================
--- /libtk/parse.c Mon Mar 22 07:41:55 2010
+++ /libtk/parse.c Fri Apr 2 12:48:59 2010
@@ -47,6 +47,7 @@
/* OPTignore */ pignore,
/* OPTsticky */ psticky,
/* OPTlist */ plist,
+ /* OPTflags */ pstab,
};
char*
@@ -290,7 +291,7 @@
TkStab *s;
TkOption *o;
int wh, con, i, n, flag, *v;
- char *r, *buf, *fmt;
+ char *r, *buf, *fmt, *out;
buf = mallocz(Tkmaxitem, 0);
if(buf == nil)
@@ -381,6 +382,23 @@
}
free(buf);
return tkvalue(val, "%s", c);
+ case OPTflags:
+ con = OPTION(ft->ptr, int, o->offset);
+ out = mallocz(Tkmaxitem, 0);
+ if(out == nil) {
+ free(buf);
+ return TkNomem;
+ }
+ c = out;
+ for (s = o->aux; s->val != nil; s++) {
+ if (con & s->con)
+ c = seprint(c, out+Tkmaxitem, " %s", s->val); /* should this be
quoted? */
+ }
+ free(buf);
+ *c = 0;
+ r = tkvalue(val, "%s", out);
+ free(out);
+ return r;
case OPTfont:
e = OPTION(ft->ptr, TkEnv*, o->offset);
free(buf);
@@ -411,8 +429,10 @@
free(buf);
return nil;
case OPTbmap:
+ //free(buf);
return tkvalue(val, "%d", OPTION(ft->ptr, Image*, o->offset) != nil);
case OPTimag:
+ //free(buf);
return tkvalue(val, "%d", OPTION(ft->ptr, TkImg*, o->offset) != nil);
}
}
@@ -517,42 +537,61 @@
OPTION(place, int, off) = TKF2I(d);
return nil;
}
+
+static TkStab*
+lookstab(TkStab *s, char *word)
+{
+ for(; s->val != nil; s++)
+ if(strcmp(s->val, word) == 0)
+ return s;
+ return nil;
+}
static char*
pstab(TkTop *t, TkOption *o, void *place, char **str, char *buf, char
*ebuf)
{
- char *p;
- int mask;
+ char *p, *fields[8];
+ int mask, val, nf;
TkStab *s, *c;
p = tkword(t, *str, buf, ebuf, nil);
if(*buf == '\0')
return TkOparg;
- for(s = o->aux; s->val; s++)
- if(strcmp(s->val, buf) == 0)
- break;
- if(s->val == nil)
- return TkBadvl;
-
- *str = p;
if(o->type == OPTstab) {
+ s = lookstab(o->aux, buf);
+ if(s == nil)
+ return TkBadvl;
+ *str = p;
OPTION(place, int, o->offset) = s->con;
return nil;
}
+
+ nf = getfields(buf, fields, nelem(fields), 1, " \t,");
+ if(nf < 1 || nf > 1 && o->type != OPTflags)
+ return TkBadvl;
mask = 0;
for(c = o->aux; c->val; c++)
mask |= c->con;
+ val = 0;
+ while(--nf >= 0) {
+ s = lookstab(o->aux, fields[nf]);
+ if(s == nil)
+ return TkBadvl;
+ val |= s->con;
+ }
+ *str = p;
+
OPTION(place, int, o->offset) &= ~mask;
- OPTION(place, int, o->offset) |= s->con;
+ OPTION(place, int, o->offset) |= val;
/*
* a hack, but otherwise we have to dirty the focus order
* every time any command is executed on a widget
*/
- if (!strcmp(o->o, "takefocus"))
+ if(strcmp(o->o, "takefocus") == 0)
tkdirtyfocusorder(t);
return nil;
}
=======================================
--- /limbo/typecheck.c Fri Feb 1 11:00:57 2008
+++ /limbo/typecheck.c Fri Apr 2 12:48:59 2010
@@ -1812,18 +1812,6 @@
return ok;
}
break;
-/*
- if(mathchk(n, 0)){
- if(n->ty != tint){
- nerror(n, "exponentiation operands not int");
- ok.ok = ok.allok = 0;
- return ok;
- }
- break;
- }
- ok.ok = ok.allok = 0;
- return ok;
-*/
case Olsh:
case Orsh:
if(shiftchk(n))
@@ -2590,7 +2578,7 @@
}
/*
- * check that a print style format string matches it's arguments
+ * check that a print style format string matches its arguments
*/
void
fmtcheck(Node *f, Node *fmtarg, Node *va)
=======================================
--- /limbo/types.c Fri Feb 1 11:00:57 2008
+++ /limbo/types.c Fri Apr 2 12:48:59 2010
@@ -676,7 +676,7 @@
/*
* assemble the data structure for an adt with a pick clause.
* since the scoping rules for adt pick fields are strange,
- * we have a cutomized check for overlapping defitions.
+ * we have a customized check for overlapping definitions.
*/
Decl*
pickdefd(Type *t, Decl *tg)
@@ -4289,7 +4289,7 @@
}
/*
- * convert an instantiated exception type to it's underlying type
+ * convert an instantiated exception type to its underlying type
*/
Type*
mkextuptype(Type *t)
==============================================================================
Revision: 77c336df67
Author:
for...@vitanuova.com
Date: Tue Apr 6 03:01:04 2010
Log: 20100406-1101
http://code.google.com/p/inferno-npe/source/detail?r=77c336df67
Modified:
/include/version.h
/libtk/parse.c
=======================================
--- /include/version.h Fri Apr 2 12:48:59 2010
+++ /include/version.h Tue Apr 6 03:01:04 2010
@@ -1,1 +1,1 @@
-#define VERSION "Fourth Edition (20100402)"
+#define VERSION "Fourth Edition (20100406)"
=======================================
--- /libtk/parse.c Fri Apr 2 12:48:59 2010
+++ /libtk/parse.c Tue Apr 6 03:01:04 2010
@@ -391,7 +391,7 @@
}
c = out;
for (s = o->aux; s->val != nil; s++) {
- if (con & s->con)
+ if (s->con == (s->con&-s->con) && (con & s->con) != 0)
c = seprint(c, out+Tkmaxitem, " %s", s->val); /* should this be
quoted? */
}
free(buf);
==============================================================================
Revision: 1f88ded5a2
Author:
for...@vitanuova.com
Date: Tue Apr 6 11:59:10 2010
Log: 20100406-1957
http://code.google.com/p/inferno-npe/source/detail?r=1f88ded5a2
Modified:
/CHANGES
/libtk/utils.c
=======================================
--- /CHANGES Fri Apr 2 12:48:59 2010
+++ /CHANGES Tue Apr 6 11:59:10 2010
@@ -1,3 +1,5 @@
+20100406
+ fix handling of boundary case in libtk/utils.c
20100402
add new option OPTflags to libtk for later use
20100325
=======================================
--- /libtk/utils.c Thu Mar 25 11:25:10 2010
+++ /libtk/utils.c Tue Apr 6 11:59:10 2010
@@ -248,8 +248,10 @@
d = c->display;
y = Dy(r);
x = Dx(r);
- if(x <= 0 || y <= 0)
- return d->black;
+ if(x <= 0 || y <= 0) {
+ r = Rect(0, 0, 1, 1);
+ x = y = 1;
+ }
/* TO DO: diagonal */
s = r;
if(dir == Tkhorizontal){
@@ -261,7 +263,7 @@
}
b = mallocz(3*n, 0);
if(b == nil)
- return d->black;
+ return nil;
locked = lockdisplay(d);
i = allocimage(d, r, RGB24, 1, DNofill);
if(i == nil)
==============================================================================
Revision: 6ff5ca2f89
Author: Venkatesh Srinivas <
m...@endeavour.zapto.org>
Date: Wed Apr 7 06:04:21 2010
Log: Merge with inferno-os 20100406-1957.
http://code.google.com/p/inferno-npe/source/detail?r=6ff5ca2f89
Modified:
/CHANGES
/include/version.h
/libtk/utils.c
=======================================
--- /CHANGES Wed Mar 17 18:01:58 2010
+++ /CHANGES Wed Apr 7 06:04:21 2010
@@ -1,3 +1,13 @@
+20100406
+ fix handling of boundary case in libtk/utils.c
+20100402
+ add new option OPTflags to libtk for later use
+20100325
+ more swizzling of libtk for later use. revised radio and check buttons.
+20100322
+ a few tweaks to Tk for later use
+20100320
+ appl/lib/json.b dis/lib/json.dis - use %f not string <real-value> to
ensure json value acceptable [issue 230, powerman]
20100310
stop tabs(2) from issuing pointless tk cmd that produces diagnostics
20100305
=======================================
--- /include/version.h Wed Mar 17 18:01:58 2010
+++ /include/version.h Wed Apr 7 06:04:21 2010
@@ -1,1 +1,1 @@
-#define VERSION "Fourth Edition (20100311)"
+#define VERSION "Fourth Edition (20100406)"
=======================================
--- /libtk/utils.c Mon Jan 18 10:28:37 2010
+++ /libtk/utils.c Wed Apr 7 06:04:21 2010
@@ -2,6 +2,14 @@
#include "draw.h"
#include "tk.h"
+struct TkCol
+{
+ ulong rgba1;
+ ulong rgba3; /* if mixed, otherwise DNotacolor */
+ Image* i;
+ TkCol* forw;
+};
+
extern void rptwakeup(void*, void*);
extern void* rptproc(char*, int, void*, int (*)(void*), int
(*)(void*,int), void (*)(void*));
@@ -118,6 +126,48 @@
*B = ((rgba >> 8) & 0xFF);
}
}
+
+static int
+tkcachecol(TkCtxt *c, Image *i, ulong one, ulong three)
+{
+ TkCol *cc;
+
+ cc = malloc(sizeof(*cc));
+ if(cc == nil)
+ return 0;
+ cc->rgba1 = one;
+ cc->rgba3 = three;
+ cc->i = i;
+ cc->forw = c->chead;
+ c->chead = cc;
+ c->ncol++;
+ /* we'll do LRU management at some point */
+ if(c->ncol > TkColcachesize){
+ static int warn;
+ if(warn == 0){
+ warn = 1;
+ print("tk: %d colours cached\n", TkColcachesize);
+ }
+ }
+ return 1;
+}
+
+static Image*
+tkfindcol(TkCtxt *c, ulong one, ulong three)
+{
+ TkCol *cc, **l;
+
+ for(l = &c->chead; (cc = *l) != nil; l = &cc->forw)
+ if(cc->rgba1 == one && cc->rgba3 == three){
+ /* move it up in the list */
+ *l = cc->forw;
+ cc->forw = c->chead;
+ c->chead = cc;
+ /* we assume it will be used right away and not stored */
+ return cc->i;
+ }
+ return nil;
+}
void
tkfreecolcache(TkCtxt *c)
@@ -134,29 +184,42 @@
c->ctail = nil;
c->ncol = 0;
}
+
+Image*
+tkcolormix(TkCtxt *c, ulong one, ulong three)
+{
+ Image *i;
+ Display *d;
+
+ i = tkfindcol(c, one, three);
+ if(i != nil)
+ return i;
+ d = c->display;
+ i = allocimagemix(d, one, three);
+ if(i == nil)
+ return d->black;
+ if(!tkcachecol(c, i, one, three)){
+ freeimage(i);
+ return d->black;
+ }
+ return i;
+}
Image*
tkcolor(TkCtxt *c, ulong pix)
{
Image *i;
- TkCol *cc, **l;
Display *d;
Rectangle r;
- for(l = &c->chead; (cc = *l) != nil; l = &cc->forw)
- if(cc->rgba == pix){
- /* move it up in the list */
- *l = cc->forw;
- cc->forw = c->chead;
- c->chead = cc;
- /* we assume it will be used right away and not stored */
- return cc->i;
- }
d = c->display;
if(pix == DWhite)
return d->white;
if(pix == DBlack)
return d->black;
+ i = tkfindcol(c, pix, DNotacolor);
+ if(i != nil)
+ return i;
r.min = ZP;
r.max.x = 1;
r.max.y = 1;
@@ -166,24 +229,67 @@
i = allocimage(d, r, RGBA32, 1, pix);
if(i == nil)
return d->black;
- cc = malloc(sizeof(*cc));
- if(cc == nil){
+ if(!tkcachecol(c, i, pix, DNotacolor)) {
freeimage(i);
return d->black;
}
- cc->rgba = pix;
- cc->i = i;
- cc->forw = c->chead;
- c->chead = cc;
- c->ncol++;
- /* we'll do LRU management at some point */
- if(c->ncol > TkColcachesize){
- static int warn;
- if(warn == 0){
- warn = 1;
- print("tk: %d colours cached\n", TkColcachesize);
- }
- }
+ return i;
+}
+
+Image*
+tkgradient(TkCtxt *c, Rectangle r, int dir, ulong pix0, ulong pix1)
+{
+ Display *d;
+ Image *i;
+ uchar *b, *p, *e;
+ int c0[3], c1[3], delta[3], a, j, x, y, n, locked;
+ Rectangle s;
+
+ d = c->display;
+ y = Dy(r);
+ x = Dx(r);
+ if(x <= 0 || y <= 0) {
+ r = Rect(0, 0, 1, 1);
+ x = y = 1;
+ }
+ /* TO DO: diagonal */
+ s = r;
+ if(dir == Tkhorizontal){
+ n = x;
+ r.max.y = r.min.y+1;
+ }else{
+ n = y;
+ r.max.x = r.min.x+1;
+ }
+ b = mallocz(3*n, 0);
+ if(b == nil)
+ return nil;
+ locked = lockdisplay(d);
+ i = allocimage(d, r, RGB24, 1, DNofill);
+ if(i == nil)
+ goto Ret;
+ tkrgbavals(pix0, &c0[2], &c0[1], &c0[0], &a);
+ tkrgbavals(pix1, &c1[2], &c1[1], &c1[0], &a);
+ for(j = 0; j < 3; j++){
+ c0[j] <<= 12;
+ c1[j] <<= 12;
+ delta[j] = ((c1[j]-c0[j])+(1<<11))/n;
+ }
+ e = b+3*n;
+ for(p = b; p < e; p += 3) {
+ p[0] = c0[0]>>12;
+ p[1] = c0[1]>>12;
+ p[2] = c0[2]>>12;
+ c0[0] += delta[0];
+ c0[1] += delta[1];
+ c0[2] += delta[2];
+ }
+ loadimage(i, r, b, 3*n);
+ replclipr(i, 1, s);
+Ret:
+ if(locked)
+ unlockdisplay(d);
+ free(b);
return i;
}
@@ -816,7 +922,19 @@
return p;
}
-static char*
+static void
+tkulall(Image *i, Point o, Image *col, Font *f, char *text)
+{
+ Rectangle r;
+
+ r.max = stringsize(f, text);
+ r.max = addpt(r.max, o);
+ r.min.x = o.x;
+ r.min.y = r.max.y - 1;
+ draw(i, r, col, nil, ZP);
+}
+
+static void
tkul(Image *i, Point o, Image *col, int ul, Font *f, char *text)
{
char c, *v;
@@ -831,13 +949,11 @@
*v = c;
r.min.x = r.max.x - r.min.x;
r.min.y = r.max.y - 1;
- r.max.y += 2;
+ r.max.y++;
draw(i, r, col, nil, ZP);
-
- return nil;
}
-char*
+void
tkdrawstring(Tk *tk, Image *i, Point o, char *text, int ul, Image *col,
int j)
{
int n, l, maxl, sox;
@@ -880,14 +996,13 @@
if(ul >= 0) {
n = strlen(text);
if(ul < n) {
- char *r;
-
- r = tkul(i, o, col, ul, e->font, text);
- if(r != nil)
- return r;
+ tkul(i, o, col, ul, e->font, text);
ul = -1;
- }
- ul -= n;
+ } else if(ul == n) {
+ tkulall(i, o, col, e->font, text);
+ ul = -1;
+ } else
+ ul -= n;
}
o.y += e->font->height;
if(q == nil)
@@ -895,7 +1010,6 @@
text = q+1;
*q = '\n';
}
- return nil;
}
/* for debugging */
@@ -1216,14 +1330,12 @@
dy = Dy(r) - size.y;
if((anchor & (Tknorth|Tksouth)) == 0)
p.y += dy/2;
- else
- if(anchor & Tksouth)
+ else if(anchor & Tksouth)
p.y += dy;
if((anchor & (Tkeast|Tkwest)) == 0)
p.x += dx/2;
- else
- if(anchor & Tkeast)
+ else if(anchor & Tkeast)
p.x += dx;
return p;
}
@@ -1429,7 +1541,8 @@
{
Rectangle r;
int bd;
- bd = withborder ? tk->borderwidth : 0;
+
+ bd = withborder? tk->borderwidth: 0;
r.min.x = -bd;
r.min.y = -bd;
r.max.x = tk->act.width + bd;
@@ -1779,12 +1892,12 @@
hit = 0;
j = np - 1;
- for (i = 0; i < np; j = i++) {
+ for(i = 0; i < np; j = i++) {
pi = poly[i];
pj = poly[j];
- if ((pi.y <= p.y && p.y < pj.y || pj.y <= p.y && p.y < pi.y) &&
+ if((pi.y <= p.y && p.y < pj.y || pj.y <= p.y && p.y < pi.y) &&
p.x < (pj.x - pi.x) * (p.y - pi.y) / (pj.y - pi.y) + pi.x) {
- if (winding == 1 || pi.y > p.y)
+ if(winding == 1 || pi.y > p.y)
hit++;
else
hit--;
@@ -1798,6 +1911,7 @@
{
Point *b;
int z, nx, ny, nrm;
+
while(np-- > 1) {
b = a+1;
nx = a->y - b->y;