static void column_clicked(GtkTreeViewColumn* column, gpointer user_data) { int col = column2index(user_data, column); GtkSortType sort1 = gtk_tree_view_column_get_sort_order(column); GtkSortType sort2 = (options.local_sort_order ? GTK_SORT_ASCENDING : GTK_SORT_DESCENDING); if(sort1 == sort2) { options.local_sort_order = !options.local_sort_order; clist_refresh(); } switch(col) { case COLUMN_NAME: options.local_sort = SORT_BY_NAME; clist_refresh(); break; case COLUMN_TYPE: options.local_sort = SORT_BY_TYPE; clist_refresh(); break; case COLUMN_SIZE: options.local_sort = SORT_BY_SIZE; clist_refresh(); break; case COLUMN_DATE: options.local_sort = SORT_BY_DATE; clist_refresh(); break; default: break; } }
/* User click: update choice (full) or goes down (single) */ gboolean on_treeview2_button_press_event(GtkWidget * widget, GdkEventButton * event, gpointer user_data) { GtkTreeView *view = GTK_TREE_VIEW(widget); GtkTreePath *path; GtkTreeViewColumn *column; GtkTreeIter iter; struct menu *menu; gint col; #if GTK_CHECK_VERSION(2,1,4) // bug in ctree with earlier version of GTK gint tx = (gint) event->x; gint ty = (gint) event->y; gint cx, cy; gtk_tree_view_get_path_at_pos(view, tx, ty, &path, &column, &cx, &cy); #else gtk_tree_view_get_cursor(view, &path, &column); #endif if (path == NULL) return FALSE; if (!gtk_tree_model_get_iter(model2, &iter, path)) return FALSE; gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1); col = column2index(column); if (event->type == GDK_2BUTTON_PRESS) { enum prop_type ptype; ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; if (ptype == P_MENU && view_mode != FULL_VIEW && col == COL_OPTION) { // goes down into menu current = menu; display_tree_part(); gtk_widget_set_sensitive(back_btn, TRUE); } else if ((col == COL_OPTION)) { toggle_sym_value(menu); gtk_tree_view_expand_row(view, path, TRUE); } } else { if (col == COL_VALUE) { toggle_sym_value(menu); gtk_tree_view_expand_row(view, path, TRUE); } else if (col == COL_NO || col == COL_MOD || col == COL_YES) { change_sym_value(menu, col); gtk_tree_view_expand_row(view, path, TRUE); } } return FALSE; }
static uint32_t column2address (GtkMenuItem *menuitem, gpointer user_data) { GtkNotebook *nb = GTK_NOTEBOOK(notebook); gint page = gtk_notebook_get_current_page(nb); GList *l, *elt; GtkWidget *list; GtkTreeView *view; GtkTreeModel *model; GtkListStore *store; gchar *str; GtkTreePath *path; GtkTreeViewColumn *column; GtkTreeIter iter; gint col; uint32_t addr; // get list pointer (we have 1 child) l = gtk_container_get_children(GTK_CONTAINER(nb)); elt = g_list_nth(l, page); list = GTK_WIDGET(elt->data); view = GTK_TREE_VIEW(list); model = gtk_tree_view_get_model(view); store = GTK_LIST_STORE(model); // get column gtk_tree_view_get_cursor(view, &path, &column); if(!path || !column) return -1; // get iterator if (!gtk_tree_model_get_iter(model, &iter, path)) return -1; // get address col = column2index(list, column); gtk_tree_model_get(model, &iter, COL_ADDR, &str, -1); sscanf(str, "%06x", &addr); return (addr + (col-1)); }
GLADE_CB gboolean on_treeview3_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { GtkTreeView *view = GTK_TREE_VIEW(widget); GtkTreeModel *model = gtk_tree_view_get_model(view); GtkTreePath *path; GtkTreeViewColumn *column; GtkTreeIter iter; gboolean ret; gchar *spath; gint i, j; gint col; if(event->type != GDK_BUTTON_PRESS) return FALSE; { // cell selection gint tx = (gint) event->x; gint ty = (gint) event->y; gint cx, cy; ret = gtk_tree_view_get_path_at_pos(view, tx, ty, &path, &column, &cx, &cy); if(ret == FALSE) return FALSE; col = column2index((GtkWidget *)view, column); spath = gtk_tree_path_to_string(path); sscanf(spath, "%i:%i", &i, &j); //gtk_tree_path_free(path); g_free(spath); } if(event->button == 1) // first button clicked { if(!((col == 0) && (i == 2) && ((j == 4) ||(j ==5)))) return FALSE; if(dbgsr_display_dbox() == -1) return TRUE; dbgregs_refresh_window(); dbgstack_refresh_window(); return TRUE; } if (event->button == 3) // third button clicked { GdkEventButton *bevent; GtkWidget *menu; // check for click on regs if(! ( (col == 1) && (i>= 0) && (i <= 1) && (j >= 0) && (j <= 7) ) ) return FALSE; // get iterator if (!gtk_tree_model_get_iter(model, &iter, path)) return FALSE; gtk_tree_path_free(path); gtk_tree_model_get(model, &iter, COL_VALUE, &spath, -1); sscanf(spath, "%x", &value); printf("value = %x\n", value); // popup menu bevent = (GdkEventButton *) (event); menu = display_popup_menu(); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, bevent->button, bevent->time); gtk_widget_show(menu); return TRUE; } return FALSE; }
GLADE_CB gboolean on_treeview1_button_press_event(GtkWidget * widget, GdkEventButton * event, gpointer user_data) { GtkTreeView *view = GTK_TREE_VIEW(gfm_widget.tree); GtkTreeModel *model = GTK_TREE_MODEL(tree); GtkTreePath *path; GtkTreeViewColumn *column; GtkTreeIter iter; VarEntry *ve; int col; gtk_tree_view_get_cursor(view, &path, &column); col = column2index(column); if (path == NULL) return FALSE; gtk_tree_model_get_iter(model, &iter, path); gtk_tree_model_get(model, &iter, COLUMN_DATA, &ve, -1); if (ve == NULL) return FALSE; if((event->type == GDK_2BUTTON_PRESS) && (col == COLUMN_ATTR)) { GdkPixbuf *pix1, *pix2, *pix3; pix1 = create_pixbuf("attr_none.xpm"); pix2 = create_pixbuf("attr_locked.xpm"); pix3 = create_pixbuf("attr_archived.xpm"); if(ve->type == tifiles_flash_type(GFMFile.model)) return FALSE; if(ve->attr == ATTRB_NONE) ve->attr = ATTRB_LOCKED; else if(ve->attr == ATTRB_LOCKED && tifiles_is_flash(GFMFile.model)) ve->attr = ATTRB_ARCHIVED; else if(ve->attr == ATTRB_LOCKED && !tifiles_is_flash(GFMFile.model)) ve->attr = ATTRB_NONE; else if(ve->attr == ATTRB_ARCHIVED) ve->attr = ATTRB_NONE; switch (ve->attr) { case ATTRB_NONE: gtk_tree_store_set(tree, &iter, COLUMN_ATTR, pix1, -1); break; case ATTRB_LOCKED: gtk_tree_store_set(tree, &iter, COLUMN_ATTR, pix2, -1); break; case ATTRB_ARCHIVED: gtk_tree_store_set(tree, &iter, COLUMN_ATTR, pix3, -1); break; default: break; } g_object_unref(pix1); g_object_unref(pix2); g_object_unref(pix3); labels_refresh(); } return FALSE; }
static void renderer_edited(GtkCellRendererText * cell, const gchar * path_string, const gchar * new_text, gpointer user_data) { GtkWidget *list = user_data; GtkTreeView *view = GTK_TREE_VIEW(list); GtkTreeModel *model = gtk_tree_view_get_model(view); GtkListStore *store = GTK_LIST_STORE(model); GtkTreeViewColumn *column; GtkTreeIter iter; GtkTreePath *path; gint col; gchar *str_addr; gchar *str_data = (char *)new_text; int addr, data, i; gchar *ascii, *utf; gsize bw; // get column gtk_tree_view_get_cursor(view, &path, &column); if(!path || !column) return; // get iterator if (!gtk_tree_model_get_iter(model, &iter, path)) return; // get address col = column2index(list, column); gtk_tree_model_get(model, &iter, COL_ADDR, &str_addr, COL_ASCII, &ascii, -1); // check for new value if((strlen(str_data) % 2) != 0) { gtk_tree_path_free(path); return; } for(i = 0; i < (int)strlen(str_data); i++) if(!isxdigit(str_data[i])) { gtk_tree_path_free(path); return; } // set new value(s) and update memory for(i = 0; (i < (int)strlen(str_data)/2) && ((col+i) <= COL_F); i++) { char digits[3]; int offset = col - COL_0 + i; strncpy(digits, &new_text[2*i], 2); digits[2] = '\0'; sscanf(str_addr, "%x", &addr); sscanf(digits, "%x", &data); mem_wr_byte(addr + offset, (uint8_t)data); // don't rely on typed value data = mem_rd_byte(addr + offset); sprintf(digits, "%02x", data); ascii[offset] = (isprint(data) && !iscntrl(data) ? data : '.'); gtk_list_store_set(store, &iter, col+i, digits, -1); dbgstack_refresh_window(); // refresh stack, too } // and ascii area, too utf = g_locale_to_utf8(ascii, -1, NULL, &bw, NULL); gtk_list_store_set(store, &iter, COL_ASCII, utf, -1); g_free(str_addr); gtk_tree_path_free(path); }