diff options
Diffstat (limited to 'rcm-client-receive.c')
| -rw-r--r-- | rcm-client-receive.c | 69 | 
1 files changed, 66 insertions, 3 deletions
| diff --git a/rcm-client-receive.c b/rcm-client-receive.c index 4f21f78..9931a08 100644 --- a/rcm-client-receive.c +++ b/rcm-client-receive.c @@ -50,6 +50,7 @@ struct rcbutton {  };  struct state { +	RCDevice *object;  	GList *remotes;  	GList *header_buttons;  	bool editing; @@ -518,6 +519,65 @@ resize_layout(struct remote *remote, guint16 new_width, guint16 new_height)  }  static void +update_remote(struct remote *remote) +{ +	GVariantBuilder kbuilder; +	GVariantBuilder lbuilder; +	GList *l; + +	g_variant_builder_init(&kbuilder, G_VARIANT_TYPE("aa{sv}")); +	for (l = remote->keymap; l; l = l->next) { +		struct keymap_entry *ke = l->data; + +		g_variant_builder_open(&kbuilder, G_VARIANT_TYPE ("a{sv}")); + +		g_variant_builder_add(&kbuilder, "{sv}", "protocol", +				      g_variant_new_string(ke->protocol)); + +		g_variant_builder_add(&kbuilder, "{sv}", "scancode", +				      g_variant_new_uint64(ke->scancode)); + +		g_variant_builder_add(&kbuilder, "{sv}", "keycode", +				      g_variant_new_string(ke->keycode)); + +		g_variant_builder_close(&kbuilder); +	} + +	g_variant_builder_init(&lbuilder, G_VARIANT_TYPE("aa{sv}")); +	for (l = remote->buttons; l; l = l->next) { +		struct rcbutton *rcb = l->data; + +		g_variant_builder_open(&lbuilder, G_VARIANT_TYPE ("a{sv}")); + +		switch (rcb->type) { +		case RCBUTTON_TYPE_NORMAL: +			g_variant_builder_add(&lbuilder, "{sv}", "type", +					      g_variant_new_string("button")); +			g_variant_builder_add(&lbuilder, "{sv}", "keycode", +					      g_variant_new_string(rcb->name)); +			break; + +		case RCBUTTON_TYPE_BLANK: +			g_variant_builder_add(&lbuilder, "{sv}", "type", +					      g_variant_new_string("blank")); +			break; + +		default: +			g_assert_not_reached(); +		} + +		g_variant_builder_close(&lbuilder); +	} + +	rcdevice_call_set_keymap_sync(state.object, remote->id, +				      remote->name, remote->description, +				      remote->width, remote->height, +				      g_variant_builder_end(&kbuilder), +				      g_variant_builder_end(&lbuilder), +				      NULL, NULL); +} + +static void  resize_layout_dialog(GtkButton *button, gpointer user_data)  {  	struct remote *remote = user_data; @@ -589,6 +649,8 @@ resize_layout_dialog(GtkButton *button, gpointer user_data)  	resize_layout(remote, width, height); +	update_remote(remote); +  out:  	gtk_widget_destroy(dialog);  } @@ -856,13 +918,14 @@ void rcng_client_receive_init_ui(GDBusObject *new_hw)  		return;  	gchar **keymap_ids = NULL; -	RCDevice *object = RCDEVICE(interface); -	rcdevice_call_list_keymaps_sync(object, &keymap_ids, NULL, NULL); +	/* FIXME: unref object */ +	state.object = RCDEVICE(interface); +	rcdevice_call_list_keymaps_sync(state.object, &keymap_ids, NULL, NULL);  	for (i = 0; keymap_ids[i]; i++) {  		struct remote *remote;  		g_print("Fetching keymap: %s\n", keymap_ids[i]); -		remote = get_keymap(object, keymap_ids[i]); +		remote = get_keymap(state.object, keymap_ids[i]);  		state.remotes = g_list_prepend(state.remotes, remote);  		gtk_grid_attach(GTK_GRID(rgrid), remote->widget, i, 1, 1, 1); | 
