1
/* Hey EMACS -*- linux-c -*- */
2
/* $Id: dbg_code.c 1455 2005-05-31 18:38:03Z roms $ */
4
/* TiEmu - an TI emulator
6
* Copyright (c) 2000-2001, Thomas Corvazier, Romain Lievin
7
* Copyright (c) 2001-2003, Romain Lievin
8
* Copyright (c) 2003, Julien Blache
9
* Copyright (c) 2004, Romain Li�vin
10
* Copyright (c) 2005, Romain Li�vin, Kevin Kofler
12
* This program is free software; you can redistribute it and/or modify
13
* it under the terms of the GNU General Public License as published by
14
* the Free Software Foundation; either version 2 of the License, or
15
* (at your option) any later version.
17
* This program is distributed in the hope that it will be useful,
18
* but WITHOUT ANY WARRANTY; without even the implied warranty of
19
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
* GNU General Public License for more details.
22
* You should have received a copy of the GNU General Public License
23
* along with this program; if not, write to the Free Software
24
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
32
#include <glade/glade.h>
33
#include <gdk/gdkkeysyms.h>
39
#include "ti68k_int.h"
42
#include "dbg_romcall.h"
46
static GladeXML *xml = NULL;
47
static GtkWidget *wnd = NULL;
48
static gint already_open = 0;
51
COL_ICON, COL_ADDR, COL_OPCODE, COL_OPERAND,
52
COL_HEXADDR, COL_FONT, COL_COLOR
54
#define CLIST_NVCOLS (4) // 4 visible columns
55
#define CLIST_NCOLS (7) // 7 real columns
57
#define FONT_NAME "courier"
62
static gint NLINES = 10;
65
static GtkListStore* clist_create(GtkWidget *widget)
67
GtkTreeView *view = GTK_TREE_VIEW(widget);
70
GtkCellRenderer *renderer;
71
GtkTreeSelection *selection;
72
const gchar *text[CLIST_NVCOLS] = { _(""), _("Address"), _("Opcode"), _("Operand") };
75
store = gtk_list_store_new(CLIST_NCOLS,
77
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
78
G_TYPE_INT, G_TYPE_STRING, GDK_TYPE_COLOR,
81
model = GTK_TREE_MODEL(store);
83
gtk_tree_view_set_model(view, model);
84
gtk_tree_view_set_headers_visible(view, TRUE);
85
gtk_tree_view_set_rules_hint(view, FALSE);
87
renderer = gtk_cell_renderer_pixbuf_new();
88
gtk_tree_view_insert_column_with_attributes(view, -1,
89
text[COL_ICON], renderer,
93
for(i = COL_ADDR; i <= COL_OPERAND; i++)
95
renderer = gtk_cell_renderer_text_new();
96
gtk_tree_view_insert_column_with_attributes(view, -1,
99
"background-gdk", COL_COLOR,
103
for (i = 0; i < CLIST_NVCOLS; i++)
105
GtkTreeViewColumn *col;
107
col = gtk_tree_view_get_column(view, i);
108
gtk_tree_view_column_set_resizable(col, TRUE);
111
selection = gtk_tree_view_get_selection(view);
112
gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
117
static void clist_populate(GtkListStore *store, uint32_t addr)
122
GdkColor *color, color1, color2;
124
uint32_t pc = ti68k_debug_get_pc();
126
/* We can't start disassembling stuff before GDB is even loaded, and in the
127
cases where we have GDB running, but not the debugger, it's just a waste
131
gdk_color_parse("White", &color1);
132
gdk_colormap_alloc_colors(gdk_colormap_get_system(), &color1, 1, FALSE, FALSE, &success);
133
gdk_color_parse("Green", &color2);
134
gdk_colormap_alloc_colors(gdk_colormap_get_system(), &color2, 1, FALSE, FALSE, &success);
136
for(i = 0; i < NLINES; i++)
141
gchar** row_text = g_malloc0((CLIST_NVCOLS + 1) * sizeof(gchar *));
144
// disassemble at 'addr' address into 'output' and returns offset to the
145
// next instruction address
146
offset = ti68k_debug_disassemble(addr, &output);
148
split = g_strsplit(output, " ", 3);
151
row_text[0] = g_strdup(split[0]);
152
sscanf(row_text[0], "%x", &value);
154
row_text[1] = g_strdup("");
156
row_text[1] = g_strdup(split[1]);
158
row_text[2] = g_strdup("");
160
row_text[2] = g_strdup(split[2]);
162
if(g_list_find(bkpts.code, GINT_TO_POINTER(addr)) != NULL)
163
pix = create_pixbuf("bkpt.xpm");
165
pix = create_pixbuf("void.xpm");
167
color = (addr == pc) ? &color2 : &color1;
169
gtk_list_store_append(store, &iter);
170
gtk_list_store_set(store, &iter,
172
COL_ADDR, row_text[0],
173
COL_OPCODE, row_text[1],
174
COL_OPERAND, row_text[2],
182
g_strfreev(row_text);
187
static void cyccnt_refresh(GtkWidget *l1, GtkWidget *l2)
189
unsigned int count, diff;
192
count = ti68k_get_cycle_count(0, &diff);
193
str1 = g_strdup_printf("%u", count);
194
str2 = g_strdup_printf("%u", diff);
196
gtk_label_set_text(GTK_LABEL(l1), str1);
197
gtk_label_set_text(GTK_LABEL(l2), str2);
203
static void clist_refresh(GtkListStore *store, gboolean reload)
205
GtkTreeModel *model = GTK_TREE_MODEL(store);
213
GdkColor *color, color1, color2;
216
const int offset = 3; // 3 instructions are still visible
220
pc = ti68k_debug_get_pc();
222
gdk_color_parse("White", &color1);
223
gdk_colormap_alloc_colors(gdk_colormap_get_system(), &color1, 1, FALSE, FALSE, &success);
224
gdk_color_parse("Green", &color2);
225
gdk_colormap_alloc_colors(gdk_colormap_get_system(), &color2, 1, FALSE, FALSE, &success);
227
// check for refresh (search for pc)
228
for(valid = gtk_tree_model_get_iter_first(model, &iter), i = 0;
230
valid = gtk_tree_model_iter_next(model, &iter), i++)
234
gtk_tree_model_get(model, &iter, COL_ADDR, &str, -1);
235
sscanf(str, "%x", &addr);
246
// pc not found, erase and populate
249
gtk_list_store_clear(store);
250
clist_populate(store, ti68k_debug_get_pc());
253
// repopulate so that 3 instructions are still visible at the bottom of the list
256
if(NLINES - found < offset)
258
gtk_list_store_clear(store);
259
clist_populate(store, addr3);
263
// look for pc and matching bkpt
264
for(valid = gtk_tree_model_get_iter_first(model, &iter);
266
valid = gtk_tree_model_iter_next(model, &iter))
271
gtk_tree_model_get(model, &iter, COL_ADDR, &str, -1);
272
sscanf(str, "%x", &addr);
274
color = (addr == pc) ? &color2 : &color1;
276
if(g_list_find(bkpts.code, GINT_TO_POINTER(addr)) != NULL)
277
pix = create_pixbuf("bkpt.xpm");
278
else if(g_list_find(bkpts.code, GINT_TO_POINTER(addr|BKPT_TMP_MASK)) != NULL)
279
pix = create_pixbuf("bkpt_tmp.xpm");
281
pix = create_pixbuf("void.xpm");
283
gtk_list_store_set(store, &iter, COL_ICON, pix, COL_COLOR, color, -1);
288
// update cycle counter
289
cyccnt_refresh(glade_get("label3"), glade_get("label4"));
292
static GtkWidget *list;
293
static GtkListStore *store;
294
static GtkWidget *combo;
317
static void tb_set_states(int s1, int s2, int s3, int s4, int s5, int s6, int s7)
319
gtk_widget_set_sensitive(tb.b1, s1);
320
gtk_widget_set_sensitive(tb.b2, s2);
321
gtk_widget_set_sensitive(tb.b3, s3);
322
gtk_widget_set_sensitive(tb.b4, s4);
323
gtk_widget_set_sensitive(tb.b5, s5);
324
gtk_widget_set_sensitive(tb.b6, s6);
325
gtk_widget_set_sensitive(tb.b7, s7);
327
gtk_widget_set_sensitive(mi.m1, s1);
328
gtk_widget_set_sensitive(mi.m2, s2);
329
gtk_widget_set_sensitive(mi.m3, s3);
330
gtk_widget_set_sensitive(mi.m4, s4);
331
gtk_widget_set_sensitive(mi.m5, s5);
332
gtk_widget_set_sensitive(mi.m6, s6);
336
Display source code window
339
extern int update_submenu(GtkWidget*, gpointer);
341
GtkWidget* dbgcode_create_window(void)
347
(tilp_paths_build_glade("dbg_code-2.glade"), "dbgcode_window",
350
g_error(_("%s: GUI loading failed !\n"), __FILE__);
351
glade_xml_signal_autoconnect(xml);
353
dbox = glade_xml_get_widget(xml, "dbgcode_window");
355
gtk_window_set_transient_for(GTK_WINDOW(dbox), GTK_WINDOW(main_wnd));
358
data = glade_xml_get_widget(xml, "windows1_menu");
359
g_signal_connect(G_OBJECT(data), "map", G_CALLBACK(update_submenu), NULL);
361
tb.b1 = glade_xml_get_widget(xml, "button1");
362
tb.b2 = glade_xml_get_widget(xml, "button2");
363
tb.b3 = glade_xml_get_widget(xml, "button3");
364
tb.b4 = glade_xml_get_widget(xml, "button4");
365
tb.b5 = glade_xml_get_widget(xml, "button5");
366
tb.b6 = glade_xml_get_widget(xml, "button6");
367
tb.b7 = glade_xml_get_widget(xml, "button7");
369
mi.m1 = glade_xml_get_widget(xml, "run1");
370
mi.m2 = glade_xml_get_widget(xml, "step1");
371
mi.m3 = glade_xml_get_widget(xml, "step_over1");
372
mi.m4 = glade_xml_get_widget(xml, "step_out1");
373
mi.m5 = glade_xml_get_widget(xml, "run_to_cursor1");
374
mi.m6 = glade_xml_get_widget(xml, "break1");
376
list = glade_xml_get_widget(xml, "treeview1");
377
store = clist_create(list);
378
clist_populate(store, ti68k_debug_get_pc());
380
gtk_tree_view_expand_all(GTK_TREE_VIEW(list));
381
gtk_widget_show(list);
383
data = glade_xml_get_widget(xml, "progressbar1");
384
gtk_widget_hide(data);
386
dbgromcall_create_window(xml);
393
GtkWidget* dbgcode_display_window(void)
396
wnd = dbgcode_create_window();
399
if(!options3.code.minimized)
401
gtk_window_resize(GTK_WINDOW(wnd), options3.code.rect.w, options3.code.rect.h);
402
gtk_window_move(GTK_WINDOW(wnd), options3.code.rect.x, options3.code.rect.y);
405
gtk_window_iconify(GTK_WINDOW(wnd));
408
gtk_widget_set_sensitive(list, TRUE);
409
tb_set_states(1, 1, 1, 1, 1, 0, 1);
410
set_other_windows_sensitivity(TRUE);
412
gtk_list_store_clear(store);
413
clist_refresh(store, TRUE);
415
dbgromcall_refresh_window();
416
gtk_widget_show(wnd);
421
void dbgcode_refresh_window(void)
423
if(options3.code.visible)
425
gtk_list_store_clear(store);
426
clist_refresh(store, TRUE);
430
void dbgcode_disasm_at(uint32_t addr)
432
GtkTreeView *view = GTK_TREE_VIEW(list);
434
//GtkTreeViewColumn *column;
436
gtk_list_store_clear(store);
437
clist_populate(store, addr);
440
path = gtk_tree_path_new_from_string("0");
441
gtk_tree_view_set_cursor(view, path, NULL, FALSE);
442
//gtk_tree_view_row_activated(view, path, column); // show selection
443
gtk_tree_path_free(path);
448
on_quit1_activate (GtkMenuItem *menuitem,
452
on_run1_activate (GtkMenuItem *menuitem,
456
tb_set_states(0, 0, 0, 0, 0, 1, 0);
457
gtk_widget_set_sensitive(list, FALSE);
458
set_other_windows_sensitivity(FALSE);
460
ti68k_debug_step(); // skip possible current bkpt
461
ti68k_engine_start();
463
on_quit1_activate(menuitem, user_data);
469
on_step1_activate (GtkMenuItem *menuitem,
476
clist_refresh(store, TRUE);
477
dbgregs_refresh_window();
478
dbgpclog_refresh_window();
479
dbgmem_refresh_window();
480
dbgstack_refresh_window();
483
while(gtk_events_pending()) gtk_main_iteration_do(FALSE);
488
on_step_over1_activate (GtkMenuItem *menuitem,
491
tb_set_states(0, 0, 0, 0, 0, 1, 0);
492
ti68k_debug_step_over();
493
tb_set_states(1, 1, 1, 1, 1, 0, 1);
495
clist_refresh(store, TRUE);
496
dbgregs_refresh_window();
497
dbgpclog_refresh_window();
498
dbgmem_refresh_window();
499
dbgstack_refresh_window();
502
while(gtk_events_pending()) gtk_main_iteration_do(FALSE);
506
on_step_out1_activate (GtkMenuItem *menuitem,
509
ti68k_debug_step_out();
511
clist_refresh(store, TRUE);
512
dbgregs_refresh_window();
513
dbgpclog_refresh_window();
514
dbgmem_refresh_window();
515
dbgstack_refresh_window();
518
while(gtk_events_pending()) gtk_main_iteration_do(FALSE);
523
on_run_to_cursor1_activate (GtkMenuItem *menuitem,
526
//GtkWidget *list = (GtkWidget *)(menuitem); // arg are swapped, why ?
527
GtkTreeView *view = GTK_TREE_VIEW(list);
528
GtkTreeModel *model = gtk_tree_view_get_model(view);
529
GtkListStore *store = GTK_LIST_STORE(model);
530
GtkTreeSelection *selection;
536
selection = gtk_tree_view_get_selection(view);
537
valid = gtk_tree_selection_get_selected(selection, NULL, &iter);
541
gtk_tree_model_get(model, &iter, COL_ADDR, &str, -1);
542
sscanf(str, "%x", &addr);
544
tb_set_states(0, 0, 0, 0, 0, 1, 0);
545
set_other_windows_sensitivity(FALSE);
547
ti68k_debug_skip(addr);
548
gtk_tree_selection_unselect_iter(selection, &iter);
550
tb_set_states(1, 1, 1, 1, 1, 0, 1);
551
set_other_windows_sensitivity(TRUE);
553
clist_refresh(store, FALSE);
554
dbgregs_refresh_window();
555
dbgpclog_refresh_window();
556
dbgmem_refresh_window();
557
dbgstack_refresh_window();
562
on_break1_activate (GtkMenuItem *menuitem,
567
//GtkWidget *list = (GtkWidget *)(menuitem); // arg are swapped, why ?
568
GtkTreeView *view = GTK_TREE_VIEW(list);
569
GtkTreeModel *model = gtk_tree_view_get_model(view);
570
GtkListStore *store = GTK_LIST_STORE(model);
573
gtk_widget_set_sensitive(list, TRUE);
574
tb_set_states(1, 1, 1, 1, 1, 0, 1);
575
set_other_windows_sensitivity(TRUE);
576
clist_refresh(store);
585
dbgcode_button6_clicked (GtkButton *button,
588
//GtkWidget *list = GTK_WIDGET(button); // arg are swapped, why ?
589
GtkTreeView *view = GTK_TREE_VIEW(list);
590
GtkTreeModel *model = gtk_tree_view_get_model(view);
591
GtkListStore *store = GTK_LIST_STORE(model);
592
GtkTreeSelection *selection;
598
selection = gtk_tree_view_get_selection(view);
599
valid = gtk_tree_selection_get_selected(selection, NULL, &iter);
602
gtk_tree_model_get(model, &iter, COL_ADDR, &str, -1);
603
sscanf(str, "%x", &addr);
605
if(g_list_find(bkpts.code, GINT_TO_POINTER(addr)) == NULL)
606
ti68k_bkpt_add_address(addr);
608
ti68k_bkpt_del_address(addr);
610
clist_refresh(store, FALSE);
611
dbgregs_refresh_window();
612
dbgpclog_refresh_window();
613
dbgmem_refresh_window();
614
dbgbkpts_refresh_window();
615
dbgstack_refresh_window();
618
// Toggle tmp breakpoint
620
dbgcode_button7_clicked (GtkButton *button,
623
//GtkWidget *list = GTK_WIDGET(button); // arg are swapped, why ?
624
GtkTreeView *view = GTK_TREE_VIEW(list);
625
GtkTreeModel *model = gtk_tree_view_get_model(view);
626
GtkListStore *store = GTK_LIST_STORE(model);
627
GtkTreeSelection *selection;
633
selection = gtk_tree_view_get_selection(view);
634
valid = gtk_tree_selection_get_selected(selection, NULL, &iter);
637
gtk_tree_model_get(model, &iter, COL_ADDR, &str, -1);
638
sscanf(str, "%x", &addr);
640
if(g_list_find(bkpts.code, GINT_TO_POINTER(addr | BKPT_TMP_MASK)) == NULL)
641
ti68k_bkpt_add_address(addr | BKPT_TMP_MASK);
643
ti68k_bkpt_del_address(addr | BKPT_TMP_MASK);
645
clist_refresh(store, FALSE);
646
dbgregs_refresh_window();
647
dbgpclog_refresh_window();
648
dbgmem_refresh_window();
649
dbgbkpts_refresh_window();
650
dbgstack_refresh_window();
653
// Reset cycle counter
655
dbgcode_button8_clicked (GtkButton *button,
658
ti68k_get_cycle_count(!0, NULL);
659
gtk_label_set_text(GTK_LABEL(glade_get("label3")), "0");
662
/***** Popup menu *****/
665
Display popup menu (right click)
667
static GtkWidget* display_popup_menu(void)
673
(tilp_paths_build_glade("dbg_code-2.glade"), "dbgcode_popup",
676
g_error(_("%s: GUI loading failed !\n"), __FILE__);
677
glade_xml_signal_autoconnect(xml);
679
menu = glade_xml_get_widget(xml, "dbgcode_popup");
684
on_treeview1_button_press_event (GtkWidget *widget,
685
GdkEventButton *event,
690
case GDK_BUTTON_PRESS: // third button clicked
691
if (event->button == 3)
693
GdkEventButton *bevent;
696
bevent = (GdkEventButton *) (event);
697
menu = display_popup_menu();
699
gtk_menu_popup(GTK_MENU(menu),
700
NULL, NULL, NULL, NULL,
701
bevent->button, bevent->time);
702
gtk_widget_show(menu);
714
static int export_disasm_to_file(GtkWidget *widget)
716
GtkTreeView *view = GTK_TREE_VIEW(widget);
717
GtkTreeModel *model = gtk_tree_view_get_model(view);
718
GtkListStore *store = GTK_LIST_STORE(model);
721
uint32_t addr, start;
730
gtk_tree_model_get_iter_first(model, &iter);
731
gtk_tree_model_get(model, &iter, COL_ADDR, &str, -1);
732
sscanf(str, "%x", &start);
735
f = fopen("C:\\disasm.txt", "a+t");
737
f = fopen("/tmp/disasm.txt", "a+t");
743
for(i = 0; i < NLINES; i++)
745
offset = ti68k_debug_disassemble(addr, &output);
748
split = g_strsplit(output, " ", 3);
751
fprintf(f, "%s\t%s", split[0], split[1]);
752
for(j=10-strlen(split[1]); j >= 0; j--)
754
fprintf(f, "\t%s", split[2]);
755
for(j=16-strlen(split[2]); j >= 0; j--)
766
// used to implement accelerator keys
768
on_go_to_address1_activate (GtkMenuItem *menuitem,
771
on_set_tmp_bkpt1_activate (GtkMenuItem *menuitem,
774
on_set_breakpoint1_activate (GtkMenuItem *menuitem,
778
on_set_pc_to_selection1_activate (GtkMenuItem *menuitem,
782
on_treeview1_key_press_event (GtkWidget *widget,
786
GtkTreeView *view = GTK_TREE_VIEW(widget);
787
GtkTreeModel *model = gtk_tree_view_get_model(view);
788
GtkListStore *store = GTK_LIST_STORE(model);
789
GtkTreeSelection *selection;
795
gint row_idx, row_max;
796
uint32_t addr, start;
801
gtk_tree_model_get_iter_first(model, &iter);
802
gtk_tree_model_get(model, &iter, COL_ADDR, &str, -1);
803
sscanf(str, "%x", &start);
806
selection = gtk_tree_view_get_selection(view);
807
valid = gtk_tree_selection_get_selected(selection, NULL, &iter);
810
gtk_tree_model_get(model, &iter, COL_ADDR, &str, -1);
811
sscanf(str, "%x", &addr);
813
row = gtk_tree_model_get_string_from_iter(model, &iter);
814
sscanf(row, "%i", &row_idx);
815
row_max = gtk_tree_model_iter_n_children(model, NULL) - 1;
818
row_idx = row_max = -1;
821
switch(event->keyval)
824
on_set_breakpoint1_activate(NULL, NULL);
827
on_set_tmp_bkpt1_activate(NULL, NULL);
830
export_disasm_to_file(widget);
833
str = g_strdup_printf("%i", row_idx+1);
834
path = gtk_tree_path_new_from_string(str); // restore selection
836
gtk_tree_selection_select_path(selection, path);
837
on_set_pc_to_selection1_activate(NULL, user_data);
841
on_go_to_address1_activate(NULL, user_data);
851
gtk_list_store_clear(store);
852
clist_populate(store, addr - 2);
859
if(row_idx < row_max)
862
offset = ti68k_debug_disassemble(start, &output);
865
gtk_list_store_clear(store);
866
clist_populate(store, start + offset);
868
str = g_strdup_printf("%i", row_max);
869
path = gtk_tree_path_new_from_string(str); // restore selection
871
gtk_tree_selection_select_path(selection, path);
882
gtk_list_store_clear(store);
883
clist_populate(store, addr - 0x10);
885
path = gtk_tree_path_new_from_string("0");
886
gtk_tree_view_set_cursor(view, path, NULL, FALSE);
894
if(row_idx < row_max)
897
gtk_list_store_clear(store);
898
clist_populate(store, addr/* + 0x10*/);
900
str = g_strdup_printf("%i", row_max);
901
path = gtk_tree_path_new_from_string(str); // restore selection
903
gtk_tree_selection_select_path(selection, path);
914
// note: user_data data passing has been manually added to Glade file
916
on_go_to_address1_activate (GtkMenuItem *menuitem,
921
if(display_dbgmem_address(&addr) == -1)
924
gtk_list_store_clear(store);
925
clist_populate(store, addr);
930
on_go_to_pc1_activate (GtkMenuItem *menuitem,
933
clist_refresh(store, TRUE);
938
on_set_breakpoint1_activate (GtkMenuItem *menuitem,
941
dbgcode_button6_clicked(NULL, NULL);
946
on_set_tmp_bkpt1_activate (GtkMenuItem *menuitem,
949
dbgcode_button7_clicked(NULL, NULL);
954
on_set_pc_to_selection1_activate (GtkMenuItem *menuitem,
957
//GtkWidget *list = GTK_WIDGET(user_data);
958
GtkTreeView *view = GTK_TREE_VIEW(list);
959
GtkTreeModel *model = gtk_tree_view_get_model(view);
960
GtkListStore *store = GTK_LIST_STORE(model);
961
GtkTreeSelection *selection;
967
selection = gtk_tree_view_get_selection(view);
968
valid = gtk_tree_selection_get_selected(selection, NULL, &iter);
970
gtk_tree_model_get(model, &iter, COL_ADDR, &str, -1);
971
sscanf(str, "%x", &addr);
973
ti68k_register_set_pc(addr);
974
dbgcode_refresh_window();
975
dbgregs_refresh_window();
976
dbgmem_refresh_window();
980
on_view_memory1_activate (GtkMenuItem *menuitem,
983
//GtkWidget *list = GTK_WIDGET(user_data);
984
GtkTreeView *view = GTK_TREE_VIEW(list);
985
GtkTreeModel *model = gtk_tree_view_get_model(view);
986
GtkListStore *store = GTK_LIST_STORE(model);
987
GtkTreeSelection *selection;
993
selection = gtk_tree_view_get_selection(view);
994
valid = gtk_tree_selection_get_selected(selection, NULL, &iter);
996
gtk_tree_model_get(model, &iter, COL_ADDR, &str, -1);
997
sscanf(str, "%x", &addr);
999
printf("addr = %x\n", addr);
1000
dbgmem_add_tab(addr);
1005
on_treeview1_size_allocate (GtkWidget *widget,
1006
GdkRectangle *allocation,
1010
GtkTreeView *view = GTK_TREE_VIEW(list);
1015
path = gtk_tree_path_new_from_string("0");
1016
gtk_tree_view_get_background_area(view, path, NULL, &rect);
1019
if(rect.height == 0)
1022
NLINES = allocation->height / rect.height - 1;
1023
//printf("#lines: %i (%i %i)\n", NLINES, allocation->height, rect.height);
1027
gtk_list_store_clear(store);
1028
clist_refresh(store, TRUE);