1
#if !defined(lint) && !defined(DOS)
2
static char rcsid[] = "$Id: print.c 203 2006-10-26 17:23:46Z hubert@u.washington.edu $";
6
* ========================================================================
7
* Copyright 2006 University of Washington
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
13
* http://www.apache.org/licenses/LICENSE-2.0
15
* ========================================================================
20
#include "confscroll.h"
24
#include "../pith/state.h"
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);
35
static char **def_printer_line;
36
static char no_ff[] = "-no-formfeed";
42
* Information used to paint and maintain a line on the configuration screen
44
/*----------------------------------------------------------------------
45
The printer selection screen
47
Draws the screen and prompts for the printer number and the custom
48
command if so selected.
52
select_printer(struct pine *ps, int edit_exceptions)
54
struct variable *vtmp;
55
CONF_S *ctmpa = NULL, *ctmpb = NULL, *heading = NULL,
57
int i, saved_printer_cat, readonly_warning = 0, no_ex;
58
SAVED_CONFIG_S *vsave;
59
char *saved_printer, **lval;
64
q_status_message(SM_ORDER, 3, 7,
65
_("Exception Setup not implemented for printer"));
69
if(fixed_var(&ps_global->vars[V_PRINTER], "change", "printer"))
72
ew = edit_exceptions ? ps_global->ew_for_except_vars : Main;
74
no_ex = (ps_global->ew_for_except_vars == Main);
90
readonly_warning = prc ? prc->readonly : 1;
91
if(prc && prc->quit_to_edit){
92
quit_to_edit_msg(prc);
97
saved_printer = cpystr(ps->VAR_PRINTER);
98
saved_printer_cat = ps->printer_category;
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;
108
= cpystr("\"Select\" a port or |pipe-command as your default printer.");
110
= cpystr(_("You may \"Select\" a print command as your default printer."));
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;
121
= cpystr("You may also add alternative ports or !pipes to the list in the");
123
= cpystr(_("You may also add custom print commands to the list in the"));
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;
134
= cpystr("\"Personally selected port or |pipe\" section below.");
136
= cpystr(_("\"Personally selected print command\" section below."));
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;
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);
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;
163
new_confline(&ctmpa);
165
ctmpa->keymenu = &printer_select_keymenu;
166
ctmpa->help = NO_HELP;
167
ctmpa->tool = print_select_tool;
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;
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;
181
= cpystr(_("This may not work with all attached printers, and will depend on the"));
182
ctmpa->headingp = heading;
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;
191
= cpystr(_("terminal emulation/communications software in use. It is known to work"));
192
ctmpa->headingp = heading;
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;
201
= cpystr("with Kermit and the latest UW version of NCSA telnet on Macs and PCs,");
202
ctmpa->headingp = heading;
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;
211
= cpystr("Versaterm Pro on Macs, and WRQ Reflections on PCs.");
212
ctmpa->headingp = heading;
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;
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';
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;
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';
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];
276
new_confline(&ctmpa);
278
ctmpa->valoffset = 6;
279
ctmpa->keymenu = &printer_select_keymenu;
280
ctmpa->help = NO_HELP;
281
ctmpa->tool = print_select_tool;
284
= cpystr(" Standard OS/2 printer port");
286
= cpystr(_(" Standard UNIX print command"));
288
ctmpa->value = cpystr("");
289
ctmpa->flags |= (CF_NOSELECT | CF_STARTITEM);
290
ctmpa->headingp = heading;
291
ctmpa->var = &ps->vars[V_STANDARD_PRINTER];
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;
301
= cpystr("Using this option may require you to use the OS/2 \"MODE\" command to");
303
= cpystr(_("Using this option may require setting your \"PRINTER\" or \"LPDEST\""));
305
ctmpa->headingp = heading;
306
ctmpa->var = &ps->vars[V_STANDARD_PRINTER];
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;
316
= cpystr("direct printer output to the correct port.");
318
= cpystr(_("environment variable using the standard UNIX utilities."));
320
ctmpa->headingp = heading;
321
ctmpa->var = &ps->vars[V_STANDARD_PRINTER];
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;
332
ctmpa->varoffset = 8;
333
ctmpa->varname = cpystr(_("Printer List:"));
334
ctmpa->flags |= CF_NOHILITE|CF_PRINTER;
336
start_line = ctmpb = ctmpa; /* default start line */
342
ctmpa->varnamep = ctmpb;
343
ctmpa->headingp = heading;
346
ctmpa->value = printer_name(vtmp->current_val.l[i]);
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;
356
new_confline(&ctmpa);
358
ctmpa->valoffset = 0;
359
ctmpa->keymenu = &printer_edit_keymenu;
360
ctmpa->help = NO_HELP;
361
ctmpa->tool = print_edit_tool;
364
= cpystr(" Personally selected port or |command");
366
= cpystr(_(" Personally selected print command"));
368
ctmpa->flags |= (CF_NOSELECT | CF_STARTITEM);
369
ctmpa->value = cpystr("");
370
ctmpa->headingp = heading;
371
ctmpa->var = &ps->vars[V_PERSONAL_PRINT_COMMAND];
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;
382
= cpystr("The text to be printed will be sent to the printer or command given here.");
384
= cpystr(_("The text to be printed will be piped into the command given here. The"));
386
ctmpa->headingp = heading;
387
ctmpa->var = &ps->vars[V_PERSONAL_PRINT_COMMAND];
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;
397
= cpystr("The printer port or |pipe is in the 2nd column, the printer name is in");
399
= cpystr(_("command is in the 2nd column, the printer name is in the first column. Some"));
401
ctmpa->headingp = heading;
402
ctmpa->var = &ps->vars[V_PERSONAL_PRINT_COMMAND];
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;
412
= cpystr("the first column. Examples: \"LPT1\", \"COM2\", \"|enscript\". A command may");
414
= cpystr(_("examples are: \"prt\", \"lpr\", \"lp\", or \"enscript\". The command may be given"));
416
ctmpa->headingp = heading;
417
ctmpa->var = &ps->vars[V_PERSONAL_PRINT_COMMAND];
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;
427
= cpystr("be given options, for example \"|ascii2ps -p LPT1\" or \"|txt2hplc -2\". Use");
429
= cpystr(_("with options, for example \"enscript -2 -r\" or \"lpr -Plpacc170\". The"));
431
ctmpa->headingp = heading;
432
ctmpa->var = &ps->vars[V_PERSONAL_PRINT_COMMAND];
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;
442
= cpystr("the |command method for printers that require conversion from ASCII.");
444
= cpystr(_("commands and options on your system may be different from these examples."));
446
ctmpa->headingp = heading;
447
ctmpa->var = &ps->vars[V_PERSONAL_PRINT_COMMAND];
449
vtmp = &ps->vars[V_PERSONAL_PRINT_COMMAND];
450
lval = no_ex ? vtmp->current_val.l : LVAL(vtmp, ew);
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;
459
ctmpa->varoffset = 8;
460
ctmpa->varname = cpystr(_("Printer List:"));
461
ctmpa->flags |= CF_NOHILITE|CF_PRINTER;
465
ctmpa->varnamep = ctmpb;
466
ctmpa->headingp = heading;
469
ctmpa->value = printer_name(lval[i]);
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;
485
ctmpa->value = cpystr("");
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)){
502
write_pinerc(ps, ew, WRP_NONE);
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),
514
def_printer_line = NULL;
515
free_saved_config(ps, &vsave, 0);
516
fs_give((void **)&saved_printer);
523
set_def_printer_value(char *printer)
525
char *p, *nick, *cmd;
526
int set, editing_norm_except_exists;
529
if(!def_printer_line)
532
editing_norm_except_exists = ((ps_global->ew_for_except_vars != Main) &&
535
parse_printer(printer, &nick, &cmd, NULL, NULL, NULL, NULL);
536
p = *nick ? nick : cmd;
538
if(*def_printer_line)
539
fs_give((void **)def_printer_line);
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)" : "",
547
(*def_printer_line)[l] = '\0';
549
fs_give((void **)&nick);
550
fs_give((void **)&cmd);
555
print_select_tool(struct pine *ps, int cmd, CONF_S **cl, unsigned int flags)
557
int rc, retval, no_ex, printer_msg = 0;
558
char *p, **lval, *printer_was;
559
struct variable *vtmp;
561
no_ex = (ps_global->ew_for_except_vars == Main);
563
printer_was = ps->VAR_PRINTER ? cpystr(ps->VAR_PRINTER) : NULL;
567
retval = config_exit_cmd(flags);
572
char aname[100], wname[100];
574
strncat(strncpy(aname, ANSI_PRINTER, 50), no_ff, 30);
575
strncat(strncpy(wname, WYSE_PRINTER, 50), no_ff, 30);
578
lval = (no_ex || !vtmp->is_user) ? vtmp->current_val.l
580
rc = set_variable(V_PRINTER, lval ? lval[(*cl)->varmem] : NULL,
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;
588
set_variable(V_PERSONAL_PRINT_CATEGORY,
589
comatose(ps->printer_category), 1, 0, ew);
594
q_status_message(SM_ORDER,3,5, _("Trouble setting default printer"));
598
else if(!strcmp((*cl)->value,ANSI_PRINTER)){
599
rc = set_variable(V_PRINTER, ANSI_PRINTER, 1, 1, ew);
601
ps->printer_category = 1;
602
set_variable(V_PERSONAL_PRINT_CATEGORY,
603
comatose(ps->printer_category), 1, 0, ew);
607
q_status_message(SM_ORDER,3,5, _("Trouble setting default printer"));
611
else if(!strcmp((*cl)->value,aname)){
612
rc = set_variable(V_PRINTER, aname, 1, 1, ew);
614
ps->printer_category = 1;
615
set_variable(V_PERSONAL_PRINT_CATEGORY,
616
comatose(ps->printer_category), 1, 0, ew);
620
q_status_message(SM_ORDER,3,5, _("Trouble setting default printer"));
624
else if(!strcmp((*cl)->value,WYSE_PRINTER)){
625
rc = set_variable(V_PRINTER, WYSE_PRINTER, 1, 1, ew);
627
ps->printer_category = 1;
628
set_variable(V_PERSONAL_PRINT_CATEGORY,
629
comatose(ps->printer_category), 1, 0, ew);
633
q_status_message(SM_ORDER,3,5, _("Trouble setting default printer"));
637
else if(!strcmp((*cl)->value,wname)){
638
rc = set_variable(V_PRINTER, wname, 1, 1, ew);
640
ps->printer_category = 1;
641
set_variable(V_PERSONAL_PRINT_CATEGORY,
642
comatose(ps->printer_category), 1, 0, ew);
646
q_status_message(SM_ORDER,3,5, _("Trouble setting default printer"));
657
ps->mangled_body = 1; /* BUG: redraw it all for now? */
658
set_def_printer_value(ps->VAR_PRINTER);
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);
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)))
686
p ? "set to \"" : "unset",
687
p ? p : "", p ? "\"" : "");
690
fs_give((void **)&p);
694
fs_give((void **)&printer_was);
701
print_edit_tool(struct pine *ps, int cmd, CONF_S **cl, unsigned int flags)
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;
711
/* need this to preserve old behavior when no exception config file */
712
no_ex = (ps_global->ew_for_except_vars == Main);
715
return(print_select_tool(ps, cmd, cl, flags));
717
if(!(cl && *cl && (*cl)->var))
720
nelval = no_ex ? (*cl)->var->current_val.l : LVAL((*cl)->var, ew);
721
lval = LVAL((*cl)->var, ew);
724
case MC_ADD: /* add to list */
726
if(!fixed_var((*cl)->var, "add to", NULL)){
728
if(lval && (*cl)->value){
729
strncpy(prompt, _("Enter printer name : "), sizeof(prompt));
730
prompt[sizeof(prompt)-1] = '\0';
732
else if(!lval && nelval){
733
/* Add to list which doesn't exist, but default does exist */
737
ekey[0].label = N_("Replace");
741
ekey[1].label = N_("Add To");
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)){
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++)
753
ltmp = (char **)fs_get((k+2) * sizeof(char *));
755
for(j = 0; j < k; j++)
756
ltmp[j] = cpystr(nelval[j]);
758
ltmp[k + 1] = ltmp[k] = NULL;
761
strncpy(prompt, _("Enter name of printer to be added : "), sizeof(prompt));
762
prompt[sizeof(prompt)-1] = '\0';
767
strncpy(prompt, _("Enter the name for replacement printer : "), sizeof(prompt));
768
prompt[sizeof(prompt)-1] = '\0';
772
cmd_cancelled("Add");
780
strncpy(prompt, _("Enter name of printer to be added : "), sizeof(prompt));
781
prompt[sizeof(prompt)-1] = '\0';
784
ps->mangled_footer = 1;
789
while(i != 0 && i != 1){
790
if(lval && (*cl)->value){
791
ekey[0].ch = ctrl('W');
794
ekey[0].label = after ? N_("InsertBefore") : N_("InsertAfter");
800
oeflags = OE_APPEND_CURRENT;
801
i = optionally_enter(name, -FOOTER_ROWS(ps), 0, sizeof(name),
803
(ekey[0].ch != -1) ? ekey : NULL,
806
rv = ps->mangled_body = 1;
807
removing_leading_and_trailing_white_space(name);
810
cmd_cancelled("Add");
813
help = (help == NO_HELP) ? h_config_insert_after : NO_HELP;
815
else if(i == 4){ /* no redraw, yet */
817
else if(i == 5){ /* change from/to prepend to/from append */
818
after = after ? 0 : 1;
826
strncpy(prompt, "Enter port or |command : ", sizeof(prompt));
828
strncpy(prompt, _("Enter command for printer : "), sizeof(prompt));
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),
835
(ekey[0].ch != -1) ? ekey : NULL,
838
rv = ps->mangled_body = 1;
839
removing_leading_and_trailing_white_space(sval);
842
for(tmp = sval; *tmp; tmp++)
844
i++; /* conservative count of ,'s */
846
if(!i){ /* only one item */
848
ltmp = (char **)fs_get(2 * sizeof(char *));
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);
861
ltmp[k] = cpystr(sval);
865
* Don't allow input of multiple entries at once.
867
q_status_message(SM_ORDER,3,5,
868
_("No commas allowed in command"));
873
config_add_list(ps, cl, ltmp, &newval, after);
878
fs_give((void **)<mp);
882
q_status_message1(SM_ORDER, 0, 3,
883
_("Can't add %s to list"), empty_val);
886
cmd_cancelled("Add");
889
help = help == NO_HELP ? h_config_print_cmd : NO_HELP;
891
else if(i == 4){ /* no redraw, yet */
893
else if(i == 5){ /* change from/to prepend to/from append */
894
after = after ? 0 : 1;
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;
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'){
916
ltmp = (char **)fs_get(2 * sizeof(char *));
917
ltmp[0] = cpystr(sval);
919
config_add_list(ps, cl, ltmp, &newval, 0);
920
fs_give((void **)<mp);
921
rv = ps->mangled_body = 1;
925
q_status_message(SM_ORDER, 0, 3, _("No set value to delete"));
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);
937
snprintf(prompt, sizeof(prompt), _("Really delete item %s from printer list "),
938
int2string((*cl)->varmem + 1));
940
prompt[sizeof(prompt)-1] = '\0';
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);
949
q_status_message(SM_ORDER, 0, 3, _("Printer not deleted"));
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;
960
if(fixed_var((*cl)->var, NULL, "printer"))
962
else if(!lval && nelval)
964
else if(!lval && !nelval)
972
ekey[0].label = N_("Name");
976
ekey[1].label = N_("Command");
980
ekey[2].label = N_("Options");
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);
989
cmd_cancelled("Change");
995
parse_printer(lval[(*cl)->varmem],
996
NULL, &p, NULL, NULL, NULL, &all_but_cmd);
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);
1004
ps->mangled_footer = 1;
1007
oeflags = OE_APPEND_CURRENT;
1008
i = optionally_enter(sval, -FOOTER_ROWS(ps), 0,
1009
sizeof(sval), prompt, NULL,
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]);
1018
for(tmp = sval; *tmp; tmp++)
1020
i++; /* count of ,'s */
1022
if(!i){ /* only one item */
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';
1030
newval = &(*cl)->value;
1034
* Don't allow input of multiple entries at once.
1036
q_status_message(SM_ORDER,3,5,
1037
_("No commas allowed in command"));
1042
cmd_cancelled("Change");
1045
help = help == NO_HELP ? h_config_change : NO_HELP;
1048
else if(i == 4){ /* no redraw, yet */
1058
parse_printer(lval[(*cl)->varmem],
1059
&p, NULL, NULL, NULL, &all_but_nick, NULL);
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';
1066
fs_give((void **)&p);
1068
ps->mangled_footer = 1;
1071
oeflags = OE_APPEND_CURRENT;
1072
i = optionally_enter(name, -FOOTER_ROWS(ps), 0,
1073
sizeof(name), prompt, NULL,
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]);
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,
1087
(*all_but_nick == '[') ? "" : "[] ",
1089
lval[(*cl)->varmem][l] = '\0';
1091
newval = &(*cl)->value;
1094
cmd_cancelled("Change");
1097
help = help == NO_HELP ? h_config_change : NO_HELP;
1100
else if(i == 4){ /* no redraw, yet */
1107
fs_give((void **)&all_but_nick);
1115
ekey[0].label = N_("Init");
1119
ekey[1].label = N_("Trailer");
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);
1127
cmd_cancelled("Change");
1131
char *init, *trailer;
1133
parse_printer(lval[(*cl)->varmem],
1134
&nick, &p, &init, &trailer, NULL, NULL);
1137
snprintf(prompt, sizeof(prompt), _("Change INIT string : "));
1139
snprintf(prompt, sizeof(prompt), _("Change TRAILER string : "));
1141
strncpy(sval, (j == 'i') ? init : trailer, sizeof(sval)-1);
1142
sval[sizeof(sval)-1] = '\0';
1144
tmp = string_to_cstring(sval);
1145
strncpy(sval, tmp, sizeof(sval)-1);
1146
sval[sizeof(sval)-1] = '\0';
1147
fs_give((void **)&tmp);
1149
ps->mangled_footer = 1;
1152
oeflags = OE_APPEND_CURRENT;
1153
i = optionally_enter(sval, -FOOTER_ROWS(ps), 0,
1154
sizeof(sval), prompt, NULL, help, &oeflags);
1158
removing_leading_and_trailing_white_space(sval);
1160
if(lval[(*cl)->varmem])
1161
fs_give((void **)&lval[(*cl)->varmem]);
1163
init = cstring_to_hexstring(sval);
1164
tmp = cstring_to_hexstring(trailer);
1165
fs_give((void **)&trailer);
1169
trailer = cstring_to_hexstring(sval);
1170
tmp = cstring_to_hexstring(init);
1171
fs_give((void **)&init);
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",
1180
/* space */ *nick ? " " : "",
1181
/* [ */ (*nick || *init || *trailer) ? "[" : "",
1182
/* INIT= */ *init ? "INIT=" : "",
1184
/* space */ (*init && *trailer) ? " " : "",
1185
/* TRAILER= */ *trailer ? "TRAILER=" : "",
1186
/* trailer */ trailer,
1187
/* ] */ (*nick || *init || *trailer) ? "]" : "",
1188
/* space */ (*nick || *init || *trailer) ? " " : "",
1190
lval[(*cl)->varmem][l] = '\0';
1192
newval = &(*cl)->value;
1195
cmd_cancelled("Change");
1198
help=(help == NO_HELP)?h_config_print_init:NO_HELP;
1201
else if(i == 4){ /* no redraw, yet */
1208
fs_give((void **)&nick);
1209
fs_give((void **)&p);
1210
fs_give((void **)&init);
1211
fs_give((void **)&trailer);
1218
case MC_EXIT: /* exit */
1219
rv = config_exit_cmd(flags);
1228
*cl = next_confline(*cl);
1231
* At this point, if changes occurred, var->user_val.X is set.
1232
* So, fix the current_val, and handle special cases...
1235
set_current_val((*cl)->var, TRUE, FALSE);
1236
fix_side_effects(ps, (*cl)->var, 0);
1240
fs_give((void **)newval);
1242
if((*cl)->var->current_val.l)
1243
*newval = printer_name((*cl)->var->current_val.l[(*cl)->varmem]);
1245
*newval = cpystr("");
1248
if(changing_selected)
1249
print_select_tool(ps, MC_CHOICE, cl, flags);
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
1262
printer_name(char *input)
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",
1271
22 - MIN(utf8_width(nick), 21),
1274
fs_give((void **) &nick);
1275
fs_give((void **) &cmd);