~ubuntu-branches/debian/stretch/alpine/stretch

« back to all changes in this revision

Viewing changes to alpine/print.c

  • Committer: Bazaar Package Importer
  • Author(s): Asheesh Laroia
  • Date: 2007-02-17 13:17:42 UTC
  • Revision ID: james.westby@ubuntu.com-20070217131742-99x5c6cpg1pbkdhw
Tags: upstream-0.82+dfsg
ImportĀ upstreamĀ versionĀ 0.82+dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#if !defined(lint) && !defined(DOS)
 
2
static char rcsid[] = "$Id: print.c 203 2006-10-26 17:23:46Z hubert@u.washington.edu $";
 
3
#endif
 
4
 
 
5
/*
 
6
 * ========================================================================
 
7
 * Copyright 2006 University of Washington
 
8
 *
 
9
 * Licensed under the Apache License, Version 2.0 (the "License");
 
10
 * you may not use this file except in compliance with the License.
 
11
 * You may obtain a copy of the License at
 
12
 *
 
13
 *     http://www.apache.org/licenses/LICENSE-2.0
 
14
 *
 
15
 * ========================================================================
 
16
 */
 
17
 
 
18
#include "headers.h"
 
19
#include "print.h"
 
20
#include "confscroll.h"
 
21
#include "keymenu.h"
 
22
#include "radio.h"
 
23
#include "status.h"
 
24
#include "../pith/state.h"
 
25
 
 
26
 
 
27
/*
 
28
 * Internal prototypes
 
29
 */
 
30
void     set_def_printer_value(char *);
 
31
int      print_select_tool(struct pine *, int, CONF_S **, unsigned);
 
32
int      print_edit_tool(struct pine *, int, CONF_S **, unsigned);
 
33
 
 
34
 
 
35
static char **def_printer_line;
 
36
static char no_ff[] = "-no-formfeed";
 
37
 
 
38
 
 
39
#ifndef DOS
 
40
 
 
41
/*
 
42
 * Information used to paint and maintain a line on the configuration screen
 
43
 */
 
44
/*----------------------------------------------------------------------
 
45
    The printer selection screen
 
46
 
 
47
   Draws the screen and prompts for the printer number and the custom
 
48
   command if so selected.
 
49
 
 
50
 ----*/
 
51
void
 
52
select_printer(struct pine *ps, int edit_exceptions)
 
53
{
 
54
    struct        variable  *vtmp;
 
55
    CONF_S       *ctmpa = NULL, *ctmpb = NULL, *heading = NULL,
 
56
                 *start_line = NULL;
 
57
    int i, saved_printer_cat, readonly_warning = 0, no_ex;
 
58
    SAVED_CONFIG_S *vsave;
 
59
    char *saved_printer, **lval;
 
60
    OPT_SCREEN_S screen;
 
61
    size_t l;
 
62
 
 
63
    if(edit_exceptions){
 
64
        q_status_message(SM_ORDER, 3, 7,
 
65
                         _("Exception Setup not implemented for printer"));
 
66
        return;
 
67
    }
 
68
 
 
69
    if(fixed_var(&ps_global->vars[V_PRINTER], "change", "printer"))
 
70
      return;
 
71
 
 
72
    ew = edit_exceptions ? ps_global->ew_for_except_vars : Main;
 
73
    
 
74
    no_ex = (ps_global->ew_for_except_vars == Main);
 
75
 
 
76
    if(ps->restricted)
 
77
      readonly_warning = 1;
 
78
    else{
 
79
        PINERC_S *prc = NULL;
 
80
 
 
81
        switch(ew){
 
82
          case Main:
 
83
            prc = ps->prc;
 
84
            break;
 
85
          case Post:
 
86
            prc = ps->post_prc;
 
87
            break;
 
88
        }
 
89
 
 
90
        readonly_warning = prc ? prc->readonly : 1;
 
91
        if(prc && prc->quit_to_edit){
 
92
            quit_to_edit_msg(prc);
 
93
            return;
 
94
        }
 
95
    }
 
96
 
 
97
    saved_printer = cpystr(ps->VAR_PRINTER);
 
98
    saved_printer_cat = ps->printer_category;
 
99
 
 
100
    new_confline(&ctmpa);
 
101
    ctmpa->valoffset = 2;
 
102
    ctmpa->keymenu   = &printer_select_keymenu;
 
103
    ctmpa->help      = NO_HELP;
 
104
    ctmpa->tool      = print_select_tool;
 
105
    ctmpa->flags    |= CF_NOSELECT;
 
106
    ctmpa->value
 
107
#ifdef OS2
 
108
      = cpystr("\"Select\" a port or |pipe-command as your default printer.");
 
109
#else
 
110
      = cpystr(_("You may \"Select\" a print command as your default printer."));
 
111
#endif
 
112
 
 
113
    new_confline(&ctmpa);
 
114
    ctmpa->valoffset = 2;
 
115
    ctmpa->keymenu   = &printer_select_keymenu;
 
116
    ctmpa->help      = NO_HELP;
 
117
    ctmpa->tool      = print_select_tool;
 
118
    ctmpa->flags    |= CF_NOSELECT;
 
119
    ctmpa->value
 
120
#ifdef OS2
 
121
      = cpystr("You may also add alternative ports or !pipes to the list in the");
 
122
#else
 
123
      = cpystr(_("You may also add custom print commands to the list in the"));
 
124
#endif
 
125
 
 
126
    new_confline(&ctmpa);
 
127
    ctmpa->valoffset = 2;
 
128
    ctmpa->keymenu   = &printer_select_keymenu;
 
129
    ctmpa->help      = NO_HELP;
 
130
    ctmpa->tool      = print_select_tool;
 
131
    ctmpa->flags    |= CF_NOSELECT;
 
132
    ctmpa->value
 
133
#ifdef OS2
 
134
      = cpystr("\"Personally selected port or |pipe\" section below.");
 
135
#else
 
136
      = cpystr(_("\"Personally selected print command\" section below."));
 
137
#endif
 
138
 
 
139
    new_confline(&ctmpa);
 
140
    ctmpa->valoffset = 2;
 
141
    ctmpa->keymenu   = &printer_select_keymenu;
 
142
    ctmpa->help      = NO_HELP;
 
143
    ctmpa->tool      = print_select_tool;
 
144
    ctmpa->flags    |= CF_NOSELECT | CF_B_LINE;
 
145
 
 
146
    new_confline(&ctmpa);
 
147
    ctmpa->valoffset = 4;
 
148
    ctmpa->keymenu   = &printer_select_keymenu;
 
149
    ctmpa->help      = NO_HELP;
 
150
    ctmpa->tool      = print_select_tool;
 
151
    ctmpa->flags    |= CF_NOSELECT;
 
152
    def_printer_line = &ctmpa->value;
 
153
    set_def_printer_value(ps->VAR_PRINTER);
 
154
 
 
155
    new_confline(&ctmpa);
 
156
    ctmpa->valoffset = 2;
 
157
    ctmpa->keymenu   = &printer_select_keymenu;
 
158
    ctmpa->help      = NO_HELP;
 
159
    ctmpa->tool      = print_select_tool;
 
160
    ctmpa->flags    |= CF_NOSELECT | CF_B_LINE;
 
161
 
 
162
#ifndef OS2
 
163
    new_confline(&ctmpa);
 
164
    heading = ctmpa;
 
165
    ctmpa->keymenu   = &printer_select_keymenu;
 
166
    ctmpa->help      = NO_HELP;
 
167
    ctmpa->tool      = print_select_tool;
 
168
    ctmpa->varname
 
169
        = cpystr(_(" Printer attached to IBM PC or compatible, Macintosh"));
 
170
    ctmpa->flags    |= (CF_NOSELECT | CF_STARTITEM);
 
171
    ctmpa->value     = cpystr("");
 
172
    ctmpa->headingp  = heading;
 
173
 
 
174
    new_confline(&ctmpa);
 
175
    ctmpa->valoffset = 6;
 
176
    ctmpa->keymenu   = &printer_select_keymenu;
 
177
    ctmpa->help      = NO_HELP;
 
178
    ctmpa->tool      = print_select_tool;
 
179
    ctmpa->flags    |= CF_NOSELECT;
 
180
    ctmpa->value
 
181
      = cpystr(_("This may not work with all attached printers, and will depend on the"));
 
182
    ctmpa->headingp  = heading;
 
183
 
 
184
    new_confline(&ctmpa);
 
185
    ctmpa->valoffset = 6;
 
186
    ctmpa->keymenu   = &printer_select_keymenu;
 
187
    ctmpa->help      = NO_HELP;
 
188
    ctmpa->tool      = print_select_tool;
 
189
    ctmpa->flags    |= CF_NOSELECT;
 
190
    ctmpa->value
 
191
      = cpystr(_("terminal emulation/communications software in use. It is known to work"));
 
192
    ctmpa->headingp  = heading;
 
193
 
 
194
    new_confline(&ctmpa);
 
195
    ctmpa->valoffset = 6;
 
196
    ctmpa->keymenu   = &printer_select_keymenu;
 
197
    ctmpa->help      = NO_HELP;
 
198
    ctmpa->tool      = print_select_tool;
 
199
    ctmpa->flags    |= CF_NOSELECT;
 
200
    ctmpa->value
 
201
      = cpystr("with Kermit and the latest UW version of NCSA telnet on Macs and PCs,");
 
202
    ctmpa->headingp  = heading;
 
203
 
 
204
    new_confline(&ctmpa);
 
205
    ctmpa->valoffset = 6;
 
206
    ctmpa->keymenu   = &printer_select_keymenu;
 
207
    ctmpa->help      = NO_HELP;
 
208
    ctmpa->tool      = print_select_tool;
 
209
    ctmpa->flags    |= CF_NOSELECT;
 
210
    ctmpa->value
 
211
      = cpystr("Versaterm Pro on Macs, and WRQ Reflections on PCs.");
 
212
    ctmpa->headingp  = heading;
 
213
 
 
214
    new_confline(&ctmpa);
 
215
    start_line = ctmpb = ctmpa; /* default start line */
 
216
    ctmpa->valoffset = 17;
 
217
    ctmpa->keymenu   = &printer_select_keymenu;
 
218
    ctmpa->help      = h_config_set_att_ansi;
 
219
    ctmpa->tool      = print_select_tool;
 
220
    ctmpa->flags    |= CF_NOHILITE;
 
221
    ctmpa->varoffset = 8;
 
222
    ctmpa->varname   = cpystr("Printer:");
 
223
    ctmpa->value     = cpystr(ANSI_PRINTER);
 
224
    ctmpa->varnamep  = ctmpb;
 
225
    ctmpa->headingp  = heading;
 
226
 
 
227
    new_confline(&ctmpa);
 
228
    ctmpa->valoffset = 17;
 
229
    ctmpa->keymenu   = &printer_select_keymenu;
 
230
    ctmpa->help      = h_config_set_att_ansi2;
 
231
    ctmpa->tool      = print_select_tool;
 
232
    ctmpa->flags    |= CF_NOHILITE;
 
233
    ctmpa->varoffset = 8;
 
234
    l = strlen(ANSI_PRINTER)+strlen(no_ff);
 
235
    ctmpa->value     = (char *)fs_get((l+1) * sizeof(char));
 
236
    ctmpa->varnamep  = ctmpb;
 
237
    ctmpa->headingp  = heading;
 
238
    snprintf(ctmpa->value, l+1, "%s%s", ANSI_PRINTER, no_ff);
 
239
    ctmpa->value[l] = '\0';
 
240
 
 
241
    new_confline(&ctmpa);
 
242
    ctmpa->valoffset = 17;
 
243
    ctmpa->keymenu   = &printer_select_keymenu;
 
244
    ctmpa->help      = h_config_set_att_wyse;
 
245
    ctmpa->tool      = print_select_tool;
 
246
    ctmpa->flags    |= CF_NOHILITE;
 
247
    ctmpa->varoffset = 8;
 
248
    ctmpa->value     = cpystr(WYSE_PRINTER);
 
249
    ctmpa->varnamep  = ctmpb;
 
250
    ctmpa->headingp  = heading;
 
251
 
 
252
    new_confline(&ctmpa);
 
253
    ctmpa->valoffset = 17;
 
254
    ctmpa->keymenu   = &printer_select_keymenu;
 
255
    ctmpa->help      = h_config_set_att_wyse2;
 
256
    ctmpa->tool      = print_select_tool;
 
257
    ctmpa->flags    |= CF_NOHILITE;
 
258
    ctmpa->varoffset = 8;
 
259
    l = strlen(WYSE_PRINTER)+strlen(no_ff);
 
260
    ctmpa->value     = (char *)fs_get((l+1) * sizeof(char));
 
261
    ctmpa->varnamep  = ctmpb;
 
262
    ctmpa->headingp  = heading;
 
263
    snprintf(ctmpa->value, l+1, "%s%s", WYSE_PRINTER, no_ff);
 
264
    ctmpa->value[l] = '\0';
 
265
#endif
 
266
 
 
267
    new_confline(&ctmpa);
 
268
    ctmpa->valoffset = 0;
 
269
    ctmpa->keymenu   = &printer_select_keymenu;
 
270
    ctmpa->help      = NO_HELP;
 
271
    ctmpa->tool      = print_select_tool;
 
272
    ctmpa->flags    |= CF_NOSELECT | CF_B_LINE;
 
273
    ctmpa->var = &ps->vars[V_STANDARD_PRINTER];
 
274
 
 
275
 
 
276
    new_confline(&ctmpa);
 
277
    heading = ctmpa;
 
278
    ctmpa->valoffset = 6;
 
279
    ctmpa->keymenu   = &printer_select_keymenu;
 
280
    ctmpa->help      = NO_HELP;
 
281
    ctmpa->tool      = print_select_tool;
 
282
    ctmpa->varname
 
283
#ifdef OS2
 
284
        = cpystr(" Standard OS/2 printer port");
 
285
#else
 
286
        = cpystr(_(" Standard UNIX print command"));
 
287
#endif
 
288
    ctmpa->value = cpystr("");
 
289
    ctmpa->flags    |= (CF_NOSELECT | CF_STARTITEM);
 
290
    ctmpa->headingp  = heading;
 
291
    ctmpa->var = &ps->vars[V_STANDARD_PRINTER];
 
292
 
 
293
    new_confline(&ctmpa);
 
294
    ctmpa->valoffset = 6;
 
295
    ctmpa->keymenu   = &printer_select_keymenu;
 
296
    ctmpa->help      = NO_HELP;
 
297
    ctmpa->tool      = print_select_tool;
 
298
    ctmpa->flags    |= CF_NOSELECT;
 
299
    ctmpa->value
 
300
#ifdef OS2
 
301
      = cpystr("Using this option may require you to use the OS/2 \"MODE\" command to");
 
302
#else
 
303
      = cpystr(_("Using this option may require setting your \"PRINTER\" or \"LPDEST\""));
 
304
#endif
 
305
    ctmpa->headingp  = heading;
 
306
    ctmpa->var = &ps->vars[V_STANDARD_PRINTER];
 
307
 
 
308
    new_confline(&ctmpa);
 
309
    ctmpa->valoffset = 6;
 
310
    ctmpa->keymenu   = &printer_select_keymenu;
 
311
    ctmpa->help      = NO_HELP;
 
312
    ctmpa->tool      = print_select_tool;
 
313
    ctmpa->flags    |= CF_NOSELECT;
 
314
    ctmpa->value
 
315
#ifdef OS2
 
316
      = cpystr("direct printer output to the correct port.");
 
317
#else
 
318
      = cpystr(_("environment variable using the standard UNIX utilities."));
 
319
#endif
 
320
    ctmpa->headingp  = heading;
 
321
    ctmpa->var = &ps->vars[V_STANDARD_PRINTER];
 
322
 
 
323
    vtmp = &ps->vars[V_STANDARD_PRINTER];
 
324
    for(i = 0; vtmp->current_val.l[i]; i++){
 
325
        new_confline(&ctmpa);
 
326
        ctmpa->valoffset = 22;
 
327
        ctmpa->keymenu   = &printer_select_keymenu;
 
328
        ctmpa->help      = NO_HELP;
 
329
        ctmpa->help      = h_config_set_stand_print;
 
330
        ctmpa->tool      = print_select_tool;
 
331
        if(i == 0){
 
332
            ctmpa->varoffset = 8;
 
333
            ctmpa->varname   = cpystr(_("Printer List:"));
 
334
            ctmpa->flags    |= CF_NOHILITE|CF_PRINTER;
 
335
#ifdef OS2
 
336
            start_line = ctmpb = ctmpa; /* default start line */
 
337
#else
 
338
            ctmpb = ctmpa;
 
339
#endif
 
340
        }
 
341
 
 
342
        ctmpa->varnamep  = ctmpb;
 
343
        ctmpa->headingp  = heading;
 
344
        ctmpa->varmem = i;
 
345
        ctmpa->var = vtmp;
 
346
        ctmpa->value = printer_name(vtmp->current_val.l[i]);
 
347
    }
 
348
 
 
349
    new_confline(&ctmpa);
 
350
    ctmpa->valoffset = 0;
 
351
    ctmpa->keymenu   = &printer_select_keymenu;
 
352
    ctmpa->help      = NO_HELP;
 
353
    ctmpa->tool      = print_select_tool;
 
354
    ctmpa->flags    |= CF_NOSELECT | CF_B_LINE;
 
355
 
 
356
    new_confline(&ctmpa);
 
357
    heading = ctmpa;
 
358
    ctmpa->valoffset = 0;
 
359
    ctmpa->keymenu   = &printer_edit_keymenu;
 
360
    ctmpa->help      = NO_HELP;
 
361
    ctmpa->tool      = print_edit_tool;
 
362
    ctmpa->varname
 
363
#ifdef OS2
 
364
        = cpystr(" Personally selected port or |command");
 
365
#else
 
366
        = cpystr(_(" Personally selected print command"));
 
367
#endif
 
368
    ctmpa->flags    |= (CF_NOSELECT | CF_STARTITEM);
 
369
    ctmpa->value = cpystr("");
 
370
    ctmpa->headingp  = heading;
 
371
    ctmpa->var = &ps->vars[V_PERSONAL_PRINT_COMMAND];
 
372
 
 
373
 
 
374
    new_confline(&ctmpa);
 
375
    ctmpa->valoffset = 6;
 
376
    ctmpa->keymenu   = &printer_edit_keymenu;
 
377
    ctmpa->help      = NO_HELP;
 
378
    ctmpa->tool      = print_edit_tool;
 
379
    ctmpa->flags    |= CF_NOSELECT;
 
380
    ctmpa->value
 
381
#ifdef OS2
 
382
      = cpystr("The text to be printed will be sent to the printer or command given here.");
 
383
#else
 
384
      = cpystr(_("The text to be printed will be piped into the command given here. The"));
 
385
#endif
 
386
    ctmpa->headingp  = heading;
 
387
    ctmpa->var = &ps->vars[V_PERSONAL_PRINT_COMMAND];
 
388
 
 
389
    new_confline(&ctmpa);
 
390
    ctmpa->valoffset = 6;
 
391
    ctmpa->keymenu   = &printer_edit_keymenu;
 
392
    ctmpa->help      = NO_HELP;
 
393
    ctmpa->tool      = print_edit_tool;
 
394
    ctmpa->flags    |= CF_NOSELECT;
 
395
    ctmpa->value
 
396
#ifdef OS2
 
397
      = cpystr("The printer port or |pipe is in the 2nd column, the printer name is in");
 
398
#else
 
399
      = cpystr(_("command is in the 2nd column, the printer name is in the first column. Some"));
 
400
#endif
 
401
    ctmpa->headingp  = heading;
 
402
    ctmpa->var = &ps->vars[V_PERSONAL_PRINT_COMMAND];
 
403
 
 
404
    new_confline(&ctmpa);
 
405
    ctmpa->valoffset = 6;
 
406
    ctmpa->keymenu   = &printer_edit_keymenu;
 
407
    ctmpa->help      = NO_HELP;
 
408
    ctmpa->tool      = print_edit_tool;
 
409
    ctmpa->flags    |= CF_NOSELECT;
 
410
    ctmpa->value
 
411
#ifdef OS2
 
412
      = cpystr("the first column. Examples: \"LPT1\", \"COM2\", \"|enscript\". A command may");
 
413
#else
 
414
      = cpystr(_("examples are: \"prt\", \"lpr\", \"lp\", or \"enscript\". The command may be given"));
 
415
#endif
 
416
    ctmpa->headingp  = heading;
 
417
    ctmpa->var = &ps->vars[V_PERSONAL_PRINT_COMMAND];
 
418
 
 
419
    new_confline(&ctmpa);
 
420
    ctmpa->valoffset = 6;
 
421
    ctmpa->keymenu   = &printer_edit_keymenu;
 
422
    ctmpa->help      = NO_HELP;
 
423
    ctmpa->tool      = print_edit_tool;
 
424
    ctmpa->flags    |= CF_NOSELECT;
 
425
    ctmpa->value
 
426
#ifdef OS2
 
427
      = cpystr("be given options, for example \"|ascii2ps -p LPT1\" or \"|txt2hplc -2\". Use");
 
428
#else
 
429
      = cpystr(_("with options, for example \"enscript -2 -r\" or \"lpr -Plpacc170\". The"));
 
430
#endif
 
431
    ctmpa->headingp  = heading;
 
432
    ctmpa->var = &ps->vars[V_PERSONAL_PRINT_COMMAND];
 
433
 
 
434
    new_confline(&ctmpa);
 
435
    ctmpa->valoffset = 6;
 
436
    ctmpa->keymenu   = &printer_edit_keymenu;
 
437
    ctmpa->help      = NO_HELP;
 
438
    ctmpa->tool      = print_edit_tool;
 
439
    ctmpa->flags    |= CF_NOSELECT;
 
440
    ctmpa->value
 
441
#ifdef OS2
 
442
      = cpystr("the |command method for printers that require conversion from ASCII.");
 
443
#else
 
444
      = cpystr(_("commands and options on your system may be different from these examples."));
 
445
#endif
 
446
    ctmpa->headingp  = heading;
 
447
    ctmpa->var = &ps->vars[V_PERSONAL_PRINT_COMMAND];
 
448
 
 
449
    vtmp = &ps->vars[V_PERSONAL_PRINT_COMMAND];
 
450
    lval = no_ex ? vtmp->current_val.l : LVAL(vtmp, ew);
 
451
    if(lval){
 
452
        for(i = 0; lval[i]; i++){
 
453
            new_confline(&ctmpa);
 
454
            ctmpa->valoffset = 22;
 
455
            ctmpa->keymenu   = &printer_edit_keymenu;
 
456
            ctmpa->help      = h_config_set_custom_print;
 
457
            ctmpa->tool      = print_edit_tool;
 
458
            if(i == 0){
 
459
                ctmpa->varoffset = 8;
 
460
                ctmpa->varname   = cpystr(_("Printer List:"));
 
461
                ctmpa->flags    |= CF_NOHILITE|CF_PRINTER;
 
462
                ctmpb = ctmpa;
 
463
            }
 
464
 
 
465
            ctmpa->varnamep  = ctmpb;
 
466
            ctmpa->headingp  = heading;
 
467
            ctmpa->varmem = i;
 
468
            ctmpa->var = vtmp;
 
469
            ctmpa->value = printer_name(lval[i]);
 
470
        }
 
471
    }
 
472
    else{
 
473
        new_confline(&ctmpa);
 
474
        ctmpa->valoffset = 22;
 
475
        ctmpa->keymenu   = &printer_edit_keymenu;
 
476
        ctmpa->help      = h_config_set_custom_print;
 
477
        ctmpa->tool      = print_edit_tool;
 
478
        ctmpa->flags    |= CF_NOHILITE;
 
479
        ctmpa->varoffset = 8;
 
480
        ctmpa->varname   = cpystr(_("Printer List:"));
 
481
        ctmpa->varnamep  = ctmpa;
 
482
        ctmpa->headingp  = heading;
 
483
        ctmpa->varmem    = 0;
 
484
        ctmpa->var       = vtmp;
 
485
        ctmpa->value     = cpystr("");
 
486
    }
 
487
 
 
488
    memset(&screen, 0, sizeof(screen));
 
489
    screen.ro_warning = readonly_warning;
 
490
    vsave = save_config_vars(ps, 0);
 
491
    /* TRANSLATORS: SETUP... is a screen title
 
492
       Print something1 using something2.
 
493
       "printer config" is something1 */
 
494
    switch(conf_scroll_screen(ps, &screen, start_line,
 
495
                              edit_exceptions ? _("SETUP PRINTER EXCEPTIONS")
 
496
                                              : _("SETUP PRINTER"),
 
497
                              _("printer config"), 0)){
 
498
      case 0:
 
499
        break;
 
500
    
 
501
      case 1:
 
502
        write_pinerc(ps, ew, WRP_NONE);
 
503
        break;
 
504
    
 
505
      case 10:
 
506
        revert_to_saved_config(ps, vsave, 0);
 
507
        ps->printer_category = saved_printer_cat;
 
508
        set_variable(V_PRINTER, saved_printer, 1, 0, ew);
 
509
        set_variable(V_PERSONAL_PRINT_CATEGORY, comatose(ps->printer_category),
 
510
                     1, 0, ew);
 
511
        break;
 
512
    }
 
513
 
 
514
    def_printer_line = NULL;
 
515
    free_saved_config(ps, &vsave, 0);
 
516
    fs_give((void **)&saved_printer);
 
517
}
 
518
 
 
519
#endif  /* !DOS */
 
520
 
 
521
 
 
522
void
 
523
set_def_printer_value(char *printer)
 
524
{
 
525
    char *p, *nick, *cmd;
 
526
    int set, editing_norm_except_exists;
 
527
    size_t l;
 
528
 
 
529
    if(!def_printer_line)
 
530
      return;
 
531
    
 
532
    editing_norm_except_exists = ((ps_global->ew_for_except_vars != Main) &&
 
533
                                  (ew == Main));
 
534
 
 
535
    parse_printer(printer, &nick, &cmd, NULL, NULL, NULL, NULL);
 
536
    p = *nick ? nick : cmd;
 
537
    set = *p;
 
538
    if(*def_printer_line)
 
539
      fs_give((void **)def_printer_line);
 
540
 
 
541
    l = strlen(p) + 60;
 
542
    *def_printer_line = fs_get((l+1) * sizeof(char));
 
543
    snprintf(*def_printer_line, l+1, "Default printer %s%s%s%s%s",
 
544
        set ? "set to \"" : "unset", set ? p : "", set ? "\"" : "",
 
545
        (set && editing_norm_except_exists) ? " (in exception config)" : "",
 
546
        set ? "." : ""); 
 
547
    (*def_printer_line)[l] = '\0';
 
548
 
 
549
    fs_give((void **)&nick);
 
550
    fs_give((void **)&cmd);
 
551
}
 
552
 
 
553
 
 
554
int
 
555
print_select_tool(struct pine *ps, int cmd, CONF_S **cl, unsigned int flags)
 
556
{
 
557
    int rc, retval, no_ex, printer_msg = 0;
 
558
    char *p, **lval, *printer_was;
 
559
    struct variable *vtmp;
 
560
 
 
561
    no_ex = (ps_global->ew_for_except_vars == Main);
 
562
 
 
563
    printer_was = ps->VAR_PRINTER ? cpystr(ps->VAR_PRINTER) : NULL;
 
564
 
 
565
    switch(cmd){
 
566
      case MC_EXIT:
 
567
        retval = config_exit_cmd(flags);
 
568
        break;
 
569
 
 
570
      case MC_CHOICE :
 
571
        if(cl && *cl){
 
572
            char aname[100], wname[100];
 
573
 
 
574
            strncat(strncpy(aname, ANSI_PRINTER, 50), no_ff, 30);
 
575
            strncat(strncpy(wname, WYSE_PRINTER, 50), no_ff, 30);
 
576
            if((*cl)->var){
 
577
                vtmp = (*cl)->var;
 
578
                lval = (no_ex || !vtmp->is_user) ? vtmp->current_val.l
 
579
                                                 : LVAL(vtmp, ew);
 
580
                rc = set_variable(V_PRINTER, lval ? lval[(*cl)->varmem] : NULL,
 
581
                                  1, 1, ew);
 
582
                if(rc == 0){
 
583
                    if(vtmp == &ps->vars[V_STANDARD_PRINTER])
 
584
                      ps->printer_category = 2;
 
585
                    else if(vtmp == &ps->vars[V_PERSONAL_PRINT_COMMAND])
 
586
                      ps->printer_category = 3;
 
587
 
 
588
                    set_variable(V_PERSONAL_PRINT_CATEGORY, 
 
589
                                 comatose(ps->printer_category), 1, 0, ew);
 
590
 
 
591
                    printer_msg++;
 
592
                }
 
593
                else
 
594
                  q_status_message(SM_ORDER,3,5, _("Trouble setting default printer"));
 
595
 
 
596
                retval = 1;
 
597
            }
 
598
            else if(!strcmp((*cl)->value,ANSI_PRINTER)){
 
599
                rc = set_variable(V_PRINTER, ANSI_PRINTER, 1, 1, ew);
 
600
                if(rc == 0){
 
601
                    ps->printer_category = 1;
 
602
                    set_variable(V_PERSONAL_PRINT_CATEGORY, 
 
603
                                 comatose(ps->printer_category), 1, 0, ew);
 
604
                    printer_msg++;
 
605
                }
 
606
                else
 
607
                  q_status_message(SM_ORDER,3,5, _("Trouble setting default printer"));
 
608
 
 
609
                retval = 1;
 
610
            }
 
611
            else if(!strcmp((*cl)->value,aname)){
 
612
                rc = set_variable(V_PRINTER, aname, 1, 1, ew);
 
613
                if(rc == 0){
 
614
                    ps->printer_category = 1;
 
615
                    set_variable(V_PERSONAL_PRINT_CATEGORY, 
 
616
                                 comatose(ps->printer_category), 1, 0, ew);
 
617
                    printer_msg++;
 
618
                }
 
619
                else
 
620
                  q_status_message(SM_ORDER,3,5, _("Trouble setting default printer"));
 
621
 
 
622
                retval = 1;
 
623
            }
 
624
            else if(!strcmp((*cl)->value,WYSE_PRINTER)){
 
625
                rc = set_variable(V_PRINTER, WYSE_PRINTER, 1, 1, ew);
 
626
                if(rc == 0){
 
627
                    ps->printer_category = 1;
 
628
                    set_variable(V_PERSONAL_PRINT_CATEGORY, 
 
629
                                 comatose(ps->printer_category), 1, 0, ew);
 
630
                    printer_msg++;
 
631
                }
 
632
                else
 
633
                  q_status_message(SM_ORDER,3,5, _("Trouble setting default printer"));
 
634
 
 
635
                retval = 1;
 
636
            }
 
637
            else if(!strcmp((*cl)->value,wname)){
 
638
                rc = set_variable(V_PRINTER, wname, 1, 1, ew);
 
639
                if(rc == 0){
 
640
                    ps->printer_category = 1;
 
641
                    set_variable(V_PERSONAL_PRINT_CATEGORY, 
 
642
                                 comatose(ps->printer_category), 1, 0, ew);
 
643
                    printer_msg++;
 
644
                }
 
645
                else
 
646
                  q_status_message(SM_ORDER,3,5, _("Trouble setting default printer"));
 
647
 
 
648
                retval = 1;
 
649
            }
 
650
            else
 
651
              retval = 0;
 
652
        }
 
653
        else
 
654
          retval = 0;
 
655
 
 
656
        if(retval){
 
657
            ps->mangled_body = 1;       /* BUG: redraw it all for now? */
 
658
            set_def_printer_value(ps->VAR_PRINTER);
 
659
        }
 
660
 
 
661
        break;
 
662
 
 
663
      default:
 
664
        retval = -1;
 
665
        break;
 
666
    }
 
667
 
 
668
    if(printer_msg){
 
669
        p = NULL;
 
670
        if(ps->VAR_PRINTER){
 
671
            char *nick, *q;
 
672
 
 
673
            parse_printer(ps->VAR_PRINTER, &nick, &q,
 
674
                          NULL, NULL, NULL, NULL);
 
675
            p = cpystr(*nick ? nick : q);
 
676
            fs_give((void **)&nick);
 
677
            fs_give((void **)&q);
 
678
        }
 
679
 
 
680
        q_status_message4(SM_ORDER, 0, 3,
 
681
                          "Default printer%s %s%s%s",
 
682
                          ((!printer_was && !ps->VAR_PRINTER) ||
 
683
                           (printer_was && ps->VAR_PRINTER &&
 
684
                            !strcmp(printer_was,ps->VAR_PRINTER)))
 
685
                              ? " still" : "",
 
686
                          p ? "set to \"" : "unset",
 
687
                          p ? p : "", p ? "\"" : ""); 
 
688
 
 
689
        if(p)
 
690
          fs_give((void **)&p);
 
691
    }
 
692
 
 
693
    if(printer_was)
 
694
      fs_give((void **)&printer_was);
 
695
 
 
696
    return(retval);
 
697
}
 
698
 
 
699
 
 
700
int
 
701
print_edit_tool(struct pine *ps, int cmd, CONF_S **cl, unsigned int flags)
 
702
{
 
703
    char             prompt[81], sval[MAXPATH+1], name[MAXPATH+1];
 
704
    char            *nick, *p, *tmp, **newval = NULL, **ltmp = NULL;
 
705
    char           **lval, **nelval;
 
706
    int              rv = 0, skip_to_next = 0, after = 0, i = 4, j, k = 0;
 
707
    int              oeflags, changing_selected = 0, no_ex;
 
708
    HelpType         help;
 
709
    ESCKEY_S         ekey[6];
 
710
 
 
711
    /* need this to preserve old behavior when no exception config file */
 
712
    no_ex = (ps_global->ew_for_except_vars == Main);
 
713
 
 
714
    if(cmd == MC_CHOICE)
 
715
      return(print_select_tool(ps, cmd, cl, flags));
 
716
 
 
717
    if(!(cl && *cl && (*cl)->var))
 
718
      return(0);
 
719
 
 
720
    nelval = no_ex ? (*cl)->var->current_val.l : LVAL((*cl)->var, ew);
 
721
    lval = LVAL((*cl)->var, ew);
 
722
 
 
723
    switch(cmd){
 
724
      case MC_ADD:                              /* add to list */
 
725
        sval[0] = '\0';
 
726
        if(!fixed_var((*cl)->var, "add to", NULL)){
 
727
 
 
728
            if(lval && (*cl)->value){
 
729
                strncpy(prompt, _("Enter printer name : "), sizeof(prompt));
 
730
                prompt[sizeof(prompt)-1] = '\0';
 
731
            }
 
732
            else if(!lval && nelval){
 
733
                /* Add to list which doesn't exist, but default does exist */
 
734
                ekey[0].ch    = 'r';
 
735
                ekey[0].rval  = 'r';
 
736
                ekey[0].name  = "R";
 
737
                ekey[0].label = N_("Replace");
 
738
                ekey[1].ch    = 'a';
 
739
                ekey[1].rval  = 'a';
 
740
                ekey[1].name  = "A";
 
741
                ekey[1].label = N_("Add To");
 
742
                ekey[2].ch    = -1;
 
743
                strncpy(prompt, _("Replace or Add To default value ? "), sizeof(prompt));
 
744
                prompt[sizeof(prompt)-1] = '\0';
 
745
                switch(i = radio_buttons(prompt, -FOOTER_ROWS(ps), ekey, 'a',
 
746
                                         'x', h_config_replace_add, RB_NORM)){
 
747
                  case 'a':
 
748
                    /* Make a list of the default commands, leaving room for 
 
749
                       the command we are about to add below. */
 
750
                    for(k = 0; nelval[k]; k++)
 
751
                      ;
 
752
 
 
753
                    ltmp = (char **)fs_get((k+2) * sizeof(char *));
 
754
                    
 
755
                    for(j = 0; j < k; j++)
 
756
                      ltmp[j] = cpystr(nelval[j]);
 
757
 
 
758
                    ltmp[k + 1] = ltmp[k] = NULL;
 
759
 
 
760
add_text:
 
761
                    strncpy(prompt, _("Enter name of printer to be added : "), sizeof(prompt));
 
762
                    prompt[sizeof(prompt)-1] = '\0';
 
763
                    break;
 
764
                    
 
765
                  case 'r':
 
766
replace_text:
 
767
                    strncpy(prompt, _("Enter the name for replacement printer : "), sizeof(prompt));
 
768
                    prompt[sizeof(prompt)-1] = '\0';
 
769
                    break;
 
770
                    
 
771
                  case 'x':
 
772
                    cmd_cancelled("Add");
 
773
                    break;
 
774
                }
 
775
 
 
776
                if(i == 'x')
 
777
                  break;
 
778
            }
 
779
            else{
 
780
                strncpy(prompt, _("Enter name of printer to be added : "), sizeof(prompt));
 
781
                prompt[sizeof(prompt)-1] = '\0';
 
782
            }
 
783
 
 
784
            ps->mangled_footer = 1;
 
785
            help = NO_HELP;
 
786
 
 
787
            name[0] = '\0';
 
788
            i = 2;
 
789
            while(i != 0 && i != 1){
 
790
                if(lval && (*cl)->value){
 
791
                    ekey[0].ch    = ctrl('W');
 
792
                    ekey[0].rval  = 5;
 
793
                    ekey[0].name  = "^W";
 
794
                    ekey[0].label = after ? N_("InsertBefore") : N_("InsertAfter");
 
795
                    ekey[1].ch    = -1;
 
796
                }
 
797
                else
 
798
                  ekey[0].ch    = -1;
 
799
 
 
800
                oeflags = OE_APPEND_CURRENT;
 
801
                i = optionally_enter(name, -FOOTER_ROWS(ps), 0, sizeof(name),
 
802
                                     prompt,
 
803
                                     (ekey[0].ch != -1) ? ekey : NULL,
 
804
                                     help, &oeflags);
 
805
                if(i == 0){
 
806
                    rv = ps->mangled_body = 1;
 
807
                    removing_leading_and_trailing_white_space(name);
 
808
                }
 
809
                else if(i == 1){
 
810
                    cmd_cancelled("Add");
 
811
                }
 
812
                else if(i == 3){
 
813
                    help = (help == NO_HELP) ? h_config_insert_after : NO_HELP;
 
814
                }
 
815
                else if(i == 4){                /* no redraw, yet */
 
816
                }
 
817
                else if(i == 5){ /* change from/to prepend to/from append */
 
818
                    after = after ? 0 : 1;
 
819
                }
 
820
            }
 
821
 
 
822
            if(i == 0)
 
823
              i = 2;
 
824
 
 
825
#ifdef OS2
 
826
            strncpy(prompt, "Enter port or |command : ", sizeof(prompt));
 
827
#else
 
828
            strncpy(prompt, _("Enter command for printer : "), sizeof(prompt));
 
829
#endif
 
830
            prompt[sizeof(prompt)-1] = '\0';
 
831
            while(i != 0 && i != 1){
 
832
                oeflags = OE_APPEND_CURRENT;
 
833
                i = optionally_enter(sval, -FOOTER_ROWS(ps), 0, sizeof(sval),
 
834
                                     prompt,
 
835
                                     (ekey[0].ch != -1) ? ekey : NULL,
 
836
                                     help, &oeflags);
 
837
                if(i == 0){
 
838
                    rv = ps->mangled_body = 1;
 
839
                    removing_leading_and_trailing_white_space(sval);
 
840
                    if(*sval || !lval){
 
841
 
 
842
                        for(tmp = sval; *tmp; tmp++)
 
843
                          if(*tmp == ',')
 
844
                          i++;  /* conservative count of ,'s */
 
845
 
 
846
                        if(!i){ /* only one item */
 
847
                          if (!ltmp){
 
848
                            ltmp = (char **)fs_get(2 * sizeof(char *));
 
849
                            ltmp[1] = NULL;
 
850
                            k = 0;
 
851
                          }
 
852
                          if(*name){
 
853
                            size_t l;
 
854
 
 
855
                            l = strlen(name) + 4 + strlen(sval);
 
856
                            ltmp[k] = (char *) fs_get((l+1) * sizeof(char));
 
857
                            snprintf(ltmp[k], l+1, "%s [] %s", name, sval);
 
858
                            ltmp[k][l] = '\0';
 
859
                          }
 
860
                          else
 
861
                            ltmp[k] = cpystr(sval);
 
862
                        }
 
863
                        else{
 
864
                            /*
 
865
                             * Don't allow input of multiple entries at once.
 
866
                             */
 
867
                            q_status_message(SM_ORDER,3,5,
 
868
                                _("No commas allowed in command"));
 
869
                            i = 2;
 
870
                            continue;
 
871
                        }
 
872
 
 
873
                        config_add_list(ps, cl, ltmp, &newval, after);
 
874
 
 
875
                        if(after)
 
876
                          skip_to_next = 1;
 
877
 
 
878
                        fs_give((void **)&ltmp);
 
879
                        k = 0;
 
880
                    }
 
881
                    else
 
882
                      q_status_message1(SM_ORDER, 0, 3,
 
883
                                         _("Can't add %s to list"), empty_val);
 
884
                }
 
885
                else if(i == 1){
 
886
                    cmd_cancelled("Add");
 
887
                }
 
888
                else if(i == 3){
 
889
                    help = help == NO_HELP ? h_config_print_cmd : NO_HELP;
 
890
                }
 
891
                else if(i == 4){                /* no redraw, yet */
 
892
                }
 
893
                else if(i == 5){ /* change from/to prepend to/from append */
 
894
                    after = after ? 0 : 1;
 
895
                }
 
896
            }
 
897
        }
 
898
 
 
899
        break;
 
900
 
 
901
      case MC_DELETE:                                   /* delete */
 
902
        if((*cl)->var->current_val.l
 
903
          && (*cl)->var->current_val.l[(*cl)->varmem]
 
904
          && !strucmp(ps->VAR_PRINTER,(*cl)->var->current_val.l[(*cl)->varmem]))
 
905
            changing_selected = 1;
 
906
 
 
907
        if(!lval && nelval){
 
908
            char pmt[80];
 
909
 
 
910
            snprintf(pmt, sizeof(pmt), _("Override default with %s"), empty_val2);
 
911
            pmt[sizeof(pmt)-1] = '\0';
 
912
            if(want_to(pmt, 'n', 'n', NO_HELP, WT_FLUSH_IN) == 'y'){
 
913
                char **ltmp;
 
914
 
 
915
                sval[0] = '\0';
 
916
                ltmp    = (char **)fs_get(2 * sizeof(char *));
 
917
                ltmp[0] = cpystr(sval);
 
918
                ltmp[1] = NULL;
 
919
                config_add_list(ps, cl, ltmp, &newval, 0);
 
920
                fs_give((void **)&ltmp);
 
921
                rv = ps->mangled_body = 1;
 
922
            }
 
923
        }
 
924
        else if(!lval){
 
925
            q_status_message(SM_ORDER, 0, 3, _("No set value to delete"));
 
926
        }
 
927
        else{
 
928
            if((*cl)->var->is_fixed){
 
929
                parse_printer(lval[(*cl)->varmem],
 
930
                    &nick, &p, NULL, NULL, NULL, NULL);
 
931
                snprintf(prompt, sizeof(prompt), _("Delete (unused) printer %s "),
 
932
                    *nick ? nick : (!*p) ? empty_val2 : p);
 
933
                fs_give((void **)&nick);
 
934
                fs_give((void **)&p);
 
935
            }
 
936
            else
 
937
              snprintf(prompt, sizeof(prompt), _("Really delete item %s from printer list "),
 
938
                    int2string((*cl)->varmem + 1));
 
939
 
 
940
            prompt[sizeof(prompt)-1] = '\0';
 
941
 
 
942
            ps->mangled_footer = 1;
 
943
            if(want_to(prompt,'n','n',h_config_print_del, WT_FLUSH_IN) == 'y'){
 
944
                rv = ps->mangled_body = 1;
 
945
                fs_give((void **)&lval[(*cl)->varmem]);
 
946
                config_del_list_item(cl, &newval);
 
947
            }
 
948
            else
 
949
              q_status_message(SM_ORDER, 0, 3, _("Printer not deleted"));
 
950
        }
 
951
 
 
952
        break;
 
953
 
 
954
      case MC_EDIT:                             /* edit/change list option */
 
955
        if((*cl)->var->current_val.l
 
956
          && (*cl)->var->current_val.l[(*cl)->varmem]
 
957
          && !strucmp(ps->VAR_PRINTER,(*cl)->var->current_val.l[(*cl)->varmem]))
 
958
            changing_selected = 1;
 
959
 
 
960
        if(fixed_var((*cl)->var, NULL, "printer"))
 
961
          break;
 
962
        else if(!lval &&  nelval)
 
963
          goto replace_text;
 
964
        else if(!lval && !nelval)
 
965
          goto add_text;
 
966
        else{
 
967
            HelpType help;
 
968
 
 
969
            ekey[0].ch    = 'n';
 
970
            ekey[0].rval  = 'n';
 
971
            ekey[0].name  = "N";
 
972
            ekey[0].label = N_("Name");
 
973
            ekey[1].ch    = 'c';
 
974
            ekey[1].rval  = 'c';
 
975
            ekey[1].name  = "C";
 
976
            ekey[1].label = N_("Command");
 
977
            ekey[2].ch    = 'o';
 
978
            ekey[2].rval  = 'o';
 
979
            ekey[2].name  = "O";
 
980
            ekey[2].label = N_("Options");
 
981
            ekey[3].ch    = -1;
 
982
            /* TRANSLATORS: this is a question with three choices */
 
983
            strncpy(prompt, _("Change Name or Command or Options ? "), sizeof(prompt));
 
984
            prompt[sizeof(prompt)-1] = '\0';
 
985
            i = radio_buttons(prompt, -FOOTER_ROWS(ps), ekey, 'c', 'x',
 
986
                              h_config_print_name_cmd, RB_NORM);
 
987
 
 
988
            if(i == 'x'){
 
989
                cmd_cancelled("Change");
 
990
                break;
 
991
            } 
 
992
            else if(i == 'c'){
 
993
                char *all_but_cmd;
 
994
 
 
995
                parse_printer(lval[(*cl)->varmem],
 
996
                              NULL, &p, NULL, NULL, NULL, &all_but_cmd);
 
997
                
 
998
                strncpy(prompt, _("Change command : "), sizeof(prompt));
 
999
                prompt[sizeof(prompt)-1] = '\0';
 
1000
                strncpy(sval, p ? p : "", sizeof(sval)-1);
 
1001
                sval[sizeof(sval)-1] = '\0';
 
1002
                fs_give((void **)&p);
 
1003
 
 
1004
                ps->mangled_footer = 1;
 
1005
                help = NO_HELP;
 
1006
                while(1){
 
1007
                    oeflags = OE_APPEND_CURRENT;
 
1008
                    i = optionally_enter(sval, -FOOTER_ROWS(ps), 0,
 
1009
                                         sizeof(sval), prompt, NULL,
 
1010
                                         help, &oeflags);
 
1011
                    if(i == 0){
 
1012
                        removing_leading_and_trailing_white_space(sval);
 
1013
                        rv = ps->mangled_body = 1;
 
1014
                        if(lval[(*cl)->varmem])
 
1015
                          fs_give((void **)&lval[(*cl)->varmem]);
 
1016
 
 
1017
                        i = 0;
 
1018
                        for(tmp = sval; *tmp; tmp++)
 
1019
                          if(*tmp == ',')
 
1020
                            i++;        /* count of ,'s */
 
1021
 
 
1022
                        if(!i){ /* only one item */
 
1023
                            size_t l;
 
1024
 
 
1025
                            l = strlen(all_but_cmd) + strlen(sval);
 
1026
                            lval[(*cl)->varmem] = (char *)fs_get((l+1) * sizeof(char));
 
1027
                            snprintf(lval[(*cl)->varmem], l+1, "%s%s", all_but_cmd, sval);
 
1028
                            lval[(*cl)->varmem][l] = '\0';
 
1029
                            
 
1030
                            newval = &(*cl)->value;
 
1031
                        }
 
1032
                        else{
 
1033
                            /*
 
1034
                             * Don't allow input of multiple entries at once.
 
1035
                             */
 
1036
                            q_status_message(SM_ORDER,3,5,
 
1037
                                _("No commas allowed in command"));
 
1038
                            continue;
 
1039
                        }
 
1040
                    }
 
1041
                    else if(i == 1){
 
1042
                        cmd_cancelled("Change");
 
1043
                    }
 
1044
                    else if(i == 3){
 
1045
                        help = help == NO_HELP ? h_config_change : NO_HELP;
 
1046
                        continue;
 
1047
                    }
 
1048
                    else if(i == 4){            /* no redraw, yet */
 
1049
                        continue;
 
1050
                    }
 
1051
 
 
1052
                    break;
 
1053
                }
 
1054
            }
 
1055
            else if(i == 'n'){
 
1056
                char *all_but_nick;
 
1057
 
 
1058
                parse_printer(lval[(*cl)->varmem],
 
1059
                              &p, NULL, NULL, NULL, &all_but_nick, NULL);
 
1060
                
 
1061
                strncpy(prompt, _("Change name : "), sizeof(prompt));
 
1062
                prompt[sizeof(prompt)-1] = '\0';
 
1063
                strncpy(name, p ? p : "", sizeof(name));
 
1064
                name[sizeof(name)-1] = '\0';
 
1065
 
 
1066
                fs_give((void **)&p);
 
1067
 
 
1068
                ps->mangled_footer = 1;
 
1069
                help = NO_HELP;
 
1070
                while(1){
 
1071
                    oeflags = OE_APPEND_CURRENT;
 
1072
                    i = optionally_enter(name, -FOOTER_ROWS(ps), 0,
 
1073
                                         sizeof(name), prompt, NULL,
 
1074
                                         help, &oeflags);
 
1075
                    if(i == 0){
 
1076
                        size_t l;
 
1077
 
 
1078
                        rv = ps->mangled_body = 1;
 
1079
                        removing_leading_and_trailing_white_space(name);
 
1080
                        if(lval[(*cl)->varmem])
 
1081
                          fs_give((void **)&lval[(*cl)->varmem]);
 
1082
 
 
1083
                        l = strlen(name) + 1 + ((*all_but_nick == '[') ? 0 : 3) + strlen(all_but_nick);
 
1084
                        lval[(*cl)->varmem] = (char *)fs_get((l+1) * sizeof(char));
 
1085
                        snprintf(lval[(*cl)->varmem], l+1,
 
1086
                            "%s %s%s", name,
 
1087
                            (*all_but_nick == '[') ? "" : "[] ",
 
1088
                            all_but_nick);
 
1089
                        lval[(*cl)->varmem][l] = '\0';
 
1090
                        
 
1091
                        newval = &(*cl)->value;
 
1092
                    }
 
1093
                    else if(i == 1){
 
1094
                        cmd_cancelled("Change");
 
1095
                    }
 
1096
                    else if(i == 3){
 
1097
                        help = help == NO_HELP ? h_config_change : NO_HELP;
 
1098
                        continue;
 
1099
                    }
 
1100
                    else if(i == 4){            /* no redraw, yet */
 
1101
                        continue;
 
1102
                    }
 
1103
 
 
1104
                    break;
 
1105
                }
 
1106
                
 
1107
                fs_give((void **)&all_but_nick);
 
1108
            }
 
1109
            else if(i == 'o'){
 
1110
                HelpType help;
 
1111
 
 
1112
                ekey[0].ch    = 'i';
 
1113
                ekey[0].rval  = 'i';
 
1114
                ekey[0].name  = "I";
 
1115
                ekey[0].label = N_("Init");
 
1116
                ekey[1].ch    = 't';
 
1117
                ekey[1].rval  = 't';
 
1118
                ekey[1].name  = "T";
 
1119
                ekey[1].label = N_("Trailer");
 
1120
                ekey[2].ch    = -1;
 
1121
                strncpy(prompt, _("Change Init string or Trailer string ? "), sizeof(prompt));
 
1122
                prompt[sizeof(prompt)-1] = '\0';
 
1123
                j = radio_buttons(prompt, -FOOTER_ROWS(ps), ekey, 'i', 'x',
 
1124
                                  h_config_print_opt_choice, RB_NORM);
 
1125
 
 
1126
                if(j == 'x'){
 
1127
                    cmd_cancelled("Change");
 
1128
                    break;
 
1129
                } 
 
1130
                else{
 
1131
                    char *init, *trailer;
 
1132
 
 
1133
                    parse_printer(lval[(*cl)->varmem],
 
1134
                                  &nick, &p, &init, &trailer, NULL, NULL);
 
1135
                    
 
1136
                    if(j == i)
 
1137
                      snprintf(prompt, sizeof(prompt), _("Change INIT string : "));
 
1138
                    else
 
1139
                      snprintf(prompt, sizeof(prompt), _("Change TRAILER string : "));
 
1140
 
 
1141
                    strncpy(sval, (j == 'i') ? init : trailer, sizeof(sval)-1);
 
1142
                    sval[sizeof(sval)-1] = '\0';
 
1143
 
 
1144
                    tmp = string_to_cstring(sval);
 
1145
                    strncpy(sval, tmp, sizeof(sval)-1);
 
1146
                    sval[sizeof(sval)-1] = '\0';
 
1147
                    fs_give((void **)&tmp);
 
1148
                    
 
1149
                    ps->mangled_footer = 1;
 
1150
                    help = NO_HELP;
 
1151
                    while(1){
 
1152
                        oeflags = OE_APPEND_CURRENT;
 
1153
                        i = optionally_enter(sval, -FOOTER_ROWS(ps), 0,
 
1154
                            sizeof(sval), prompt, NULL, help, &oeflags);
 
1155
                        if(i == 0){
 
1156
                            size_t l;
 
1157
 
 
1158
                            removing_leading_and_trailing_white_space(sval);
 
1159
                            rv = 1;
 
1160
                            if(lval[(*cl)->varmem])
 
1161
                              fs_give((void **)&lval[(*cl)->varmem]);
 
1162
                            if(j == 'i'){
 
1163
                                init = cstring_to_hexstring(sval);
 
1164
                                tmp = cstring_to_hexstring(trailer);
 
1165
                                fs_give((void **)&trailer);
 
1166
                                trailer = tmp;
 
1167
                            }
 
1168
                            else{
 
1169
                                trailer = cstring_to_hexstring(sval);
 
1170
                                tmp = cstring_to_hexstring(init);
 
1171
                                fs_give((void **)&init);
 
1172
                                init = tmp;
 
1173
                            }
 
1174
 
 
1175
                            l = strlen(nick) + 1 + 2 + strlen("INIT=") + strlen(init) + 1 + strlen("TRAILER=") + strlen(trailer)+ 1 + strlen(p);
 
1176
                            lval[(*cl)->varmem] = (char *)fs_get((l+1) * sizeof(char));
 
1177
                            snprintf(lval[(*cl)->varmem], l+1,
 
1178
                                "%s%s%s%s%s%s%s%s%s%s%s",
 
1179
            /* nick */      nick,
 
1180
            /* space */     *nick ? " " : "",
 
1181
            /* [ */                 (*nick || *init || *trailer) ? "[" : "",
 
1182
            /* INIT= */     *init ? "INIT=" : "",
 
1183
            /* init */      init,
 
1184
            /* space */     (*init && *trailer) ? " " : "",
 
1185
            /* TRAILER= */          *trailer ? "TRAILER=" : "",
 
1186
            /* trailer */           trailer,
 
1187
            /* ] */                 (*nick || *init || *trailer) ? "]" : "",
 
1188
            /* space */     (*nick || *init || *trailer) ? " " : "",
 
1189
            /* command */           p);
 
1190
                            lval[(*cl)->varmem][l] = '\0';
 
1191
            
 
1192
                            newval = &(*cl)->value;
 
1193
                        }
 
1194
                        else if(i == 1){
 
1195
                            cmd_cancelled("Change");
 
1196
                        }
 
1197
                        else if(i == 3){
 
1198
                            help=(help == NO_HELP)?h_config_print_init:NO_HELP;
 
1199
                            continue;
 
1200
                        }
 
1201
                        else if(i == 4){                /* no redraw, yet */
 
1202
                            continue;
 
1203
                        }
 
1204
 
 
1205
                        break;
 
1206
                    }
 
1207
 
 
1208
                    fs_give((void **)&nick);
 
1209
                    fs_give((void **)&p);
 
1210
                    fs_give((void **)&init);
 
1211
                    fs_give((void **)&trailer);
 
1212
                }
 
1213
            }
 
1214
        }
 
1215
 
 
1216
        break;
 
1217
 
 
1218
      case MC_EXIT:                             /* exit */
 
1219
        rv = config_exit_cmd(flags);
 
1220
        break;
 
1221
 
 
1222
      default:
 
1223
        rv = -1;
 
1224
        break;
 
1225
    }
 
1226
 
 
1227
    if(skip_to_next)
 
1228
      *cl = next_confline(*cl);
 
1229
 
 
1230
    /*
 
1231
     * At this point, if changes occurred, var->user_val.X is set.
 
1232
     * So, fix the current_val, and handle special cases...
 
1233
     */
 
1234
    if(rv == 1){
 
1235
        set_current_val((*cl)->var, TRUE, FALSE);
 
1236
        fix_side_effects(ps, (*cl)->var, 0);
 
1237
 
 
1238
        if(newval){
 
1239
            if(*newval)
 
1240
              fs_give((void **)newval);
 
1241
            
 
1242
            if((*cl)->var->current_val.l)
 
1243
              *newval = printer_name((*cl)->var->current_val.l[(*cl)->varmem]);
 
1244
            else
 
1245
              *newval = cpystr("");
 
1246
        }
 
1247
 
 
1248
        if(changing_selected)
 
1249
          print_select_tool(ps, MC_CHOICE, cl, flags);
 
1250
    }
 
1251
 
 
1252
    return(rv);
 
1253
}
 
1254
 
 
1255
 
 
1256
/*
 
1257
 * Given a single printer string from the config file, returns an allocated
 
1258
 * copy of the friendly printer name, which is
 
1259
 *      "Nickname"  command
 
1260
 */
 
1261
char *
 
1262
printer_name(char *input)
 
1263
{
 
1264
    char *nick, *cmd;
 
1265
    char *ret;
 
1266
 
 
1267
    parse_printer(input, &nick, &cmd, NULL, NULL, NULL, NULL);
 
1268
    ret = (char *)fs_get((2+6*22+1+strlen(cmd)) * sizeof(char));
 
1269
    utf8_snprintf(ret, 2+6*22+1+strlen(cmd), "\"%.21w\"%*s%s",
 
1270
        *nick ? nick : "",
 
1271
        22 - MIN(utf8_width(nick), 21),
 
1272
        "",
 
1273
        cmd);
 
1274
    fs_give((void **) &nick);
 
1275
    fs_give((void **) &cmd);
 
1276
 
 
1277
    return(ret);
 
1278
}