Esempio n. 1
0
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);
	}
}
Esempio n. 2
0
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);;
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
}
Esempio n. 5
0
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();
	}
}
Esempio n. 6
0
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));
}