1 /*
2 GtkLP
3 graphical Frontends for non-administrative CUPS users.
4
5 Copyright (C) 1998-2004 Tobias Mueller
6
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License
9 as published by the Free Software Foundation; either version 2
10 of the License, or (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA
21
22 */
23
24 #include <config.h>
25
26 #include "special.h"
27
28 #include <stdio.h>
29 #include <string.h>
30 #include <gtk/gtk.h>
31
32 #include <gettext.h>
33 #include <libgtklp.h>
34
35 #include "gtklp.h"
36
37 GtkWidget *specialTab;
38 GtkWidget *bannerFrame, *bannerFrameStartCombo, *bannerFrameStopCombo;
39 GtkWidget *jobNameFrame, *jobNameField;
40 GtkWidget *specialOptFrame, *specialRawCheck;
41 GtkWidget *extraOptFrame, *extraOptField;
42 GtkWidget *passFrame, *loginEntrySpecial, *passEntrySpecial;
43 extern void getBannerList(char *);
44 GList *bannerList;
45
46 int passWarn;
47
48 int bannerAnz;
49 char Banners[MAX_BANNER][MAXLINE + 1];
50
specialTabSetDefaults(void)51 void specialTabSetDefaults(void)
52 {
53 int i1 = 0;
54
55 if (DEBUG)
56 printf("Get specialDefaults\n");
57 /* banners */
58 if (bannerList == NULL)
59 getBannerList(DEF_PRN);
60 gtk_combo_set_popdown_strings(GTK_COMBO(bannerFrameStartCombo),
61 bannerList);
62 gtk_combo_set_popdown_strings(GTK_COMBO(bannerFrameStopCombo),
63 bannerList);
64 gtk_list_select_item(GTK_LIST(GTK_COMBO(bannerFrameStartCombo)->list),
65 0);
66 gtk_list_select_item(GTK_LIST(GTK_COMBO(bannerFrameStopCombo)->list),
67 0);
68 for (i1 = 0; i1 < bannerAnz; i1++) {
69 if (strcmp
70 (str2str(Banners[i1]),
71 str2str(PrinterBannerStart[PrinterChoice])) == 0)
72 gtk_list_select_item(GTK_LIST
73 (GTK_COMBO(bannerFrameStartCombo)->
74 list), i1);
75 if (strcmp
76 (str2str(Banners[i1]),
77 str2str(PrinterBannerEnd[PrinterChoice])) == 0)
78 gtk_list_select_item(GTK_LIST
79 (GTK_COMBO(bannerFrameStopCombo)->
80 list), i1);
81 }
82 /* Job Name */
83 if (JobName[0] != (uintptr_t) NULL) ;
84 gtk_entry_set_text(GTK_ENTRY(jobNameField), JobName);
85 /* Options */
86 if (wantraw)
87 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(specialRawCheck),
88 1);
89 else
90 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(specialRawCheck),
91 0);
92 /* Extra Options */
93 if (ExtraOpt[0] != (uintptr_t) NULL) ;
94 gtk_entry_set_text(GTK_ENTRY(extraOptField), ExtraOpt);
95
96 /* Password and login */
97 gtk_entry_set_text(GTK_ENTRY(loginEntrySpecial),
98 (const gchar *)cupsUser());
99 gtk_entry_set_text(GTK_ENTRY(passEntrySpecial), passWord);
100 passWarn = 1;
101 hasAskedPWD = 0;
102 }
103
BannerFrame(GtkWidget * container)104 void BannerFrame(GtkWidget * container)
105 {
106 GtkWidget *mainHBox, *vbox, *hbox1, *hbox2, *labelStart, *labelStop;
107
108 bannerList = NULL;
109 bannerAnz = 0;
110
111 mainHBox = gtk_hbox_new(FALSE, INFRAME_SPACING_H);
112 gtk_box_pack_start(GTK_BOX(container), mainHBox, FALSE, FALSE,
113 FRAME_SPACING_V);
114 gtk_widget_show(mainHBox);
115
116 bannerFrame = gtk_frame_new(str2str(_("Banners")));
117 gtk_box_pack_start(GTK_BOX(mainHBox), bannerFrame, TRUE, TRUE,
118 FRAME_SPACING_V);
119
120 /* vbox */
121 vbox = gtk_vbox_new(FALSE, INFRAME_SPACING_V);
122 gtk_container_set_border_width(GTK_CONTAINER(vbox), VBOX_BORDER);
123 gtk_container_add(GTK_CONTAINER(bannerFrame), vbox);
124 gtk_widget_show(vbox);
125
126 /* Start Box */
127 hbox1 = gtk_hbox_new(FALSE, 0 * INFRAME_SPACING_H);
128 gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE,
129 0 * INFRAME_SPACING_H);
130 gtk_widget_show(hbox1);
131
132 /* Stop Box */
133 hbox2 = gtk_hbox_new(FALSE, 0 * INFRAME_SPACING_H);
134 gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE,
135 0 * INFRAME_SPACING_V);
136 gtk_widget_show(hbox2);
137
138 /* Start */
139 labelStart = gtk_label_new(str2str(_("Start:")));
140 gtk_misc_set_alignment(GTK_MISC(labelStart), 0, 0.5);
141 gtk_widget_set_size_request(GTK_WIDGET(labelStart),
142 BANNERLABELFIELD_FIELDLENGTH, -1);
143 gtk_box_pack_start(GTK_BOX(hbox1), labelStart, FALSE, FALSE,
144 INFRAME_SPACING_V);
145 gtk_widget_show(labelStart);
146
147 bannerFrameStartCombo = gtk_combo_new();
148 gtk_combo_set_value_in_list(GTK_COMBO(bannerFrameStartCombo), TRUE,
149 FALSE);
150 gtk_list_set_selection_mode(GTK_LIST
151 (GTK_COMBO(bannerFrameStartCombo)->list),
152 GTK_SELECTION_SINGLE);
153
154 gtk_entry_set_editable(GTK_ENTRY
155 (GTK_COMBO(bannerFrameStartCombo)->entry),
156 FALSE);
157 gtk_box_pack_start(GTK_BOX(hbox1), bannerFrameStartCombo, FALSE, FALSE,
158 0);
159 gtk_widget_show(bannerFrameStartCombo);
160
161 /* Stop */
162 labelStop = gtk_label_new(str2str(_("End:")));
163 gtk_misc_set_alignment(GTK_MISC(labelStop), 0, 0.5);
164 gtk_widget_set_size_request(GTK_WIDGET(labelStop),
165 BANNERLABELFIELD_FIELDLENGTH, -1);
166 gtk_box_pack_start(GTK_BOX(hbox2), labelStop, FALSE, FALSE,
167 INFRAME_SPACING_V);
168 gtk_widget_show(labelStop);
169
170 bannerFrameStopCombo = gtk_combo_new();
171 gtk_combo_set_value_in_list(GTK_COMBO(bannerFrameStopCombo), TRUE,
172 FALSE);
173 gtk_list_set_selection_mode(GTK_LIST
174 (GTK_COMBO(bannerFrameStopCombo)->list),
175 GTK_SELECTION_SINGLE);
176
177 gtk_entry_set_editable(GTK_ENTRY
178 (GTK_COMBO(bannerFrameStopCombo)->entry), FALSE);
179 gtk_box_pack_start(GTK_BOX(hbox2), bannerFrameStopCombo, FALSE, FALSE,
180 0);
181 gtk_widget_show(bannerFrameStopCombo);
182
183 }
184
loginEntrySpecialNew(GtkWidget * widget,GdkEventFocus * event,gpointer user_data)185 gboolean loginEntrySpecialNew(GtkWidget * widget, GdkEventFocus * event,
186 gpointer user_data)
187 {
188 cupsSetUser((const char *)
189 gtk_entry_get_text(GTK_ENTRY(loginEntrySpecial)));
190 strncpy(UserName, (char *)gtk_entry_get_text(GTK_ENTRY(loginEntrySpecial)), (size_t) MAX_USERNAME); /* no length-check, cause it's done with entrys max-length */
191 if (DEBUG)
192 printf("New Username: %s\n", cupsUser());
193
194 return (0);
195 }
196
passEntrySpecialNew(GtkEditable * editable,gpointer data)197 gboolean passEntrySpecialNew(GtkEditable * editable, gpointer data)
198 {
199 strncpy(passWord, (char *)gtk_entry_get_text(GTK_ENTRY(passEntrySpecial)), (size_t) MAX_PASSLEN); /* no length-check, cause it's done with entrys max-length */
200 if (DEBUG)
201 printf("New Password: %s\n", passWord);
202 if ((passWarn == 1) && (passWord[0] != (uintptr_t) NULL)) {
203 passWarn = 0;
204 quick_message(str2str
205 (_
206 ("You have chosen to store your password on the disk.\nThis is not secure, so I recommend against doing so.\nYou have been warned.")),
207 4);
208 }
209
210 return (0);
211 }
212
PassFrame(GtkWidget * container)213 void PassFrame(GtkWidget * container)
214 {
215 GtkWidget *mainHBox, *vbox, *hbox1, *hbox2, *labelLogin, *labelPass;
216
217 mainHBox = gtk_hbox_new(FALSE, INFRAME_SPACING_H);
218 gtk_box_pack_start(GTK_BOX(container), mainHBox, FALSE, FALSE,
219 FRAME_SPACING_V);
220 gtk_widget_show(mainHBox);
221
222 passFrame = gtk_frame_new(str2str(_("Password")));
223 gtk_box_pack_start(GTK_BOX(mainHBox), passFrame, TRUE, TRUE,
224 FRAME_SPACING_V);
225
226 /* vbox */
227 vbox = gtk_vbox_new(FALSE, INFRAME_SPACING_V);
228 gtk_container_set_border_width(GTK_CONTAINER(vbox), VBOX_BORDER);
229 gtk_container_add(GTK_CONTAINER(passFrame), vbox);
230 gtk_widget_show(vbox);
231
232 /* Login Box */
233 hbox1 = gtk_hbox_new(FALSE, 0 * INFRAME_SPACING_H);
234 gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE,
235 0 * INFRAME_SPACING_H);
236 gtk_widget_show(hbox1);
237
238 /* Password Box */
239 hbox2 = gtk_hbox_new(FALSE, 0 * INFRAME_SPACING_H);
240 gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE,
241 0 * INFRAME_SPACING_V);
242 gtk_widget_show(hbox2);
243
244 /* Login */
245 labelLogin = gtk_label_new(str2str(_("Login:")));
246 gtk_misc_set_alignment(GTK_MISC(labelLogin), 0, 0.5);
247 gtk_widget_set_size_request(GTK_WIDGET(labelLogin),
248 LOGINLABELFIELD_FIELDLENGTH, -1);
249 gtk_box_pack_start(GTK_BOX(hbox1), labelLogin, FALSE, FALSE,
250 INFRAME_SPACING_V);
251 gtk_widget_show(labelLogin);
252
253 loginEntrySpecial = gtk_entry_new();
254 gtk_entry_set_editable(GTK_ENTRY(loginEntrySpecial), TRUE);
255 gtk_entry_set_max_length(GTK_ENTRY(loginEntrySpecial), MAX_USERNAME);
256 gtk_entry_set_visibility(GTK_ENTRY(loginEntrySpecial), TRUE);
257 gtk_box_pack_start(GTK_BOX(hbox1), loginEntrySpecial, FALSE, FALSE, 0);
258 gtk_widget_show(loginEntrySpecial);
259
260 /* Password */
261 labelPass = gtk_label_new(str2str(_("Password:")));
262 gtk_misc_set_alignment(GTK_MISC(labelPass), 0, 0.5);
263 gtk_widget_set_size_request(GTK_WIDGET(labelPass),
264 LOGINLABELFIELD_FIELDLENGTH, -1);
265 gtk_box_pack_start(GTK_BOX(hbox2), labelPass, FALSE, FALSE,
266 INFRAME_SPACING_V);
267 gtk_widget_show(labelPass);
268
269 passEntrySpecial = gtk_entry_new();
270 gtk_entry_set_editable(GTK_ENTRY(passEntrySpecial), TRUE);
271 gtk_entry_set_max_length(GTK_ENTRY(passEntrySpecial), MAX_PASSLEN);
272 gtk_entry_set_visibility(GTK_ENTRY(passEntrySpecial), FALSE);
273 gtk_box_pack_start(GTK_BOX(hbox2), passEntrySpecial, FALSE, FALSE, 0);
274 gtk_widget_show(passEntrySpecial);
275
276 gtk_signal_connect(GTK_OBJECT(loginEntrySpecial), "focus-out-event",
277 GTK_SIGNAL_FUNC(loginEntrySpecialNew), NULL);
278 gtk_signal_connect(GTK_OBJECT(passEntrySpecial), "focus-out-event",
279 GTK_SIGNAL_FUNC(passEntrySpecialNew), NULL);
280 }
281
JobNameChanged(GtkWidget * widget,gpointer data)282 void JobNameChanged(GtkWidget * widget, gpointer data)
283 {
284 strncpy(JobName,
285 gtk_editable_get_chars(GTK_EDITABLE(jobNameField), 0, -1),
286 (size_t) MAX_JOB_NAME_LENGTH);
287 if (DEBUG)
288 printf("Job Name changed: %s\n", JobName);
289 }
290
JobNameFrame(GtkWidget * container)291 void JobNameFrame(GtkWidget * container)
292 {
293 GtkWidget *mainHBox, *hbox, *vbox;
294
295 mainHBox = gtk_hbox_new(FALSE, INFRAME_SPACING_H);
296 gtk_box_pack_start(GTK_BOX(container), mainHBox, FALSE, FALSE,
297 FRAME_SPACING_V);
298 gtk_widget_show(mainHBox);
299
300 jobNameFrame = gtk_frame_new(str2str(_("Job Name")));
301 gtk_box_pack_start(GTK_BOX(mainHBox), jobNameFrame, TRUE, TRUE,
302 FRAME_SPACING_V);
303
304 /* vbox */
305 vbox = gtk_vbox_new(FALSE, INFRAME_SPACING_V);
306 gtk_container_set_border_width(GTK_CONTAINER(vbox), VBOX_BORDER);
307 gtk_container_add(GTK_CONTAINER(jobNameFrame), vbox);
308 gtk_widget_show(vbox);
309
310 /* hbox */
311 hbox = gtk_hbox_new(FALSE, INFRAME_SPACING_H);
312 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
313 gtk_widget_show(hbox);
314
315 /* TextBox */
316 jobNameField = gtk_entry_new_with_max_length(MAX_JOB_NAME_LENGTH);
317 gtk_widget_set_size_request(jobNameField, JOBNAME_FIELD_LENGTH, -1);
318 gtk_entry_set_text(GTK_ENTRY(jobNameField), "");
319 gtk_box_pack_start(GTK_BOX(hbox), jobNameField, FALSE, FALSE,
320 INFRAME_SPACING_V);
321 gtk_widget_show(jobNameField);
322
323 /* Signals */
324 gtk_signal_connect(GTK_OBJECT(GTK_ENTRY(jobNameField)), "changed",
325 GTK_SIGNAL_FUNC(JobNameChanged), NULL);
326 }
327
specialCheckChanged(GtkWidget * widget,gpointer data)328 void specialCheckChanged(GtkWidget * widget, gpointer data)
329 {
330 if (DEBUG)
331 printf("specialChanged: %s\n", (char *)data);
332 if (strcmp((char *)data, "Raw") == 0) {
333 if (wantraw == 1)
334 wantraw = 0;
335 else
336 wantraw = 1;
337 return;
338 }
339 if (DEBUG)
340 printf("PROG_ERROR: unknown special button !\n");
341 emergency();
342
343 }
344
SpecialOptFrame(GtkWidget * container)345 void SpecialOptFrame(GtkWidget * container)
346 {
347 GtkWidget *mainHBox, *hbox, *vbox;
348
349 mainHBox = gtk_hbox_new(FALSE, INFRAME_SPACING_H);
350 gtk_box_pack_start(GTK_BOX(container), mainHBox, FALSE, FALSE,
351 FRAME_SPACING_V);
352 gtk_widget_show(mainHBox);
353 specialOptFrame = gtk_frame_new(str2str(_("Options")));
354 gtk_box_pack_start(GTK_BOX(mainHBox), specialOptFrame, TRUE, TRUE,
355 FRAME_SPACING_V);
356
357 /* Box */
358 hbox = gtk_hbox_new(FALSE, 0);
359 gtk_container_add(GTK_CONTAINER(specialOptFrame), hbox);
360 gtk_widget_show(hbox);
361
362 vbox = gtk_vbox_new(FALSE, 0);
363 gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE,
364 INFRAME_SPACING_H);
365 gtk_widget_show(vbox);
366
367 /* Buttons */
368 specialRawCheck =
369 gtk_check_button_new_with_label(str2str(_("Raw output")));
370 gtk_box_pack_start(GTK_BOX(vbox), specialRawCheck, FALSE, FALSE, 0);
371 gtk_signal_connect(GTK_OBJECT(specialRawCheck), "pressed",
372 GTK_SIGNAL_FUNC(specialCheckChanged), "Raw");
373 gtk_widget_show(specialRawCheck);
374
375 }
376
extraOptChanged(GtkWidget * widget,gpointer data)377 void extraOptChanged(GtkWidget * widget, gpointer data)
378 {
379 strncpy(ExtraOpt,
380 gtk_editable_get_chars(GTK_EDITABLE(extraOptField), 0, -1),
381 (size_t) MAX_EXTRAOPT);
382 if (DEBUG)
383 printf("Extra Options changed: %s\n", ExtraOpt);
384 }
385
ExtraOptFrame(GtkWidget * container)386 void ExtraOptFrame(GtkWidget * container)
387 {
388 GtkWidget *mainHBox, *hbox, *vbox;
389
390 mainHBox = gtk_hbox_new(FALSE, INFRAME_SPACING_H);
391 gtk_box_pack_start(GTK_BOX(container), mainHBox, FALSE, FALSE,
392 FRAME_SPACING_V);
393 gtk_widget_show(mainHBox);
394
395 extraOptFrame = gtk_frame_new(str2str(_("Extra Options")));
396 gtk_box_pack_start(GTK_BOX(mainHBox), extraOptFrame, TRUE, TRUE,
397 FRAME_SPACING_V);
398
399 /* vbox */
400 vbox = gtk_vbox_new(FALSE, INFRAME_SPACING_V);
401 gtk_container_set_border_width(GTK_CONTAINER(vbox), VBOX_BORDER);
402 gtk_container_add(GTK_CONTAINER(extraOptFrame), vbox);
403 gtk_widget_show(vbox);
404
405 /* hbox */
406 hbox = gtk_hbox_new(FALSE, INFRAME_SPACING_H);
407 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
408 gtk_widget_show(hbox);
409
410 /* TextBox */
411 extraOptField = gtk_entry_new_with_max_length(MAX_EXTRAOPT);
412 gtk_widget_set_size_request(extraOptField, EXTRAOPT_FIELD_LENGTH, -1);
413 gtk_entry_set_text(GTK_ENTRY(extraOptField), "");
414 gtk_box_pack_start(GTK_BOX(hbox), extraOptField, FALSE, FALSE,
415 INFRAME_SPACING_V);
416 gtk_widget_show(extraOptField);
417
418 /* Signals */
419 gtk_signal_connect(GTK_OBJECT(GTK_ENTRY(extraOptField)), "changed",
420 GTK_SIGNAL_FUNC(extraOptChanged), NULL);
421 }
422
SpecialTab(void)423 void SpecialTab(void)
424 {
425 specialTab = gtk_vbox_new(FALSE, 0);
426 gtk_container_set_border_width(GTK_CONTAINER(specialTab), FRAME_BORDER);
427 gtk_notebook_append_page(GTK_NOTEBOOK(tabs), specialTab,
428 gtk_label_new(str2str(_("Special"))));
429
430 BannerFrame(specialTab);
431 JobNameFrame(specialTab);
432 SpecialOptFrame(specialTab);
433 PassFrame(specialTab);
434 ExtraOptFrame(specialTab);
435 }
436