~ubuntu-branches/ubuntu/trusty/xterm/trusty

« back to all changes in this revision

Viewing changes to charproc.c

  • Committer: Bazaar Package Importer
  • Author(s): Timo Aaltonen
  • Date: 2010-03-31 12:32:27 UTC
  • mfrom: (1.1.17 upstream) (11.1.17 sid)
  • Revision ID: james.westby@ubuntu.com-20100331123227-8a6qwmyciob6j88y
Tags: 256-1ubuntu1
* Merge from Debian unstable.
* Revert the libutempter change for lucid. (LP: #539473)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* $XTermId: charproc.c,v 1.1020 2009/12/10 09:24:04 tom Exp $ */
 
1
/* $XTermId: charproc.c,v 1.1033 2010/01/20 01:59:19 tom Exp $ */
2
2
 
3
3
/*
4
4
 
5
 
Copyright 1999-2008,2009 by Thomas E. Dickey
 
5
Copyright 1999-2009,2010 by Thomas E. Dickey
6
6
 
7
7
                        All Rights Reserved
8
8
 
137
137
    int code;
138
138
} FlagList;
139
139
 
 
140
typedef void (*BitFunc) (unsigned * /* p */ ,
 
141
                         unsigned /* mask */ );
 
142
 
140
143
static IChar doinput(void);
141
144
static int set_character_class(char * /*s */ );
142
145
static void FromAlternate(XtermWidget /* xw */ );
144
147
                          int /* rows */ ,
145
148
                          int /* cols */ ,
146
149
                          Bool /* text */ );
147
 
static void SwitchBufs(XtermWidget xw);
 
150
static void SwitchBufs(XtermWidget /* xw */ ,
 
151
                       int /* toBuf */ );
148
152
static void ToAlternate(XtermWidget /* xw */ );
149
153
static void ansi_modes(XtermWidget termw,
150
 
                       void (*func) (unsigned *p, unsigned mask));
 
154
                       BitFunc /* func */ );
151
155
static void bitclr(unsigned *p, unsigned mask);
152
156
static void bitcpy(unsigned *p, unsigned q, unsigned mask);
153
157
static void bitset(unsigned *p, unsigned mask);
154
 
static void dpmodes(XtermWidget termw, void (*func) (unsigned *p, unsigned mask));
 
158
static void dpmodes(XtermWidget /* xw */ ,
 
159
                    BitFunc /* func */ );
155
160
static void restoremodes(XtermWidget /* xw */ );
156
161
static void savemodes(XtermWidget /* xw */ );
157
162
static void window_ops(XtermWidget /* xw */ );
330
335
    { "set-logging",            HandleLogging },
331
336
#endif
332
337
#if OPT_ALLOW_XXX_OPS
 
338
    { "allow-color-ops",        HandleAllowColorOps },
333
339
    { "allow-font-ops",         HandleAllowFontOps },
334
340
    { "allow-tcap-ops",         HandleAllowTcapOps },
335
341
    { "allow-title-ops",        HandleAllowTitleOps },
408
414
static XtResource xterm_resources[] =
409
415
{
410
416
    Bres(XtNallowSendEvents, XtCAllowSendEvents, screen.allowSendEvent0, False),
 
417
    Bres(XtNallowColorOps, XtCAllowColorOps, screen.allowColorOp0, DEF_ALLOW_COLOR),
411
418
    Bres(XtNallowFontOps, XtCAllowFontOps, screen.allowFontOp0, DEF_ALLOW_FONT),
412
419
    Bres(XtNallowTcapOps, XtCAllowTcapOps, screen.allowTcapOp0, DEF_ALLOW_TCAP),
413
420
    Bres(XtNallowTitleOps, XtCAllowTitleOps, screen.allowTitleOp0, DEF_ALLOW_TITLE),
496
503
    Sres(XtNcharClass, XtCCharClass, screen.charClass, NULL),
497
504
    Sres(XtNdecTerminalID, XtCDecTerminalID, screen.term_id, DFT_DECID),
498
505
    Sres(XtNdefaultString, XtCDefaultString, screen.default_string, "#"),
 
506
    Sres(XtNdisallowedColorOps, XtCDisallowedColorOps,
 
507
         screen.disallowedColorOps, DEF_DISALLOWED_COLOR),
 
508
    Sres(XtNdisallowedFontOps, XtCDisallowedFontOps,
 
509
         screen.disallowedFontOps, DEF_DISALLOWED_FONT),
 
510
    Sres(XtNdisallowedTcapOps, XtCDisallowedTcapOps,
 
511
         screen.disallowedTcapOps, DEF_DISALLOWED_TCAP),
499
512
    Sres(XtNdisallowedWindowOps, XtCDisallowedWindowOps,
500
513
         screen.disallowedWinOps, DEF_DISALLOWED_WINDOW),
501
514
    Sres(XtNeightBitSelectTypes, XtCEightBitSelectTypes,
3109
3122
        case CASE_CSI_IGNORE:
3110
3123
            sp->parsestate = cigtable;
3111
3124
            break;
 
3125
 
 
3126
        case CASE_DECSWBV:
 
3127
            TRACE(("CASE_DECSWBV\n"));
 
3128
            switch ((nparam >= 1) ? param[0] : DEFAULT) {
 
3129
            case 2:
 
3130
            case 3:
 
3131
            case 4:
 
3132
                screen->warningVolume = bvLow;
 
3133
                break;
 
3134
            case 5:
 
3135
            case 6:
 
3136
            case 7:
 
3137
            case 8:
 
3138
                screen->warningVolume = bvHigh;
 
3139
                break;
 
3140
            default:
 
3141
                screen->warningVolume = bvOff;
 
3142
                break;
 
3143
            }
 
3144
            TRACE(("...warningVolume %d\n", screen->warningVolume));
 
3145
            sp->parsestate = sp->groundtable;
 
3146
            break;
 
3147
 
 
3148
        case CASE_DECSMBV:
 
3149
            TRACE(("CASE_DECSMBV\n"));
 
3150
            switch ((nparam >= 1) ? param[0] : DEFAULT) {
 
3151
            case 2:
 
3152
            case 3:
 
3153
            case 4:
 
3154
                screen->marginVolume = bvLow;
 
3155
                break;
 
3156
            case 0:
 
3157
            case DEFAULT:
 
3158
            case 5:
 
3159
            case 6:
 
3160
            case 7:
 
3161
            case 8:
 
3162
                screen->marginVolume = bvHigh;
 
3163
                break;
 
3164
            default:
 
3165
                screen->marginVolume = bvOff;
 
3166
                break;
 
3167
            }
 
3168
            TRACE(("...marginVolume %d\n", screen->marginVolume));
 
3169
            sp->parsestate = sp->groundtable;
 
3170
            break;
3112
3171
        }
3113
3172
        if (sp->parsestate == sp->groundtable)
3114
3173
            sp->lastchar = thischar;
3900
3959
 * process ANSI modes set, reset
3901
3960
 */
3902
3961
static void
3903
 
ansi_modes(XtermWidget xw,
3904
 
           void (*func) (unsigned *p, unsigned mask))
 
3962
ansi_modes(XtermWidget xw, BitFunc func)
3905
3963
{
3906
3964
    int i;
3907
3965
 
3955
4013
 * process DEC private modes set, reset
3956
4014
 */
3957
4015
static void
3958
 
dpmodes(XtermWidget xw,
3959
 
        void (*func) (unsigned *p, unsigned mask))
 
4016
dpmodes(XtermWidget xw, BitFunc func)
3960
4017
{
3961
4018
    TScreen *screen = TScreenOf(xw);
3962
4019
    int i, j;
4094
4151
        case 44:                /* margin bell                  */
4095
4152
            set_bool_mode(screen->marginbell);
4096
4153
            if (!screen->marginbell)
4097
 
                screen->bellarmed = -1;
 
4154
                screen->bellArmed = -1;
4098
4155
            update_marginbell();
4099
4156
            break;
4100
4157
        case 45:                /* reverse wraparound   */
4514
4571
            break;
4515
4572
        case 44:                /* margin bell                  */
4516
4573
            if ((DoRM(DP_X_MARGIN, screen->marginbell)) == 0)
4517
 
                screen->bellarmed = -1;
 
4574
                screen->bellArmed = -1;
4518
4575
            update_marginbell();
4519
4576
            break;
4520
4577
        case 45:                /* reverse wraparound   */
5139
5196
                                                    (unsigned) MaxRows(screen),
5140
5197
                                                    (unsigned) MaxCols(screen),
5141
5198
                                                    &screen->editBuf_data[1]);
5142
 
        SwitchBufs(xw);
 
5199
        SwitchBufs(xw, 1);
5143
5200
        screen->whichBuf = 1;
5144
5201
#if OPT_SAVE_LINES
5145
5202
        screen->visbuf = screen->editBuf_index[screen->whichBuf];
5158
5215
        if (screen->scroll_amt)
5159
5216
            FlushScroll(xw);
5160
5217
        screen->whichBuf = 0;
5161
 
        SwitchBufs(xw);
 
5218
        SwitchBufs(xw, 0);
5162
5219
#if OPT_SAVE_LINES
5163
5220
        screen->visbuf = screen->editBuf_index[screen->whichBuf];
5164
5221
#endif
5167
5224
}
5168
5225
 
5169
5226
static void
5170
 
SwitchBufs(XtermWidget xw)
 
5227
SwitchBufs(XtermWidget xw, int toBuf)
5171
5228
{
5172
5229
    TScreen *screen = TScreenOf(xw);
5173
5230
    int rows, top;
5176
5233
        HideCursor();
5177
5234
 
5178
5235
    rows = MaxRows(screen);
5179
 
    SwitchBufPtrs(screen);
 
5236
    SwitchBufPtrs(screen, toBuf);
5180
5237
 
5181
5238
    if ((top = INX2ROW(screen, 0)) < rows) {
5182
 
        if (screen->scroll_amt)
 
5239
        if (screen->scroll_amt) {
5183
5240
            FlushScroll(xw);
 
5241
        }
5184
5242
        XClearArea(screen->display,
5185
5243
                   VWindow(screen),
5186
5244
                   (int) OriginX(screen),
5206
5264
 * Swap buffer line pointers between alternate and regular screens.
5207
5265
 */
5208
5266
void
5209
 
SwitchBufPtrs(TScreen * screen)
 
5267
SwitchBufPtrs(TScreen * screen, int toBuf GCC_UNUSED)
5210
5268
{
5211
5269
    if (CheckBufPtrs(screen)) {
5212
5270
#if OPT_SAVE_LINES
5213
 
        screen->visbuf = screen->editBuf_index[screen->whichBuf];
 
5271
        screen->visbuf = screen->editBuf_index[toBuf];
5214
5272
#else
5215
5273
        size_t len = ScrnPointers(screen, (unsigned) MaxRows(screen));
5216
5274
 
5717
5775
    const char *next;
5718
5776
    unsigned size;
5719
5777
    char *value = 0;
 
5778
    char *result;
5720
5779
 
5721
5780
    /* ignore empty values */
5722
5781
    while (*base == ',')
5735
5794
    } else {
5736
5795
        *source = base;
5737
5796
    }
5738
 
    return x_strtrim(value);
 
5797
    result = x_strtrim(value);
 
5798
    free(value);
 
5799
    return result;
5739
5800
}
5740
5801
 
5741
5802
static void
5757
5818
            char *temp;
5758
5819
 
5759
5820
            value = (int) strtol(next, &temp, 0);
5760
 
            if (temp != 0 && *temp != '\0') {
 
5821
            if (!IsEmpty(temp)) {
5761
5822
                fprintf(stderr, "Expected a number: %s\n", next);
5762
5823
            } else {
5763
5824
                for (n = 0; n < limit; ++n) {
5800
5861
#define DftFg(name) isDefaultForeground(Kolor(name))
5801
5862
#define DftBg(name) isDefaultBackground(Kolor(name))
5802
5863
 
 
5864
#define DATA(name) { #name, ec##name }
 
5865
    static FlagList tblColorOps[] =
 
5866
    {
 
5867
        DATA(SetColor)
 
5868
        ,DATA(GetColor)
 
5869
        ,DATA(GetAnsiColor)
 
5870
    };
 
5871
#undef DATA
 
5872
 
 
5873
#define DATA(name) { #name, ef##name }
 
5874
    static FlagList tblFontOps[] =
 
5875
    {
 
5876
        DATA(SetFont)
 
5877
        ,DATA(GetFont)
 
5878
    };
 
5879
#undef DATA
 
5880
 
 
5881
#define DATA(name) { #name, et##name }
 
5882
    static FlagList tblTcapOps[] =
 
5883
    {
 
5884
        DATA(SetTcap)
 
5885
        ,DATA(GetTcap)
 
5886
    };
 
5887
#undef DATA
 
5888
 
5803
5889
#define DATA(name) { #name, ew##name }
5804
5890
    static FlagList tblWindowOps[] =
5805
5891
    {
6045
6131
    init_Bres(screen.meta_sends_esc);
6046
6132
 
6047
6133
    init_Bres(screen.allowSendEvent0);
 
6134
    init_Bres(screen.allowColorOp0);
6048
6135
    init_Bres(screen.allowFontOp0);
6049
6136
    init_Bres(screen.allowTcapOp0);
6050
6137
    init_Bres(screen.allowTitleOp0);
6051
6138
    init_Bres(screen.allowWindowOp0);
6052
6139
 
 
6140
    init_Sres(screen.disallowedColorOps);
 
6141
 
 
6142
    set_flags_from_list(TScreenOf(wnew)->disallow_color_ops,
 
6143
                        TScreenOf(wnew)->disallowedColorOps,
 
6144
                        tblColorOps,
 
6145
                        ecLAST);
 
6146
 
 
6147
    init_Sres(screen.disallowedFontOps);
 
6148
 
 
6149
    set_flags_from_list(TScreenOf(wnew)->disallow_font_ops,
 
6150
                        TScreenOf(wnew)->disallowedFontOps,
 
6151
                        tblFontOps,
 
6152
                        efLAST);
 
6153
 
 
6154
    init_Sres(screen.disallowedTcapOps);
 
6155
 
 
6156
    set_flags_from_list(TScreenOf(wnew)->disallow_tcap_ops,
 
6157
                        TScreenOf(wnew)->disallowedTcapOps,
 
6158
                        tblTcapOps,
 
6159
                        etLAST);
 
6160
 
6053
6161
    init_Sres(screen.disallowedWinOps);
6054
6162
 
6055
6163
    set_flags_from_list(TScreenOf(wnew)->disallow_win_ops,
6065
6173
 
6066
6174
    /* make a copy so that editres cannot change the resource after startup */
6067
6175
    TScreenOf(wnew)->allowSendEvents = TScreenOf(wnew)->allowSendEvent0;
 
6176
    TScreenOf(wnew)->allowColorOps = TScreenOf(wnew)->allowColorOp0;
6068
6177
    TScreenOf(wnew)->allowFontOps = TScreenOf(wnew)->allowFontOp0;
6069
6178
    TScreenOf(wnew)->allowTcapOps = TScreenOf(wnew)->allowTcapOp0;
6070
6179
    TScreenOf(wnew)->allowTitleOps = TScreenOf(wnew)->allowTitleOp0;
6314
6423
    init_Bres(misc.render_font);
6315
6424
    /* minor tweak to make debug traces consistent: */
6316
6425
    if (wnew->misc.render_font) {
6317
 
        if (wnew->misc.face_name == 0) {
 
6426
        if (IsEmpty(wnew->misc.face_name)) {
6318
6427
            wnew->misc.render_font = False;
6319
6428
            TRACE(("reset render_font since there is no face_name\n"));
6320
6429
        }
6430
6539
    if (!GravityIsNorthWest(wnew) &&
6431
6540
        !GravityIsSouthWest(wnew)) {
6432
6541
        char value[80];
6433
 
        char *temp[2];
 
6542
        String temp[2];
6434
6543
        Cardinal nparams = 1;
6435
6544
 
6436
 
        sprintf(temp[0] = value, "%d", wnew->misc.resizeGravity);
 
6545
        sprintf(value, "%d", wnew->misc.resizeGravity);
 
6546
        temp[0] = value;
6437
6547
        temp[1] = 0;
6438
6548
        XtAppWarningMsg(app_con, "rangeError", "resizeGravity", "XTermError",
6439
6549
                        "unsupported resizeGravity resource value (%s)",
6520
6630
            name = 0; \
6521
6631
        }
6522
6632
 
6523
 
#ifdef NO_LEAKS
6524
 
#if OPT_RENDERFONT
6525
 
static void
6526
 
xtermCloseXft(TScreen * screen, XTermXftFonts * pub)
6527
 
{
6528
 
    if (pub->font != 0) {
6529
 
        XftFontClose(screen->display, pub->font);
6530
 
        pub->font = 0;
6531
 
    }
6532
 
}
6533
 
#endif
6534
 
#endif
6535
 
 
6536
6633
#if OPT_INPUT_METHOD
6537
6634
static void
6538
6635
cleanupInputMethod(TScreen * screen)
7910
8007
void
7911
8008
VTReset(XtermWidget xw, Bool full, Bool saved)
7912
8009
{
 
8010
    static char empty[1];
 
8011
 
7913
8012
    TScreen *screen = TScreenOf(xw);
7914
8013
 
7915
8014
    if (!XtIsRealized((Widget) xw) || (CURRENT_EMU() != (Widget) xw)) {
7932
8031
 
7933
8032
    if_OPT_ISO_COLORS(screen, {
7934
8033
        reset_SGR_Colors(xw);
7935
 
        if (ResetAnsiColorRequest(xw, "", 0))
 
8034
        if (ResetAnsiColorRequest(xw, empty, 0))
7936
8035
            xtermRepaint(xw);
7937
8036
    });
7938
8037
 
8056
8155
    int base;                   /* 8, 10, 16 (octal, decimal, hex) */
8057
8156
    int numbers;                /* count of numbers per range */
8058
8157
    int digits;                 /* count of digits in a number */
8059
 
    static char *errfmt = "%s:  %s in range string \"%s\" (position %d)\n";
 
8158
    static const char *errfmt = "%s:  %s in range string \"%s\" (position %d)\n";
8060
8159
 
8061
8160
    if (!s || !s[0])
8062
8161
        return -1;
8250
8349
    } else {
8251
8350
        Boolean failed = False;
8252
8351
        int oldFont = TScreenOf(xw)->menu_font_number;
8253
 
        char *save = TScreenOf(xw)->MenuFontName(fontMenu_fontsel);
 
8352
        String save = TScreenOf(xw)->MenuFontName(fontMenu_fontsel);
8254
8353
        char *val;
8255
8354
        char *test = 0;
8256
8355
        char *used = 0;