Blame src/terminal-client-utils.c

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