|
Packit Service |
3bdf47 |
/*
|
|
Packit Service |
3bdf47 |
* Copyright © 2001, 2002 Havoc Pennington
|
|
Packit Service |
3bdf47 |
* Copyright © 2002 Red Hat, Inc.
|
|
Packit Service |
3bdf47 |
* Copyright © 2002 Sun Microsystems
|
|
Packit Service |
3bdf47 |
* Copyright © 2003 Mariano Suarez-Alvarez
|
|
Packit Service |
3bdf47 |
* Copyright © 2011, 2013 Christian Persch
|
|
Packit Service |
3bdf47 |
*
|
|
Packit Service |
3bdf47 |
* This program is free software: you can redistribute it and/or modify
|
|
Packit Service |
3bdf47 |
* it under the terms of the GNU General Public License as published by
|
|
Packit Service |
3bdf47 |
* the Free Software Foundation, either version 3 of the License, or
|
|
Packit Service |
3bdf47 |
* (at your option) any later version.
|
|
Packit Service |
3bdf47 |
*
|
|
Packit Service |
3bdf47 |
* This program is distributed in the hope that it will be useful,
|
|
Packit Service |
3bdf47 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
3bdf47 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit Service |
3bdf47 |
* GNU General Public License for more details.
|
|
Packit Service |
3bdf47 |
*
|
|
Packit Service |
3bdf47 |
* You should have received a copy of the GNU General Public License
|
|
Packit Service |
3bdf47 |
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit Service |
3bdf47 |
*/
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
#include "config.h"
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
#include "terminal-client-utils.h"
|
|
Packit Service |
3bdf47 |
#include "terminal-defines.h"
|
|
Packit Service |
3bdf47 |
#include "terminal-libgsystem.h"
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
#include <string.h>
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
#include <gio/gio.h>
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
#include <gdk/gdk.h>
|
|
Packit Service |
3bdf47 |
#if defined(TERMINAL_COMPILATION) && defined(GDK_WINDOWING_X11)
|
|
Packit Service |
3bdf47 |
#include <gdk/gdkx.h>
|
|
Packit Service |
3bdf47 |
#endif
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
/**
|
|
Packit Service |
3bdf47 |
* terminal_client_append_create_instance_options:
|
|
Packit Service |
3bdf47 |
* @builder: a #GVariantBuilder of #GVariantType "a{sv}"
|
|
Packit Service |
3bdf47 |
* @display: (array element-type=guint8):
|
|
Packit Service |
3bdf47 |
* @startup_id: (array element-type=guint8):
|
|
Packit Service |
3bdf47 |
* @geometry:
|
|
Packit Service |
3bdf47 |
* @role:
|
|
Packit Service |
3bdf47 |
* @profile:
|
|
Packit Service |
3bdf47 |
* @title:
|
|
Packit Service |
3bdf47 |
* @maximise_window:
|
|
Packit Service |
3bdf47 |
* @fullscreen_window:
|
|
Packit Service |
3bdf47 |
*
|
|
Packit Service |
3bdf47 |
* Appends common options to @builder.
|
|
Packit Service |
3bdf47 |
*/
|
|
Packit Service |
3bdf47 |
void
|
|
Packit Service |
3bdf47 |
terminal_client_append_create_instance_options (GVariantBuilder *builder,
|
|
Packit Service |
3bdf47 |
const char *display_name,
|
|
Packit Service |
3bdf47 |
const char *startup_id,
|
|
Packit Service |
3bdf47 |
const char *geometry,
|
|
Packit Service |
3bdf47 |
const char *role,
|
|
Packit Service |
3bdf47 |
const char *profile,
|
|
Packit Service |
3bdf47 |
const char *encoding,
|
|
Packit Service |
3bdf47 |
const char *title,
|
|
Packit Service |
3bdf47 |
gboolean active,
|
|
Packit Service |
3bdf47 |
gboolean maximise_window,
|
|
Packit Service |
3bdf47 |
gboolean fullscreen_window)
|
|
Packit Service |
3bdf47 |
{
|
|
Packit Service |
3bdf47 |
/* Bytestring options */
|
|
Packit Service |
3bdf47 |
if (display_name != NULL)
|
|
Packit Service |
3bdf47 |
g_variant_builder_add (builder, "{sv}",
|
|
Packit Service |
3bdf47 |
"display", g_variant_new_bytestring (display_name));
|
|
Packit Service |
3bdf47 |
if (startup_id)
|
|
Packit Service |
3bdf47 |
g_variant_builder_add (builder, "{sv}",
|
|
Packit Service |
3bdf47 |
"desktop-startup-id", g_variant_new_bytestring (startup_id));
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
/* String options */
|
|
Packit Service |
3bdf47 |
if (profile)
|
|
Packit Service |
3bdf47 |
g_variant_builder_add (builder, "{sv}",
|
|
Packit Service |
3bdf47 |
"profile", g_variant_new_string (profile));
|
|
Packit Service |
3bdf47 |
if (encoding)
|
|
Packit Service |
3bdf47 |
g_variant_builder_add (builder, "{sv}",
|
|
Packit Service |
3bdf47 |
"encoding", g_variant_new_string (encoding));
|
|
Packit Service |
3bdf47 |
if (title)
|
|
Packit Service |
3bdf47 |
g_variant_builder_add (builder, "{sv}",
|
|
Packit Service |
3bdf47 |
"title", g_variant_new_string (title));
|
|
Packit Service |
3bdf47 |
if (geometry)
|
|
Packit Service |
3bdf47 |
g_variant_builder_add (builder, "{sv}",
|
|
Packit Service |
3bdf47 |
"geometry", g_variant_new_string (geometry));
|
|
Packit Service |
3bdf47 |
if (role)
|
|
Packit Service |
3bdf47 |
g_variant_builder_add (builder, "{sv}",
|
|
Packit Service |
3bdf47 |
"role", g_variant_new_string (role));
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
/* Boolean options */
|
|
Packit Service |
3bdf47 |
if (active)
|
|
Packit Service |
3bdf47 |
g_variant_builder_add (builder, "{sv}",
|
|
Packit Service |
3bdf47 |
"active", g_variant_new_boolean (active));
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
if (maximise_window)
|
|
Packit Service |
3bdf47 |
g_variant_builder_add (builder, "{sv}",
|
|
Packit Service |
3bdf47 |
"maximize-window", g_variant_new_boolean (TRUE));
|
|
Packit Service |
3bdf47 |
if (fullscreen_window)
|
|
Packit Service |
3bdf47 |
g_variant_builder_add (builder, "{sv}",
|
|
Packit Service |
3bdf47 |
"fullscreen-window", g_variant_new_boolean (TRUE));
|
|
Packit Service |
3bdf47 |
}
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
/**
|
|
Packit Service |
3bdf47 |
* terminal_client_append_exec_options:
|
|
Packit Service |
3bdf47 |
* @builder: a #GVariantBuilder of #GVariantType "a{sv}"
|
|
Packit Service |
3bdf47 |
* @working_directory: (allow-none): the cwd, or %NULL
|
|
Packit Service |
3bdf47 |
* @shell:
|
|
Packit Service |
3bdf47 |
*
|
|
Packit Service |
3bdf47 |
* Appends the environment and the working directory to @builder.
|
|
Packit Service |
3bdf47 |
*/
|
|
Packit Service |
3bdf47 |
void
|
|
Packit Service |
3bdf47 |
terminal_client_append_exec_options (GVariantBuilder *builder,
|
|
Packit Service |
3bdf47 |
const char *working_directory,
|
|
Packit Service |
3bdf47 |
PassFdElement *fd_array,
|
|
Packit Service |
3bdf47 |
gsize fd_array_len,
|
|
Packit Service |
3bdf47 |
gboolean shell)
|
|
Packit Service |
3bdf47 |
{
|
|
Packit Service |
3bdf47 |
gs_strfreev char **envv;
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
envv = g_get_environ ();
|
|
Packit Service |
3bdf47 |
envv = g_environ_unsetenv (envv, "COLORTERM");
|
|
Packit Service |
3bdf47 |
envv = g_environ_unsetenv (envv, "COLUMNS");
|
|
Packit Service |
3bdf47 |
envv = g_environ_unsetenv (envv, "DESKTOP_STARTUP_ID");
|
|
Packit Service |
3bdf47 |
envv = g_environ_unsetenv (envv, "GIO_LAUNCHED_DESKTOP_FILE_PID");
|
|
Packit Service |
3bdf47 |
envv = g_environ_unsetenv (envv, "GIO_LAUNCHED_DESKTOP_FILE");
|
|
Packit Service |
3bdf47 |
envv = g_environ_unsetenv (envv, "GNOME_DESKTOP_ICON");
|
|
Packit Service |
3bdf47 |
envv = g_environ_unsetenv (envv, "LINES");
|
|
Packit Service |
3bdf47 |
envv = g_environ_unsetenv (envv, "PWD");
|
|
Packit Service |
3bdf47 |
envv = g_environ_unsetenv (envv, "TERM");
|
|
Packit Service |
3bdf47 |
envv = g_environ_unsetenv (envv, "VTE_VERSION");
|
|
Packit Service |
3bdf47 |
envv = g_environ_unsetenv (envv, "WINDOWID");
|
|
Packit Service |
3bdf47 |
envv = g_environ_unsetenv (envv, TERMINAL_ENV_SERVICE_NAME);
|
|
Packit Service |
3bdf47 |
envv = g_environ_unsetenv (envv, TERMINAL_ENV_SCREEN);
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
g_variant_builder_add (builder, "{sv}",
|
|
Packit Service |
3bdf47 |
"environ",
|
|
Packit Service |
3bdf47 |
g_variant_new_bytestring_array ((const char * const *) envv, -1));
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
if (working_directory)
|
|
Packit Service |
3bdf47 |
g_variant_builder_add (builder, "{sv}",
|
|
Packit Service |
3bdf47 |
"cwd", g_variant_new_bytestring (working_directory));
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
if (shell)
|
|
Packit Service |
3bdf47 |
g_variant_builder_add (builder, "{sv}",
|
|
Packit Service |
3bdf47 |
"shell",
|
|
Packit Service |
3bdf47 |
g_variant_new_boolean (TRUE));
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
if (fd_array_len) {
|
|
Packit Service |
3bdf47 |
gsize i;
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
g_variant_builder_open (builder, G_VARIANT_TYPE ("{sv}"));
|
|
Packit Service |
3bdf47 |
g_variant_builder_add (builder, "s", "fd-set");
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
g_variant_builder_open (builder, G_VARIANT_TYPE ("v"));
|
|
Packit Service |
3bdf47 |
g_variant_builder_open (builder, G_VARIANT_TYPE ("a(ih)"));
|
|
Packit Service |
3bdf47 |
for (i = 0; i < fd_array_len; i++) {
|
|
Packit Service |
3bdf47 |
g_variant_builder_add (builder, "(ih)", fd_array[i].fd, fd_array[i].index);
|
|
Packit Service |
3bdf47 |
}
|
|
Packit Service |
3bdf47 |
g_variant_builder_close (builder); /* a(ih) */
|
|
Packit Service |
3bdf47 |
g_variant_builder_close (builder); /* v */
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
g_variant_builder_close (builder); /* {sv} */
|
|
Packit Service |
3bdf47 |
}
|
|
Packit Service |
3bdf47 |
}
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
/**
|
|
Packit Service |
3bdf47 |
* terminal_client_get_fallback_startup_id:
|
|
Packit Service |
3bdf47 |
*
|
|
Packit Service |
3bdf47 |
* Returns: a fallback startup ID, or %NULL
|
|
Packit Service |
3bdf47 |
*/
|
|
Packit Service |
3bdf47 |
char *
|
|
Packit Service |
3bdf47 |
terminal_client_get_fallback_startup_id (void)
|
|
Packit Service |
3bdf47 |
{
|
|
Packit Service |
3bdf47 |
#if defined(TERMINAL_COMPILATION) && defined(GDK_WINDOWING_X11)
|
|
Packit Service |
3bdf47 |
GdkDisplay *display;
|
|
Packit Service |
3bdf47 |
Display *xdisplay;
|
|
Packit Service |
3bdf47 |
Window xwindow;
|
|
Packit Service |
3bdf47 |
XEvent event;
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
display = gdk_display_get_default ();
|
|
Packit Service |
3bdf47 |
if (display == NULL || !GDK_IS_X11_DISPLAY (display))
|
|
Packit Service |
3bdf47 |
goto out;
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
xdisplay = GDK_DISPLAY_XDISPLAY (display);
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
{
|
|
Packit Service |
3bdf47 |
XSetWindowAttributes attrs;
|
|
Packit Service |
3bdf47 |
Atom atom_name;
|
|
Packit Service |
3bdf47 |
Atom atom_type;
|
|
Packit Service |
3bdf47 |
const char *name;
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
attrs.override_redirect = True;
|
|
Packit Service |
3bdf47 |
attrs.event_mask = PropertyChangeMask | StructureNotifyMask;
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
xwindow =
|
|
Packit Service |
3bdf47 |
XCreateWindow (xdisplay,
|
|
Packit Service |
3bdf47 |
RootWindow (xdisplay, 0),
|
|
Packit Service |
3bdf47 |
-100, -100, 1, 1,
|
|
Packit Service |
3bdf47 |
0,
|
|
Packit Service |
3bdf47 |
CopyFromParent,
|
|
Packit Service |
3bdf47 |
CopyFromParent,
|
|
Packit Service |
3bdf47 |
(Visual *)CopyFromParent,
|
|
Packit Service |
3bdf47 |
CWOverrideRedirect | CWEventMask,
|
|
Packit Service |
3bdf47 |
&attrs);
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
atom_name = XInternAtom (xdisplay, "WM_NAME", TRUE);
|
|
Packit Service |
3bdf47 |
g_assert (atom_name != None);
|
|
Packit Service |
3bdf47 |
atom_type = XInternAtom (xdisplay, "STRING", TRUE);
|
|
Packit Service |
3bdf47 |
g_assert (atom_type != None);
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
name = "Fake Window";
|
|
Packit Service |
3bdf47 |
XChangeProperty (xdisplay,
|
|
Packit Service |
3bdf47 |
xwindow, atom_name,
|
|
Packit Service |
3bdf47 |
atom_type,
|
|
Packit Service |
3bdf47 |
8, PropModeReplace, (unsigned char *)name, strlen (name));
|
|
Packit Service |
3bdf47 |
}
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
XWindowEvent (xdisplay,
|
|
Packit Service |
3bdf47 |
xwindow,
|
|
Packit Service |
3bdf47 |
PropertyChangeMask,
|
|
Packit Service |
3bdf47 |
&event);
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
XDestroyWindow(xdisplay, xwindow);
|
|
Packit Service |
3bdf47 |
|
|
Packit Service |
3bdf47 |
return g_strdup_printf ("_TIME%lu", event.xproperty.time);
|
|
Packit Service |
3bdf47 |
out:
|
|
Packit Service |
3bdf47 |
#endif
|
|
Packit Service |
3bdf47 |
return NULL;
|
|
Packit Service |
3bdf47 |
}
|