summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Persch <chpe@src.gnome.org>2022-12-02 22:05:38 +0100
committerChristian Persch <chpe@src.gnome.org>2022-12-02 22:05:38 +0100
commit98c0ab76de14b8836e0b5a6196751b4766072be9 (patch)
treeabbc026893d24b5a62251ddd631bf0e63376e91b
parentd11869ae9127bea4c81aeb92f2d7c29aa8fd98d9 (diff)
downloadgnome-terminal-98c0ab76de14b8836e0b5a6196751b4766072be9.tar.gz
client: Transport XDG_ACTIVATION_TOKEN to the server
-rw-r--r--src/terminal-client-utils.cc7
-rw-r--r--src/terminal-client-utils.hh1
-rw-r--r--src/terminal-gdbus.cc6
-rw-r--r--src/terminal-options.cc38
-rw-r--r--src/terminal-options.hh1
-rw-r--r--src/terminal.cc4
6 files changed, 44 insertions, 13 deletions
diff --git a/src/terminal-client-utils.cc b/src/terminal-client-utils.cc
index d7c59fe4..9e799611 100644
--- a/src/terminal-client-utils.cc
+++ b/src/terminal-client-utils.cc
@@ -142,7 +142,8 @@ terminal_client_get_file_uninstalled(char const* exe_install_dir,
* terminal_client_append_create_instance_options:
* @builder: a #GVariantBuilder of #GVariantType "a{sv}"
* @display: (array element-type=guint8):
- * @startup_id: (array element-type=guint8):
+ * @startup_id:
+ * @activation_token:
* @geometry:
* @role:
* @profile:
@@ -156,6 +157,7 @@ void
terminal_client_append_create_instance_options (GVariantBuilder *builder,
const char *display_name,
const char *startup_id,
+ const char *activation_token,
const char *geometry,
const char *role,
const char *profile,
@@ -172,6 +174,9 @@ terminal_client_append_create_instance_options (GVariantBuilder *builder,
if (startup_id)
g_variant_builder_add (builder, "{sv}",
"desktop-startup-id", g_variant_new_bytestring (startup_id));
+ if (activation_token)
+ g_variant_builder_add (builder, "{sv}",
+ "activation-token", g_variant_new_string (activation_token));
/* String options */
if (profile)
diff --git a/src/terminal-client-utils.hh b/src/terminal-client-utils.hh
index 33e5c909..faf0c5ed 100644
--- a/src/terminal-client-utils.hh
+++ b/src/terminal-client-utils.hh
@@ -36,6 +36,7 @@ char* terminal_client_get_file_uninstalled(char const* exe_install_dir,
void terminal_client_append_create_instance_options (GVariantBuilder *builder,
const char *display_name,
const char *startup_id,
+ const char *activation_token,
const char *geometry,
const char *role,
const char *profile,
diff --git a/src/terminal-gdbus.cc b/src/terminal-gdbus.cc
index dc77b457..55f33915 100644
--- a/src/terminal-gdbus.cc
+++ b/src/terminal-gdbus.cc
@@ -439,13 +439,15 @@ terminal_factory_impl_create_instance (TerminalFactory *factory,
/* Still no parent window? Create a new one */
if (window == nullptr) {
- const char *startup_id, *role;
+ const char *startup_id, *role, *activation_token;
gboolean start_maximized, start_fullscreen;
window = terminal_window_new (G_APPLICATION (app));
have_new_window = TRUE;
- if (g_variant_lookup (options, "desktop-startup-id", "^&ay", &startup_id))
+ if (g_variant_lookup (options, "activation-token", "&s", &activation_token))
+ gtk_window_set_startup_id (GTK_WINDOW (window), activation_token);
+ else if (g_variant_lookup (options, "desktop-startup-id", "^&ay", &startup_id))
gtk_window_set_startup_id (GTK_WINDOW (window), startup_id);
/* Overwrite the default, unique window role set in terminal_window_init */
diff --git a/src/terminal-options.cc b/src/terminal-options.cc
index 9e672f5d..8f1ced58 100644
--- a/src/terminal-options.cc
+++ b/src/terminal-options.cc
@@ -999,6 +999,18 @@ digest_options_callback (GOptionContext *context,
return TRUE;
}
+static char*
+getenv_utf8(char const* env)
+{
+ auto const value = g_getenv(env);
+ if (!value ||
+ !value[0] ||
+ !g_utf8_validate(value, -1, nullptr))
+ return nullptr;
+
+ return g_strdup(value);
+}
+
/**
* terminal_options_parse:
* @argcp: (inout) address of the argument count. Changed if any arguments were handled
@@ -1031,12 +1043,8 @@ terminal_options_parse (int *argcp,
options->default_maximize = FALSE;
options->execute = FALSE;
- const char *startup_id = g_getenv ("DESKTOP_STARTUP_ID");
- if (startup_id && startup_id[0] &&
- g_utf8_validate (startup_id, -1, nullptr))
- options->startup_id = g_strdup (startup_id);
- else
- options->startup_id = nullptr;
+ options->startup_id = getenv_utf8("DESKTOP_STARTUP_ID");
+ options->startup_id = getenv_utf8("XDG_ACTIVATION_TOKEN");
options->display_name = nullptr;
options->initial_windows = nullptr;
options->default_role = nullptr;
@@ -1113,12 +1121,12 @@ terminal_options_parse (int *argcp,
return nullptr;
}
+#ifdef GDK_WINDOWING_X11
/* Do this here so that gdk_display is initialized */
- if (options->startup_id == nullptr)
+ if (options->startup_id == nullptr) {
options->startup_id = terminal_client_get_fallback_startup_id ();
- /* Still nullptr? */
- if (options->startup_id == nullptr)
- terminal_printerr_detail ("Warning: DESKTOP_STARTUP_ID not set and no fallback available.\n");
+ }
+#endif /* X11 */
GdkDisplay *display = gdk_display_get_default ();
if (display != nullptr)
@@ -1314,6 +1322,7 @@ terminal_options_free (TerminalOptions *options)
g_free (options->display_name);
g_free (options->startup_id);
+ g_free (options->activation_token);
g_free (options->server_app_id);
g_free (options->sm_client_id);
@@ -1644,6 +1653,15 @@ get_goption_context (TerminalOptions *options)
nullptr,
nullptr
},
+ {
+ "activation-token",
+ 0,
+ G_OPTION_FLAG_HIDDEN,
+ G_OPTION_ARG_STRING,
+ &options->activation_token,
+ nullptr,
+ nullptr
+ },
{ nullptr, 0, 0, G_OPTION_ARG_NONE, nullptr, nullptr, nullptr }
};
diff --git a/src/terminal-options.hh b/src/terminal-options.hh
index fe88361f..48edb320 100644
--- a/src/terminal-options.hh
+++ b/src/terminal-options.hh
@@ -74,6 +74,7 @@ typedef struct
char *server_app_id;
char *startup_id;
+ char *activation_token;
char *display_name;
gboolean show_preferences;
GList *initial_windows;
diff --git a/src/terminal.cc b/src/terminal.cc
index ce6060fd..520b1040 100644
--- a/src/terminal.cc
+++ b/src/terminal.cc
@@ -354,6 +354,9 @@ handle_show_preferences_remote (TerminalOptions *options,
if (options->startup_id)
g_variant_builder_add (&builder, "{sv}",
"desktop-startup-id", g_variant_new_string (options->startup_id));
+ if (options->activation_token)
+ g_variant_builder_add (&builder, "{sv}",
+ "activation-token", g_variant_new_string (options->activation_token));
g_variant_builder_close (&builder);
if (!g_dbus_connection_call_sync (bus,
@@ -454,6 +457,7 @@ handle_options (TerminalOptions *options,
terminal_client_append_create_instance_options (&builder,
options->display_name,
options->startup_id,
+ options->activation_token,
iw->geometry,
iw->role,
it->profile ? it->profile : options->default_profile,