From d35ca0b099448b9be4528d2bc3bfebac5943f5f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= Date: Thu, 11 Feb 2021 16:24:03 +0000 Subject: [PATCH] src: introduce more window level actions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All the menu / toolbar callbacks are given equivalent action implementations. Signed-off-by: Daniel P. Berrangé --- src/virt-viewer-window.c | 262 +++++++++++++++++++++++++++++++++------ 1 file changed, 225 insertions(+), 37 deletions(-) diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c index d89c15b..5470515 100644 --- a/src/virt-viewer-window.c +++ b/src/virt-viewer-window.c @@ -80,6 +80,8 @@ static void virt_viewer_window_toolbar_setup(VirtViewerWindow *self); static GtkMenu* virt_viewer_window_get_keycombo_menu(VirtViewerWindow *self); static void virt_viewer_window_get_minimal_dimensions(VirtViewerWindow *self, guint *width, guint *height); static gint virt_viewer_window_get_minimal_zoom_level(VirtViewerWindow *self); +static void virt_viewer_window_set_fullscreen(VirtViewerWindow *self, + gboolean fullscreen); enum { PROP_0, @@ -339,6 +341,221 @@ can_activate_cb (GtkWidget *widget G_GNUC_UNUSED, return TRUE; } +static void +virt_viewer_window_action_zoom_out(GSimpleAction *act G_GNUC_UNUSED, + GVariant *param G_GNUC_UNUSED, + gpointer opaque) +{ + g_return_if_fail(VIRT_VIEWER_IS_WINDOW(opaque)); + + virt_viewer_window_zoom_out(VIRT_VIEWER_WINDOW(opaque)); +} + +static void +virt_viewer_window_action_zoom_in(GSimpleAction *act G_GNUC_UNUSED, + GVariant *param G_GNUC_UNUSED, + gpointer opaque) +{ + g_return_if_fail(VIRT_VIEWER_IS_WINDOW(opaque)); + + virt_viewer_window_zoom_in(VIRT_VIEWER_WINDOW(opaque)); +} + +static void +virt_viewer_window_action_zoom_reset(GSimpleAction *act G_GNUC_UNUSED, + GVariant *param G_GNUC_UNUSED, + gpointer opaque) +{ + g_return_if_fail(VIRT_VIEWER_IS_WINDOW(opaque)); + + virt_viewer_window_zoom_reset(VIRT_VIEWER_WINDOW(opaque)); +} + +static void +virt_viewer_window_action_quit(GSimpleAction *act G_GNUC_UNUSED, + GVariant *param G_GNUC_UNUSED, + gpointer opaque) +{ + g_return_if_fail(VIRT_VIEWER_IS_WINDOW(opaque)); + + VirtViewerWindow *self = VIRT_VIEWER_WINDOW(opaque); + + virt_viewer_app_maybe_quit(self->app, self); +} + +static void +virt_viewer_window_action_minimize(GSimpleAction *act G_GNUC_UNUSED, + GVariant *param G_GNUC_UNUSED, + gpointer opaque) +{ + g_return_if_fail(VIRT_VIEWER_IS_WINDOW(opaque)); + + VirtViewerWindow *self = VIRT_VIEWER_WINDOW(opaque); + + gtk_window_iconify(GTK_WINDOW(self->window)); +} + +static void +virt_viewer_window_action_about(GSimpleAction *act G_GNUC_UNUSED, + GVariant *param G_GNUC_UNUSED, + gpointer opaque) +{ + g_return_if_fail(VIRT_VIEWER_IS_WINDOW(opaque)); + + virt_viewer_window_show_about(VIRT_VIEWER_WINDOW(opaque)); +} + +static void +virt_viewer_window_action_guest_details(GSimpleAction *act G_GNUC_UNUSED, + GVariant *param G_GNUC_UNUSED, + gpointer opaque) +{ + g_return_if_fail(VIRT_VIEWER_IS_WINDOW(opaque)); + + virt_viewer_window_show_guest_details(VIRT_VIEWER_WINDOW(opaque)); +} + +static void +virt_viewer_window_action_fullscreen(GSimpleAction *act, + GVariant *state, + gpointer opaque) +{ + g_return_if_fail(VIRT_VIEWER_IS_WINDOW(opaque)); + + VirtViewerWindow *self = VIRT_VIEWER_WINDOW(opaque); + gboolean fullscreen = g_variant_get_boolean(state); + + g_simple_action_set_state(act, g_variant_new_boolean(fullscreen)); + + virt_viewer_window_set_fullscreen(self, fullscreen); +} + +static void +virt_viewer_window_action_send_key(GSimpleAction *act G_GNUC_UNUSED, + GVariant *param, + gpointer opaque) +{ + g_return_if_fail(VIRT_VIEWER_IS_WINDOW(opaque)); + + VirtViewerWindow *self = VIRT_VIEWER_WINDOW(opaque); + + g_return_if_fail(self->display != NULL); + gsize nkeys = 0; + const guint *keys = g_variant_get_fixed_array(param, + &nkeys, + sizeof(guint32)); + g_return_if_fail(keys != NULL); + + virt_viewer_display_send_keys(VIRT_VIEWER_DISPLAY(self->display), + keys, nkeys); +} + +static void +virt_viewer_window_action_screenshot(GSimpleAction *act G_GNUC_UNUSED, + GVariant *param G_GNUC_UNUSED, + gpointer opaque) +{ + g_return_if_fail(VIRT_VIEWER_IS_WINDOW(opaque)); + + virt_viewer_window_screenshot(VIRT_VIEWER_WINDOW(opaque)); +} + +static void +virt_viewer_window_action_usb_device_select(GSimpleAction *act G_GNUC_UNUSED, + GVariant *param G_GNUC_UNUSED, + gpointer opaque) +{ + g_return_if_fail(VIRT_VIEWER_IS_WINDOW(opaque)); + + VirtViewerWindow *self = VIRT_VIEWER_WINDOW(opaque); + + virt_viewer_session_usb_device_selection(virt_viewer_app_get_session(self->app), + GTK_WINDOW(self->window)); +} + +static void +virt_viewer_window_action_usb_device_reset(GSimpleAction *act G_GNUC_UNUSED, + GVariant *param G_GNUC_UNUSED, + gpointer opaque) +{ + g_return_if_fail(VIRT_VIEWER_IS_WINDOW(opaque)); + + VirtViewerWindow *self = VIRT_VIEWER_WINDOW(opaque); + + virt_viewer_session_usb_device_reset(virt_viewer_app_get_session(self->app)); +} + + +static void +virt_viewer_window_action_release_cursor(GSimpleAction *act G_GNUC_UNUSED, + GVariant *param G_GNUC_UNUSED, + gpointer opaque) +{ + g_return_if_fail(VIRT_VIEWER_IS_WINDOW(opaque)); + + VirtViewerWindow *self = VIRT_VIEWER_WINDOW(opaque); + + g_return_if_fail(self->display != NULL); + virt_viewer_display_release_cursor(VIRT_VIEWER_DISPLAY(self->display)); +} + +static void +virt_viewer_window_action_preferences(GSimpleAction *act G_GNUC_UNUSED, + GVariant *param G_GNUC_UNUSED, + gpointer opaque) +{ + g_return_if_fail(VIRT_VIEWER_IS_WINDOW(opaque)); + + VirtViewerWindow *self = VIRT_VIEWER_WINDOW(opaque); + + virt_viewer_app_show_preferences(self->app, self->window); +} + +static void +virt_viewer_window_action_change_cd(GSimpleAction *act G_GNUC_UNUSED, + GVariant *param G_GNUC_UNUSED, + gpointer opaque) +{ + g_return_if_fail(VIRT_VIEWER_IS_WINDOW(opaque)); + + virt_viewer_window_change_cd(VIRT_VIEWER_WINDOW(opaque)); +} + +static GActionEntry actions[] = { + { .name = "zoom-out", + .activate = virt_viewer_window_action_zoom_out }, + { .name = "zoom-in", + .activate = virt_viewer_window_action_zoom_in }, + { .name = "zoom-reset", + .activate = virt_viewer_window_action_zoom_reset }, + { .name = "quit", + .activate = virt_viewer_window_action_quit }, + { .name = "minimize", + .activate = virt_viewer_window_action_minimize }, + { .name = "about", + .activate = virt_viewer_window_action_about }, + { .name = "guest-details", + .activate = virt_viewer_window_action_guest_details }, + { .name = "fullscreen", + .state = "false", + .change_state = virt_viewer_window_action_fullscreen }, + { .name = "send-key", + .parameter_type = "au", + .activate = virt_viewer_window_action_send_key }, + { .name = "screenshot", + .activate = virt_viewer_window_action_screenshot }, + { .name = "usb-device-select", + .activate = virt_viewer_window_action_usb_device_select }, + { .name = "usb-device-reset", + .activate = virt_viewer_window_action_usb_device_reset }, + { .name = "release-cursor", + .activate = virt_viewer_window_action_release_cursor }, + { .name = "preferences", + .activate = virt_viewer_window_action_preferences }, + { .name = "change-cd", + .activate = virt_viewer_window_action_change_cd }, +}; + static void virt_viewer_window_init (VirtViewerWindow *self) { @@ -381,6 +598,10 @@ virt_viewer_window_init (VirtViewerWindow *self) gtk_box_pack_end(GTK_BOX(vbox), GTK_WIDGET(self->notebook), TRUE, TRUE, 0); self->window = GTK_WIDGET(gtk_builder_get_object(self->builder, "viewer")); + + g_action_map_add_action_entries(G_ACTION_MAP(self->window), actions, + G_N_ELEMENTS(actions), self); + gtk_window_add_accel_group(GTK_WINDOW(self->window), self->accel_group); virt_viewer_window_update_title(self); @@ -639,7 +860,7 @@ virt_viewer_window_enter_fullscreen(VirtViewerWindow *self, gint monitor) #define MAX_KEY_COMBO 4 struct keyComboDef { - guint keys[MAX_KEY_COMBO]; + guint32 keys[MAX_KEY_COMBO]; const char *accel_label; const gchar* accel_path; }; @@ -665,7 +886,7 @@ static const struct keyComboDef keyCombos[] = { }; static guint -get_nkeys(const guint *keys) +get_nkeys(const guint32 *keys) { guint i; @@ -680,7 +901,7 @@ virt_viewer_window_menu_send(GtkWidget *menu, VirtViewerWindow *self) { g_return_if_fail(self->display != NULL); - guint *keys = g_object_get_data(G_OBJECT(menu), "vv-keys"); + guint32 *keys = g_object_get_data(G_OBJECT(menu), "vv-keys"); g_return_if_fail(keys != NULL); virt_viewer_display_send_keys(VIRT_VIEWER_DISPLAY(self->display), @@ -702,7 +923,7 @@ virt_viewer_menu_add_combo(VirtViewerWindow *self, GtkMenu *menu, /* make accel work in fullscreen */ g_signal_connect(item, "can-activate-accel", G_CALLBACK(can_activate_cb), self); } - guint *ckeys = g_memdup(keys, (get_nkeys(keys) + 1) * sizeof(guint)); + guint32 *ckeys = g_memdup(keys, (get_nkeys(keys) + 1) * sizeof(guint32)); g_object_set_data_full(G_OBJECT(item), "vv-keys", ckeys, g_free); g_signal_connect(item, "activate", G_CALLBACK(virt_viewer_window_menu_send), self); } @@ -805,36 +1026,6 @@ virt_viewer_window_get_keycombo_menu(VirtViewerWindow *self) return menu; } -static void -action_zoom_in(G_GNUC_UNUSED GSimpleAction *action, - G_GNUC_UNUSED GVariant *state, - gpointer user_data) -{ - virt_viewer_window_zoom_in(VIRT_VIEWER_WINDOW(user_data)); -} - -static void -action_zoom_out(G_GNUC_UNUSED GSimpleAction *action, - G_GNUC_UNUSED GVariant *state, - gpointer user_data) -{ - virt_viewer_window_zoom_out(VIRT_VIEWER_WINDOW(user_data)); -} - -static void -action_zoom_reset(G_GNUC_UNUSED GSimpleAction *action, - G_GNUC_UNUSED GVariant *state, - gpointer user_data) -{ - virt_viewer_window_zoom_reset(VIRT_VIEWER_WINDOW(user_data)); -} - -/* Keep keypad_action_entries and keypad_action_accels in sync */ -static const GActionEntry keypad_action_entries[] = { - { .name = "zoom-in", .activate = action_zoom_in }, - { .name = "zoom-out", .activate = action_zoom_out }, - { .name = "zoom-reset", .activate = action_zoom_reset }, -}; struct VirtViewerActionAccels { const char *accels[2]; @@ -928,9 +1119,6 @@ virt_viewer_window_enable_modifiers(VirtViewerWindow *self) if (!virt_viewer_app_get_enable_accel(self->app) && gtk_accel_map_lookup_entry("/view/zoom-out", &key) && key.accel_key != 0) { - g_action_map_add_action_entries(G_ACTION_MAP(self->window), - keypad_action_entries, G_N_ELEMENTS(keypad_action_entries), - self); for (i = 0; i < G_N_ELEMENTS(action_accels); i++) { gtk_application_set_accels_for_action(GTK_APPLICATION(self->app), action_accels[i].action,