]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/gnome2-console/callbacks.c
This commit was manufactured by cvs2svn to create tag
[bacula/bacula] / bacula / src / gnome2-console / callbacks.c
1 /* 
2  *    Version $Id$
3  */
4
5 #ifdef HAVE_CONFIG_H
6 #  include <config.h>
7 #endif
8
9 #include "bacula.h"
10 #include "console.h"
11
12 #include "callbacks.h"
13 #include "interface.h"
14 #include "support.h"
15
16 #define KEY_Enter 65293
17 #define KEY_Up    65362
18 #define KEY_Down  65364
19 #define KEY_Left  65361
20 #define KEY_Right 65363
21
22 gboolean
23 on_app1_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
24 {
25    gtk_main_quit();
26    return FALSE;
27 }
28
29 void
30 on_connect_activate(GtkMenuItem *menuitem, gpointer user_data)
31 {
32    if (connect_to_director(user_data)) {
33       start_director_reader(user_data);
34    }
35 }
36
37
38 void
39 on_disconnect_activate(GtkMenuItem *menuitem, gpointer user_data)
40 {
41    if (disconnect_from_director(user_data)) {
42       stop_director_reader(user_data);
43    }
44 }
45
46
47 void
48 on_exit_activate(GtkMenuItem *menuitem, gpointer user_data)
49 {
50    gtk_main_quit();
51 }
52
53
54 void
55 on_cut1_activate(GtkMenuItem *menuitem, gpointer user_data)
56 {
57
58 }
59
60
61 void
62 on_copy1_activate(GtkMenuItem *menuitem, gpointer user_data)
63 {
64
65 }
66
67
68 void
69 on_paste1_activate(GtkMenuItem *menuitem, gpointer user_data)
70 {
71
72 }
73
74
75 void
76 on_clear1_activate(GtkMenuItem *menuitem, gpointer user_data)
77 {
78
79 }
80
81
82 void
83 on_properties1_activate(GtkMenuItem *menuitem, gpointer user_data)
84 {
85
86 }
87
88
89 void
90 on_preferences1_activate(GtkMenuItem *menuitem, gpointer user_data)
91 {
92 }
93
94
95 void
96 on_about_activate(GtkMenuItem *menuitem, gpointer user_data)
97 {
98    gtk_widget_show(about1);
99    gtk_main();
100 }
101
102
103 void
104 on_connect_button_clicked(GtkButton *button, gpointer user_data)
105 {
106    if (connect_to_director(user_data)) {
107       start_director_reader(user_data);
108    }
109 }
110
111 /* Define max length of history and how many to delete when it gets there.  
112  * If you make HIST_DEL > HIST_MAX, you shoot yourself in the foot. 
113  */
114 #define HIST_MAX 2500
115 #define HIST_DEL  500
116
117 static GList *hist = NULL;
118 static GList *hc = NULL;
119 static int hist_len = 0;
120
121 static void add_to_history(gchar *ecmd)
122 {
123    int len = strlen(ecmd);
124
125    if (len > 0) {
126       hist = g_list_append(hist, bstrdup(ecmd));
127       hist_len++;
128    }
129    if (hist_len >= HIST_MAX) {
130       int i;
131       GList *hp;
132       for (i=0; i<HIST_DEL; i++) {
133          hp = g_list_next(hist);
134          free(hp->data);
135          hist = g_list_remove(hist, hp->data);
136       }
137       hist_len -= HIST_DEL;
138    }
139    hc = NULL;             
140 }
141
142 /*
143  * Note, apparently there is a bug in GNOME where some of the
144  *  key press events are lost -- at least it loses every other
145  *  up arrow!
146  */
147 gboolean
148 on_entry1_key_press_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
149 {
150    if (event->keyval == KEY_Enter) {
151       char *ecmd = (char *)gtk_entry_get_text((GtkEntry *)entry1);
152       set_text(ecmd, strlen(ecmd));
153       set_text("\n", 1);
154       add_to_history(ecmd);
155       write_director(ecmd);
156       gtk_entry_set_text((GtkEntry *)entry1, "");
157    } else if (event->keyval == KEY_Up) {
158       if (!hc) {
159          hc = g_list_last(hist);
160       } else {
161          hc = g_list_previous(hc);
162       }
163       if (!hc) {
164          hc = g_list_first(hist);
165       }
166       gtk_entry_set_text((GtkEntry *)entry1, (gchar *)hc->data);
167    } else if (event->keyval == KEY_Down) {
168       if (!hc) {
169          hc = g_list_first(hist);
170       } else {
171          hc = g_list_next(hc);
172       }
173       if (!hc) {
174          hc = g_list_last(hist);
175       }
176       gtk_entry_set_text((GtkEntry *)entry1, (gchar *)hc->data);
177    }
178 // gtk_entry_set_position((GtkEntry *)entry1, -1);
179 // gtk_window_set_focus((GtkWindow *)app1, entry1);
180    return FALSE;
181 }
182
183
184 void
185 on_app1_show(GtkWidget *widget, gpointer user_data)
186 {
187 }
188
189
190
191 void
192 on_msgs_button_clicked(GtkButton *button, gpointer user_data)
193 {
194    write_director("messages");
195 }
196
197 void
198 on_msgs_activate(GtkMenuItem *menuitem, gpointer user_data)
199 {
200    write_director("messages");
201 }
202
203 void
204 on_about_button_clicked(GtkButton *button, gpointer user_data)
205 {
206    gtk_widget_hide(about1);
207    gtk_main_quit();
208    set_status_ready();
209 }
210
211 void
212 on_select_director_OK_clicked(GtkButton *button, gpointer user_data)
213 {
214    reply = OK;
215    gtk_widget_hide(dir_dialog);
216    gtk_main_quit();
217    set_status_ready();
218 }
219
220
221 void
222 on_select_director_cancel_clicked(GtkButton *button, gpointer user_data)
223 {
224    reply = CANCEL;
225    gtk_widget_hide(dir_dialog);
226    gtk_main_quit();
227    set_status_ready();
228 }
229
230 /*
231  * Compare list string items
232  */
233 static gint compare_func(const void *data1, const void *data2)
234 {
235    return strcmp((const char *)data1, (const char *)data2);
236 }
237
238 static GList *find_combo_list(char *name)
239 {
240    if (strcmp(name, "job") == 0) {
241       return job_list;
242    }
243    if (strcmp(name, "pool") == 0) {
244       return pool_list;
245    }
246    if (strcmp(name, "client") == 0) {
247       return client_list;
248    }
249    if (strcmp(name, "storage") == 0) {
250       return storage_list;
251    }
252    if (strcmp(name, "fileset") == 0) {
253       return fileset_list;
254    }
255    if (strcmp(name, "messages") == 0) {
256       return messages_list;
257    }
258    if (strcmp(name, "type") == 0) {
259       return type_list;
260    }
261    if (strcmp(name, "level") == 0) {
262       return level_list;
263    }
264    return NULL;
265 }
266
267 /*
268  * Set correct default values in the Run dialog box
269  */
270 static void set_run_defaults()
271 {
272    GtkWidget *combo, *entry;
273    char *job, *def;
274    GList *item, *list;
275    char cmd[1000];
276    int pos;
277
278    stop_director_reader(NULL);
279
280    combo = lookup_widget(run_dialog, "combo_job");
281    job = (char *)gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry));
282    bsnprintf(cmd, sizeof(cmd), ".defaults job=\"%s\"", job);
283    write_director(cmd);
284    while (bnet_recv(UA_sock) > 0) {
285       def = strchr(UA_sock->msg, '=');
286       if (!def) {
287          continue;
288       }
289       *def++ = 0;
290       if (strcmp(UA_sock->msg, "job") == 0 ||
291           strcmp(UA_sock->msg, "when") == 0) {
292          continue;
293       }
294       /* Where is an entry box */
295       if (strcmp(UA_sock->msg, "where") == 0) {
296          entry = lookup_widget(run_dialog, "entry_where");
297          gtk_entry_set_text(GTK_ENTRY(entry), def);
298          continue;
299       }
300
301       /* Now handle combo boxes */
302       list = find_combo_list(UA_sock->msg);
303       if (!list) {
304          continue;
305       }
306       item = g_list_find_custom(list, def, compare_func);
307       bsnprintf(cmd, sizeof(cmd), "combo_%s", UA_sock->msg);
308       combo = lookup_widget(run_dialog, cmd);
309       if (!combo) {
310          continue;
311       }
312       pos = g_list_position(list, item);
313       gtk_list_select_item(GTK_LIST(GTK_COMBO(combo)->list), pos);
314    }
315    start_director_reader(NULL);
316 }
317
318 void
319 on_entry_job_changed(GtkEditable *editable, gpointer user_data)
320 {
321    set_run_defaults();
322 }
323
324
325 void
326 on_run_button_clicked(GtkButton *button, gpointer user_data)
327 {
328    char dt[50];
329    GtkWidget *entry;
330
331    bstrutime(dt, sizeof(dt), time(NULL));
332    entry = lookup_widget(run_dialog, "entry_when");
333    gtk_entry_set_text(GTK_ENTRY(entry), dt);
334    set_run_defaults();
335    gtk_widget_show(run_dialog);
336    gtk_main();
337 }
338
339
340 static char *get_combo_text(GtkWidget *dialog, char *combo_name)
341 {
342    GtkWidget *combo;
343    combo = lookup_widget(dialog, combo_name);
344    if (!combo) {
345       return NULL;
346    }
347    return (char *)gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry));
348 }
349
350 static char *get_entry_text(GtkWidget *dialog, char *entry_name)
351 {
352    GtkWidget *entry;
353    entry = lookup_widget(dialog, entry_name);
354    if (!entry) {
355       return NULL;
356    }
357    return (char *)gtk_entry_get_text(GTK_ENTRY(entry));
358 }
359
360 static char *get_spin_text(GtkWidget *dialog, char *spin_name)
361 {
362    GtkSpinButton *spin;
363    spin = (GtkSpinButton *)lookup_widget(dialog, spin_name);
364    if (!spin) {
365       return NULL;
366    }
367    return (char *)gtk_entry_get_text(GTK_ENTRY(&spin->entry));
368 }
369
370
371
372
373 void
374 on_run_ok_clicked(GtkButton *button, gpointer user_data)
375 {
376    char *job, *fileset, *level, *client, *pool, *when, *where, *storage;
377
378    gtk_widget_hide(run_dialog);
379    gtk_main_quit();
380
381    job     = get_combo_text(run_dialog, "combo_job");
382    fileset = get_combo_text(run_dialog, "combo_fileset");
383    client  = get_combo_text(run_dialog, "combo_client");
384    pool    = get_combo_text(run_dialog, "combo_pool");
385    storage = get_combo_text(run_dialog, "combo_storage");
386    level   = get_combo_text(run_dialog, "combo_level");
387
388    when    = get_entry_text(run_dialog, "entry_when");
389    where   = get_entry_text(run_dialog, "entry_where");
390
391    if (!job || !fileset || !client || !pool || !storage ||
392        !level || !when || !where) {
393       set_status_ready();
394       return;
395    }
396       
397    bsnprintf(cmd, sizeof(cmd), 
398              "run job=\"%s\" fileset=\"%s\" level=%s client=\"%s\" pool=\"%s\" "
399              "when=\"%s\" where=\"%s\" storage=\"%s\"", 
400              job, fileset, level, client, pool, when, where, storage);
401    write_director(cmd);
402    write_director("yes");
403    return;
404 }
405
406
407 void
408 on_run_cancel_clicked(GtkButton *button, gpointer user_data)
409 {
410    gtk_widget_hide(run_dialog);
411    gtk_main_quit();
412    set_status_ready();
413 }
414
415 gboolean
416 on_entry1_key_release_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
417 {
418   return FALSE;
419 }
420
421 void
422 on_restore_button_clicked(GtkButton *button, gpointer user_data)
423 {
424    gtk_widget_show(restore_dialog);
425    gtk_main();
426 }
427
428 void
429 on_view_fileset_clicked(GtkButton *button, gpointer user_data)
430 {
431 }
432
433 void
434 on_restore_ok_clicked(GtkButton *button, gpointer user_data)
435 {
436    gtk_widget_hide(restore_dialog);
437    gtk_main_quit();
438    set_status_ready();
439 }
440
441
442 void
443 on_restore_cancel_clicked(GtkButton *button, gpointer user_data)
444 {
445    gtk_widget_hide(restore_dialog);
446    gtk_main_quit();
447    set_status_ready();
448 }
449
450 void
451 on_apply_button_clicked(GtkButton *button, gpointer user_data)
452 {
453    gtk_widget_show(restore_files);
454    gtk_main();
455 }
456
457 void
458 on_restore_file_clicked(GtkButton *button, gpointer user_data)
459 {
460    gtk_widget_hide(restore_files);
461    gtk_main_quit();
462 }
463
464 void
465 on_label_button_clicked(GtkButton *button, gpointer user_data)
466 {
467    gtk_widget_show(label_dialog);
468    gtk_main();
469 }
470
471 void
472 on_label_ok_clicked(GtkButton *button, gpointer user_data)
473 {
474    char *pool, *volume, *storage, *slot;
475
476    gtk_widget_hide(label_dialog);
477    gtk_main_quit();
478
479    pool    = get_combo_text(label_dialog, "label_combo_pool");
480    storage = get_combo_text(label_dialog, "label_combo_storage");
481
482    volume  = get_entry_text(label_dialog, "label_entry_volume");
483
484    slot    = get_spin_text(label_dialog, "label_slot");
485
486    if (!pool || !storage || !volume || !(*volume)) {
487       set_status_ready();
488       return;
489    }
490       
491    bsnprintf(cmd, sizeof(cmd), 
492              "label name=\"%s\" pool=\"%s\" storage=\"%s\" slot=%s", 
493              volume, pool, storage, slot);
494    write_director(cmd);
495 }
496
497
498 void
499 on_label_cancel_clicked(GtkButton *button, gpointer user_data)
500 {
501    gtk_widget_hide(label_dialog);
502    gtk_main_quit();
503    set_status_ready();
504 }