scrn-wid.mkvi / last modification: 2020-01-30 14:16
%D \module
%D   [       file=scrn-int,
%D        version=2011.02.27, % moved from scrn-int
%D          title=\CONTEXT\ Core Macros,
%D       subtitle=Widgets,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

\writestatus{loading}{ConTeXt Interaction Macros / Widgets}

\registerctxluafile{scrn-wid}{}

% todo: expansion in comments (default is expanded)
% todo: check renderings ... acrobat crashes too easily on missing one

\unprotect

%D Attachments (mkiv upgraded):
%D
%D As usual in \CONTEXT\ we separate the general definition (frontend)
%D and the rendering (backend).

% hack: x\footnote{x\inleftmargin[scope=local]{\attachment[location=high,file=i-context.pdf]}}x

% old but stil valid method:
%
% \useattachment[test.tex]
% \useattachment[whatever][test.tex]
% \useattachment[whatever][newname][test.tex]
% \useattachment[whatever][title][newname][test.tex]
%
% new method:
%
% \registerattachment[sometag][specification] % name file author title subtitle
%
% \attachment[sometag][extra specs]
% \attachment[test.tex]
% \attachment[file=test.tex]
% \attachment[file=test.tex,method=hidden]
% \attachment[name=newname,file=test.tex]
% \attachment[title=mytitle,name=newname,file=test.tex]
%
% indirect
%
% \defineattachment[whatever5][file=test.tex] \attachment[whatever5][method=hidden]
% \defineattachment[whatever5][file=test.tex,method=hidden] \attachment[whatever5]
%
% direct (no definitions)
%
% \attachment[test][file=oeps.tex,title=Oeps,author=Hans,subtitle=TeX File,method=hidden]
% \attachment[label=test,file=oeps.tex,title=Oeps,author=Hans,subtitle=TeX File,method=hidden]
%
% autolabel:
%
% \attachment[file=oeps.tex,title=Oeps,author=Hans,subtitle=TeX File,method=hidden]
%
% % \setupattachments[\c!symbol={symbol-normal,symbol-down}]

% startattachment -> temp file

\newbox\b_scrn_attachment_collect
\newbox\b_scrn_attachment_link
\newbox\b_scrn_attachment_symbol

\installcorenamespace{attachment}
\installcorenamespace{attachmentlocation}
\installcorenamespace{attachmentmethod}

\installcommandhandler \??attachment {attachment} \??attachment

\let\setupattachments\setupattachment % convenience and compatibility

\setupattachment
  [\c!state=\v!start,
   \c!color=\interactionparameter\c!color,
  %\c!textlayer=,
  %\c!symbol=,
  %\c!title=,
  %\c!subtitle=,
  %\c!file=, % input filename
  %\c!name=, % new filename
  %\c!author=,
  %\c!method=, % \v!hidden = not in menu
  %\c!buffer=
   \c!symbol=,
   \c!distance=\emwidth,
   \c!width=\v!fit,
   \c!height=\v!fit,
   \c!depth=\v!fit,
   \c!location=\v!high]

\unexpanded\def\registerattachment
  {\dodoubleempty\scrn_attachment_register}

\def\scrn_attachment_register[#tag][#settings]% we save (globally) at the lua end
  {\ifsecondargument
     \begingroup
     \def\currentattachment{_}%
     \setupcurrentattachment[#settings,\s!parent=\??attachment]%
     \clf_registerattachment
        tag        {#tag}%
        registered {#tag}%
        title      {\attachmentparameter\c!title}%
        subtitle   {\attachmentparameter\c!subtitle}%
        author     {\attachmentparameter\c!author}%
        file       {\attachmentparameter\c!file}%
        name       {\attachmentparameter\c!name}%
        buffer     {\attachmentparameter\c!buffer}%
        mimetype   {\attachmentparameter\c!type}%
     \relax
     \endgroup
   \else
     % todo
   \fi}

\appendtoks
    \setuevalue         \currentattachment {\scrn_attachment_direct{\currentattachment}}%
    \setuevalue{\e!start\currentattachment}{\scrn_attachment_start {\currentattachment}}%
    \setuevalue{\e!stop \currentattachment}{\scrn_attachment_stop                     }%
\to \everydefineattachment

\unexpanded\def\scrn_attachment_direct#tag%
  {\edef\currentattachment{#tag}%
   \doifelselocation
     {\dodoubleempty\scrn_attachment_direct_status}
     {\dodoubleempty\scrn_attachment_direct_ignore}}

\def\scrn_attachment_direct_status
  {\doifelse{\attachmentparameter\c!state}\v!start
     \scrn_attachment_direct_indeed
     \scrn_attachment_direct_ignore}

\def\scrn_attachment_direct_indeed[#registered][#settings]%
  {\bgroup
   \doifelsenothing{#registered}
      {\scrn_attachment_inject[\v!auto][]}
      {\doifelseassignment{#registered}
         {\scrn_attachment_inject[\v!auto][#registered]}
         {\scrn_attachment_inject[#registered][#settings]}}%
   \egroup}

\def\scrn_attachment_direct_ignore[#tag][#settings]%
  {}

\unexpanded\def\scrn_attachment_start#tag%
  {\edef\currentattachment{#tag}%
   \doifelselocation
     {\dodoubleempty\scrn_attachment_start_indeed}
     {\dodoubleempty\scrn_attachment_start_ignore}}

\unexpanded\def\scrn_attachment_stop
  {}

\def\scrn_attachment_start_indeed
  {\doif{\attachmentparameter\c!state}\v!start
     {\scrn_attachment_start_indeed}
     {\scrn_attachment_start_ignore}}

\def\scrn_attachment_start_indeed[#registered][#settings]%
  {\bgroup
   \doifelsenothing{#registered}
     {\def\scrn_attachment_stop{\scrn_attachment_inject[\v!auto][\c!buffer=\v!attachment]\egroup}}%
     {\doifelseassignment{#registered}
        {\def\scrn_attachment_stop{\scrn_attachment_inject[\v!auto][\c!buffer=\v!attachment,#registered]\egroup}}%
        {\def\scrn_attachment_stop{\scrn_attachment_inject[#registered][\c!buffer=\v!attachment,#settings]\egroup}}}%
   \grabbufferdatadirect\v!attachment{\e!start\currentattachment}{\e!stop\currentattachment}}

\def\scrn_attachment_start_ignore
  {\expandafter\gobbleuntil\csname\e!stop\currentattachment\endcsname}

\def\scrn_attachment_inject[#registered][#settings]%
  {\edef\currentattachmentregistered{#registered}%
   \setupattachment[\currentattachment][#settings]%
   \expandnamespaceparameter\??attachmentmethod\attachmentparameter\c!method\v!normal}

\setvalue{\??attachmentmethod\v!normal}%
  {\edef\currentattachmentsymbol{\attachmentparameter\c!symbol}%
   \edef\currentattachmentwidth {\attachmentparameter\c!width }%
   \edef\currentattachmentheight{\attachmentparameter\c!height}%
   \edef\currentattachmentdepth {\attachmentparameter\c!depth }%
   \ifx\currentattachmentsymbol\empty
     \ifx\currentattachmentwidth \v!fit\edef\currentattachmentwidth {.5\emwidth}\fi
     \ifx\currentattachmentheight\v!fit\edef\currentattachmentheight{.5\emwidth}\fi
     \ifx\currentattachmentdepth \v!fit\let \currentattachmentdepth \zeropoint\fi
   \else
     \clf_presetsymbollist{\attachmentparameter\c!symbol}%
     % we cannot yet ask for the wd/ht/dp of an xform else we could use those
     \setbox\b_scrn_attachment_symbol\hbox{\symbol[\lastpredefinedsymbol]}%
     \ifx\currentattachmentwidth \v!fit\edef\currentattachmentwidth {\wd\b_scrn_attachment_symbol}\fi
     \ifx\currentattachmentheight\v!fit\edef\currentattachmentheight{\ht\b_scrn_attachment_symbol}\fi
     \ifx\currentattachmentdepth \v!fit\edef\currentattachmentdepth {\dp\b_scrn_attachment_symbol}\fi
   \fi
   \clf_insertattachment
     tag               {\currentattachment}%
     registered        {\currentattachmentregistered}%
     width             \dimexpr\currentattachmentwidth \relax
     height            \dimexpr\currentattachmentheight\relax
     depth             \dimexpr\currentattachmentdepth \relax
     color             {\attachmentparameter\c!color}%
     colormodel        \attribute\colormodelattribute
     colorvalue        \numexpr\thecolorattribute{\attachmentparameter\c!color}\relax % or are these chardefs
     transparencyvalue \numexpr\thetransparencyattribute{\attachmentparameter\c!color}\relax % or are these chardefs
     symbol            {\currentattachmentsymbol}%
     layer             {\attachmentparameter\c!textlayer}%
     % these will be overloaded by registered when available
     title             {\attachmentparameter\c!title}%
     subtitle          {\attachmentparameter\c!subtitle}%
     author            {\attachmentparameter\c!author}%
     file              {\attachmentparameter\c!file}%
     name              {\attachmentparameter\c!name}%
     buffer            {\attachmentparameter\c!buffer}%
     mimetype          {\attachmentparameter\c!type}%
   \relax
   \wd\b_scrn_attachment_link\currentattachmentwidth
   \ht\b_scrn_attachment_link\currentattachmentheight
   \dp\b_scrn_attachment_link\currentattachmentdepth
   \expandnamespaceparameter\??attachmentlocation\attachmentparameter\c!location\s!unknown}

\setvalue{\??attachmentmethod\v!hidden}%
  {\clf_insertattachment
     tag        {\currentattachment}%
     registered {\currentattachmentregistered}%
     method     {\v!hidden}%
     title      {\attachmentparameter\c!title}%
     subtitle   {\attachmentparameter\c!subtitle}%
     author     {\attachmentparameter\c!author}%
     file       {\attachmentparameter\c!file}%
     name       {\attachmentparameter\c!name}%
     buffer     {\attachmentparameter\c!buffer}%
     mimetype   {\attachmentparameter\c!type}%
   \relax}

\unexpanded\def\scrn_attachment_flush_traced
  {\hpack\bgroup
     \blackrule % can be a fast one
       [ \c!color=trace:r,
         \c!width=\wd\b_scrn_attachment_link,
        \c!height=\ht\b_scrn_attachment_link,
         \c!depth=\dp\b_scrn_attachment_link]%
     \kern-\wd\b_scrn_attachment_link
     \box\b_scrn_attachment_link
   \egroup}

\unexpanded\def\scrn_attachment_flush_normal
  {\box\b_scrn_attachment_link}

\installtextracker
  {attachments.anchors}
  {\let\scrn_attachment_flush\scrn_attachment_flush_traced}
  {\let\scrn_attachment_flush\scrn_attachment_flush_normal}

\let\scrn_attachment_flush\scrn_attachment_flush_normal

\setvalue{\??attachmentlocation\v!inmargin   }{\inmargin     {\scrn_attachment_flush}}
\setvalue{\??attachmentlocation\v!leftedge   }{\inleftedge   {\scrn_attachment_flush}}
\setvalue{\??attachmentlocation\v!rightedge  }{\inrightedge  {\scrn_attachment_flush}}
\setvalue{\??attachmentlocation\v!leftmargin }{\inleftmargin {\scrn_attachment_flush}}
\setvalue{\??attachmentlocation\v!rightmargin}{\inrightmargin{\scrn_attachment_flush}}
\setvalue{\??attachmentlocation\v!high       }{\high         {\scrn_attachment_flush}}

\setvalue{\??attachmentlocation\v!none}%
  {\global\setbox\b_scrn_attachment_collect\hbox\bgroup
     \ifvoid\b_scrn_attachment_collect\else
       \box\b_scrn_attachment_collect
       \hskip\attachmentparameter\c!distance\relax
     \fi
     \scrn_attachment_flush
   \egroup}

\setvalue{\??attachmentlocation\s!unknown}%
  {\ifvoid\b_scrn_attachment_collect\else
     \box\b_scrn_attachment_collect
   \fi}

\unexpanded\def\placeattachments
  {\ifvoid\b_scrn_attachment_collect\else
     \box\b_scrn_attachment_collect
   \fi}

\defineattachment[attachment]

% \ifx\currentinterface\defaultinterface \else
%     \defineattachment[\v!attachment]
% \fi

% backward compatible:

\unexpanded\def\useattachment
  {\doquadrupleempty\scrn_attachment_use}

\def\scrn_attachment_use[#tag][#title][#name][#file]%
  {\iffourthargument
     \registerattachment[#tag][title=#title,name=#name,file=#file]%
   \else\ifthirdargument
     \registerattachment[#tag][title=#title,name=#title,file=#name]%
   \else\ifsecondargument
     \registerattachment[#tag][title=#title,name=#title,file=#title]%
   \else
     \registerattachment[#tag][title=#tag,name=#tag,file=#tag]%
   \fi\fi\fi}

%D Comments:

% test
%
% \startcomment
%   hello beautiful\\world
% \stopcomment
%
% test
%
% \startcomment[hello]
%   hello << eerste >>
%   beautiful
%   world
% \stopcomment
%
% test
%
% \startcomment[hello][color=green,width=10cm,height=3cm]
%   hello
%   beautiful
%   world
% \stopcomment
%
% test
%
% \startcomment[hello][color=red,width=4cm,height=3cm]
%   hello
%
%   beautiful
%
%   world
% \stopcomment
%
% test
%
% \startcomment[symbol=Help]
%   Do we want this kind of rubish?
% \stopcomment
%
% test
%
% \definesymbol [comment-normal][{\externalfigure[cow.pdf]}]
% \definesymbol [comment-down]  [{\externalfigure[cow.pdf]}]
%
% \def\CowSymbol#1#2%
%  {\scale
%     [\c!height=#1]
%     {\startMPcode
%        loadfigure "koe.mp" number 1 ;
%        refill currentpicture withcolor #2 ;
%      \stopMPcode}}
%
% \definesymbol [comment-normal]
%   [\CowSymbol{4ex}{red}]
%
% \definesymbol [comment-down]
%   [\CowSymbol{4ex}{green}]
%
% \setupcomment
%   [\c!symbol={comment-normal,comment-down},
%    \c!option=\v!buffer]
%
% \startcomment[hello]
%     oeps
% \stopcomment
%
% test
%
% \setupcomment
%   [\c!symbol=normal,
%    \c!option=max,width=10cm]
%
% \startcomment[hello]
%     oeps
% \stopcomment
%
% test

%D The implementation is mostly the same as for attachments but sharing code
%D will not make it cleaner.

\installcorenamespace{comment}
\installcorenamespace{commentlocation}

\installcommandhandler \??comment {comment} \??comment

\newbox\b_scrn_comment_collect
\newbox\b_scrn_comment_rendering
\newbox\b_scrn_comment_link
\newbox\b_scrn_comment_symbol

\setupcomment
  [\c!state=\v!start,
   \c!distance=\emwidth,
   \c!color=\interactionparameter\c!color,
   \c!space=\v!no,
   \c!symbol=,
  %\c!title=,
  %\c!option=,
  %\c!textlayer=,
   \c!width=\v!fit,
   \c!height=\v!fit,
   \c!depth=\v!fit,
   \c!nx=40,
   \c!ny=10,
   \c!buffer=\v!comment,
   \c!location=\v!high]

\appendtoks
    \setuevalue         \currentcomment {\scrn_comment_argument{\currentcomment}}%
    \setuevalue{\e!start\currentcomment}{\scrn_comment_start   {\currentcomment}}%
    \setuevalue{\e!stop \currentcomment}{\scrn_comment_stop                     }%
\to \everydefinecomment

\unexpanded\def\scrn_comment_argument#category%
  {\def\currentcomment{#category}%
   \doifelselocation
     {\dodoubleempty\scrn_comment_argument_status}
     {\dodoubleempty\scrn_comment_argument_ignore}}

\def\scrn_comment_argument_status
  {\doifelse{\commentparameter\c!state}\v!start
     \scrn_comment_argument_indeed
     \scrn_comment_argument_ignore}

\def\scrn_comment_argument_indeed[#title][#settings]#text%
  {\doifelseassignment{#title}
     {\setupcurrentcomment[#title]}
     {\setupcurrentcomment[\c!title=#title,#settings]}%
   \clf_assignbuffer{\v!comment}{#text}\catcodetable\relax% todo: expansion control, but expanded by default (xml)
   \scrn_comment_inject
   \ignorespaces}

\def\scrn_comment_argument_ignore[#title][#settings]#text%
  {\ignorespaces}

\unexpanded\def\scrn_comment_start#category%
  {\def\currentcomment{#category}%
   \doifelselocation
     {\dodoubleempty\scrn_comment_start_status}
     {\dodoubleempty\scrn_comment_start_ignore}}

\def\scrn_comment_start_status
  {\doifelse{\commentparameter\c!state}\v!start
     {\scrn_comment_start_indeed}
     {\scrn_comment_start_ignore}}

\def\scrn_comment_start_indeed[#title][#settings]%
  {\bgroup
   \doifelseassignment{#title}
     {\setupcurrentcomment[#title]}
     {\setupcurrentcomment[\c!title=#title,#settings]}%
   \unexpanded\def\scrn_comment_stop{\scrn_comment_inject\egroup}%
   \grabbufferdatadirect\v!comment{\e!start\currentcomment}{\e!stop\currentcomment}}

\def\scrn_comment_start_ignore
  {\expandafter\gobbleuntil\csname\e!stop\currentcomment\endcsname}

\unexpanded\def\scrn_comment_stop
  {}

\installcorenamespace{commentmethods}

\unexpanded\def\scrn_comment_inject
  {\expandnamespaceparameter\??commentmethods\commentparameter\c!method\v!normal}

%D Beware: comments symbols don't scale in acrobat (cf. spec but somewhat
%D weird, esp because for instance attachment symbols do scale).

\setvalue{\??commentmethods\v!normal}%
  {\edef\currentcommentsymbol{\commentparameter\c!symbol}%
   \edef\currentcommentwidth {\commentparameter\c!width }%
   \edef\currentcommentheight{\commentparameter\c!height}%
   \edef\currentcommentdepth {\commentparameter\c!depth }%
   \ifx\currentcommentsymbol\empty
     \ifx\currentcommentwidth \v!fit\edef\currentcommentwidth {.5\emwidth}\fi
     \ifx\currentcommentheight\v!fit\edef\currentcommentheight{.5\emwidth}\fi
     \ifx\currentcommentdepth \v!fit\let \currentcommentdepth \zeropoint\fi
   \else
     \clf_presetsymbollist{\commentparameter\c!symbol}%
     % we cannot yet ask for the wd/ht/dp of an xform else we could use those
     \setbox\b_scrn_comment_symbol\hbox{\symbol[\lastpredefinedsymbol]}%
     \ifx\currentcommentwidth \v!fit\edef\currentcommentwidth {\wd\b_scrn_comment_symbol}\fi
     \ifx\currentcommentheight\v!fit\edef\currentcommentheight{\ht\b_scrn_comment_symbol}\fi
     \ifx\currentcommentdepth \v!fit\edef\currentcommentdepth {\dp\b_scrn_comment_symbol}\fi
   \fi
   \clf_insertcomment
     tag               {\currentcomment}%
     title             {\commentparameter\c!title}%
     subtitle          {\commentparameter\c!subtitle}%
     author            {\commentparameter\c!author}%
     width             \dimexpr\currentcommentwidth\relax
     height            \dimexpr\currentcommentheight\relax
     depth             \dimexpr\currentcommentdepth\relax
     nx                {\commentparameter\c!nx}%
     ny                {\commentparameter\c!ny}%
     colormodel        \attribute\colormodelattribute
     colorvalue        \numexpr\thecolorattribute{\commentparameter\c!color}\relax
     transparencyvalue \numexpr\thetransparencyattribute{\commentparameter\c!color}\relax
     option            {\commentparameter\c!option}% % todo
     symbol            {\commentparameter\c!symbol}%
     buffer            {\commentparameter\c!buffer}% {\v!comment}%
     layer             {\commentparameter\c!textlayer}%
     space             {\commentparameter\c!space}%
   \relax
   \wd\b_scrn_comment_link\currentcommentwidth
   \ht\b_scrn_comment_link\currentcommentheight
   \dp\b_scrn_comment_link\currentcommentdepth
   \expandnamespaceparameter\??commentlocation\commentparameter\c!location\s!unknown}

\letvalue{\??commentmethods\v!hidden}\donothing

\unexpanded\def\scrn_comment_flush_traced
  {\hpack\bgroup
     \blackrule % can be a fast one
       [ \c!color=trace:y,
         \c!width=\wd\b_scrn_comment_link,
        \c!height=\ht\b_scrn_comment_link,
         \c!depth=\dp\b_scrn_comment_link]%
     \kern-\wd\b_scrn_comment_link
     \box\b_scrn_comment_link
   \egroup}

\unexpanded\def\scrn_comment_flush_normal
  {\box\b_scrn_comment_link}

\installtextracker
  {comments.anchors}
  {\let\scrn_comment_flush\scrn_comment_flush_traced}
  {\let\scrn_comment_flush\scrn_comment_flush_normal}

\let\scrn_comment_flush\scrn_comment_flush_normal

% todo: dedicated margin classes

\setvalue{\??commentlocation\v!inmargin   }{\inmargin     {\scrn_comment_flush}}
\setvalue{\??commentlocation\v!leftedge   }{\inleftedge   {\scrn_comment_flush}}
\setvalue{\??commentlocation\v!rightedge  }{\inrightedge  {\scrn_comment_flush}}
\setvalue{\??commentlocation\v!leftmargin }{\inleftmargin {\scrn_comment_flush}}
\setvalue{\??commentlocation\v!rightmargin}{\inrightmargin{\scrn_comment_flush}}
\setvalue{\??commentlocation\v!high       }{\high         {\scrn_comment_flush}}

\setvalue{\??commentlocation\v!none}%
  {\global\setbox\b_scrn_comment_collect\hbox\bgroup
     \ifvoid\b_scrn_comment_collect\else
       \box\b_scrn_comment_collect
       \hskip\commentparameter\c!distance\relax
     \fi
     \scrn_comment_flush
   \egroup}

\setvalue{\??commentlocation\s!unknown}%
  {\ifvoid\b_scrn_comment_collect\else
     \box\b_scrn_comment_collect
   \fi}

\unexpanded\def\placecomments
  {\ifvoid\b_scrn_comment_collect\else
     \box\b_scrn_comment_collect
   \fi}

\definecomment[comment]

% \ifx\currentinterface\defaultinterface \else
%     \definecomment[\v!comment]
% \fi

%D Soundclips:
%D
%D Defining sound tracks:
%D
%D \starttyping
%D \useexternalsoundtrack[label][file]
%D \stoptyping
%D
%D associated actions: StartSound StopSound PauseSound ResumeSound
%D
%D Todo: like external figures, also search on path,
%D although, they need to be present ar viewing time, so ...

\installcorenamespace{externalsoundtracks}

\installsetuponlycommandhandler \??externalsoundtracks {externalsoundtracks}

\setupexternalsoundtracks
  [\c!option=]

\unexpanded\def\useexternalsoundtrack
  {\dodoubleargument\scrn_soundtrack_indeed}

\def\scrn_soundtrack_indeed[#tag][#filename]%
  {\clf_registersoundclip
     tag  {#tag}%
     file {#filename}%
   \relax}

\def\checksoundtrack#tag% yet untested in mkiv (also move management to lua)
  {\iflocation
     \clf_insertsoundclip
       tag    {#tag}%
       repeat {\directexternalsoundtrackparameter\c!option}%
     \relax
   \fi}

%D Renderings (not yet tested in mkvi):

% Todo: multiple instances and inheritance .. will be done when
% needed i.e. when I see usage.

\let\currentrendering\empty

\definereference[StartCurrentRendering] [\v!StartRendering {\currentrendering}]
\definereference[StopCurrentRendering]  [\v!StopRendering  {\currentrendering}]
\definereference[PauseCurrentRendering] [\v!PauseRendering {\currentrendering}]
\definereference[ResumeCurrentRendering][\v!ResumeRendering{\currentrendering}]

\unexpanded\def\useexternalrendering{\doquadrupleempty\scrn_rendering_use}
\unexpanded\def\setinternalrendering{\dodoubleempty   \scrn_rendering_set}

\def\scrn_rendering_use[#tag][#mime][#file][#option]%
  {\clf_registerrendering
     type     {external}%
     label    {#tag}%
     mime     {#mime}%
     filename {#file}%
     option   {#option}%
   \relax}

\def\scrn_rendering_set[#tag][#option]% {content} % crappy
  {\bgroup
   \dowithnextbox
     {\clf_registerrendering
         type     {internal}%
         label    {#tag}%
         mime     {IRO}% brrr
         filename {#tag}%
         option   {#option}%
      \relax
      \let\objectoffset\zeropoint
      \setobject{IRO}{#tag}\hpack{\box\nextbox}%
      \egroup}%
     \hbox}

\def\renderingtype  #tag{\clf_renderingvar{#tag}{type}}
\def\renderingoption#tag{\clf_renderingvar{#tag}{option}}

\newdimen\d_scrn_rendering_width  \d_scrn_rendering_width  8cm
\newdimen\d_scrn_rendering_height \d_scrn_rendering_height 6cm

\let\m_scrn_rendering_page\!!zerocount

\installcorenamespace{renderingwindow}

\installframedcommandhandler \??renderingwindow {renderingwindow} \??renderingwindow

\appendtoks
    \letrenderingwindowparameter\c!openpageaction \empty
    \letrenderingwindowparameter\c!closepageaction\empty
    \setrenderingwindowparameter\c!width          {\d_scrn_rendering_width }%
    \setrenderingwindowparameter\c!height         {\d_scrn_rendering_height}%
\to \everypresetrenderingwindow

\unexpanded\def\placerenderingwindow
  {\dodoubleempty\scrn_rendering_place_window}

\def\scrn_rendering_place_window[#window][#rendering]% do all in lua
  {\bgroup
   \edef\currentrendering{\ifsecondargument#rendering\else#window\fi}%
   % create fall back if needed
   \edef\currentrenderingwindow{\namedrenderingwindowparameter{#window}\c!width}% stupid test, we need a proper one here
   \ifx\currentrenderingwindow\empty
     \let\currentrenderingwindow\s!default
     \definerenderingwindow[\currentrenderingwindow]% why not global
   \else
     \edef\currentrenderingwindow{#window}%
   \fi
   \edef\currentrenderingtype{\renderingtype\currentrendering}%
   \ifx\currentrenderingtype\s!internal
     \getobjectdimensions{IRO}\currentrendering
     \d_scrn_rendering_height\dimexpr\objectheight+\objectdepth\relax
     \d_scrn_rendering_width\objectwidth\relax
     \dogetobjectreferencepage{IRO}\currentrendering\m_scrn_rendering_page
   \else\ifx\currentrenderingwindow\s!default
     \d_scrn_rendering_height\vsize
     \d_scrn_rendering_width \hsize
     \let\m_scrn_rendering_page\realpageno
   \else
     \d_scrn_rendering_height\renderingwindowparameter\c!height
     \d_scrn_rendering_width \renderingwindowparameter\c!width
     \let\m_scrn_rendering_page\realpageno
   \fi\fi
 % todo:
 % \handlereferenceactions{\renderingwindowparameter\c!openpageaction }\dosetuprenderingopenpageaction
 % \handlereferenceactions{\renderingwindowparameter\c!closepageaction}\dosetuprenderingclosepageaction
   \letrenderingwindowparameter\c!offset\v!overlay
   \inheritedrenderingwindowframed
     {\vfilll
      \dontleavehmode
      \clf_insertrenderingwindow
        label  {\currentrendering}%
        width  \d_scrn_rendering_width
        height \d_scrn_rendering_height
        option {\renderingoption\currentrendering}%
        page   \m_scrn_rendering_page
      \relax
      \hfill}%
   \egroup}

%D Linkedlists (not tested in mkvi):

% %D The next mechanism, linked lists, is quite old and
% %D is \MKIV'd for completeness. I will finish the
% %D configuration part when I need it.
% %D
% %D \starttyping
% %D \setupinteraction[state=start]
% %D \definelinkedlist[demo]
% %D \dorecurse{10}{\linkedlistelement[demo]{link \recurselevel} \page}
% %D \stoptyping
%
% \definesystemvariable {lk}   % LinK
%
% \installcommandhandler\??lk{linkedlist}\??lk
%
% \let\setupbutton\setuplinkedlists\setuplinkedlist
%
% \appendtoks
%     \clf_definelinkedlist{\currentlinkedlist}%
% \to \everydefinelinkedlist
%
% \def\setlinkedlistproperties#1#2#3#4#5#6%
%   {\def\currentlink {#1}%
%    \def\noflinks    {#2}%
%    \def\firstlink   {#3}%
%    \def\previouslink{#4}%
%    \def\nextlink    {#5}%
%    \def\lastlink    {#6}}
%
% \def\linkedlistelement[#1]#2% currently no view support
%   {\dontleavehmode\hbox\bgroup
%    #2%
%    \iflocation
%      \edef\currentlinkedlist{#1}%
%      \ifcsname\??lk\currentlinkedlist\s!parent\endcsname
%        \hskip\linkedlistparameter\c!distance\relax
%        \clf_addlinklistelement{\currentlinkedlist}%
%        \expanded{\ctxlatecommand{enhancelinkedlist("\currentlinkedlist",\currentlink)}}% can also be done at the lua end
%        \dogotosomepage  {\??lk\currentlinkedlist}\gotobegincharacter \firstlink
%        \ifnum\noflinks>\plustwo
%          \dogotosomepage{\??lk\currentlinkedlist}\gobackwardcharacter\previouslink
%          \dogotosomepage{\??lk\currentlinkedlist}\goforwardcharacter \nextlink
%        \fi
%        \dogotosomepage  {\??lk\currentlinkedlist}\gotoendcharacter   \lastlink
%      \else
%        \writestatus\m!interactions{no such linked list: \currentlinkedlist}%
%      \fi
%    \fi
%    \egroup}
%
% \setuplinkedlists
%   [\c!distance=.25em,
%    \c!width=\v!fit,
%    \c!location=\v!low,
%    \c!color=\interactionparameter\c!color,
%    \c!frame=\v!off,
%    \c!background=,
%    \c!backgroundcolor=]

\protect \endinput