~aleteoryx/ntalk

0df328a4efe3a02f064fd0cb40945790caeb37cb — Aleteoryx 2 months ago c5b51de
sixels in motd
1 files changed, 59 insertions(+), 25 deletions(-)

M ntalk.tcl
M ntalk.tcl => ntalk.tcl +59 -25
@@ 156,6 156,31 @@ proc sixels2image {sixels} {
	return $image
}

proc parseline {line} {
	set chunks {}

	set idx1 -1
	set idx2 -1
	while {[set idx2 [string first "\\(" $line $idx1]] != -1} {
		# insert the prefix text
		lappend chunks [string range $line $idx1 $idx2-1]

		# get the sixels
		set idx1 $idx2
		set idx2 [string first ")" $line $idx1+2]
		if {$idx2 == -1} { set idx2 [string length $line] }

		# insert them
		set image [sixels2image [string range $line $idx1+2 $idx2-1]]
		lappend chunks [list [string range $line $idx1 $idx2] $image]
		
		set idx1 [expr {$idx2 + 1}]
	}
	lappend chunks [string range $line $idx1 end]
	
	return $chunks
}


### FONT STUFF ###



@@ 173,8 198,7 @@ make16

### UI SETUP ###

set motd "no MOTD yet! maybe you should send one..."
label .head -textvariable motd
label .motd

frame .foot
entry .foot.input


@@ 190,7 214,7 @@ pack .foot.ppl .foot.sep .foot.msgs -side right
pack .foot.name -side left
pack .foot.input -side bottom -fill x

pack .head -side top
pack .motd -side top
pack .foot -side bottom -fill x
pack .scroll -side right -fill y
pack .buffer -fill both


@@ 244,6 268,27 @@ menu .menu.sixels.rm -tearoff 0

. configure -menu .menu

### MOTD ###

proc setmotd {newmotd} {
	global motd

	destroy {*}[winfo children .motd]
	foreach {text image} [parseline $newmotd] {
		set tlabel [label .motd.[incr i] -text $text]
		pack $tlabel -side left
		
		if {$image != {}} {
			lassign $image _ image
			set ilabel [label .motd.[incr i] -image $image]
			pack $ilabel -side left
		}
	}
	
	set motd $newmotd
}
setmotd "no MOTD yet! maybe you should send one..."


### USER SIXEL LIBRARY ###



@@ 454,11 499,11 @@ proc bufpush {line} {

	set tag {}
	if {[string first "MOTD:" $line] == 0} {
		set motd [string trim [string range $line 5 end]]
		setmotd [string trim [string range $line 5 end]]
		set line "<<< $motd >>>"
		set tag motd
	} elseif {[string first "MOTD" $line] == 0} {
		set motd [string trim [string range $line 4 end]]
		setmotd [string trim [string range $line 4 end]]
		set line "<<< $motd >>>"
		set tag motd
	} elseif {[regexp "\[^\\w.\]${user}\[^\\w.\]" $line]} {


@@ 466,28 511,17 @@ proc bufpush {line} {
	}

	.buffer configure -state normal
	
	set idx1 -1
	set idx2 -1
	while {[set idx2 [string first "\\(" $line $idx1]] != -1} {
		# insert the prefix text
		.buffer insert end [string range $line $idx1 $idx2-1] $tag

		# get the sixels
		set idx1 $idx2
		set idx2 [string first ")" $line $idx1+2]
		if {$idx2 == -1} { set idx2 [string length $line] }

		# insert them
		.buffer insert end [string range $line $idx1 $idx2] rawsixel
		set image [sixels2image [string range $line $idx1+2 $idx2-1]]
		.buffer image create end -image $image
		
		set idx1 [expr {$idx2 + 1}]
	foreach {text image} [parseline $line] {
		.buffer insert end $text $tag

		if {$image != {}} {
			lassign $image raw image
			.buffer insert end $raw [concat rawsixel $tag]
			.buffer image create end -image $image
			.buffer tag add $tag {end -1 chars}
		}
	}
	.buffer insert end [string range $line $idx1 end] $tag
	.buffer insert end "\n" $tag
	
	.buffer configure -state disabled
}
proc bufdown {} {