⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tescreen.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/************************************************************************ Copyright (C) 2000-2005 Trolltech AS and its licensors.** All rights reserved.**** This file is part of the Qtopia Environment.**** This file may be distributed and/or modified under the terms of the** GNU General Public License version 2 as published by the Free Software** Foundation and appearing in the file LICENSE.GPL included in the** packaging of this file.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.**** See http://www.trolltech.com/gpl/ for GPL licensing information.** See below for additional copyright and license information**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************//* -------------------------------------------------------------------------- *//*                                                                            *//* [TEScreen.C]               Screen Data Type                                *//*                                                                            *//* -------------------------------------------------------------------------- *//*                                                                            *//* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de>            *//*                                                                            *//* This file is part of Konsole - an X terminal for KDE                       *//*                                                                            *//* -------------------------------------------------------------------------- *//*									      *//* Konsole ported to Qt/Embedded by Trolltech                                 *//*									      *//* -------------------------------------------------------------------------- *//* \file*//* \class TEScreen    \brief The TEScreen class represents the image manipulated by the emulation.    This class implements the operations of the terminal emulation framework.    It is a complete passive device, driven by the emulation decoder    (TEmuVT102). By this it forms in fact an ADT, that defines operations    on a rectangular image.    It does neither know how to display its image nor about escape sequences.    It is further independent of the underlying toolkit. By this, one can even    use this module for an ordinary text surface.    Since the operations are called by a specific emulation decoder, one may    collect their different operations here.    The state manipulated by the operations is mainly kept in `image', though    it is a little more complex bejond this. See the header file of the class.    \sa TEWidget \sa VT102Emulation*/#include <stdio.h>#include <stdlib.h>#include <unistd.h>// #include <kdebug.h>#include <assert.h>#include <string.h>#include <ctype.h>#include "TEScreen.h"#define HERE printf("%s(%d): here\n",__FILE__,__LINE__)//FIXME: this is emulation specific. Use FALSE for xterm, TRUE for ANSI.//FIXME: see if we can get this from terminfo.#define BS_CLEARS FALSE#define loc(X,Y) ((Y)*columns+(X))/* creates a `TEScreen' of \a lines and \a columns.*/TEScreen::TEScreen(int lines, int columns){  this->lines   = lines;  this->columns = columns;  image      = (ca*) malloc(lines*columns*sizeof(ca));  tabstops   = NULL; initTabStops();  histCursor = 0;  clearSelection();  reset();}/* Destructor*/TEScreen::~TEScreen(){  free(image);  if (tabstops) free(tabstops);}/* ------------------------------------------------------------------------- *//*                                                                           *//* Normalized                    Screen Operations                           *//*                                                                           *//* ------------------------------------------------------------------------- */// Cursor Setting --------------------------------------------------------------/*? \section Cursor    The `cursor' is a location within the screen that is implicitely used in    many operations. The operations within this section allow to manipulate    the cursor explicitly and to obtain it's value.    The position of the cursor is guarantied to be between (including) 0 and    `columns-1' and `lines-1'.*//*    Move the cursor up \a n lines.    The cursor will not be moved beyond the top margin.*/void TEScreen::cursorUp(int n)//=CUU{  if (n == 0) n = 1; // Default  int stop = cuY < tmargin ? 0 : tmargin;  cuX = QMIN(columns-1,cuX); // nowrap!  cuY = QMAX(stop,cuY-n);}/*    Move the cursor down \a n lines.    The cursor will not be moved beyond the bottom margin.*/void TEScreen::cursorDown(int n)//=CUD{  if (n == 0) n = 1; // Default  int stop = cuY > bmargin ? lines-1 : bmargin;  cuX = QMIN(columns-1,cuX); // nowrap!  cuY = QMIN(stop,cuY+n);}/*    Move the cursor left \a n columns.    The cursor will not move beyond the first column.*/void TEScreen::cursorLeft(int n)//=CUB{  if (n == 0) n = 1; // Default  cuX = QMIN(columns-1,cuX); // nowrap!  cuX = QMAX(0,cuX-n);}/*    Move the cursor right \a n columns.    The cursor will not move beyond the rightmost column.*/void TEScreen::cursorRight(int n)//=CUF{  if (n == 0) n = 1; // Default  cuX = QMIN(columns-1,cuX+n);}/*    Set \a top and \a bot (tom) margin.*/void TEScreen::setMargins(int top, int bot)//=STBM{  if (top == 0) top = 1;      // Default  if (bot == 0) bot = lines;  // Default  top = top - 1;              // Adjust to internal lineno  bot = bot - 1;              // Adjust to internal lineno  if ( !( 0 <= top && top < bot && bot < lines ) )  { fprintf(stderr,"%s(%d) : setRegion(%d,%d) : bad range.\n", // No tr                   __FILE__,__LINE__,top,bot);    return;                   // Default error action: ignore  }  tmargin = top;  bmargin = bot;  cuX = 0;  cuY = getMode(MODE_Origin) ? top : 0;}/*    Move the cursor down one line.    If cursor is on bottom margin, the region between the    actual top and bottom margin is scrolled up instead.*/void TEScreen::index()//=IND{  if (cuY == bmargin)  {    if (tmargin == 0 && bmargin == lines-1) addHistLine(); // hist.history    scrollUp(tmargin,1);  }  else if (cuY < lines-1)    cuY += 1;}/*    Move the cursor up one line.    If cursor is on the top margin, the region between the    actual top and bottom margin is scrolled down instead.*/void TEScreen::reverseIndex()//=RI{  if (cuY == tmargin)     scrollDown(tmargin,1);  else if (cuY > 0)    cuY -= 1;}/*    Move the cursor to the begin of the next line.    If cursor is on bottom margin, the region between the    actual top and bottom margin is scrolled up.*/void TEScreen::NextLine()//=NEL{  Return(); index();}// Line Editing ----------------------------------------------------------------/*? \section inserting / deleting characters*//* erase \a n characters starting from (including) the cursor position.    The line is filled in from the right with spaces.*/void TEScreen::eraseChars(int n){  if (n == 0) n = 1; // Default  int p = QMAX(0,QMIN(cuX+n-1,columns-1));  clearImage(loc(cuX,cuY),loc(p,cuY),' ');}/* delete \a n characters starting from (including) the cursor position.    The line is filled in from the right with spaces.*/void TEScreen::deleteChars(int n){  if (n == 0) n = 1; // Default  int p = QMAX(0,QMIN(cuX+n,columns-1));  moveImage(loc(cuX,cuY),loc(p,cuY),loc(columns-1,cuY));  clearImage(loc(columns-n,cuY),loc(columns-1,cuY),' ');}/* insert \a n spaces at the cursor position.    The cursor is not moved by the operation.*/void TEScreen::insertChars(int n){  if (n == 0) n = 1; // Default  int p = QMAX(0,QMIN(columns-1-n,columns-1));  int q = QMAX(0,QMIN(cuX+n,columns-1));  moveImage(loc(q,cuY),loc(cuX,cuY),loc(p,cuY));  clearImage(loc(cuX,cuY),loc(q-1,cuY),' ');}/* delete \a n lines starting from (including) the cursor position.    The cursor is not moved by the operation.*/void TEScreen::deleteLines(int n){  if (n == 0) n = 1; // Default  scrollUp(cuY,n);}/* insert \a n lines at the cursor position.    The cursor is not moved by the operation.*/void TEScreen::insertLines(int n){  if (n == 0) n = 1; // Default  scrollDown(cuY,n);}// Mode Operations -----------------------------------------------------------/* Set a specific mode. */void TEScreen::setMode(int m){  currParm.mode[m] = TRUE;  switch(m)  {    case MODE_Origin : cuX = 0; cuY = tmargin; break; //FIXME: home  }}/* Reset a specific mode. */void TEScreen::resetMode(int m){  currParm.mode[m] = FALSE;  switch(m)  {    case MODE_Origin : cuX = 0; cuY = 0; break; //FIXME: home  }}/* Save a specific mode. */void TEScreen::saveMode(int m){  saveParm.mode[m] = currParm.mode[m];}/* Restore a specific mode. */void TEScreen::restoreMode(int m){  currParm.mode[m] = saveParm.mode[m];}//NOTE: this is a helper function/* Return the setting  a specific mode. */BOOL TEScreen::getMode(int m){  return currParm.mode[m];}/* Save the cursor position and the rendition attribute settings. */void TEScreen::saveCursor(){  sa_cuX     = cuX;  sa_cuY     = cuY;  sa_cu_re   = cu_re;  sa_cu_fg   = cu_fg;  sa_cu_bg   = cu_bg;}/* Restore the cursor position and the rendition attribute settings. */void TEScreen::restoreCursor(){  cuX     = QMIN(sa_cuX,columns-1);  cuY     = QMIN(sa_cuY,lines-1);  cu_re   = sa_cu_re;  cu_fg   = sa_cu_fg;  cu_bg   = sa_cu_bg;  effectiveRendition();}/* ------------------------------------------------------------------------- *//*                                                                           *//*                             Screen Operations                             *//*                                                                           *//* ------------------------------------------------------------------------- *//* Assing a new size, of \a new_lines and \a new_columns to the screen.    The topmost left position is maintained, while lower lines    or right hand side columns might be removed or filled with    spaces to fit the new size.    The region setting is reset to the whole screen and the    tab positions reinitialized.*/void TEScreen::resizeImage(int new_lines, int new_columns){  //  // Don't generate empty images.  //  if (new_lines == 0 || new_columns == 0) {    return;  }  if (cuY > new_lines-1)  { // attempt to preserve focus and lines    bmargin = lines-1; //FIXME: margin lost    for (int i = 0; i < cuY-(new_lines-1); i++)    {      addHistLine(); scrollUp(0,1);    }  }  // make new image  ca* newimg = (ca*)malloc(new_lines*new_columns*sizeof(ca));  clearSelection();    int x, y;  // clear new image  for (y = 0; y < new_lines; y++)  for (x = 0; x < new_columns; x++)  {    newimg[y*new_columns+x].c = ' ';    newimg[y*new_columns+x].f = DEFAULT_FORE_COLOR;    newimg[y*new_columns+x].b = DEFAULT_BACK_COLOR;    newimg[y*new_columns+x].r = DEFAULT_RENDITION;  }  int cpy_lines   = QMIN(new_lines,  lines);  int cpy_columns = QMIN(new_columns,columns);  // copy to new image  for (y = 0; y < cpy_lines; y++)  for (x = 0; x < cpy_columns; x++)  {    newimg[y*new_columns+x].c = image[loc(x,y)].c;    newimg[y*new_columns+x].f = image[loc(x,y)].f;    newimg[y*new_columns+x].b = image[loc(x,y)].b;    newimg[y*new_columns+x].r = image[loc(x,y)].r;  }  free(image);  image = newimg;  lines = new_lines;  columns = new_columns;  cuX = QMIN(cuX,columns-1);  cuY = QMIN(cuY,lines-1);  // FIXME: try to keep values, evtl.  tmargin=0;  bmargin=lines-1;  initTabStops();  clearSelection();}/*   Clarifying rendition here and in TEWidget.   currently, TEWidget's color table is     0       1       2 .. 9    10 .. 17     dft_fg, dft_bg, dim 0..7, intensive 0..7   cu_fg, cu_bg contain values 0..8;   - 0    = default color   - 1..8 = ansi specified color   re_fg, re_bg contain values 0..17   due to the TEWidget's color table   rendition attributes are      attr           widget screen      -------------- ------ ------      RE_UNDERLINE     XX     XX    affects foreground only      RE_BLINK         XX     XX    affects foreground only      RE_BOLD          XX     XX    affects foreground only      RE_REVERSE       --     XX      RE_TRANSPARENT   XX     --    affects background only      RE_INTENSIVE     XX     --    affects foreground only   Note that RE_BOLD is used in both widget   and screen rendition. Since xterm/vt102   is to poor to distinguish between bold   (which is a font attribute) and intensive   (which is a color attribute), we translate   this and RE_BOLD in falls eventually appart   into RE_BOLD and RE_INTENSIVE.*/void TEScreen::reverseRendition(ca* p){ UINT8 f = p->f; UINT8 b = p->b;  p->f = b; p->b = f; //p->r &= ~RE_TRANSPARENT;}void TEScreen::effectiveRendition()// calculate rendition{  ef_re = cu_re & (RE_UNDERLINE | RE_BLINK);  if (cu_re & RE_REVERSE)  {    ef_fg = cu_bg;    ef_bg = cu_fg;  }  else  {    ef_fg = cu_fg;    ef_bg = cu_bg;  }  if (cu_re & RE_BOLD)  {    if (ef_fg < BASE_COLORS)      ef_fg += BASE_COLORS;    else      ef_fg -= BASE_COLORS;  }}/*    returns the image.    Get the size of the image by \sa getLines and \sa getColumns.    NOTE that the image returned by this function must later be    freed.*/ca* TEScreen::getCookedImage(){ int x,y;  ca* merged = (ca*)malloc(lines*columns*sizeof(ca));  ca dft(' ',DEFAULT_FORE_COLOR,DEFAULT_BACK_COLOR,DEFAULT_RENDITION);  for (y = 0; (y < lines) && (y < (hist.getLines()-histCursor)); y++)  {    int len = QMIN(columns,hist.getLineLen(y+histCursor));    int yp  = y*columns;    int yq  = (y+histCursor)*columns;    hist.getCells(y+histCursor,0,len,merged+yp);    for (x = len; x < columns; x++) merged[yp+x] = dft;    for (x = 0; x < columns; x++)    {   int p=x + yp; int q=x + yq;        if ( ( q >= sel_TL ) && ( q <= sel_BR ) )          reverseRendition(&merged[p]); // for selection    }  }  if (lines >= hist.getLines()-histCursor)  {    for (y = (hist.getLines()-histCursor); y < lines ; y++)    {       int yp  = y*columns;       int yq  = (y+histCursor)*columns;       int yr =  (y-hist.getLines()+histCursor)*columns;       for (x = 0; x < columns; x++)       { int p = x + yp; int q = x + yq; int r = x + yr;         merged[p] = image[r];         if ( q >= sel_TL && q <= sel_BR )           reverseRendition(&merged[p]); // for selection       }    }  }  // evtl. inverse display  if (getMode(MODE_Screen))  { int i,n = lines*columns;    for (i = 0; i < n; i++)      reverseRendition(&merged[i]); // for reverse display  }  if (getMode(MODE_Cursor) && (cuY+(hist.getLines()-histCursor) < lines)) // cursor visible    reverseRendition(&merged[loc(cuX,cuY+(hist.getLines()-histCursor))]);  return merged;}/**/void TEScreen::reset(){    setMode(MODE_Wrap  ); saveMode(MODE_Wrap  );  // wrap at end of margin  resetMode(MODE_Origin); saveMode(MODE_Origin);  // position refere to [1,1]  resetMode(MODE_Insert); saveMode(MODE_Insert);  // overstroke    setMode(MODE_Cursor);                         // cursor visible  resetMode(MODE_Screen);                         // screen not inverse  resetMode(MODE_NewLine);  tmargin=0;  bmargin=lines-1;  setDefaultRendition();  saveCursor();  clear();}/* Clear the entire screen and home the cursor.*/void TEScreen::clear(){  clearEntireScreen();  home();}/* Moves the cursor left one column.*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -