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; }
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); }
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; }
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)); } }