3 * - By John Hodge (thePowersGang)
6 * - Virtual Terminal - Input code
9 #include <api_drv_video.h>
13 * \fn void VT_InitOutput()
14 * \brief Initialise Video Output
18 giVT_OutputDevHandle = VFS_Open(gsVT_OutputDevice, VFS_OPENFLAG_WRITE);
19 if(giVT_OutputDevHandle == -1) {
20 Log_Warning("VTerm", "Oh F**k, I can't open the video device '%s'", gsVT_OutputDevice);
23 VT_SetResolution( giVT_RealWidth, giVT_RealHeight );
25 VT_SetMode( VIDEO_BUFFMT_TEXT );
29 * \brief Set video output buffer mode
31 void VT_SetMode(int Mode)
33 VFS_IOCtl( giVT_OutputDevHandle, VIDEO_IOCTL_SETBUFFORMAT, &Mode );
37 * \fn void VT_int_ScrollFramebuffer( tVTerm *Term, int Count )
38 * \note Scrolls the framebuffer down by \a Count text lines
40 void VT_int_ScrollFramebuffer( tVTerm *Term, int Count )
50 // Only update if this is the current terminal
51 if( Term != gpVT_CurTerm ) return;
53 if( Count > Term->ScrollHeight ) Count = Term->ScrollHeight;
54 if( Count < -Term->ScrollHeight ) Count = -Term->ScrollHeight;
56 // Switch to 2D Command Stream
57 tmp = VIDEO_BUFFMT_2DSTREAM;
58 VFS_IOCtl(giVT_OutputDevHandle, VIDEO_IOCTL_SETBUFFORMAT, &tmp);
60 // BLIT to 0,0 from 0,giVT_CharHeight
61 buf.Op = VIDEO_2DOP_BLIT;
62 buf.SrcX = 0; buf.DstX = 0;
63 // TODO: Don't assume character dimensions
64 buf.W = Term->TextWidth * giVT_CharWidth;
67 buf.SrcY = (Term->ScrollTop+Count) * giVT_CharHeight;
68 buf.DstY = Term->ScrollTop * giVT_CharHeight;
70 else // Scroll up, move text down
73 buf.SrcY = Term->ScrollTop * giVT_CharHeight;
74 buf.DstY = (Term->ScrollTop+Count) * giVT_CharHeight;
76 buf.H = (Term->ScrollHeight-Count) * giVT_CharHeight;
77 VFS_WriteAt(giVT_OutputDevHandle, 0, sizeof(buf), &buf);
79 // Restore old mode (this function is only called during text mode)
80 tmp = VIDEO_BUFFMT_TEXT;
81 VFS_IOCtl(giVT_OutputDevHandle, VIDEO_IOCTL_SETBUFFORMAT, &tmp);
84 void VT_int_UpdateCursor( tVTerm *Term, int bShow )
86 tVideo_IOCtl_Pos csr_pos;
88 if( Term != gpVT_CurTerm ) return ;
95 else if( Term->Mode == TERM_MODE_TEXT )
99 // if( !(Term->Flags & VT_FLAG_SHOWCSR)
100 // && ( (Term->Flags & VT_FLAG_HIDECSR) || !Term->Node.ReadThreads)
102 if( !Term->Text || Term->Flags & VT_FLAG_HIDECSR )
109 if(Term->Flags & VT_FLAG_ALTBUF)
110 offset = Term->AltWritePos;
112 offset = Term->WritePos - Term->ViewPos;
114 csr_pos.x = offset % Term->TextWidth;
115 csr_pos.y = offset / Term->TextWidth;
116 if( 0 > csr_pos.y || csr_pos.y >= Term->TextHeight )
117 csr_pos.y = -1, csr_pos.x = -1;
122 csr_pos.x = Term->VideoCursorX;
123 csr_pos.y = Term->VideoCursorY;
125 VFS_IOCtl(giVT_OutputDevHandle, VIDEO_IOCTL_SETCURSOR, &csr_pos);
129 * \fn void VT_int_UpdateScreen( tVTerm *Term, int UpdateAll )
130 * \brief Updates the video framebuffer
132 void VT_int_UpdateScreen( tVTerm *Term, int UpdateAll )
135 int view_pos, write_pos;
136 // Only update if this is the current terminal
137 if( Term != gpVT_CurTerm ) return;
142 view_pos = (Term->Flags & VT_FLAG_ALTBUF) ? 0 : Term->ViewPos;
143 write_pos = (Term->Flags & VT_FLAG_ALTBUF) ? Term->AltWritePos : Term->WritePos;
144 buffer = (Term->Flags & VT_FLAG_ALTBUF) ? Term->AltBuf : Term->Text;
145 // Re copy the entire screen?
148 giVT_OutputDevHandle,
150 Term->TextWidth*Term->TextHeight*sizeof(tVT_Char),
154 // Only copy the current line
156 int ofs = write_pos - write_pos % Term->TextWidth;
158 giVT_OutputDevHandle,
159 (ofs - view_pos)*sizeof(tVT_Char),
160 Term->TextWidth*sizeof(tVT_Char),
169 VT_int_UpdateCursor(Term, 1);