12 #include "callbacks.h"
13 #include "interface.h"
16 #define KEY_Enter 65293
18 #define KEY_Down 65364
19 #define KEY_Left 65361
20 #define KEY_Right 65363
22 void terminate_console(int sig);
24 extern "C" gint compare_func(const void *data1, const void *data2);
27 on_console_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
35 on_connect_activate(GtkMenuItem *menuitem, gpointer user_data)
37 if (connect_to_director(user_data)) {
38 start_director_reader(user_data);
44 on_disconnect_activate(GtkMenuItem *menuitem, gpointer user_data)
46 if (disconnect_from_director(user_data)) {
47 stop_director_reader(user_data);
53 on_exit_activate(GtkMenuItem *menuitem, gpointer user_data)
60 on_cut1_activate(GtkMenuItem *menuitem, gpointer user_data)
67 on_copy1_activate(GtkMenuItem *menuitem, gpointer user_data)
74 on_paste1_activate(GtkMenuItem *menuitem, gpointer user_data)
81 on_clear1_activate(GtkMenuItem *menuitem, gpointer user_data)
87 on_preferences1_activate(GtkMenuItem *menuitem, gpointer user_data)
93 on_about_activate(GtkMenuItem *menuitem, gpointer user_data)
95 gtk_widget_show(about1);
101 on_connect_button_clicked(GtkButton *button, gpointer user_data)
103 if (connect_to_director(user_data)) {
104 start_director_reader(user_data);
108 /* Define max length of history and how many to delete when it gets there.
109 * If you make HIST_DEL > HIST_MAX, you shoot yourself in the foot.
111 #define HIST_MAX 2500
114 static GList *hist = NULL;
115 static GList *hc = NULL;
116 static int hist_len = 0;
118 static void add_to_history(gchar *ecmd)
120 int len = strlen(ecmd);
123 hist = g_list_append(hist, bstrdup(ecmd));
126 if (hist_len >= HIST_MAX) {
129 for (i=0; i<HIST_DEL; i++) {
130 hp = g_list_next(hist);
132 hist = g_list_remove(hist, hp->data);
134 hist_len -= HIST_DEL;
140 * Note, apparently there is a bug in GNOME where some of the
141 * key press events are lost -- at least it loses every other
145 on_entry1_key_press_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
147 if (event->keyval == KEY_Enter) {
148 char *ecmd = (char *)gtk_entry_get_text((GtkEntry *)entry1);
149 set_text(ecmd, strlen(ecmd));
151 add_to_history(ecmd);
152 write_director(ecmd);
153 gtk_entry_set_text((GtkEntry *)entry1, "");
154 } else if (event->keyval == KEY_Up) {
156 hc = g_list_last(hist);
158 hc = g_list_previous(hc);
161 hc = g_list_first(hist);
163 gtk_entry_set_text((GtkEntry *)entry1, (gchar *)hc->data);
164 } else if (event->keyval == KEY_Down) {
166 hc = g_list_first(hist);
168 hc = g_list_next(hc);
171 hc = g_list_last(hist);
173 gtk_entry_set_text((GtkEntry *)entry1, (gchar *)hc->data);
175 // gtk_entry_set_position((GtkEntry *)entry1, -1);
176 // gtk_window_set_focus((GtkWindow *)app1, entry1);
182 on_app1_show(GtkWidget *widget, gpointer user_data)
189 on_msgs_button_clicked(GtkButton *button, gpointer user_data)
191 write_director("messages");
195 on_msgs_activate(GtkMenuItem *menuitem, gpointer user_data)
197 write_director("messages");
201 on_about_button_clicked(GtkButton *button, gpointer user_data)
203 gtk_widget_hide(about1);
209 on_select_director_OK_clicked(GtkButton *button, gpointer user_data)
212 gtk_widget_hide(dir_dialog);
219 on_select_director_cancel_clicked(GtkButton *button, gpointer user_data)
222 gtk_widget_hide(dir_dialog);
228 * Compare list string items
231 gint compare_func(const void *data1, const void *data2)
233 return strcmp((const char *)data1, (const char *)data2);
236 static GList *find_combo_list(char *name)
238 if (strcmp(name, "job") == 0) {
241 if (strcmp(name, "pool") == 0) {
244 if (strcmp(name, "client") == 0) {
247 if (strcmp(name, "storage") == 0) {
250 if (strcmp(name, "fileset") == 0) {
253 if (strcmp(name, "messages") == 0) {
254 return messages_list;
256 if (strcmp(name, "type") == 0) {
259 if (strcmp(name, "level") == 0) {
266 * Set correct default values in the Run dialog box
268 static void set_run_defaults()
270 GtkWidget *combo, *entry;
276 stop_director_reader(NULL);
278 combo = lookup_widget(run_dialog, "combo_job");
279 job = (char *)gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry));
280 bsnprintf(cmd, sizeof(cmd), ".defaults job=\"%s\"", job);
282 while (bnet_recv(UA_sock) > 0) {
283 def = strchr(UA_sock->msg, '=');
288 if (strcmp(UA_sock->msg, "job") == 0 ||
289 strcmp(UA_sock->msg, "when") == 0) {
292 /* Where is an entry box */
293 if (strcmp(UA_sock->msg, "where") == 0) {
294 entry = lookup_widget(run_dialog, "entry_where");
295 gtk_entry_set_text(GTK_ENTRY(entry), def);
299 /* Now handle combo boxes */
300 list = find_combo_list(UA_sock->msg);
304 item = g_list_find_custom(list, def, compare_func);
305 bsnprintf(cmd, sizeof(cmd), "combo_%s", UA_sock->msg);
306 combo = lookup_widget(run_dialog, cmd);
310 pos = g_list_position(list, item);
311 gtk_list_select_item(GTK_LIST(GTK_COMBO(combo)->list), pos);
313 start_director_reader(NULL);
317 on_entry_job_changed(GtkEditable *editable, gpointer user_data)
324 on_run_button_clicked(GtkButton *button, gpointer user_data)
329 bstrutime(dt, sizeof(dt), time(NULL));
330 entry = lookup_widget(run_dialog, "entry_when");
331 gtk_entry_set_text(GTK_ENTRY(entry), dt);
333 gtk_widget_show(run_dialog);
338 static char *get_combo_text(GtkWidget *dialog, const char *combo_name)
341 combo = lookup_widget(dialog, combo_name);
345 return (char *)gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry));
348 static char *get_entry_text(GtkWidget *dialog, const char *entry_name)
351 entry = lookup_widget(dialog, entry_name);
355 return (char *)gtk_entry_get_text(GTK_ENTRY(entry));
358 static char *get_spin_text(GtkWidget *dialog, const char *spin_name)
361 spin = (GtkSpinButton *)lookup_widget(dialog, spin_name);
365 return (char *)gtk_entry_get_text(GTK_ENTRY(&spin->entry));
372 on_run_ok_clicked(GtkButton *button, gpointer user_data)
374 char *job, *fileset, *level, *client, *pool, *when, *where, *storage;
376 gtk_widget_hide(run_dialog);
379 job = get_combo_text(run_dialog, "combo_job");
380 fileset = get_combo_text(run_dialog, "combo_fileset");
381 client = get_combo_text(run_dialog, "combo_client");
382 pool = get_combo_text(run_dialog, "combo_pool");
383 storage = get_combo_text(run_dialog, "combo_storage");
384 level = get_combo_text(run_dialog, "combo_level");
386 when = get_entry_text(run_dialog, "entry_when");
387 where = get_entry_text(run_dialog, "entry_where");
389 if (!job || !fileset || !client || !pool || !storage ||
390 !level || !when || !where) {
395 bsnprintf(cmd, sizeof(cmd),
396 "run job=\"%s\" fileset=\"%s\" level=%s client=\"%s\" pool=\"%s\" "
397 "when=\"%s\" where=\"%s\" storage=\"%s\"",
398 job, fileset, level, client, pool, when, where, storage);
400 set_text(cmd, strlen(cmd));
401 write_director("yes");
407 on_run_cancel_clicked(GtkButton *button, gpointer user_data)
409 gtk_widget_hide(run_dialog);
415 on_entry1_key_release_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
421 on_restore_button_clicked(GtkButton *button, gpointer user_data)
423 gtk_widget_show(restore_dialog);
428 on_view_fileset_clicked(GtkButton *button, gpointer user_data)
434 on_restore_cancel_clicked(GtkButton *button, gpointer user_data)
436 gtk_widget_hide(restore_dialog);
443 on_label_button_clicked(GtkButton *button, gpointer user_data)
445 gtk_widget_show(label_dialog);
450 on_label_ok_clicked(GtkButton *button, gpointer user_data)
452 char *pool, *volume, *storage, *slot;
454 gtk_widget_hide(label_dialog);
457 pool = get_combo_text(label_dialog, "label_combo_pool");
458 storage = get_combo_text(label_dialog, "label_combo_storage");
460 volume = get_entry_text(label_dialog, "label_entry_volume");
462 slot = get_spin_text(label_dialog, "label_slot");
464 if (!pool || !storage || !volume || !(*volume)) {
469 bsnprintf(cmd, sizeof(cmd),
470 "label name=\"%s\" pool=\"%s\" storage=\"%s\" slot=%s",
471 volume, pool, storage, slot);
473 set_text(cmd, strlen(cmd));
478 on_label_cancel_clicked(GtkButton *button, gpointer user_data)
480 gtk_widget_hide(label_dialog);
487 on_select_files_button_clicked(GtkButton *button, gpointer user_data)
489 char *job, *fileset, *client, *pool, *before, *storage;
491 gtk_widget_hide(restore_dialog);
493 job = get_combo_text(restore_dialog, "combo_restore_job");
494 fileset = get_combo_text(restore_dialog, "combo_restore_fileset");
495 client = get_combo_text(restore_dialog, "combo_restore_client");
496 pool = get_combo_text(restore_dialog, "combo_restore_pool");
497 storage = get_combo_text(restore_dialog, "combo_restore_storage");
499 before = get_entry_text(restore_dialog, "restore_before_entry");
501 if (!job || !fileset || !client || !pool || !storage || !before) {
506 bsnprintf(cmd, sizeof(cmd),
507 "restore select current fileset=\"%s\" client=\"%s\" pool=\"%s\" "
508 "storage=\"%s\"", fileset, client, pool, storage);
510 set_text(cmd, strlen(cmd));
511 gtk_widget_show(restore_file_selection);
512 select_restore_files(); /* put up select files dialog */
516 on_restore_select_ok_clicked(GtkButton *button, gpointer user_data)
518 gtk_widget_hide(restore_file_selection);
519 write_director("done");
526 on_restore_select_cancel_clicked(GtkButton *button, gpointer user_data)
528 gtk_widget_hide(restore_file_selection);
529 write_director("quit");
535 on_restore_files_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
537 gtk_widget_hide(restore_file_selection);
545 on_new1_activate (GtkMenuItem *menuitem,
553 on_open1_activate (GtkMenuItem *menuitem,
561 on_save1_activate (GtkMenuItem *menuitem,
569 on_save_as1_activate (GtkMenuItem *menuitem,
577 on_quit1_activate (GtkMenuItem *menuitem,
585 on_cut2_activate (GtkMenuItem *menuitem,
593 on_copy2_activate (GtkMenuItem *menuitem,
601 on_paste2_activate (GtkMenuItem *menuitem,
609 on_clear2_activate (GtkMenuItem *menuitem,
617 on_properties1_activate (GtkMenuItem *menuitem,
625 on_preferences2_activate (GtkMenuItem *menuitem,
633 on_about2_activate (GtkMenuItem *menuitem,
640 * Set correct default values in the Restore dialog box
642 void set_restore_dialog_defaults()
650 stop_director_reader(NULL);
652 combo = lookup_widget(restore_dialog, "combo_restore_job");
653 job = (char *)gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry));
654 bsnprintf(cmd, sizeof(cmd), ".defaults job=\"%s\"", job);
656 while (bnet_recv(UA_sock) > 0) {
657 def = strchr(UA_sock->msg, '=');
662 if (strcmp(UA_sock->msg, "job") == 0 ||
663 strcmp(UA_sock->msg, "when") == 0 ||
664 strcmp(UA_sock->msg, "where") == 0 ||
665 strcmp(UA_sock->msg, "messages") == 0 ||
666 strcmp(UA_sock->msg, "level") == 0 ||
667 strcmp(UA_sock->msg, "type") == 0) {
671 /* Now handle combo boxes */
672 list = find_combo_list(UA_sock->msg);
676 item = g_list_find_custom(list, def, compare_func);
677 bsnprintf(cmd, sizeof(cmd), "combo_restore_%s", UA_sock->msg);
678 combo = lookup_widget(restore_dialog, cmd);
682 pos = g_list_position(list, item);
683 gtk_list_select_item(GTK_LIST(GTK_COMBO(combo)->list), pos);
685 start_director_reader(NULL);
690 on_restore_job_entry_changed(GtkEditable *editable, gpointer user_data)
692 /* Set defaults that correspond to new job selection */
693 set_restore_dialog_defaults();