summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Bornecrantz <jakob@vmware.com>2009-06-04 17:53:01 +0100
committerJakob Bornecrantz <jakob@vmware.com>2009-06-04 17:53:01 +0100
commitea8763c234dfaa5fef7cc1b4dc954402f2fd7e9e (patch)
treecbd69bf67b1490a797e0eb3d7e8d633050d12686
parenta0680699199e18db090cf19bca23d28632ca5c9f (diff)
Create a viewed concept
This allows us to select object but view another one
-rw-r--r--src/main.c60
-rw-r--r--src/program.h12
-rw-r--r--src/shader.c46
-rw-r--r--src/texture.c28
4 files changed, 120 insertions, 26 deletions
diff --git a/src/main.c b/src/main.c
index 4f46d4c..9801bd9 100644
--- a/src/main.c
+++ b/src/main.c
@@ -235,6 +235,66 @@ static void icon_setup(struct program *p)
icon_add("res/shader_off_replaced.png", "shader_off_replaced", p);
}
+void main_set_viewed(GtkTreeIter *iter, struct program *p)
+{
+ GtkTreeModel *model = GTK_TREE_MODEL(p->main.treestore);
+ GtkTreeIter parent;
+ enum types old_type;
+ uint64_t old_id;
+ GValue typename;
+ GValue type;
+ GValue id;
+
+ old_id = p->viewed.id;
+ old_type = p->viewed.type;
+
+ if (iter) {
+ memset(&id, 0, sizeof(id));
+ memset(&type, 0, sizeof(type));
+ memset(&typename, 0, sizeof(typename));
+
+ gtk_tree_model_get_value(model, iter, COLUMN_ID, &id);
+ gtk_tree_model_get_value(model, iter, COLUMN_TYPE, &type);
+ gtk_tree_model_get_value(model, iter, COLUMN_TYPENAME, &typename);
+
+ g_assert(G_VALUE_HOLDS_UINT64(&id));
+ g_assert(G_VALUE_HOLDS_INT(&type));
+ g_assert(G_VALUE_HOLDS_STRING(&typename));
+
+ p->viewed.iter = *iter;
+ p->viewed.id = g_value_get_uint64(&id);
+ p->viewed.type = g_value_get_int(&type);
+
+ if (gtk_tree_model_iter_parent(model, &parent, iter)) {
+ g_value_unset(&id);
+ gtk_tree_model_get_value(model, &parent, COLUMN_ID, &id);
+ g_assert(G_VALUE_HOLDS_UINT64(&id));
+ p->viewed.parent = g_value_get_uint64(&id);
+ } else {
+ /* Everything else then the screen must have a parent */
+ g_assert(p->viewed.id != 0);
+ }
+ } else {
+ memset(&p->viewed, 0, sizeof(p->viewed));
+ }
+
+ if (p->viewed.id != old_id ||
+ p->viewed.type != old_type) {
+ if (old_id) {
+ if (old_type == TYPE_SHADER)
+ shader_unviewed(p);
+ else if (old_type == TYPE_TEXTURE)
+ texture_unviewed(p);
+ }
+ if (p->viewed.id) {
+ if (p->viewed.type == TYPE_SHADER)
+ shader_viewed(p);
+ else if (p->selected.type == TYPE_TEXTURE)
+ texture_viewed(p);
+ }
+ }
+}
+
void main_window_create(struct program *p)
{
GtkBuilder *builder;
diff --git a/src/program.h b/src/program.h
index 41ef9df..aa38d8a 100644
--- a/src/program.h
+++ b/src/program.h
@@ -85,6 +85,13 @@ struct program
} selected;
struct {
+ GtkTreeIter iter;
+ enum types type;
+ guint64 parent;
+ guint64 id;
+ } viewed;
+
+ struct {
GtkWidget *back;
GtkWidget *forward;
GtkWidget *background;
@@ -146,6 +153,7 @@ gboolean ask_connect(struct program *p);
/* src/main.c */
void main_window_create(struct program *p);
void main_quit(struct program *p);
+void main_set_viewed(GtkTreeIter *iter, struct program *p);
void icon_add(const char *filename, const char *name, struct program *p);
GdkPixbuf* icon_get(const char *name, struct program *p);
@@ -165,6 +173,8 @@ void context_list(GtkTreeStore *store,
void texture_list(GtkTreeStore *store, GtkTreeIter *parent, struct program *p);
void texture_unselected(struct program *p);
void texture_selected(struct program *p);
+void texture_unviewed(struct program *p);
+void texture_viewed(struct program *p);
void texture_refresh(struct program *p);
void texture_draw(struct program *p);
@@ -172,6 +182,8 @@ void texture_draw(struct program *p);
/* src/shader.c */
void shader_unselected(struct program *p);
void shader_selected(struct program *p);
+void shader_unviewed(struct program *p);
+void shader_viewed(struct program *p);
void shader_list(GtkTreeStore *store,
GtkTreeIter *parent,
rbug_context_t ctx,
diff --git a/src/shader.c b/src/shader.c
index a81a28a..79fc91d 100644
--- a/src/shader.c
+++ b/src/shader.c
@@ -56,16 +56,16 @@ static void disable(GtkWidget *widget, struct program *p)
struct rbug_connection *con = p->rbug.con;
(void)widget;
- g_assert(p->selected.type == TYPE_SHADER);
+ g_assert(p->viewed.type == TYPE_SHADER);
rbug_finish_and_emit_events(p);
- rbug_send_shader_disable(con, p->selected.parent, p->selected.id, true, NULL);
+ rbug_send_shader_disable(con, p->viewed.parent, p->viewed.id, true, NULL);
rbug_finish_and_emit_events(p);
gtk_widget_hide(p->tool.disable);
gtk_widget_show(p->tool.enable);
- shader_start_info_action(p->selected.parent, p->selected.id, &p->selected.iter, p);
+ shader_start_info_action(p->viewed.parent, p->viewed.id, &p->viewed.iter, p);
}
static void enable(GtkWidget *widget, struct program *p)
@@ -73,16 +73,16 @@ static void enable(GtkWidget *widget, struct program *p)
struct rbug_connection *con = p->rbug.con;
(void)widget;
- g_assert(p->selected.type == TYPE_SHADER);
+ g_assert(p->viewed.type == TYPE_SHADER);
rbug_finish_and_emit_events(p);
- rbug_send_shader_disable(con, p->selected.parent, p->selected.id, false, NULL);
+ rbug_send_shader_disable(con, p->viewed.parent, p->viewed.id, false, NULL);
rbug_finish_and_emit_events(p);
gtk_widget_show(p->tool.disable);
gtk_widget_hide(p->tool.enable);
- shader_start_info_action(p->selected.parent, p->selected.id, &p->selected.iter, p);
+ shader_start_info_action(p->viewed.parent, p->viewed.id, &p->viewed.iter, p);
}
static void update_text(struct rbug_proto_shader_info_reply *info, struct program *p)
@@ -110,13 +110,13 @@ static void revert(GtkWidget *widget, struct program *p)
struct rbug_connection *con = p->rbug.con;
(void)widget;
- g_assert(p->selected.type == TYPE_SHADER);
+ g_assert(p->viewed.type == TYPE_SHADER);
rbug_finish_and_emit_events(p);
- rbug_send_shader_replace(con, p->selected.parent, p->selected.id, NULL, 0, NULL);
+ rbug_send_shader_replace(con, p->viewed.parent, p->viewed.id, NULL, 0, NULL);
rbug_finish_and_emit_events(p);
- shader_start_info_action(p->selected.parent, p->selected.id, &p->selected.iter, p);
+ shader_start_info_action(p->viewed.parent, p->viewed.id, &p->viewed.iter, p);
}
static void save(GtkWidget *widget, struct program *p)
@@ -131,7 +131,7 @@ static void save(GtkWidget *widget, struct program *p)
unsigned num;
(void)widget;
- g_assert(p->selected.type == TYPE_SHADER);
+ g_assert(p->viewed.type == TYPE_SHADER);
g_assert(sizeof(struct tgsi_token) == 4);
rbug_finish_and_emit_events(p);
@@ -148,22 +148,22 @@ static void save(GtkWidget *widget, struct program *p)
num = tgsi_num_tokens(tokens);
- rbug_send_shader_replace(con, p->selected.parent, p->selected.id,
+ rbug_send_shader_replace(con, p->viewed.parent, p->viewed.id,
(uint32_t*)tokens, num, NULL);
gtk_widget_show(p->tool.revert);
rbug_finish_and_emit_events(p);
- shader_start_info_action(p->selected.parent, p->selected.id, &p->selected.iter, p);
+ shader_start_info_action(p->viewed.parent, p->viewed.id, &p->viewed.iter, p);
out:
g_free(text);
}
-void shader_selected(struct program *p)
+void shader_viewed(struct program *p)
{
- g_assert(p->selected.type == TYPE_SHADER);
+ g_assert(p->viewed.type == TYPE_SHADER);
p->shader.id[0] = g_signal_connect(p->tool.save, "clicked", G_CALLBACK(save), p);
p->shader.id[1] = g_signal_connect(p->tool.revert, "clicked", G_CALLBACK(revert), p);
@@ -176,10 +176,10 @@ void shader_selected(struct program *p)
if (p->shader.info)
shader_stop_info_action(p->shader.info, p);
- shader_start_info_action(p->selected.parent, p->selected.id, &p->selected.iter, p);
+ shader_start_info_action(p->viewed.parent, p->viewed.id, &p->viewed.iter, p);
}
-void shader_unselected(struct program *p)
+void shader_unviewed(struct program *p)
{
g_signal_handler_disconnect(p->tool.save, p->shader.id[0]);
g_signal_handler_disconnect(p->tool.revert, p->shader.id[1]);
@@ -194,6 +194,16 @@ void shader_unselected(struct program *p)
gtk_widget_hide(p->main.textview_scrolled);
}
+void shader_unselected(struct program *p)
+{
+ main_set_viewed(NULL, p);
+}
+
+void shader_selected(struct program *p)
+{
+ main_set_viewed(&p->selected.iter, p);
+}
+
void shader_list(GtkTreeStore *store, GtkTreeIter *parent,
rbug_context_t ctx, struct program *p)
{
@@ -243,6 +253,8 @@ static void shader_action_info_info(struct rbug_event *e,
/* ack pending message */
action->pending = FALSE;
+ g_assert(header->opcode == RBUG_OP_SHADER_INFO_REPLY);
+
if (info->disabled) {
if (info->replaced_len == 0)
buf = icon_get("shader_off_normal", p);
@@ -256,7 +268,7 @@ static void shader_action_info_info(struct rbug_event *e,
}
gtk_tree_store_set(p->main.treestore, &action->iter, COLUMN_PIXBUF, buf, -1);
- if (p->selected.id != action->sid)
+ if (p->viewed.id != action->sid)
goto out;
update_text(info, p);
diff --git a/src/texture.c b/src/texture.c
index 1a31ad3..0fcd762 100644
--- a/src/texture.c
+++ b/src/texture.c
@@ -82,7 +82,7 @@ static void automatic(GtkWidget *widget, struct program *p)
p->texture.automatic = !p->texture.automatic;
if (p->texture.automatic)
- texture_start_if_new_read_action(p->selected.id, &p->selected.iter, p);
+ texture_start_if_new_read_action(p->viewed.id, &p->viewed.iter, p);
}
static void background(GtkWidget *widget, struct program *p)
@@ -109,7 +109,7 @@ void texture_list(GtkTreeStore *store, GtkTreeIter *parent, struct program *p)
void texture_refresh(struct program *p)
{
- texture_start_if_new_read_action(p->selected.id, &p->selected.iter, p);
+ texture_start_if_new_read_action(p->viewed.id, &p->viewed.iter, p);
}
void texture_draw(struct program *p)
@@ -134,7 +134,7 @@ void texture_draw(struct program *p)
break;
}
- if (p->texture.id != p->selected.id)
+ if (p->texture.id != p->viewed.id)
return;
w = p->texture.width;
@@ -162,10 +162,10 @@ void texture_draw(struct program *p)
glDisable(GL_BLEND);
if (p->texture.automatic)
- texture_start_if_new_read_action(p->selected.id, &p->selected.iter, p);
+ texture_start_if_new_read_action(p->viewed.id, &p->viewed.iter, p);
}
-void texture_unselected(struct program *p)
+void texture_unviewed(struct program *p)
{
(void)p;
@@ -183,11 +183,11 @@ void texture_unselected(struct program *p)
g_signal_handler_disconnect(p->tool.background, p->texture.tid[2]);
}
-void texture_selected(struct program *p)
+void texture_viewed(struct program *p)
{
- g_assert(p->selected.type == TYPE_TEXTURE);
+ g_assert(p->viewed.type == TYPE_TEXTURE);
- texture_start_if_new_read_action(p->selected.id, &p->selected.iter, p);
+ texture_start_if_new_read_action(p->viewed.id, &p->viewed.iter, p);
gtk_widget_show(p->tool.alpha);
gtk_widget_show(p->tool.automatic);
@@ -203,6 +203,16 @@ void texture_selected(struct program *p)
p->texture.tid[2] = g_signal_connect(p->tool.background, "clicked", G_CALLBACK(background), p);
}
+void texture_unselected(struct program *p)
+{
+ main_set_viewed(NULL, p);
+}
+
+void texture_selected(struct program *p)
+{
+ main_set_viewed(&p->selected.iter, p);
+}
+
/*
* Actions
*/
@@ -522,7 +532,7 @@ static void texture_start_if_new_read_action(rbug_texture_t t,
/* are we currently trying download anything? */
if (p->texture.read) {
/* ok we are downloading something, but is it the one we want? */
- if (p->texture.read->id == p->selected.id) {
+ if (p->texture.read->id == p->viewed.id) {
/* don't need to do anything */
return;
} else {