Пример #1
0
HexDocument *
hex_document_new_from_file (const gchar *name)
{
  HexDocument *doc;
  gchar *path_end;

  doc = HEX_DOCUMENT (g_object_new (hex_document_get_type(), NULL));
  g_return_val_if_fail (doc != NULL, NULL);

  doc->file_name = (gchar *)g_strdup(name);
  if (get_document_attributes(doc))
    {
      doc->gap_size = 100;
      doc->buffer_size = doc->file_size + doc->gap_size;
      doc->buffer = (guchar *)g_malloc(doc->buffer_size);

      /* find the start of the filename without path */
      path_end = g_path_get_basename (doc->file_name);
      doc->path_end = g_filename_to_utf8 (path_end, -1, NULL, NULL, NULL);
      g_free (path_end);

      if (hex_document_read(doc))
        {
          doc_list = g_list_append(doc_list, doc);
          return doc;
        }
    }
  g_object_unref(G_OBJECT(doc));
  return NULL;
}
Пример #2
0
static void
hex_document_finalize(GObject *obj)
{
    HexDocument *hex;

    hex = HEX_DOCUMENT(obj);

    if(hex->buffer)
        g_free(hex->buffer);

    if(hex->file_name)
        g_free(hex->file_name);

    if(hex->path_end)
        g_free(hex->path_end);

    undo_stack_free(hex);

    while(hex->views)
        hex_document_remove_view(hex, (GtkWidget *)hex->views->data);

    doc_list = g_list_remove(doc_list, hex);

    G_OBJECT_CLASS (parent_class)->finalize (obj);
}
Пример #3
0
HexDocument *
hex_document_new ()
{
  HexDocument *doc;

  doc = HEX_DOCUMENT (g_object_new (hex_document_get_type(), NULL));
  g_return_val_if_fail (doc != NULL, NULL);

  doc->file_name = NULL;
  doc->gap_size = 100;
  doc->file_size = 0;
  doc->buffer_size = doc->file_size + doc->gap_size;
  doc->gap_pos = doc->buffer = (guchar *)g_malloc(doc->buffer_size);
  doc->path_end = g_strdup(_("New document"));

  doc_list = g_list_append(doc_list, doc);
  return doc;
}
Пример #4
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));
	}
}