Blame src/terminal-client-utils.c

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
}