Register forum user name Search FAQ

Gammon Forum

Notice: Any messages purporting to come from this site telling you that your password has expired, or that you need to verify your details, confirm your email, resolve issues, making threats, or asking for money, are spam. We do not email users with any such messages. If you have lost your password you can obtain a new one by using the password reset link.

Due to spam on this forum, all posts now need moderator approval.

 Entire forum ➜ MUSHclient ➜ Miniwindows ➜ Mini-Window chatter

Mini-Window chatter

It is now over 60 days since the last post. This thread is closed.     Refresh page


Pages: 1  2 3  

Posted by Halig   Portugal  (123 posts)  Bio
Date Reply #15 on Sun 25 Oct 2015 08:00 PM (UTC)
Message
Another problem. The buffer got filled, i lost count how many lines it was there, and the errors where these:

Run-time error
Plugin: Chat_Capture_Miniwindow (called from world: Legends of Krynn)
Function/Sub: chats called by trigger
Reason: processing trigger "" when matching line: "You tell Slash the Pony 'http://www.google.com'"
[string "Plugin"]:624: C stack overflow
stack traceback:
[string "Plugin"]:624: in function 'stylesToANSI'
[string "Plugin"]:423: in function <[string "Plugin"]:419>
[C]: in function 'Simulate'
[string "Plugin"]:423: in function <[string "Plugin"]:419>
[C]: in function 'Simulate'
[string "Plugin"]:423: in function <[string "Plugin"]:419>
[C]: in function 'Simulate'
[string "Plugin"]:423: in function <[string "Plugin"]:419>
[C]: in function 'Simulate'
[string "Plugin"]:423: in function <[string "Plugin"]:419>
[C]: in function 'Simulate'
...
[C]: in function 'Simulate'
[string "Plugin"]:423: in function <[string "Plugin"]:419>
[C]: in function 'Simulate'
[string "Plugin"]:423: in function <[string "Plugin"]:419>
[C]: in function 'Simulate'
[string "Plugin"]:423: in function <[string "Plugin"]:419>
[C]: in function 'Simulate'
[string "Plugin"]:423: in function <[string "Plugin"]:419>
[C]: in function 'Simulate'
[string "Plugin"]:423: in function <[string "Plugin"]:419>
Error context in script:
620 : -- This can get confused if the player has redefined their color chart.
621 : function stylesToANSI (styles)
622 : local line = {}
623 : local reinit = true
624*: for _,v in ipairs (styles) do
625 : if ANSI_colours[v.textcolour] then
626 : table.insert(line, ANSI_colours[v.textcolour])
627 : elseif colours_extended[v.textcolour] then -- use 256 color xterm ansi when necessary
628 : table.insert(line, ANSI(38,5,colours_extended[v.textcolour]))
Top

Posted by Nick Gammon   Australia  (23,158 posts)  Bio   Forum Administrator
Date Reply #16 on Sun 25 Oct 2015 08:31 PM (UTC)
Message

 620 : -- This can get confused if the player has redefined their color chart.


Have you redefined your ASCII colours?

- Nick Gammon

www.gammon.com.au, www.mushclient.com
Top

Posted by Halig   Portugal  (123 posts)  Bio
Date Reply #17 on Sun 25 Oct 2015 08:37 PM (UTC)
Message
Nick, good point out, didn't notice that. How can i redefine my ASCII colours?

I inserted on the begining of the script, the lines that Fiendish told me too.
Top

Posted by Halig   Portugal  (123 posts)  Bio
Date Reply #18 on Sun 25 Oct 2015 08:41 PM (UTC)

Amended on Sun 25 Oct 2015 08:48 PM (UTC) by Halig

Message
Nick, thank you. I checked on the World Properties and the colours where not default. I didn't knew that this was changed. I changed that to Default values.
On the first attempt to send a tell with an hyperlink, it gives me the same error. But if i typed again the tell, there is no more error.
Why only on the first try it gives those enormous error?
Top

Posted by Fiendish   USA  (2,535 posts)  Bio   Global Moderator
Date Reply #19 on Mon 26 Oct 2015 07:29 AM (UTC)

Amended on Mon 26 Oct 2015 04:28 PM (UTC) by Fiendish

Message
Uh. Hmm.

I'm pretty sure I tested this with changed colors (that's why it reinits the color table on missing value in the first place.) It definitely shouldn't be causing a stack overflow! Nick, thoughts?

https://github.com/fiendish/aardwolfclientpackage
Top

Posted by Halig   Portugal  (123 posts)  Bio
Date Reply #20 on Mon 26 Oct 2015 06:15 PM (UTC)
Message
Hi Fiendish,

It keeps that way, and now not even the second tell goes through.
I would try change yours, but i guess the changes are so many, and so many files to see and try to adapt.
Top

Posted by Fiendish   USA  (2,535 posts)  Bio   Global Moderator
Date Reply #21 on Mon 26 Oct 2015 07:01 PM (UTC)

Amended on Mon 26 Oct 2015 07:03 PM (UTC) by Fiendish

Message
No, I think you'd never be able to go and customize my current Aardwolf version now. Too many specific details.

Can you show me what your plugin currently looks like? I don't see any reason why stylesToANSI would cause a stack overflow, and that run of Simulates in your error message is sketchy.

https://github.com/fiendish/aardwolfclientpackage
Top

Posted by Halig   Portugal  (123 posts)  Bio
Date Reply #22 on Mon 26 Oct 2015 07:32 PM (UTC)
Message
<muclient>
<plugin
name="Chat_Capture_Miniwindow"
id="565dae21eb816a2fdb8d50f9"
language="Lua"
purpose="Move chats to a miniwindow"
date_written="2010-04-04"
date_modified="2015-10-22"
requires="4.99"
version="3"
save_state="y"
>

<description trim="y">
USAGE:

chats echo on : echo chats in main window
chats echo off : do not echo chats
chats show : show chats window
chats hide : hide chats window

LH-click a line to copy it to the clipboard
RH-click main window to see menu of options

Click title bar to drag window.
</description>

</plugin>

<triggers>
<trigger
enabled="y"
match="You HERO '*'"
script="chats"
omit_from_output="y"
sequence="100"
></trigger>

<trigger
enabled="y"
match="You tell * '*'"
omit_from_output="y"
script="chats"
send_to="12"
sequence="100"
>
<send>StopEvaluatingTriggers (true)</send>
</trigger>

<trigger
enabled="y"
keep_evaluating="y"
match="^\[(.*)\]: .*"
regexp="y"
script="chats"
omit_from_output="y"
sequence="100"
sound="E:\MUSHclient 4.99\MUD.wav"
send_to="12"
>
<send>StopEvaluatingTriggers (true)</send>
</trigger>

<trigger
enabled="y"
match="* tells you '*'"
script="chats"
omit_from_output="y"
sequence="100"
sound="E:\MUSHclient 4.99\MUD.wav"
send_to="12"
>
<send>StopEvaluatingTriggers (true)</send>
</trigger>

<trigger
enabled="y"
match="* Prays: '*'"
script="chats"
omit_from_output="y"
sequence="100"
></trigger>

<trigger
enabled="y"
match="* HEROs '*'"
script="chats"
omit_from_output="y"
sequence="100"
send_to="12"
>
<send>StopEvaluatingTriggers (true)</send>
</trigger>
</triggers>

<aliases>
<alias
script="chat_echo"
match="^chats echo( on| off)?$"
enabled="y"
regexp="y"
sequence="100"
ignore_case="y"
></alias>

<alias
script="chat_show"
match="chats show"
enabled="y"
sequence="100"
ignore_case="y"
></alias>

<alias
script="chat_hide"
match="chats hide"
enabled="y"
sequence="100"
ignore_case="y"
></alias>
</aliases>

Continues...
Top

Posted by Halig   Portugal  (123 posts)  Bio
Date Reply #23 on Mon 26 Oct 2015 07:34 PM (UTC)
Message
<script>
<![CDATA[

require "movewindow" -- load the movewindow.lua module
require "copytable"

local BLACK = 1
local RED = 2
local GREEN = 3
local YELLOW = 4
local BLUE = 5
local MAGENTA = 6
local CYAN = 7
local WHITE = 8

BODY_FONT_NAME = "Dina"
BODY_FONT_SIZE = 8
SCROLL_BAR_WIDTH = 15
MAX_LINES = 10000 -- how many lines to store in scrollback

-- date_format = "[%d %b %H:%M:%S] " -- [30 Aug 13:29:49] date and time 24 hour
-- date_format = "[%d %b %I:%M:%S%p] " -- [30 Aug 01:20:12PM] date and time 12 hour
-- date_format = "[%H:%M:%S] " -- [13:29:08] time 24 hour
-- date_format = "[%X] " -- [1:22:06 PM] time 12 hour

TIMESTAMP_TEXT_COLOUR = "white"
TIMESTAMP_BACK_COLOUR = "black"

-- doing it this way makes them default to true the first time around
timestamp = not (GetVariable("timestamp") == "false")
echo = not (GetVariable("echo") == "false")

date_format = GetVariable("date_format")
WINDOW_WIDTH = tonumber(GetVariable("WINDOW_WIDTH"))
WINDOW_HEIGHT = tonumber(GetVariable("WINDOW_HEIGHT"))

-- offset of text from edge
TEXT_INSET = 5

-- where to store the chat line
lines = {} -- table of recent chat lines
rawlines = {}

lineStart = ""
lineEnd = ""
WINDOW_COLUMNS = ""
WINDOW_LINES = ""

theme = {
WINDOW_BACKGROUND = ColourNameToRGB ("#000000"), -- for miniwindow body
WINDOW_BORDER = ColourNameToRGB("#E8E8E8"), -- for miniwindow body

HIGHLIGHT=ColourNameToRGB("#FFFFFF"), -- for 3D surfaces
FACE=ColourNameToRGB("#D4D0C8"), -- for 3D surfaces
INNERSHADOW=ColourNameToRGB("#808080"), -- for 3D surfaces
OUTERSHADOW = ColourNameToRGB("#404040"), -- for 3D surfaces

BACK_FACE = ColourNameToRGB ("#E8E8E8"), -- for contrasting details
DETAIL = ColourNameToRGB ("#000000"), -- for contrasting details

TITLE_HEIGHT = 17, -- for miniwindow title area
SUBTITLE_HEIGHT = 17, -- for miniwindow title area
TITLE_FONT_NAME = "Dina", -- for miniwindow title area
TITLE_FONT_SIZE = 8 -- for miniwindow title area
} -- end theme table


-- replacement for WindowRectOp action 5, which allows for a 3D look while maintaining color theme
-- Requires global theme.HIGHLIGHT, theme.FACE, theme.INNERSHADOW, and theme.OUTERSHADOW rgb colors to be set.
function DrawThemed3DRect(Window, left, top, right, bottom)
WindowRectOp(Window, miniwin.rect_fill, left, top, right, bottom, theme.FACE)
WindowLine(Window, left, top, right, top, theme.HIGHLIGHT,
miniwin.pen_solid + miniwin.pen_endcap_flat, 1)
WindowLine(Window, left, top, left, bottom, theme.HIGHLIGHT,
miniwin.pen_solid + miniwin.pen_endcap_flat, 1)
WindowLine(Window, left, bottom-2, right, bottom-2, theme.INNERSHADOW,
miniwin.pen_solid + miniwin.pen_endcap_flat, 1)
WindowLine(Window, right-2, top, right-2, bottom-2, theme.INNERSHADOW,
miniwin.pen_solid + miniwin.pen_endcap_flat, 1)
WindowLine(Window, left, bottom-1, right, bottom-1, theme.OUTERSHADOW,
miniwin.pen_solid + miniwin.pen_endcap_flat, 1)
WindowLine(Window, right-1, top, right-1, bottom-1, theme.OUTERSHADOW,
miniwin.pen_solid + miniwin.pen_endcap_flat, 1)
end

function DrawThemedResizeTag(Window, x1, y1, size)
local x2, y2 = x1+size, y1+size
DrawThemed3DRect(Window, x1, y1, x2, y2)
local m = 2
local n = 2
while (x1+m+2 <= x2-3 and y1+n+1 <= y2-4) do
WindowLine(Window, x1+m+1, y2-4, x2-3, y1+n, theme.HIGHLIGHT,
miniwin.pen_solid, 1)
WindowLine(Window, x1+m+2, y2-4, x2-3, y1+n+1, theme.INNERSHADOW,
miniwin.pen_solid, 1)
m = m+3
n = n+3
end
end -- function DrawThemedResizeTag

Win = GetPluginID()
font_height = ""
line_height = ""
windowinfo = ""
startx = ""
starty = ""


Continues...
Top

Posted by Halig   Portugal  (123 posts)  Bio
Date Reply #24 on Mon 26 Oct 2015 07:34 PM (UTC)
Message
function ResizeMoveCallback()
posx, posy = WindowInfo (Win, 17), WindowInfo (Win, 18)
if (WindowTextWidth(Win, "titlefont"..Win, "WWWCOMMUNICATION")+2*SCROLL_BAR_WIDTH <= WINDOW_WIDTH+posx-startx) then
WINDOW_WIDTH = WINDOW_WIDTH+posx-startx
startx = posx
end -- if
if (3*SCROLL_BAR_WIDTH+10+line_height+theme.TITLE_HEIGHT <= WINDOW_HEIGHT+posy-starty) then
WINDOW_HEIGHT = WINDOW_HEIGHT+posy-starty
starty = posy
end -- if
init(false)
end -- function ResizeMoveCallback

function ResizeReleaseCallback()
WINDOW_HEIGHT = theme.TITLE_HEIGHT+(line_height*(WINDOW_LINES-1))+3
init(true)
end -- ResizeReleaseCallback

function OnPluginInstall()
-- Dummy window to get font characteristics
check (WindowCreate (Win, 0, 0, 1, 1, 0, 0, theme.WINDOW_BACKGROUND) )
check (WindowFont(Win, "bodyfont"..Win, BODY_FONT_NAME, BODY_FONT_SIZE))
check (WindowFont(Win, "titlefont"..Win, theme.TITLE_FONT_NAME, theme.TITLE_FONT_SIZE))
font_height = WindowFontInfo (Win, "bodyfont"..Win, 1) - WindowFontInfo (Win, "bodyfont"..Win, 4) + 1
line_height = font_height+1
font_width = WindowTextWidth (Win, "bodyfont"..Win, "W")

-- install the window movement handler, get back the window position
windowinfo = movewindow.install (Win, miniwin.pos_top_right, miniwin.create_absolute_location, true)

-- check for Echo/Timestamp/date_format/window size (in pixels) variables, if not there, set them
if date_format == nil then
date_format = "[%d %b %H:%M:%S] "
end -- if
if WINDOW_WIDTH == nil then
WINDOW_WIDTH = (font_width*80)+SCROLL_BAR_WIDTH -- 80 columns
end
if WINDOW_HEIGHT == nil then
WINDOW_HEIGHT = theme.TITLE_HEIGHT+(line_height*6)+2 -- 6 lines
end -- if
init(true)
OnPluginEnable () -- do initialization stuff
end -- function OnPluginInstall

function init(firstTime)
-- how many lines and columns will fit?
WINDOW_LINES = math.ceil((WINDOW_HEIGHT-theme.TITLE_HEIGHT)/line_height)
WINDOW_COLUMNS = math.ceil((WINDOW_WIDTH-SCROLL_BAR_WIDTH)/font_width)

if firstTime then
WindowCreate(Win, windowinfo.window_left, windowinfo.window_top, WINDOW_WIDTH, WINDOW_HEIGHT, windowinfo.window_mode, windowinfo.window_flags, theme.WINDOW_BACKGROUND)

-- catch for right-click menu and line selection
WindowAddHotspot(Win, "textarea", 0, theme.TITLE_HEIGHT, WINDOW_WIDTH-SCROLL_BAR_WIDTH,0,
"", "", "MouseDown", "CancelMouseDown", "MouseUp", "",
miniwin.cursor_ibeam, 0)
-- add the drag handler so they can move the window around
movewindow.add_drag_handler (Win, 0, 0, 0, theme.TITLE_HEIGHT)

-- scroll bar up/down buttons
WindowAddHotspot(Win, "up", WINDOW_WIDTH-SCROLL_BAR_WIDTH, theme.TITLE_HEIGHT, 0, theme.TITLE_HEIGHT+SCROLL_BAR_WIDTH,
"MouseOver", "CancelMouseOver", "MouseDown", "CancelMouseDown", "MouseUp", "",
miniwin.cursor_hand, 0)
WindowAddHotspot(Win, "down", WINDOW_WIDTH-SCROLL_BAR_WIDTH, WINDOW_HEIGHT-(2*SCROLL_BAR_WIDTH), 0, WINDOW_HEIGHT-SCROLL_BAR_WIDTH,
"MouseOver", "CancelMouseOver", "MouseDown", "CancelMouseDown", "MouseUp", "",
miniwin.cursor_hand, 0)

-- add the resize widget hotspot
WindowAddHotspot(Win, "resizer", WINDOW_WIDTH-SCROLL_BAR_WIDTH, WINDOW_HEIGHT-SCROLL_BAR_WIDTH, WINDOW_WIDTH, WINDOW_HEIGHT,
"MouseOver", "CancelMouseOver", "MouseDown", "CancelMouseDown", "MouseUp", "",
miniwin.cursor_nw_se_arrow, 0)
WindowDragHandler(Win, "resizer", "ResizeMoveCallback", "ResizeReleaseCallback", 0)
else
WindowResize(Win, WINDOW_WIDTH, WINDOW_HEIGHT, theme.WINDOW_BACKGROUND)
WindowMoveHotspot(Win, "textarea", 0, theme.TITLE_HEIGHT, WINDOW_WIDTH-SCROLL_BAR_WIDTH, 0)
WindowMoveHotspot(Win, "up", WINDOW_WIDTH-SCROLL_BAR_WIDTH, theme.TITLE_HEIGHT, 0, theme.TITLE_HEIGHT+SCROLL_BAR_WIDTH)
WindowMoveHotspot(Win, "down", WINDOW_WIDTH-SCROLL_BAR_WIDTH, WINDOW_HEIGHT-(2*SCROLL_BAR_WIDTH), 0, WINDOW_HEIGHT-SCROLL_BAR_WIDTH)
WindowMoveHotspot(Win, "resizer", WINDOW_WIDTH-SCROLL_BAR_WIDTH, WINDOW_HEIGHT-SCROLL_BAR_WIDTH, WINDOW_WIDTH, 0)
end -- if
WindowShow(Win, true)

if (firstTime == true) then
lines = {}
for _,styles in ipairs(rawlines) do
fillBuffer(styles)
end -- for each line
end -- if

lineStart = math.max(1, #lines-WINDOW_LINES+2)
lineEnd = math.max(1, #lines)
refresh()
end -- function init


Continues...
Top

Posted by Halig   Portugal  (123 posts)  Bio
Date Reply #25 on Mon 26 Oct 2015 07:35 PM (UTC)
Message
function OnPluginClose ()
-- if enabled
if GetPluginInfo (GetPluginID(), 17) then
OnPluginDisable()
end -- if enabled
end -- function OnPluginClose

function OnPluginEnable ()
WindowShow (Win, true)
end -- function OnPluginEnable

function OnPluginSaveState ()
-- save window current location for next time
SetVariable ("enabled", tostring (GetPluginInfo (GetPluginID(), 17)))
movewindow.save_state (Win)
-- save echo/timestamp status
SetVariable ("echo", tostring (echo))
SetVariable ("timestamp", tostring (timestamp))
SetVariable("date_format", date_format)
SetVariable("WINDOW_WIDTH", WINDOW_WIDTH)
SetVariable("WINDOW_HEIGHT", WINDOW_HEIGHT)
end -- function OnPluginSaveState

function OnPluginDisable ()
WindowShow( Win, false )
end -- function OnPluginDisable

-- display one line
function Display_Line (line, styles)

local left = TEXT_INSET
local top = theme.TITLE_HEIGHT + (line * line_height) + 1
local bottom = top + line_height
local font = "bodyfont" .. Win

if backfill then
WindowRectOp (Win, miniwin.rect_fill, 1, top, WINDOW_WIDTH - SCROLL_BAR_WIDTH, bottom, ColourNameToRGB("#333333"))
end -- backfill

if (styles) then
for _, style in ipairs (styles) do
local width = WindowTextWidth (Win, font, style.text) -- get width of text
local right = left + width
WindowRectOp (Win, miniwin.rect_fill, left, top, right, bottom, style.backcolour) -- draw background
WindowText (Win, font, style.text, left, top, 0, 0, style.textcolour) -- draw text
left = left + width -- advance horizontally
end -- for each style run
end -- if styles

end -- Display_Line

-- display all visible lines
function writeLines()
for count = lineStart, lineEnd do
Display_Line( count-lineStart, lines[count][1], false )
end -- for each line
Redraw()

end -- function writeLines

-- clear and redraw
function refresh()
WindowRectOp(Win, miniwin.rect_fill, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, theme.WINDOW_BACKGROUND)
drawStuff()
end -- function refresh

barPos = ""
barSize = ""
totalSteps = ""


Continues...
Top

Posted by Halig   Portugal  (123 posts)  Bio
Date Reply #26 on Mon 26 Oct 2015 07:36 PM (UTC)
Message
function drawStuff()
-- draw border
WindowRectOp (Win, miniwin.rect_frame, 0, 0, 0, 0, theme.WINDOW_BORDER)

-- Title bar
DrawThemed3DRect(Win, 0, 0, WINDOW_WIDTH, theme.TITLE_HEIGHT)

-- Title text
WindowText(Win, "titlefont"..Win, "COMMUNICATION", ((WINDOW_WIDTH)-(7.5*line_height))/2, (theme.TITLE_HEIGHT-line_height)/2, WINDOW_WIDTH, theme.TITLE_HEIGHT, theme.DETAIL, false)

if #lines >= 1 then
writeLines()
end -- if

-- Scrollbar base
WindowRectOp(Win, miniwin.rect_fill, WINDOW_WIDTH-SCROLL_BAR_WIDTH, theme.TITLE_HEIGHT, WINDOW_WIDTH, WINDOW_HEIGHT, theme.BACK_FACE) -- scroll bar background
WindowRectOp(Win, miniwin.rect_frame, WINDOW_WIDTH-SCROLL_BAR_WIDTH+1, SCROLL_BAR_WIDTH+theme.TITLE_HEIGHT+1, WINDOW_WIDTH-1, WINDOW_HEIGHT-(2*SCROLL_BAR_WIDTH)-1, theme.DETAIL) -- scroll bar background inset rectangle
DrawThemed3DRect(Win, WINDOW_WIDTH-SCROLL_BAR_WIDTH, theme.TITLE_HEIGHT, WINDOW_WIDTH, theme.TITLE_HEIGHT+SCROLL_BAR_WIDTH) -- top scroll button
DrawThemed3DRect(Win, WINDOW_WIDTH-SCROLL_BAR_WIDTH, WINDOW_HEIGHT-(SCROLL_BAR_WIDTH*2), WINDOW_WIDTH, WINDOW_HEIGHT-SCROLL_BAR_WIDTH) -- bottom scroll button

-- draw triangle in up button
points = string.format ("%i,%i,%i,%i,%i,%i", (WINDOW_WIDTH-SCROLL_BAR_WIDTH)+2, theme.TITLE_HEIGHT+8,(WINDOW_WIDTH-SCROLL_BAR_WIDTH)+6, theme.TITLE_HEIGHT+4,(WINDOW_WIDTH-SCROLL_BAR_WIDTH)+10, theme.TITLE_HEIGHT+8)
WindowPolygon (Win, points,
theme.DETAIL, miniwin.pen_solid, 1, -- pen (solid, width 1)
theme.DETAIL, miniwin.brush_solid, --brush (solid)
true, --close
false) --alt fill

-- draw triangle in down button
points = string.format ("%i,%i,%i,%i,%i,%i", (WINDOW_WIDTH-SCROLL_BAR_WIDTH)+2, (WINDOW_HEIGHT-SCROLL_BAR_WIDTH)-10,(WINDOW_WIDTH-SCROLL_BAR_WIDTH)+6, (WINDOW_HEIGHT-SCROLL_BAR_WIDTH)-6, (WINDOW_WIDTH-SCROLL_BAR_WIDTH)+10,(WINDOW_HEIGHT-SCROLL_BAR_WIDTH)-10)
WindowPolygon (Win, points,
theme.DETAIL, miniwin.pen_solid, 1, -- pen (solid, width 1)
theme.DETAIL, miniwin.brush_solid, --brush (solid)
true, --close
false) --alt fill

-- The scrollbar position indicator
totalSteps = #lines
if (totalSteps <= WINDOW_LINES-1) then totalSteps = 1 end
SCROLL_BAR_HEIGHT = (WINDOW_HEIGHT-(3*SCROLL_BAR_WIDTH)-theme.TITLE_HEIGHT)
if (not dragscrolling) then
stepNum = lineStart-1
barPos = SCROLL_BAR_WIDTH +theme.TITLE_HEIGHT+ ((SCROLL_BAR_HEIGHT/totalSteps) * stepNum)
barSize = (SCROLL_BAR_HEIGHT/math.max(WINDOW_LINES-1,totalSteps)) * (WINDOW_LINES-1)
if barSize < 10 then
barSize = 10
end
if barPos+barSize > SCROLL_BAR_WIDTH+theme.TITLE_HEIGHT+SCROLL_BAR_HEIGHT then
barPos = SCROLL_BAR_WIDTH+theme.TITLE_HEIGHT+SCROLL_BAR_HEIGHT - barSize
end
WindowAddHotspot(Win, "scroller", (WINDOW_WIDTH-SCROLL_BAR_WIDTH), barPos, WINDOW_WIDTH, barPos+barSize,
"MouseOver", "CancelMouseOver", "MouseDown", "CancelMouseDown", "MouseUp", "",
miniwin.cursor_hand, 0)
WindowDragHandler(Win, "scroller", "ScrollerMoveCallback", "ScrollerReleaseCallback", 0)
end -- if
DrawThemed3DRect(Win, WINDOW_WIDTH-SCROLL_BAR_WIDTH, barPos, WINDOW_WIDTH, barPos+barSize)

-- resizer tag
DrawThemedResizeTag(Win, WINDOW_WIDTH-SCROLL_BAR_WIDTH, WINDOW_HEIGHT-SCROLL_BAR_WIDTH, SCROLL_BAR_WIDTH)

Redraw()
end -- function drawStuff

function ScrollerMoveCallback(flags, hotspot_id)
mouseposy = WindowInfo(Win, 18)
windowtop = WindowInfo(Win, 2)
barPos = math.max(mouseposy-windowtop+clickdelta, SCROLL_BAR_WIDTH+theme.TITLE_HEIGHT)
if barPos > WINDOW_HEIGHT-(SCROLL_BAR_WIDTH*2)-barSize then
barPos = WINDOW_HEIGHT-(SCROLL_BAR_WIDTH*2)-barSize
lineStart = math.max(1,#lines-WINDOW_LINES+2)
lineEnd = #lines
else
lineStart = math.floor((barPos-SCROLL_BAR_WIDTH-theme.TITLE_HEIGHT)/(SCROLL_BAR_HEIGHT/totalSteps)+1)
lineEnd = math.min(lineStart + WINDOW_LINES-2, #lines)
end -- if
refresh()
end -- function ScrollerMoveCallback
Top

Posted by Halig   Portugal  (123 posts)  Bio
Date Reply #27 on Mon 26 Oct 2015 07:37 PM (UTC)
Message
function ScrollerReleaseCallback(flags, hotspot_id)
dragscrolling = false
refresh()
end -- function ScrollerReleaseCallback

function fillBuffer(rawstyles)
local avail = 0
local line_styles
local beginning = true
-- keep pulling out styles and trying to fit them on the current line
local styles = copytable.deep (rawstyles)
local remove = table.remove
local insert = table.insert
while #styles > 0 do
if avail <= 0 then -- no room available? start new line
-- remove first line if filled up
if #lines >= MAX_LINES then
remove (lines, 1)
end -- if
avail = WINDOW_WIDTH - (TEXT_INSET * 2) - 9
line_styles = {}
add_line( line_styles, beginning )
beginning = false
end -- line full

-- get next style, work out how long it is
local style = remove (styles, 1)
local width = WindowTextWidth (Win, "bodyfont"..Win, style.text)

-- if it fits, copy whole style in
if width <= avail then
insert (line_styles, style)
avail = avail - width
else -- otherwise, have to split style
-- look for trailing space (work backwards). remember where space is
local col = style.length - 1
local split_col
-- keep going until out of columns
while col > 1 do
width = WindowTextWidth (Win, "bodyfont"..Win, style.text:sub (1, col))
if width <= avail then
if not split_col then
split_col = col -- in case no space found, this is where we can split
end -- if
-- see if space here
if style.text:sub (col, col) == " " then
split_col = col
break
end -- if space
end -- if will now fit
col = col - 1
end -- while

-- if we found a place to split, use old style, and make it shorter. Also make a copy and put the rest in that
if split_col then
insert (line_styles, style)
local style_copy = copytable.shallow (style)
style.text = style.text:sub (1, split_col)
style.length = split_col
style_copy.text = style_copy.text:sub (split_col + 1)
style_copy.length = #style_copy.text
insert (styles, 1, style_copy)
elseif next (line_styles) == nil then
insert (line_styles, style)
else
insert (styles, 1, style)
end -- if
avail = 0 -- now we need to wrap
end -- if could not fit whole thing in
end -- while we still have styles over
end -- function fillBuffer
Top

Posted by Halig   Portugal  (123 posts)  Bio
Date Reply #28 on Mon 26 Oct 2015 07:37 PM (UTC)
Message
-- Main capture routine
function chats (name, line, wildcards, styles)

-- echo in this world as well if the user wants
if echo then
Simulate(stylesToANSI(styles).."\r\n")
end -- echo wanted

-- inject timestamp if wanted
if timestamp then
local tstamp = os.date (date_format)
table.insert (styles, 1, {
text = tstamp,
textcolour = ColourNameToRGB (TIMESTAMP_TEXT_COLOUR),
backcolour = ColourNameToRGB (TIMESTAMP_BACK_COLOUR),
length = string.len (tstamp),
style = 0,
} )
end -- if

-- store the raw lines for use during resizing
if #rawlines >= MAX_LINES then
table.remove(rawlines, 1)
end
table.insert(rawlines, styles)

fillBuffer(styles)
refresh( )
end -- function chats

function add_line ( line, is_beginning_of_message )
-- add new line
table.insert (lines, {line, false} )
lines[#lines][2] = is_beginning_of_message

-- advance the count
if #lines >= WINDOW_LINES then
lineStart = lineStart + 1
end -- if

if #lines > 1 then
lineEnd = lineEnd + 1
end -- if
end -- function add_line

keepscrolling = false
require "wait"

function scrollbar(calledBy)
wait.make (function()
while keepscrolling == true do
if calledBy == "up" then
if (lineStart > 1) then
lineStart = lineStart - 1
lineEnd = lineEnd - 1
WindowRectOp(Win, miniwin.rect_draw_edge, (WINDOW_WIDTH-SCROLL_BAR_WIDTH), theme.TITLE_HEIGHT, 0, theme.TITLE_HEIGHT+SCROLL_BAR_WIDTH,
miniwin.rect_edge_sunken, miniwin.rect_edge_at_all + miniwin.rect_option_fill_middle) -- up arrow pushed
points = string.format ("%i,%i,%i,%i,%i,%i", (WINDOW_WIDTH-SCROLL_BAR_WIDTH)+3, theme.TITLE_HEIGHT+9,(WINDOW_WIDTH-SCROLL_BAR_WIDTH)+7, theme.TITLE_HEIGHT+5,(WINDOW_WIDTH-SCROLL_BAR_WIDTH)+11, theme.TITLE_HEIGHT+9)
WindowPolygon (Win, points,
theme.DETAIL, miniwin.pen_solid, 1, -- pen (solid, width 1)
theme.DETAIL, miniwin.brush_solid, -- brush (solid)
true, -- close
false) -- alt fill
else
keepscrolling = false
end
elseif calledBy == "down" then
if (lineEnd < #lines) then
lineStart = lineStart + 1
lineEnd = lineEnd + 1
WindowRectOp(Win, miniwin.rect_draw_edge, (WINDOW_WIDTH-SCROLL_BAR_WIDTH), WINDOW_HEIGHT-(SCROLL_BAR_WIDTH*2), 0, WINDOW_HEIGHT-SCROLL_BAR_WIDTH-1,
miniwin.rect_edge_sunken, miniwin.rect_edge_at_all + miniwin.rect_option_fill_middle) -- down arrow pushed
points = string.format ("%i,%i,%i,%i,%i,%i", (WINDOW_WIDTH-SCROLL_BAR_WIDTH)+3, (WINDOW_HEIGHT-SCROLL_BAR_WIDTH)-11,(WINDOW_WIDTH-SCROLL_BAR_WIDTH)+7, (WINDOW_HEIGHT-SCROLL_BAR_WIDTH)-7, (WINDOW_WIDTH-SCROLL_BAR_WIDTH)+11,(WINDOW_HEIGHT-SCROLL_BAR_WIDTH)-11) -- draw triangle in up button
WindowPolygon (Win, points,
theme.DETAIL, miniwin.pen_solid, 1, -- pen (solid, width 1)
theme.DETAIL, miniwin.brush_solid, -- brush (solid)
true, -- close
false) -- alt fill
else
keepscrolling = false
end
end -- if
wait.time(0.1)
refresh()
end -- while keepscrolling
end) -- wait.make
end -- function scrollbar
Top

Posted by Halig   Portugal  (123 posts)  Bio
Date Reply #29 on Mon 26 Oct 2015 07:37 PM (UTC)
Message
function GetLineText (styles)
local t = {}
for _, style in ipairs (styles) do
table.insert (t, style.text)
end -- for
return table.concat (t)
end -- function GetLineText

function GetAllBufferedMessages()
local t = {}
for _,styles in ipairs(rawlines) do
table.insert (t, GetLineText (styles))
end -- for
SetClipboard(table.concat(t,"\r\n"))
end -- function GetAllBufferedMessages

function GetBufferedMessage(xpos, ypos)
windowline = math.floor(((ypos-theme.TITLE_HEIGHT)/line_height)+1)-1
text = ""
if (#lines > windowline) then
local line = windowline+lineStart
-- go to beginning of message
while lines[line][2] ~= true and line > 1 do
line = line - 1
end -- while
-- first line
local styles = copytable.deep(lines[line][1])
if (line-lineStart+1 > 0) then
Display_Line (line-lineStart, styles, true)
end -- if
text = GetLineText (styles)
-- remaining lines
line = line + 1
while line <= #lines and lines[line][2] ~= true do
local styles = copytable.deep(lines[line][1])
if (line-lineStart+1 > 0 and line-lineStart < WINDOW_LINES) then
Display_Line (line-lineStart, styles, true)
end
text = text.. GetLineText (styles)
line = line + 1
end -- while
SetClipboard(text)
end -- if
Redraw()

end -- function GetBufferedMessage

function MouseOver(flags, hotspot_id)
keepscrolling = false
end -- function MouseOver

function CancelMouseOver(flags, hotspot_id)
keepscrolling = false
end -- function CancelMouseOver

function MouseDown(flags, hotspot_id)
if (hotspot_id == "resizer") then
startx, starty = WindowInfo (Win, 17), WindowInfo (Win, 18)
elseif (hotspot_id == "scroller") then
clickdelta = WindowHotspotInfo(Win, "scroller", 2)-WindowInfo (Win, 15)
dragscrolling = true
elseif (hotspot_id == "textarea" and flags == miniwin.hotspot_got_lh_mouse) then
GetBufferedMessage(WindowInfo(Win, 14), WindowInfo(Win,15))
else
keepscrolling = true
scrollbar(hotspot_id)
end -- if
end -- function MouseDown

function CancelMouseDown(flags, hotspot_id)
keepscrolling = false
refresh()
end -- function CancelMouseDown

function MouseUp(flags, hotspot_id)
if (hotspot_id == "textarea" and flags == miniwin.hotspot_got_rh_mouse) then
-- build menu for current state
right_click_menu()
else
refresh()
end -- if
keepscrolling = false
end -- function MouseUp
Top

The dates and times for posts above are shown in Universal Co-ordinated Time (UTC).

To show them in your local time you can join the forum, and then set the 'time correction' field in your profile to the number of hours difference between your location and UTC time.


95,743 views.

This is page 2, subject is 3 pages long:  [Previous page]  1  2 3  [Next page]

It is now over 60 days since the last post. This thread is closed.     Refresh page

Go to topic:           Search the forum


[Go to top] top

Information and images on this site are licensed under the Creative Commons Attribution 3.0 Australia License unless stated otherwise.