static void on_button_hash_clicked(void) { if (gui_get_view() == GUI_VIEW_FILE) { // XXX: Workaround for when user clicks Cancel in FileChooserDialog and // XXX: uri is changed without emitting the "selection-changed" signal on_filechooserbutton_selection_changed(); if (!gtk_widget_get_sensitive(GTK_WIDGET(gui.button_hash))) return; } switch (gui_get_view()) { case GUI_VIEW_FILE: { gui_clear_digests(); gui_set_state(GUI_STATE_BUSY); char *uri = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER( gui.filechooserbutton)); hash_file_start(uri); break; } case GUI_VIEW_TEXT: hash_string(); break; case GUI_VIEW_FILE_LIST: gui_clear_digests(); gui_set_state(GUI_STATE_BUSY); hash_file_list_start(); break; default: g_assert_not_reached(); } }
static void on_dialog_combobox_changed(void) { gui_clear_all_digests(); if (gui_get_view() == GUI_VIEW_TEXT) on_button_hash_clicked(); }
void hash_file_start(const char *uri) { size_t key_size = 0; const uint8_t *hmac_key = gui_get_hmac_key(&key_size); if (gui_get_view() == GUI_VIEW_FILE) gtkhash_hash_file_clear_digests(&hash_priv.file_data); gtkhash_hash_file(&hash_priv.file_data, uri, hmac_key, key_size); }
static void on_entry_hmac_changed(void) { switch (gui_get_view()) { case GUI_VIEW_FILE: gui_clear_digests(); break; case GUI_VIEW_TEXT: on_button_hash_clicked(); break; default: g_assert_not_reached(); } }
void hash_file_start(const char *uri) { if (gui_get_view() != GUI_VIEW_FILE_LIST) gtkhash_hash_file_clear_digests(&hash_priv.file_data); GFile *file = g_file_new_for_uri(uri); char *pname = g_file_get_parse_name(file); gtk_progress_bar_set_text(gui.progressbar, pname); g_free(pname); g_object_unref(file); gtkhash_hash_file_set_uri(&hash_priv.file_data, uri); gtkhash_hash_file_set_stop(&hash_priv.file_data, false); gtkhash_hash_file_set_state(&hash_priv.file_data, HASH_FILE_STATE_START); gtkhash_hash_file_add_source(&hash_priv.file_data); }
static void on_togglebutton_hmac_toggled(void) { switch (gui_get_view()) { case GUI_VIEW_FILE: gtk_widget_set_sensitive(GTK_WIDGET(gui.entry_hmac_file), gtk_toggle_button_get_active(gui.togglebutton_hmac_file)); break; case GUI_VIEW_TEXT: gtk_widget_set_sensitive(GTK_WIDGET(gui.entry_hmac_text), gtk_toggle_button_get_active(gui.togglebutton_hmac_text)); break; default: g_assert_not_reached(); } on_entry_hmac_changed(); }
void gtkhash_hash_file_finish_cb(G_GNUC_UNUSED void *data) { const bool stop = gtkhash_hash_file_get_stop(&hash_priv.file_data); switch (gui_get_view()) { case GUI_VIEW_FILE: { if (stop) break; for (int i = 0; i < HASH_FUNCS_N; i++) { const char *digest = gtkhash_hash_func_get_digest(&hash.funcs[i], gui_get_digest_format()); gtk_entry_set_text(gui.hash_widgets[i].entry_file, digest); } break; } case GUI_VIEW_FILE_LIST: { g_assert(hash_priv.uris); g_assert(hash_priv.uris->data); if (stop) break; for (int i = 0; i < HASH_FUNCS_N; i++) { const char *digest = gtkhash_hash_func_get_digest(&hash.funcs[i], gui_get_digest_format()); list_set_digest(hash_priv.uris->data, i, digest); } g_free(hash_priv.uris->data); hash_priv.uris = g_slist_delete_link(hash_priv.uris, hash_priv.uris); if (hash_priv.uris) { hash_file_start(hash_priv.uris->data); return; } break; } default: g_assert_not_reached(); } gui_set_state(GUI_STATE_IDLE); }
void gui_clear_digests(void) { switch (gui_get_view()) { case GUI_VIEW_FILE: for (int i = 0; i < HASH_FUNCS_N; i++) gtk_entry_set_text(gui.hash_widgets[i].entry_file, ""); break; case GUI_VIEW_TEXT: for (int i = 0; i < HASH_FUNCS_N; i++) gtk_entry_set_text(gui.hash_widgets[i].entry_text, ""); break; case GUI_VIEW_FILE_LIST: list_clear_digests(); break; default: g_assert_not_reached(); } }
void gui_set_state(const enum gui_state_e state) { g_assert(GUI_STATE_IS_VALID(state)); gui_priv.state = state; if (gui_get_view() == GUI_VIEW_TEXT) return; const bool busy = (state == GUI_STATE_BUSY); gtk_widget_set_visible(GTK_WIDGET(gui.button_hash), !busy); gtk_widget_set_visible(GTK_WIDGET(gui.button_stop), busy); gtk_progress_bar_set_fraction(gui.progressbar, 0.0); gtk_widget_set_visible(GTK_WIDGET(gui.progressbar), busy); gtk_widget_set_sensitive(GTK_WIDGET(gui.hbox_input), !busy); gtk_widget_set_sensitive(GTK_WIDGET(gui.hbox_output), !busy); gtk_widget_set_sensitive(GTK_WIDGET(gui.toolbar), !busy); gtk_widget_set_sensitive(GTK_WIDGET(gui.treeview), !busy); gtk_widget_set_sensitive(GTK_WIDGET(gui.radiomenuitem_text), !busy); gtk_widget_set_sensitive(GTK_WIDGET(gui.radiomenuitem_file), !busy); gtk_widget_set_sensitive(GTK_WIDGET(gui.radiomenuitem_file_list), !busy); gtk_widget_set_sensitive(GTK_WIDGET(gui.dialog_table), !busy); gtk_widget_set_sensitive(GTK_WIDGET(gui.dialog_combobox), !busy); if (busy) { gtk_window_set_default(gui.window, GTK_WIDGET(gui.button_stop)); gtk_widget_set_sensitive(GTK_WIDGET(gui.menuitem_save_as), false); } else { gtk_window_set_default(gui.window, GTK_WIDGET(gui.button_hash)); // User may already have menu open, so make sure save_as gets updated g_signal_emit_by_name(gui.menuitem_file, "activate"); } }
void gui_update(void) { bool has_enabled = false; for (int i = 0; i < HASH_FUNCS_N; i++) { if (hash.funcs[i].supported) { hash.funcs[i].enabled = gtk_toggle_button_get_active( gui.hash_widgets[i].button); if (hash.funcs[i].enabled) has_enabled = true; } else hash.funcs[i].enabled = false; gtk_widget_set_visible(GTK_WIDGET(gui.hash_widgets[i].label), hash.funcs[i].enabled); gtk_widget_set_visible(GTK_WIDGET(gui.hash_widgets[i].entry_file), hash.funcs[i].enabled); gtk_widget_set_visible(GTK_WIDGET(gui.hash_widgets[i].entry_text), hash.funcs[i].enabled); gtk_widget_set_visible(GTK_WIDGET(gui.hash_widgets[i].menuitem_treeview_copy), hash.funcs[i].enabled); } list_update(); switch (gui_get_view()) { case GUI_VIEW_FILE: { gtk_widget_hide(GTK_WIDGET(gui.toolbar)); gtk_widget_hide(GTK_WIDGET(gui.label_text)); gtk_widget_hide(GTK_WIDGET(gui.entry)); gtk_widget_hide(GTK_WIDGET(gui.vbox_list)); gtk_widget_hide(GTK_WIDGET(gui.vbox_digests_text)); gtk_widget_show(GTK_WIDGET(gui.label_file)); gtk_widget_show(GTK_WIDGET(gui.filechooserbutton)); gtk_widget_show(GTK_WIDGET(gui.vbox_single)); gtk_widget_show(GTK_WIDGET(gui.vbox_digests_file)); gtk_widget_show(GTK_WIDGET(gui.hseparator_buttons)); gtk_widget_show(GTK_WIDGET(gui.button_hash)); char *uri = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER( gui.filechooserbutton)); if (uri) { gtk_widget_set_sensitive(GTK_WIDGET(gui.button_hash), has_enabled); g_free(uri); } else gtk_widget_set_sensitive(GTK_WIDGET(gui.button_hash), false); break; } case GUI_VIEW_TEXT: gtk_widget_hide(GTK_WIDGET(gui.toolbar)); gtk_widget_hide(GTK_WIDGET(gui.label_file)); gtk_widget_hide(GTK_WIDGET(gui.filechooserbutton)); gtk_widget_hide(GTK_WIDGET(gui.vbox_list)); gtk_widget_hide(GTK_WIDGET(gui.vbox_digests_file)); gtk_widget_hide(GTK_WIDGET(gui.hseparator_buttons)); gtk_widget_hide(GTK_WIDGET(gui.button_hash)); gtk_widget_show(GTK_WIDGET(gui.label_text)); gtk_widget_show(GTK_WIDGET(gui.entry)); gtk_widget_show(GTK_WIDGET(gui.vbox_single)); gtk_widget_show(GTK_WIDGET(gui.vbox_digests_text)); gtk_widget_grab_focus(GTK_WIDGET(gui.entry)); g_signal_emit_by_name(gui.button_hash, "clicked"); break; case GUI_VIEW_FILE_LIST: gtk_widget_hide(GTK_WIDGET(gui.vbox_single)); gtk_widget_hide(GTK_WIDGET(gui.hseparator_buttons)); gtk_widget_show(GTK_WIDGET(gui.vbox_list)); gtk_widget_show(GTK_WIDGET(gui.button_hash)); gtk_widget_set_visible(GTK_WIDGET(gui.toolbar), gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM( gui.menuitem_treeview_show_toolbar))); gtk_widget_set_sensitive(GTK_WIDGET(gui.button_hash), has_enabled && (list_count_rows() > 0)); break; default: g_assert_not_reached(); } }
static void save_window_view(GKeyFile *keyfile) { g_key_file_set_integer(keyfile, "window", "view", gui_get_view()); }
static void on_menuitem_save_as_activate(void) { GtkFileChooser *chooser = GTK_FILE_CHOOSER( gtk_file_chooser_dialog_new(_("Save Digests"), gui.window, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL)); gtk_file_chooser_set_do_overwrite_confirmation(chooser, true); if (gtk_dialog_run(GTK_DIALOG(chooser)) == GTK_RESPONSE_ACCEPT) { char *filename = gtk_file_chooser_get_filename(chooser); GString *string = g_string_sized_new(1024); for (int i = 0; i < HASH_FUNCS_N; i++) { if (!hash.funcs[i].enabled) continue; switch (gui_get_view()) { case GUI_VIEW_FILE: { const bool hmac_active = gtk_toggle_button_get_active( gui.togglebutton_hmac_file); const char *digest = gtk_entry_get_text( gui.hash_widgets[i].entry_file); if (digest && *digest) { g_string_append_printf(string, (hmac_active && (hash.funcs[i].block_size > 0)) ? "# HMAC-%s\n" : "# %s\n", hash.funcs[i].name); } else continue; char *path = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER(gui.filechooserbutton)); char *basename = g_path_get_basename(path); g_free(path); g_string_append_printf(string, "%s %s\n", gtk_entry_get_text(gui.hash_widgets[i].entry_file), basename); g_free(basename); break; } case GUI_VIEW_TEXT: { const bool hmac_active = gtk_toggle_button_get_active( gui.togglebutton_hmac_text); g_string_append_printf(string, (hmac_active && (hash.funcs[i].block_size > 0)) ? "# HMAC-%s\n" : "# %s\n", hash.funcs[i].name); g_string_append_printf(string, "%s \"%s\"\n", gtk_entry_get_text(gui.hash_widgets[i].entry_text), gtk_entry_get_text(gui.entry_text)); break; } case GUI_VIEW_FILE_LIST: { int prev = -1; for (unsigned int row = 0; row < list_count_rows(); row++) { char *digest = list_get_digest(row, i); if (digest && *digest) { if (i != prev) g_string_append_printf(string, "# %s\n", hash.funcs[i].name); prev = i; } else { if (digest) g_free(digest); prev = i; continue; } char *uri = list_get_uri(row); char *basename = g_filename_display_basename(uri); g_string_append_printf(string, "%s %s\n", digest, basename); g_free(basename); g_free(uri); g_free(digest); } break; } default: g_assert_not_reached(); } } char *data = g_string_free(string, false); g_file_set_contents(filename, data, -1, NULL); g_free(data); g_free(filename); } gtk_widget_destroy(GTK_WIDGET(chooser)); }