Beispiel #1
0
Datei: main.c Projekt: 8l/ghex
int
main(int argc, char **argv)
{
	GtkWidget *win;
	GError *error = NULL;
	GtkApplication *application;
	gchar *locale_dir;
	gint retval;

	locale_dir = ghex_locale_dir ();
	bindtextdomain (GETTEXT_PACKAGE, locale_dir);
	g_free (locale_dir);

	bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
	textdomain (GETTEXT_PACKAGE);

	/* Initialize GTK+ program */
	if (!gtk_init_with_args (&argc, &argv,
	                         _("- GTK+ binary editor"),
	                         options,
	                         GETTEXT_PACKAGE,
	                         &error)) {
		g_printerr (_("%s\nRun '%s --help' to see a full list of available command line options.\n"),
		            error->message, argv[0]);
		g_error_free (error);
		return 1;
	}

	/* Set default window icon */
	gtk_window_set_default_icon_name ("ghex");

	/* load preferences */
	ghex_init_configuration();

	/* accessibility setup */
	setup_factory();

	application = gtk_application_new ("org.gnome.GHexApplication",
	                                   G_APPLICATION_NON_UNIQUE);
	g_signal_connect (application, "activate",
	                  G_CALLBACK (ghex_activate), NULL);

	g_application_register (G_APPLICATION (application), NULL, NULL);

	if (args_remaining != NULL) {
		gchar **filename;
		for (filename = args_remaining; *filename != NULL; filename++) {
			if (g_file_test (*filename, G_FILE_TEST_EXISTS)) {
				win = ghex_window_new_from_file (application, *filename);
				if(win != NULL) {
					if(geometry) {
						if(!gtk_window_parse_geometry(GTK_WINDOW(win), geometry))
							g_warning(_("Invalid geometry string \"%s\"\n"), geometry);
						geometry = NULL;
					}
					gtk_widget_show(win);
				}
			}
		}
	}

	if(ghex_window_get_list() == NULL) {
		win = ghex_window_new (application);
		if(geometry) {
			if(!gtk_window_parse_geometry(GTK_WINDOW(win), geometry))
				g_warning(_("Invalid geometry string \"%s\"\n"), geometry);
			geometry = NULL;
		}
		gtk_widget_show(win);
	}
	else win = GTK_WIDGET(ghex_window_get_list()->data);

	retval = g_application_run (G_APPLICATION (application), argc, argv);
	g_object_unref (application);

	return retval;
}
Beispiel #2
0
static void ghex_prefs_notify_cb (GConfClient *gconf_client,
								  guint cnxn_id,
								  GConfEntry *entry,
								  gpointer user_data)
{
	const GList *winn, *docn;

	if(!strcmp(entry->key, GHEX_BASE_KEY GHEX_PREF_OFFSETS_COLUMN)) {
		gboolean show_off = gconf_value_get_bool(entry->value);
		show_offsets_column = show_off;
		winn = ghex_window_get_list();
		while(winn) {
			if(GHEX_WINDOW(winn->data)->gh)
				gtk_hex_show_offsets(GHEX_WINDOW(winn->data)->gh, show_off);
			winn = g_list_next(winn);
		}
	}
	else if(!strcmp(entry->key, GHEX_BASE_KEY GHEX_PREF_GROUP)) {
		def_group_type = gconf_value_get_int(entry->value);
	}
	else if(!strcmp(entry->key, GHEX_BASE_KEY GHEX_PREF_MAX_UNDO_DEPTH)) {
		gint new_undo_max = gconf_value_get_int(entry->value);
		max_undo_depth = new_undo_max;
		docn = hex_document_get_list();
		while(docn) {
			hex_document_set_max_undo(HEX_DOCUMENT(docn->data), max_undo_depth);
			docn = g_list_next(docn);
		}
	}
	else if(!strcmp(entry->key, GHEX_BASE_KEY GHEX_PREF_BOX_SIZE)) {
		shaded_box_size = gconf_value_get_int(entry->value);
	}
	else if(!strcmp(entry->key, GHEX_BASE_KEY GHEX_PREF_OFFSET_FORMAT) &&
			strcmp(gconf_value_get_string(entry->value), offset_fmt)) {
		gchar *old_offset_fmt = offset_fmt;
		gint len, i;
		gboolean expect_spec;

		offset_fmt = g_strdup(gconf_value_get_string(entry->value));

		/* check for a valid format string */
		len = strlen(offset_fmt);
		expect_spec = FALSE;
		for(i = 0; i < len; i++) {
			if(offset_fmt[i] == '%')
				expect_spec = TRUE;
			if( expect_spec &&
				( (offset_fmt[i] >= 'a' && offset_fmt[i] <= 'z') ||
				  (offset_fmt[i] >= 'A' && offset_fmt[i] <= 'Z') ) ) {
				expect_spec = FALSE;
				if(offset_fmt[i] != 'x' && offset_fmt[i] != 'd' &&
				   offset_fmt[i] != 'o' && offset_fmt[i] != 'X' &&
				   offset_fmt[i] != 'P' && offset_fmt[i] != 'p') {
					g_free(offset_fmt);
					offset_fmt = old_offset_fmt;
					gconf_client_set_string(gconf_client, GHEX_BASE_KEY GHEX_PREF_OFFSET_FORMAT,
											"%X", NULL);
				}
			}
		}
		if(offset_fmt != old_offset_fmt)
			g_free(old_offset_fmt);
	}
	else if(!strcmp(entry->key, GHEX_BASE_KEY GHEX_PREF_FONT)) {
		if(gconf_value_get_string(entry->value) != NULL) {
			const gchar *font_name = gconf_value_get_string(entry->value);
			PangoFontMetrics *new_metrics;
			PangoFontDescription *new_desc;

			if((new_metrics = gtk_hex_load_font(font_name)) != NULL) {
				new_desc = pango_font_description_from_string (font_name);
				winn = ghex_window_get_list();
				while(winn) {
					if(GHEX_WINDOW(winn->data)->gh)
						gtk_hex_set_font(GHEX_WINDOW(winn->data)->gh, new_metrics, new_desc);
					winn = g_list_next(winn);
				}
		
				if (def_metrics)
					pango_font_metrics_unref (def_metrics);
			
				if (def_font_desc)
					pango_font_description_free (def_font_desc);

				if (def_font_name)
					g_free(def_font_name);

				def_metrics = new_metrics;
				def_font_name = g_strdup(font_name);
				def_font_desc = new_desc;
			}
		}
	}
	else if(!strcmp(entry->key, GHEX_BASE_KEY GHEX_PREF_DATA_FONT)) {
		if(data_font_name)
			g_free(data_font_name);
		data_font_name = g_strdup (gconf_value_get_string(entry->value));
	}
	else if(!strcmp(entry->key, GHEX_BASE_KEY GHEX_PREF_HEADER_FONT)) {
		if(header_font_name)
			g_free(header_font_name);
		header_font_name = g_strdup (gconf_value_get_string(entry->value));
	}
}