Develop and Download Open Source Software

Browse Subversion Repository

Diff of /trunk/teraterm/teraterm/vtterm.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 4696 by doda, Mon Oct 31 16:40:10 2011 UTC revision 4700 by doda, Tue Nov 1 10:24:23 2011 UTC
# Line 145  int FilterTop, FilterBottom, FilterLeft, Line 145  int FilterTop, FilterBottom, FilterLeft,
145  /* IME Status */  /* IME Status */
146  BOOL IMEstat;  BOOL IMEstat;
147    
148    /* OSC String buffer */
149    #define MAXOSCBUFFSIZE 4096
150    static char *OSCStrBuff;
151    static unsigned int OSCStrBuffSize;
152    
153  static _locale_t CLocale = NULL;  static _locale_t CLocale = NULL;
154    
155  void ResetSBuffer(PStatusBuff sbuff)  void ResetSBuffer(PStatusBuff sbuff)
# Line 3439  void XsProcColor(int mode, unsigned int Line 3444  void XsProcColor(int mode, unsigned int
3444          }          }
3445  }  }
3446    
3447    void XsProcClipboard(PCHAR buff)
3448    {
3449            int len, blen;
3450            char *p, *cbbuff;
3451            HGLOBAL cbmem;
3452    
3453            p = buff;
3454            while (strchr("cps01234567", *p)) {
3455                    p++;
3456            }
3457    
3458            if (*p++ == ';') {
3459                    if (*p == '?' && *(p+1) == 0) { // Read access
3460                            if (ts.CtrlFlag & CSF_CBREAD) {
3461                                    ; // not supported.
3462                            }
3463                    }
3464                    else if (ts.CtrlFlag & CSF_CBWRITE) { // Write access
3465                            len = strlen(buff);
3466                            blen = len * 3 / 4 + 1;
3467    
3468                            if ((cbmem = GlobalAlloc(GMEM_MOVEABLE, blen)) == NULL) {
3469                                    return;
3470                            };
3471                            if ((cbbuff = GlobalLock(cbmem)) == NULL) {
3472                                    GlobalFree(cbmem);
3473                                    return;
3474                            }
3475    
3476                            len = b64decode(cbbuff, blen, p);
3477    
3478                            if (len == 0 || len >= blen) {
3479                                    GlobalUnlock(cbmem);
3480                                    GlobalFree(cbmem);
3481                                    return;
3482                            }
3483    
3484                            cbbuff[len] = 0;
3485                            GlobalUnlock(cbmem);
3486    
3487                            if (OpenClipboard(NULL)) {
3488                                    EmptyClipboard();
3489                                    SetClipboardData(CF_TEXT, cbmem);
3490                                    CloseClipboard();
3491                            }
3492                    }
3493            }
3494    }
3495    
3496  #define ModeXsFirst     1  #define ModeXsFirst     1
3497  #define ModeXsString    2  #define ModeXsString    2
3498  #define ModeXsColorNum  3  #define ModeXsColorNum  3
# Line 3450  void XSequence(BYTE b) Line 3504  void XSequence(BYTE b)
3504          static BYTE XsParseMode = ModeXsFirst, PrevMode;          static BYTE XsParseMode = ModeXsFirst, PrevMode;
3505          static char StrBuff[sizeof(ts.Title)];          static char StrBuff[sizeof(ts.Title)];
3506          static unsigned int ColorNumber, StrLen;          static unsigned int ColorNumber, StrLen;
3507            static char realloc_failed = FALSE;
3508            char *p;
3509            unsigned int new_size;
3510    
3511          switch (XsParseMode) {          switch (XsParseMode) {
3512            case ModeXsFirst:            case ModeXsFirst:
# Line 3471  void XSequence(BYTE b) Line 3528  void XSequence(BYTE b)
3528                                  ColorNumber = 0;                                  ColorNumber = 0;
3529                                  XsParseMode = ModeXsColorSpec;                                  XsParseMode = ModeXsColorSpec;
3530                                  break;                                  break;
3531                            case 52:
3532                                    if ((ts.CtrlFlag & CSF_CBRW) == 0) {
3533                                            XsParseMode = ModeXsIgnore;
3534                                            break;
3535                                    }
3536                                    if (OSCStrBuff == NULL) {
3537                                            OSCStrBuff = malloc(sizeof(ts.Title));
3538                                            if (OSCStrBuff == NULL) {
3539                                                    XsParseMode = ModeXsIgnore;
3540                                                    break;
3541                                            }
3542                                            OSCStrBuffSize = sizeof(ts.Title);
3543                                    }
3544                                    XsParseMode = ModeXsString;
3545                                    break;
3546                          default:                          default:
3547                                  XsParseMode = ModeXsString;                                  XsParseMode = ModeXsString;
3548                          }                          }
# Line 3482  void XSequence(BYTE b) Line 3554  void XSequence(BYTE b)
3554                  break;                  break;
3555            case ModeXsString:            case ModeXsString:
3556                  if ((b==ST && Accept8BitCtrl && !(ts.Language==IdJapanese && ts.KanjiCode==IdSJIS)) || b==BEL) { /* String Terminator */                  if ((b==ST && Accept8BitCtrl && !(ts.Language==IdJapanese && ts.KanjiCode==IdSJIS)) || b==BEL) { /* String Terminator */
                         StrBuff[StrLen] = '\0';  
3557                          switch (Param[1]) {                          switch (Param[1]) {
3558                            case 0: /* Change window title and icon name */                            case 0: /* Change window title and icon name */
3559                            case 1: /* Change icon name */                            case 1: /* Change icon name */
3560                            case 2: /* Change window title */                            case 2: /* Change window title */
3561                                    StrBuff[StrLen] = '\0';
3562                                  if (ts.AcceptTitleChangeRequest) {                                  if (ts.AcceptTitleChangeRequest) {
3563                                          strncpy_s(cv.TitleRemote, sizeof(cv.TitleRemote), StrBuff, _TRUNCATE);                                          strncpy_s(cv.TitleRemote, sizeof(cv.TitleRemote), StrBuff, _TRUNCATE);
3564                                          // (2006.6.15 maya) タイトルに渡す文字列をSJISに変換                                          // (2006.6.15 maya) タイトルに渡す文字列をSJISに変換
# Line 3494  void XSequence(BYTE b) Line 3566  void XSequence(BYTE b)
3566                                          ChangeTitle();                                          ChangeTitle();
3567                                  }                                  }
3568                                  break;                                  break;
3569                              case 52: /* Clipboard access */
3570                                    OSCStrBuff[StrLen] = '\0';
3571                                    XsProcClipboard(OSCStrBuff);
3572    
3573                                    break;
3574                            default:                            default:
3575                                  /* nothing to do */;                                  /* nothing to do */;
3576                          }                          }
# Line 3508  void XSequence(BYTE b) Line 3585  void XSequence(BYTE b)
3585                          ParseMode = ModeFirst;                          ParseMode = ModeFirst;
3586                          XsParseMode = ModeXsFirst;                          XsParseMode = ModeXsFirst;
3587                  }                  }
3588                    else if (Param[1] == 52) {
3589                            if (StrLen < OSCStrBuffSize - 1) {
3590                                    OSCStrBuff[StrLen++] = b;
3591                            }
3592                            else if (!realloc_failed && OSCStrBuffSize < MAXOSCBUFFSIZE) {
3593                                    new_size = OSCStrBuffSize * 2;
3594                                    if (new_size > MAXOSCBUFFSIZE) {
3595                                            new_size = MAXOSCBUFFSIZE;
3596                                    }
3597    
3598                                    p = realloc(OSCStrBuff, new_size);
3599                                    if (p == NULL) {
3600                                            realloc_failed = TRUE;
3601                                    }
3602                                    else {
3603                                            OSCStrBuff = p;
3604                                            OSCStrBuffSize = new_size;
3605                                            if (StrLen < OSCStrBuffSize - 1) {
3606                                                    OSCStrBuff[StrLen++] = b;
3607                                            }
3608                                    }
3609                            }
3610                    }
3611                  else if (StrLen < sizeof(StrBuff) - 1) {                  else if (StrLen < sizeof(StrBuff) - 1) {
3612                          StrBuff[StrLen++] = b;                          StrBuff[StrLen++] = b;
3613                  }                  }
# Line 3593  void XSequence(BYTE b) Line 3693  void XSequence(BYTE b)
3693                          PrevMode = ModeXsIgnore;                          PrevMode = ModeXsIgnore;
3694                          XsParseMode = ModeXsEsc;                          XsParseMode = ModeXsEsc;
3695                  }                  }
3696                  break;                  break;
3697          }          }
3698  }  }
3699    
# Line 4521  void EndTerm() { Line 4621  void EndTerm() {
4621          if (CLocale) {          if (CLocale) {
4622                  _free_locale(CLocale);                  _free_locale(CLocale);
4623          }          }
4624            if (OSCStrBuff) {
4625                    free(OSCStrBuff);
4626                    OSCStrBuff = NULL;
4627                    OSCStrBuffSize = 0;
4628            }
4629          CLocale = NULL;          CLocale = NULL;
4630  }  }
4631    

Legend:
Removed from v.4696  
changed lines
  Added in v.4700

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26