/* < terminfointerpreter */
void terminfointerpreter(gpointer theEntry, gpointer userData)
{
  terminfoEntry* anEntry = (terminfoEntry*)theEntry;
  int aData1 = (int)(anEntry->myData1);
  int aData2 = (int)(anEntry->myData2);

  ENTER("terminfointerpreter");

  DISPLAY_CAPACITY(anEntry->myCapacity);

  copyCursor(&(anEntry->myStartingPosition), &myCursor);

  switch(anEntry->myCapacity)
    {
    case CLEAR:
/*       myContext.myLinePortionIndex=-1; */
      myCursor.myCol=0;
      myCursor.myLine=0;
/*       { /\* Erase the lines *\/  */
/* 	char* aOutput=NULL; */
/* 	struct t_cursor aFirstCursor; */
/* 	struct t_cursor aLastCursor; */
	
/* 	aFirstCursor.myLine=0; */
/* 	aFirstCursor.myCol=0; */
	
/* 	aLastCursor.myLine=myContext.myNumberOfLine - 1; */
/* 	aLastCursor.myCol=0; */
	    
/* 	eraseLine( this, & aFirstCursor, & aLastCursor, &(myContext.myDefaultStyle), & aOutput); */
/* 	if (aOutput != NULL) */
/* 	  { */
/* 	    free(aOutput); */
/* 	  } */
/*       } */
      break;
    case CUB1:
      if (myCursor.myCol!=0)
	{
	  myCursor.myCol--;
	}
      break;
    case CUD1:
      myCursor.myLine++;
      break;
    case CR:
      myCursor.myCol=0;
      break;
    case NEL:
      myCursor.myLine++;
      myCursor.myCol=0;
      break;
    case CUF1:
      myCursor.myCol++;
      break;
    case CUP:
      myCursor.myLine = (aData1 > 0) ? aData1 - 1 : aData1;
      myCursor.myCol = (aData2 > 0) ? aData2 - 1 : aData2;
      break;
    case CUU:
      myCursor.myLine-=aData1;
      break;
    case DCH: /* delete characters (shorter line) */
      /* aData1 gives the number of characters to delete */
/*       deleteCharacter( this, & myContext.myCursor, aData1, theOutput); */
      break;
    case DL: /* delete lines */
      /* aData1 gives the number of lines to delete */
/*       deleteLine( this, aData1, theOutput); */
      break;
    case ECH: /* Erase characters (same line length) */
      /* aData1 gives the number of characters to erase */
/*       eraseCharacter( this, & myContext.myCursor, aData1, & myContext.myCursor.myStyle, theOutput); */
      break;
    case ED: /* Clear the display after the cursor */
      {
/* 	struct t_cursor aFirstCursor; */
/* 	struct t_cursor aLastCursor; */
	
/* 	switch( aData1) */
/* 	  { */
/* 	  case 1: /\* erase from start to cursor *\/ */
/* 	    aFirstCursor.myLine=0; */
/* 	    aFirstCursor.myCol=0; */
/* 	    aLastCursor.myLine = myContext.myCursor.myLine; */
/* 	    aLastCursor.myCol = myContext.myCursor.myCol; */
/* 	    break; */
/* 	  case 2: /\* whole display *\/ */
/* 	    aFirstCursor.myLine=0; */
/* 	    aFirstCursor.myCol=0; */
/* 	    aLastCursor.myLine=myContext.myNumberOfLine - 1; */
/* 	    aLastCursor.myCol=myContext.myNumberOfCol - 1; */
/* 	    break; */
/* 	  case 0: /\* from cursor to end of display *\/ */
/* 	  default: */
/* 	    aFirstCursor.myLine = myContext.myCursor.myLine; */
/* 	    aFirstCursor.myCol = myContext.myCursor.myCol; */
/* 	    aLastCursor.myLine=myContext.myNumberOfLine - 1; */
/* 	    aLastCursor.myCol=myContext.myNumberOfCol - 1; */
/* 	    break; */
/* 	  } */
/* 	eraseLine( this, &aFirstCursor, &aLastCursor, &(myContext.myCursor.myStyle), theOutput); */
      }
      break;
    case EL:
      {
/* 	    struct t_cursor aFirstCursor; */
/* 	    struct t_cursor aLastCursor; */

/* 	    aFirstCursor.myLine = myContext.myCursor.myLine; */
/* 	    aFirstCursor.myCol = myContext.myCursor.myCol; */
/* 	    aLastCursor.myLine = aFirstCursor.myLine; */

/* 	    switch( aData1) */
/* 	      { */
/* 	      case 1: /\* erase from start of line to cursor *\/ */
/* 		aLastCursor.myCol=0; */
/* 		break; */
/* 	      case 2: /\* whole line *\/ */
/* 		aFirstCursor.myCol=0; */
/* 		aLastCursor.myCol=myContext.myNumberOfCol - 1; */
/* 		break; */
/* 	      case 0: /\* from cursor to end of line *\/ */
/* 	      default: */
/* 		aLastCursor.myCol=myContext.myNumberOfCol - 1; */
/* 		break; */
/* 	      } */
/* 	    eraseLine( this, &aFirstCursor, &aLastCursor, &(myContext.myCursor.myStyle), theOutput); */
      }
      break;
    case HOME:
      myCursor.myCol=0;
      myCursor.myLine=0;
      break;
    case HPA:
      myCursor.myCol=aData1 - 1;
      break;
    case HT:
      /* from kernel 2.6.12 vt.c */
      while (myCursor.myCol < 160) 
	{
	  myCursor.myCol++;
	  if (vc_tab_stop[ myCursor.myCol >> 5] & (1 << (myCursor.myCol & 31)))
	    break;
	}
      break;

    case ICH: /* insert n characters */
/* 	    insertCol( this, myContext.myCursor.myCol + aData1 - 1, &(myContext.myCursor.myStyle), theOutput); */
      break;
    case IL: /* several lines are added (the content is shifted to the bottom of the screen) */
      break;
    case RC:
      myCursor.myCol=mySavedCursor.myCol;
      myCursor.myLine=mySavedCursor.myLine;
      break;
     case SC:
      mySavedCursor.myCol=myCursor.myCol;
      mySavedCursor.myLine=myCursor.myLine;
      break;
    case SGR:
      copyStyle( &(myCursor.myStyle), (style*)(anEntry->myData1));
      DISPLAY_STYLE(&(myCursor.myStyle));
      break;
    case VPA:
      myCursor.myLine=(aData1 > 0) ? aData1 - 1 : aData1;
      break;
    case TEXTFIELD:
      {
	GString* aString = anEntry->myData1;
	myCursor.myCol += strlen(aString->str);
      }
      break;
    default:
    case RMACS:
    case BEL:
      break;
    }
  SHOW3("myLine=%d, myCol=%d\n",
	myCursor.myLine, 
	myCursor.myCol);
}
Example #2
0
static int setKeyboard( enum keyboard *theKeyboard, enum language theCurrentLanguage)
{
  ENTER("setKeyboard");
  int aKeyboardRequest=1;
  int i=0;
  enum keyboard aKeyboard;
  int aKeyboardIsChanged=0;
  int aMaxKeyboard=0;

  if (!theKeyboard)
    {
      return 0;
    }

  if (theCurrentLanguage == Russian)
    {
      aMaxKeyboard = (MaxCyrillicKeyboard - FirstCyrillicKeyboard);
      // atm, Russian language implies a cyrillic keyboard 
      if ((*theKeyboard < FirstCyrillicKeyboard) 
	  || (MaxCyrillicKeyboard >= *theKeyboard)) 
	{
	  *theKeyboard = russianKeyboard;
	  aKeyboardIsChanged=1;
	}
    }
  else
    {
      aMaxKeyboard = MaxKeyboard;
      // atm, if language is not Russian, then no cyrillic keyboard
      if ((FirstCyrillicKeyboard <= *theKeyboard) 
	  && (*theKeyboard < MaxCyrillicKeyboard)) 
	{
	  *theKeyboard = americanKeyboard;
	  aKeyboardIsChanged=1;
	}
    }

  aKeyboard = *theKeyboard;

  say( keyboardIs);
  say( aKeyboard);

  say( changeKeyboard);
  say( PleasePressKey);

  if (getAnswer() != MENU_Yes)
    {
      return aKeyboardIsChanged;
    }

  say( whichKeyboard);

  aMaxKeyboard = (theCurrentLanguage == Russian) ?
    (MaxCyrillicKeyboard - FirstCyrillicKeyboard) : MaxKeyboard;

  // The distinct keyboards are sorting in alphabetical order
  if (TheLanguageForSorting != theCurrentLanguage)
    {
      if (theCurrentLanguage == Russian)
	{
	  for (i=FirstCyrillicKeyboard;i<MaxCyrillicKeyboard;i++)
	    {
	      TheKeyboards[ i - FirstCyrillicKeyboard] = i;
	      SHOW3("i - FirstCyrillicKeyboard=%d, i=%d\n",i - FirstCyrillicKeyboard, i);
	    }       
	}
      else
	{
	  for (i=0;i<MaxKeyboard;i++)
	    {
	      TheKeyboards[i] = i;
	    }
	  aMaxKeyboard = i;
	  
	  qsort( TheKeyboards, MaxKeyboard, sizeof(enum keyboard), sortKeyboardMessages);
	}
      
      TheLanguageForSorting = theCurrentLanguage;
    }

  // Looking for the index which matches aKeyboard
  for (i=0; i<aMaxKeyboard; i++)
    {
      if (TheKeyboards[i] == aKeyboard)
	{
	  break;
	}
    }

  if (i >= aMaxKeyboard)
    {
      SHOW("Keyboard: Unexpected value");
      return 0;
    }

  while( aKeyboardRequest)
  {
    SHOW3("say TheKeyboards[%d]=%d\n",i, TheKeyboards[i]);
    say( TheKeyboards[i]); // works because the enum values are the same!

    switch(getAnswer())
      {
	case MENU_Yes:
	  aKeyboardRequest=0;
	  break;

	case MENU_Previous:
	  i = (i > 0) ? i-1 : aMaxKeyboard-1;
	  break;

	default:
	  i = (i >= aMaxKeyboard-1) ? 0 : i+1;
	  break;
      }
  }

  aKeyboardIsChanged = (TheKeyboards[i] != *theKeyboard);
  *theKeyboard = TheKeyboards[i];
  return aKeyboardIsChanged;
}
Example #3
0
 void operator()(ED e) const { SHOW3(TUHG, e, remain_pmap[e], TUHG_PRINT(e, g)); }