void list_remove_selection(void) { GList *rows = gtk_tree_selection_get_selected_rows(gui.treeselection, &gui.treemodel); for (GList *i = rows; i != NULL; i = i->next) { GtkTreePath *path = i->data; GtkTreeRowReference *ref = gtk_tree_row_reference_new(gui.treemodel, i->data); i->data = ref; gtk_tree_path_free(path); } for (GList *i = rows; i != NULL; i = i->next) { GtkTreeRowReference *ref = i->data; GtkTreePath *path = gtk_tree_row_reference_get_path(ref); GtkTreeIter iter; if (gtk_tree_model_get_iter(gui.treemodel, &iter, path)) gtk_list_store_remove(gui.liststore, &iter); gtk_tree_path_free(path); gtk_tree_row_reference_free(ref); } g_list_free(rows); if (list_count_rows() == 0) { gtk_widget_set_sensitive(GTK_WIDGET(gui.toolbutton_clear), false); gtk_widget_set_sensitive(GTK_WIDGET(gui.menuitem_treeview_clear), false); gtk_widget_set_sensitive(GTK_WIDGET(gui.button_hash), false); } }
GSList *list_get_all_uris(void) { GSList *uris = NULL; for (unsigned int i = 0; i < list_count_rows(); i++) { char *uri = list_get_uri(i); uris = g_slist_prepend(uris, uri); } return g_slist_reverse(uris);; }
char *list_get_digest(const unsigned int row, const enum hash_func_e id) { g_assert(row <= list_count_rows()); g_assert(HASH_FUNC_IS_VALID(id)); GtkTreeIter iter; char *digest; GValue value; value.g_type = 0; if (!gtk_tree_model_get_iter_first(gui.treemodel, &iter)) return NULL; for (unsigned int i = 0; i < row; i++) gtk_tree_model_iter_next(gui.treemodel, &iter); gtk_tree_model_get_value(gui.treemodel, &iter, COL_HASH + id, &value); digest = g_strdup(g_value_get_string(&value)); g_value_unset(&value); return digest; }
char *list_get_uri(const unsigned int row) { g_assert(row <= list_count_rows()); GtkTreeIter iter; GValue value; value.g_type = 0; if (!gtk_tree_model_get_iter_first(gui.treemodel, &iter)) return NULL; for (unsigned int i = 0; i < row; i++) gtk_tree_model_iter_next(gui.treemodel, &iter); gtk_tree_model_get_value(gui.treemodel, &iter, COL_FILE, &value); GFile *file = g_file_parse_name(g_value_get_string(&value)); g_value_unset(&value); char *uri = g_file_get_uri(file); g_object_unref(file); return uri; }
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 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)); }