Blame src/terminal-nautilus.c

Packit Service 3bdf47
/*
Packit Service 3bdf47
 *  Copyright (C) 2004, 2005 Free Software Foundation, Inc.
Packit Service 3bdf47
 *  Copyright © 2011 Christian Persch
Packit Service 3bdf47
 *  Author: Christian Neumair <chris@gnome-de.org>
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 <glib.h>
Packit Service 3bdf47
#include <glib/gi18n-lib.h>
Packit Service 3bdf47
#include <gio/gio.h>
Packit Service 3bdf47
#include <gtk/gtk.h>
Packit Service 3bdf47
Packit Service 3bdf47
#include <libnautilus-extension/nautilus-menu-provider.h>
Packit Service 3bdf47
#include <libnautilus-extension/nautilus-extension-types.h>
Packit Service 3bdf47
Packit Service 3bdf47
#include <errno.h>
Packit Service 3bdf47
#include <fcntl.h>
Packit Service 3bdf47
#include <stdlib.h>
Packit Service 3bdf47
#include <string.h>
Packit Service 3bdf47
Packit Service 3bdf47
#include "terminal-i18n.h"
Packit Service 3bdf47
#include "terminal-client-utils.h"
Packit Service 3bdf47
#include "terminal-defines.h"
Packit Service 3bdf47
#include "terminal-gdbus-generated.h"
Packit Service 3bdf47
Packit Service 3bdf47
/* Nautilus extension class */
Packit Service 3bdf47
Packit Service 3bdf47
#define TERMINAL_TYPE_NAUTILUS         (terminal_nautilus_get_type ())
Packit Service 3bdf47
#define TERMINAL_NAUTILUS(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), TERMINAL_TYPE_NAUTILUS, TerminalNautilus))
Packit Service 3bdf47
#define TERMINAL_NAUTILUS_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), TERMINAL_TYPE_NAUTILUS, TerminalNautilusClass))
Packit Service 3bdf47
#define TERMINAL_IS_NAUTILUS(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), TERMINAL_TYPE_NAUTILUS))
Packit Service 3bdf47
#define TERMINAL_IS_NAUTILUS_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), TERMINAL_TYPE_NAUTILUS))
Packit Service 3bdf47
#define TERMINAL_NAUTILUS_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TERMINAL_TYPE_NAUTILUS, TerminalNautilusClass))
Packit Service 3bdf47
Packit Service 3bdf47
typedef struct _TerminalNautilus      TerminalNautilus;
Packit Service 3bdf47
typedef struct _TerminalNautilusClass TerminalNautilusClass;
Packit Service 3bdf47
Packit Service 3bdf47
struct _TerminalNautilus {
Packit Service 3bdf47
        GObject parent_instance;
Packit Service 3bdf47
Packit Service 3bdf47
        GSettings *lockdown_prefs;
Packit Service 3bdf47
        gboolean have_mc;
Packit Service 3bdf47
};
Packit Service 3bdf47
Packit Service 3bdf47
struct _TerminalNautilusClass {
Packit Service 3bdf47
        GObjectClass parent_class;
Packit Service 3bdf47
};
Packit Service 3bdf47
Packit Service 3bdf47
static GType terminal_nautilus_get_type (void);
Packit Service 3bdf47
Packit Service 3bdf47
/* Nautilus menu item class */
Packit Service 3bdf47
Packit Service 3bdf47
#define TERMINAL_TYPE_NAUTILUS_MENU_ITEM        (terminal_nautilus_menu_item_get_type ())
Packit Service 3bdf47
#define TERMINAL_NAUTILUS_MENU_ITEM(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), TERMINAL_TYPE_NAUTILUS_MENU_ITEM, TerminalNautilusMenuItem))
Packit Service 3bdf47
#define TERMINAL_NAUTILUS_MENU_ITEM_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), TERMINAL_TYPE_NAUTILUS_MENU_ITEM, TerminalNautilusMenuItemClass))
Packit Service 3bdf47
#define TERMINAL_IS_NAUTILUS_MENU_ITEM(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), TERMINAL_TYPE_NAUTILUS_MENU_ITEM))
Packit Service 3bdf47
#define TERMINAL_IS_NAUTILUS_MENU_ITEM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TERMINAL_TYPE_NAUTILUS_MENU_ITEM))
Packit Service 3bdf47
#define TERMINAL_NAUTILUS_MENU_ITEM_GET_CLASS(o)(G_TYPE_INSTANCE_GET_CLASS ((o), TERMINAL_TYPE_NAUTILUS_MENU_ITEM, TerminalNautilusMenuItemClass))
Packit Service 3bdf47
Packit Service 3bdf47
typedef struct _TerminalNautilusMenuItem      TerminalNautilusMenuItem;
Packit Service 3bdf47
typedef struct _TerminalNautilusMenuItemClass TerminalNautilusMenuItemClass;
Packit Service 3bdf47
Packit Service 3bdf47
struct _TerminalNautilusMenuItem {
Packit Service 3bdf47
  NautilusMenuItem parent_instance;
Packit Service 3bdf47
Packit Service 3bdf47
  TerminalNautilus *nautilus;
Packit Service 3bdf47
  NautilusFileInfo *file_info;
Packit Service 3bdf47
  gboolean run_in_mc;
Packit Service 3bdf47
  gboolean remote_terminal;
Packit Service 3bdf47
};
Packit Service 3bdf47
Packit Service 3bdf47
struct _TerminalNautilusMenuItemClass {
Packit Service 3bdf47
  NautilusMenuItemClass parent_class;
Packit Service 3bdf47
};
Packit Service 3bdf47
Packit Service 3bdf47
static GType terminal_nautilus_menu_item_get_type (void);
Packit Service 3bdf47
Packit Service 3bdf47
/* --- */
Packit Service 3bdf47
Packit Service 3bdf47
#define TERMINAL_ICON_NAME "utilities-terminal"
Packit Service 3bdf47
Packit Service 3bdf47
typedef enum {
Packit Service 3bdf47
  /* local files. Always open "conventionally", i.e. cd and spawn. */
Packit Service 3bdf47
  FILE_INFO_LOCAL,
Packit Service 3bdf47
  FILE_INFO_DESKTOP,
Packit Service 3bdf47
  /* SFTP: Shell terminals are opened "remote" (i.e. with ssh client),
Packit Service 3bdf47
   * commands are executed like OTHER.
Packit Service 3bdf47
   */
Packit Service 3bdf47
  FILE_INFO_SFTP,
Packit Service 3bdf47
  /* OTHER: Terminals and commands are opened by mapping the URI back
Packit Service 3bdf47
   * to ~/.gvfs, i.e. to the GVFS FUSE bridge.
Packit Service 3bdf47
   */
Packit Service 3bdf47
  FILE_INFO_OTHER
Packit Service 3bdf47
} TerminalFileInfo;
Packit Service 3bdf47
Packit Service 3bdf47
static TerminalFileInfo
Packit Service 3bdf47
get_terminal_file_info_from_uri (const char *uri)
Packit Service 3bdf47
{
Packit Service 3bdf47
  TerminalFileInfo ret;
Packit Service 3bdf47
  char *uri_scheme;
Packit Service 3bdf47
Packit Service 3bdf47
  uri_scheme = g_uri_parse_scheme (uri);
Packit Service 3bdf47
Packit Service 3bdf47
  if (uri_scheme == NULL) {
Packit Service 3bdf47
    ret = FILE_INFO_OTHER;
Packit Service 3bdf47
  } else if (strcmp (uri_scheme, "file") == 0) {
Packit Service 3bdf47
    ret = FILE_INFO_LOCAL;
Packit Service 3bdf47
  } else if (strcmp (uri_scheme, "x-nautilus-desktop") == 0) {
Packit Service 3bdf47
    ret = FILE_INFO_DESKTOP;
Packit Service 3bdf47
  } else if (strcmp (uri_scheme, "sftp") == 0 ||
Packit Service 3bdf47
             strcmp (uri_scheme, "ssh") == 0) {
Packit Service 3bdf47
    ret = FILE_INFO_SFTP;
Packit Service 3bdf47
  } else {
Packit Service 3bdf47
    ret = FILE_INFO_OTHER;
Packit Service 3bdf47
  }
Packit Service 3bdf47
Packit Service 3bdf47
  g_free (uri_scheme);
Packit Service 3bdf47
Packit Service 3bdf47
  return ret;
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
/* Helpers */
Packit Service 3bdf47
Packit Service 3bdf47
#define NAUTILUS_SETTINGS_SCHEMA                "org.gnome.Nautilus"
Packit Service 3bdf47
#define GNOME_DESKTOP_LOCKDOWN_SETTINGS_SCHEMA  "org.gnome.desktop.lockdown"
Packit Service 3bdf47
Packit Service 3bdf47
static inline gboolean
Packit Service 3bdf47
desktop_opens_home_dir (TerminalNautilus *nautilus)
Packit Service 3bdf47
{
Packit Service 3bdf47
#if 0
Packit Service 3bdf47
  return  _client_get_bool (gconf_client,
Packit Service 3bdf47
                                "/apps/nautilus-open-terminal/desktop_opens_home_dir",
Packit Service 3bdf47
                                NULL);
Packit Service 3bdf47
#endif
Packit Service 3bdf47
  return TRUE;
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
static inline gboolean
Packit Service 3bdf47
display_mc_item (TerminalNautilus *nautilus)
Packit Service 3bdf47
{
Packit Service 3bdf47
#if 0
Packit Service 3bdf47
  return gconf_client_get_bool (gconf_client,
Packit Service 3bdf47
                                "/apps/nautilus-open-terminal/display_mc_item",
Packit Service 3bdf47
                                NULL);
Packit Service 3bdf47
#endif
Packit Service 3bdf47
  return FALSE;
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
static inline gboolean
Packit Service 3bdf47
desktop_is_home_dir (TerminalNautilus *nautilus)
Packit Service 3bdf47
{
Packit Service 3bdf47
  return FALSE;
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
/* a very simple URI parsing routine from Launchpad #333462, until GLib supports URI parsing (GNOME #489862) */
Packit Service 3bdf47
#define SFTP_PREFIX "sftp://"
Packit Service 3bdf47
static void
Packit Service 3bdf47
parse_sftp_uri (GFile *file,
Packit Service 3bdf47
                char **user,
Packit Service 3bdf47
                char **host,
Packit Service 3bdf47
                unsigned int *port,
Packit Service 3bdf47
                char **path)
Packit Service 3bdf47
{
Packit Service 3bdf47
  char *tmp, *save;
Packit Service 3bdf47
  char *uri;
Packit Service 3bdf47
Packit Service 3bdf47
  uri = g_file_get_uri (file);
Packit Service 3bdf47
  g_assert (uri != NULL);
Packit Service 3bdf47
  save = uri;
Packit Service 3bdf47
Packit Service 3bdf47
  *path = NULL;
Packit Service 3bdf47
  *user = NULL;
Packit Service 3bdf47
  *host = NULL;
Packit Service 3bdf47
  *port = 0;
Packit Service 3bdf47
Packit Service 3bdf47
  /* skip intial 'sftp:// prefix */
Packit Service 3bdf47
  g_assert (!strncmp (uri, SFTP_PREFIX, strlen (SFTP_PREFIX)));
Packit Service 3bdf47
  uri += strlen (SFTP_PREFIX);
Packit Service 3bdf47
Packit Service 3bdf47
  /* cut out the path */
Packit Service 3bdf47
  tmp = strchr (uri, '/');
Packit Service 3bdf47
  if (tmp != NULL) {
Packit Service 3bdf47
    *path = g_uri_unescape_string (tmp, "/");
Packit Service 3bdf47
    *tmp = '\0';
Packit Service 3bdf47
  }
Packit Service 3bdf47
Packit Service 3bdf47
  /* read the username - it ends with @ */
Packit Service 3bdf47
  tmp = strchr (uri, '@');
Packit Service 3bdf47
  if (tmp != NULL) {
Packit Service 3bdf47
    *tmp++ = '\0';
Packit Service 3bdf47
Packit Service 3bdf47
    *user = strdup (uri);
Packit Service 3bdf47
    if (strchr (*user, ':') != NULL) {
Packit Service 3bdf47
      /* chop the password */
Packit Service 3bdf47
      *(strchr (*user, ':')) = '\0'; 
Packit Service 3bdf47
    }
Packit Service 3bdf47
Packit Service 3bdf47
    uri = tmp;
Packit Service 3bdf47
  }
Packit Service 3bdf47
Packit Service 3bdf47
  /* now read the port, starts with : */
Packit Service 3bdf47
  tmp = strchr (uri, ':');
Packit Service 3bdf47
  if (tmp != NULL) {
Packit Service 3bdf47
    *tmp++ = '\0';
Packit Service 3bdf47
    *port = atoi (tmp);  /*FIXME: getservbyname*/
Packit Service 3bdf47
  }
Packit Service 3bdf47
Packit Service 3bdf47
  /* what is left is the host */
Packit Service 3bdf47
  *host = strdup (uri);
Packit Service 3bdf47
  g_free (save);
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
static char **
Packit Service 3bdf47
ssh_argv (const char *uri,
Packit Service 3bdf47
          gboolean run_in_mc,
Packit Service 3bdf47
          int *argcp)
Packit Service 3bdf47
{
Packit Service 3bdf47
  GFile *file;
Packit Service 3bdf47
  char **argv;
Packit Service 3bdf47
  int argc;
Packit Service 3bdf47
  char *host_name, *path, *user_name, *quoted_path;
Packit Service 3bdf47
  guint host_port;
Packit Service 3bdf47
Packit Service 3bdf47
  g_assert (uri != NULL);
Packit Service 3bdf47
Packit Service 3bdf47
  argv = g_new0 (char *, 9);
Packit Service 3bdf47
  argc = 0;
Packit Service 3bdf47
  argv[argc++] = g_strdup ("ssh");
Packit Service 3bdf47
  argv[argc++] = g_strdup ("-t");
Packit Service 3bdf47
Packit Service 3bdf47
  file = g_file_new_for_uri (uri);
Packit Service 3bdf47
  parse_sftp_uri (file, &user_name, &host_name, &host_port, &path);
Packit Service 3bdf47
  g_object_unref (file);
Packit Service 3bdf47
Packit Service 3bdf47
  if (user_name != NULL) {
Packit Service 3bdf47
    argv[argc++ ]= g_strdup_printf ("%s@%s", user_name, host_name);
Packit Service 3bdf47
    g_free (host_name);
Packit Service 3bdf47
    g_free (user_name);
Packit Service 3bdf47
  } else {
Packit Service 3bdf47
    argv[argc++] = host_name;
Packit Service 3bdf47
  }
Packit Service 3bdf47
Packit Service 3bdf47
  if (host_port != 0) {
Packit Service 3bdf47
    argv[argc++] = g_strdup ("-p");
Packit Service 3bdf47
    argv[argc++] = g_strdup_printf ("%u", host_port);
Packit Service 3bdf47
  }
Packit Service 3bdf47
Packit Service 3bdf47
  /* FIXME to we have to consider the remote file encoding? */
Packit Service 3bdf47
  quoted_path = g_shell_quote (path);
Packit Service 3bdf47
Packit Service 3bdf47
  if (run_in_mc) {
Packit Service 3bdf47
    argv[argc++] = g_strdup_printf ("cd %s && exec %s", quoted_path, "mc");
Packit Service 3bdf47
  } else {
Packit Service 3bdf47
    /* login shell */
Packit Service 3bdf47
    argv[argc++] = g_strdup_printf ("cd %s && exec $SHELL -", quoted_path);
Packit Service 3bdf47
  }
Packit Service 3bdf47
Packit Service 3bdf47
  g_free (path);
Packit Service 3bdf47
  g_free (quoted_path);
Packit Service 3bdf47
Packit Service 3bdf47
  *argcp = argc;
Packit Service 3bdf47
  return argv;
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
static char **
Packit Service 3bdf47
mc_argv (int *argcp)
Packit Service 3bdf47
{
Packit Service 3bdf47
  char **argv;
Packit Service 3bdf47
Packit Service 3bdf47
  argv = g_new (char *, 2);
Packit Service 3bdf47
  argv[0] = g_strdup ("mc");
Packit Service 3bdf47
  argv[1] = NULL;
Packit Service 3bdf47
Packit Service 3bdf47
  *argcp = 1;
Packit Service 3bdf47
  return argv;
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
static gboolean
Packit Service 3bdf47
terminal_locked_down (TerminalNautilus *nautilus)
Packit Service 3bdf47
{
Packit Service 3bdf47
  return g_settings_get_boolean (nautilus->lockdown_prefs,
Packit Service 3bdf47
                                 "disable-command-line");
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
/* used to determine for remote URIs whether GVFS is capable of mapping them to ~/.gvfs */
Packit Service 3bdf47
static gboolean
Packit Service 3bdf47
uri_has_local_path (const char *uri)
Packit Service 3bdf47
{
Packit Service 3bdf47
  GFile *file;
Packit Service 3bdf47
  char *path;
Packit Service 3bdf47
  gboolean ret;
Packit Service 3bdf47
Packit Service 3bdf47
  file = g_file_new_for_uri (uri);
Packit Service 3bdf47
  path = g_file_get_path (file);
Packit Service 3bdf47
Packit Service 3bdf47
  ret = (path != NULL);
Packit Service 3bdf47
Packit Service 3bdf47
  g_free (path);
Packit Service 3bdf47
  g_object_unref (file);
Packit Service 3bdf47
Packit Service 3bdf47
  return ret;
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
/* Nautilus menu item class */
Packit Service 3bdf47
Packit Service 3bdf47
typedef struct {
Packit Service 3bdf47
  TerminalNautilus *nautilus;
Packit Service 3bdf47
  guint32 timestamp;
Packit Service 3bdf47
  char *path;
Packit Service 3bdf47
  char *uri;
Packit Service 3bdf47
  TerminalFileInfo info;
Packit Service 3bdf47
  gboolean remote;
Packit Service 3bdf47
  gboolean run_in_mc;
Packit Service 3bdf47
} ExecData;
Packit Service 3bdf47
Packit Service 3bdf47
static void
Packit Service 3bdf47
exec_data_free (ExecData *data)
Packit Service 3bdf47
{
Packit Service 3bdf47
  g_object_unref (data->nautilus);
Packit Service 3bdf47
  g_free (data->path);
Packit Service 3bdf47
  g_free (data->uri);
Packit Service 3bdf47
Packit Service 3bdf47
  g_free (data);
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
/* FIXME: make this async */
Packit Service 3bdf47
static gboolean
Packit Service 3bdf47
create_terminal (ExecData *data /* transfer full */)
Packit Service 3bdf47
{
Packit Service 3bdf47
  TerminalFactory *factory;
Packit Service 3bdf47
  TerminalReceiver *receiver;
Packit Service 3bdf47
  GError *error = NULL;
Packit Service 3bdf47
  GVariantBuilder builder;
Packit Service 3bdf47
  char *object_path;
Packit Service 3bdf47
  char startup_id[32];
Packit Service 3bdf47
  char **argv;
Packit Service 3bdf47
  int argc;
Packit Service 3bdf47
Packit Service 3bdf47
  factory = terminal_factory_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
Packit Service 3bdf47
                                                     G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
Packit Service 3bdf47
                                                     G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS,
Packit Service 3bdf47
                                                     TERMINAL_APPLICATION_ID,
Packit Service 3bdf47
                                                     TERMINAL_FACTORY_OBJECT_PATH,
Packit Service 3bdf47
                                                     NULL /* cancellable */,
Packit Service 3bdf47
                                                     &error);
Packit Service 3bdf47
  if (factory == NULL) {
Packit Service 3bdf47
    g_dbus_error_strip_remote_error (error);
Packit Service 3bdf47
    g_printerr ("Error constructing proxy for %s:%s: %s\n",
Packit Service 3bdf47
                TERMINAL_APPLICATION_ID, TERMINAL_FACTORY_OBJECT_PATH,
Packit Service 3bdf47
                error->message);
Packit Service 3bdf47
    g_error_free (error);
Packit Service 3bdf47
    exec_data_free (data);
Packit Service 3bdf47
    return FALSE;
Packit Service 3bdf47
  }
Packit Service 3bdf47
Packit Service 3bdf47
  g_snprintf (startup_id, sizeof (startup_id), "_TIME%u", data->timestamp);
Packit Service 3bdf47
Packit Service 3bdf47
  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
Packit Service 3bdf47
Packit Service 3bdf47
  terminal_client_append_create_instance_options (&builder,
Packit Service 3bdf47
                                                  gdk_display_get_name (gdk_display_get_default ()),
Packit Service 3bdf47
                                                  startup_id,
Packit Service 3bdf47
                                                  NULL /* geometry */,
Packit Service 3bdf47
                                                  NULL /* role */,
Packit Service 3bdf47
                                                  NULL /* use default profile */,
Packit Service 3bdf47
                                                  NULL /* use profile encoding */,
Packit Service 3bdf47
                                                  NULL /* title */,
Packit Service 3bdf47
                                                  TRUE, /* active */
Packit Service 3bdf47
                                                  FALSE /* maximised */,
Packit Service 3bdf47
                                                  FALSE /* fullscreen */);
Packit Service 3bdf47
Packit Service 3bdf47
  if (!terminal_factory_call_create_instance_sync
Packit Service 3bdf47
         (factory,
Packit Service 3bdf47
          g_variant_builder_end (&builder),
Packit Service 3bdf47
          &object_path,
Packit Service 3bdf47
          NULL /* cancellable */,
Packit Service 3bdf47
          &error)) {
Packit Service 3bdf47
    g_dbus_error_strip_remote_error (error);
Packit Service 3bdf47
    g_printerr ("Error creating terminal: %s\n", error->message);
Packit Service 3bdf47
    g_error_free (error);
Packit Service 3bdf47
    g_object_unref (factory);
Packit Service 3bdf47
    exec_data_free (data);
Packit Service 3bdf47
    return FALSE;
Packit Service 3bdf47
  }
Packit Service 3bdf47
Packit Service 3bdf47
  g_object_unref (factory);
Packit Service 3bdf47
Packit Service 3bdf47
  receiver = terminal_receiver_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
Packit Service 3bdf47
                                                       G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
Packit Service 3bdf47
                                                       G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS,
Packit Service 3bdf47
                                                       TERMINAL_APPLICATION_ID,
Packit Service 3bdf47
                                                       object_path,
Packit Service 3bdf47
                                                       NULL /* cancellable */,
Packit Service 3bdf47
                                                       &error);
Packit Service 3bdf47
  if (receiver == NULL) {
Packit Service 3bdf47
    g_dbus_error_strip_remote_error (error);
Packit Service 3bdf47
    g_printerr ("Failed to create proxy for terminal: %s\n", error->message);
Packit Service 3bdf47
    g_error_free (error);
Packit Service 3bdf47
    g_free (object_path);
Packit Service 3bdf47
    exec_data_free (data);
Packit Service 3bdf47
    return FALSE;
Packit Service 3bdf47
  }
Packit Service 3bdf47
Packit Service 3bdf47
  g_free (object_path);
Packit Service 3bdf47
Packit Service 3bdf47
  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
Packit Service 3bdf47
Packit Service 3bdf47
  terminal_client_append_exec_options (&builder,
Packit Service 3bdf47
                                       data->path,
Packit Service 3bdf47
                                       NULL, 0, /* FD array */
Packit Service 3bdf47
                                       TRUE /* shell */);
Packit Service 3bdf47
Packit Service 3bdf47
  if (data->info == FILE_INFO_SFTP &&
Packit Service 3bdf47
      data->remote) {
Packit Service 3bdf47
    argv = ssh_argv (data->uri, data->run_in_mc, &argc);
Packit Service 3bdf47
  } else if (data->run_in_mc) {
Packit Service 3bdf47
    argv = mc_argv (&argc);
Packit Service 3bdf47
  } else {
Packit Service 3bdf47
    argv = NULL; argc = 0;
Packit Service 3bdf47
  }
Packit Service 3bdf47
Packit Service 3bdf47
  if (!terminal_receiver_call_exec_sync (receiver,
Packit Service 3bdf47
                                         g_variant_builder_end (&builder),
Packit Service 3bdf47
                                         g_variant_new_bytestring_array ((const char * const *) argv, argc),
Packit Service 3bdf47
                                         NULL /* in FD list */,
Packit Service 3bdf47
                                         NULL /* out FD list */,
Packit Service 3bdf47
                                         NULL /* cancellable */,
Packit Service 3bdf47
                                         &error)) {
Packit Service 3bdf47
    g_dbus_error_strip_remote_error (error);
Packit Service 3bdf47
    g_printerr ("Error: %s\n", error->message);
Packit Service 3bdf47
    g_error_free (error);
Packit Service 3bdf47
    g_strfreev (argv);
Packit Service 3bdf47
    g_object_unref (receiver);
Packit Service 3bdf47
    exec_data_free (data);
Packit Service 3bdf47
    return FALSE;
Packit Service 3bdf47
  }
Packit Service 3bdf47
Packit Service 3bdf47
  g_strfreev (argv);
Packit Service 3bdf47
Packit Service 3bdf47
  exec_data_free (data);
Packit Service 3bdf47
Packit Service 3bdf47
  g_object_unref (receiver);
Packit Service 3bdf47
Packit Service 3bdf47
  return TRUE;
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
static void
Packit Service 3bdf47
terminal_nautilus_menu_item_activate (NautilusMenuItem *item)
Packit Service 3bdf47
{
Packit Service 3bdf47
  TerminalNautilusMenuItem *menu_item = TERMINAL_NAUTILUS_MENU_ITEM (item);
Packit Service 3bdf47
  TerminalNautilus *nautilus = menu_item->nautilus;
Packit Service 3bdf47
  char *uri, *path;
Packit Service 3bdf47
  TerminalFileInfo info;
Packit Service 3bdf47
  ExecData *data;
Packit Service 3bdf47
Packit Service 3bdf47
  uri = nautilus_file_info_get_activation_uri (menu_item->file_info);
Packit Service 3bdf47
  if (uri == NULL)
Packit Service 3bdf47
    return;
Packit Service 3bdf47
Packit Service 3bdf47
  path = NULL;
Packit Service 3bdf47
  info = get_terminal_file_info_from_uri (uri);
Packit Service 3bdf47
Packit Service 3bdf47
  switch (info) {
Packit Service 3bdf47
    case FILE_INFO_LOCAL:
Packit Service 3bdf47
      path = g_filename_from_uri (uri, NULL, NULL);
Packit Service 3bdf47
      break;
Packit Service 3bdf47
Packit Service 3bdf47
    case FILE_INFO_DESKTOP:
Packit Service 3bdf47
      if (desktop_is_home_dir (nautilus) || desktop_opens_home_dir (nautilus)) {
Packit Service 3bdf47
        path = g_strdup (g_get_home_dir ());
Packit Service 3bdf47
      } else {
Packit Service 3bdf47
        path = g_strdup (g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP));
Packit Service 3bdf47
      }
Packit Service 3bdf47
      break;
Packit Service 3bdf47
Packit Service 3bdf47
    case FILE_INFO_SFTP:
Packit Service 3bdf47
      if (menu_item->remote_terminal)
Packit Service 3bdf47
        break;
Packit Service 3bdf47
Packit Service 3bdf47
      /* fall through */
Packit Service 3bdf47
Packit Service 3bdf47
    case FILE_INFO_OTHER: {
Packit Service 3bdf47
      GFile *file;
Packit Service 3bdf47
Packit Service 3bdf47
      /* map back remote URI to local path */
Packit Service 3bdf47
      file = g_file_new_for_uri (uri);
Packit Service 3bdf47
      path = g_file_get_path (file);
Packit Service 3bdf47
      g_object_unref (file);
Packit Service 3bdf47
      break;
Packit Service 3bdf47
    }
Packit Service 3bdf47
Packit Service 3bdf47
    default:
Packit Service 3bdf47
      g_assert_not_reached ();
Packit Service 3bdf47
  }
Packit Service 3bdf47
Packit Service 3bdf47
  if (path == NULL && (info != FILE_INFO_SFTP || !menu_item->remote_terminal)) {
Packit Service 3bdf47
    g_free (uri);
Packit Service 3bdf47
    return;
Packit Service 3bdf47
  }
Packit Service 3bdf47
Packit Service 3bdf47
  data = g_new (ExecData, 1);
Packit Service 3bdf47
  data->nautilus = g_object_ref (nautilus);
Packit Service 3bdf47
  data->timestamp = gtk_get_current_event_time ();
Packit Service 3bdf47
  data->path = path;
Packit Service 3bdf47
  data->uri = uri;
Packit Service 3bdf47
  data->info = info;
Packit Service 3bdf47
  data->remote = menu_item->remote_terminal;
Packit Service 3bdf47
  data->run_in_mc = menu_item->run_in_mc;
Packit Service 3bdf47
Packit Service 3bdf47
  create_terminal (data);
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
G_DEFINE_DYNAMIC_TYPE (TerminalNautilusMenuItem, terminal_nautilus_menu_item, NAUTILUS_TYPE_MENU_ITEM)
Packit Service 3bdf47
Packit Service 3bdf47
static void 
Packit Service 3bdf47
terminal_nautilus_menu_item_init (TerminalNautilusMenuItem *nautilus_menu_item)
Packit Service 3bdf47
{
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
static void
Packit Service 3bdf47
terminal_nautilus_menu_item_dispose (GObject *object)
Packit Service 3bdf47
{
Packit Service 3bdf47
  TerminalNautilusMenuItem *menu_item = TERMINAL_NAUTILUS_MENU_ITEM (object);
Packit Service 3bdf47
Packit Service 3bdf47
  if (menu_item->file_info != NULL) {
Packit Service 3bdf47
    g_object_unref (menu_item->file_info);
Packit Service 3bdf47
    menu_item->file_info = NULL;
Packit Service 3bdf47
  }
Packit Service 3bdf47
  if (menu_item->nautilus != NULL) {
Packit Service 3bdf47
    g_object_unref (menu_item->nautilus);
Packit Service 3bdf47
    menu_item->nautilus = NULL;
Packit Service 3bdf47
  }
Packit Service 3bdf47
Packit Service 3bdf47
  G_OBJECT_CLASS (terminal_nautilus_menu_item_parent_class)->dispose (object);
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
static void
Packit Service 3bdf47
terminal_nautilus_menu_item_class_init (TerminalNautilusMenuItemClass *klass)
Packit Service 3bdf47
{
Packit Service 3bdf47
  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
Packit Service 3bdf47
  NautilusMenuItemClass *menu_item_class = NAUTILUS_MENU_ITEM_CLASS (klass);
Packit Service 3bdf47
Packit Service 3bdf47
  gobject_class->dispose = terminal_nautilus_menu_item_dispose;
Packit Service 3bdf47
Packit Service 3bdf47
  menu_item_class->activate = terminal_nautilus_menu_item_activate;
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
static void
Packit Service 3bdf47
terminal_nautilus_menu_item_class_finalize (TerminalNautilusMenuItemClass *class)
Packit Service 3bdf47
{
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
static NautilusMenuItem *
Packit Service 3bdf47
terminal_nautilus_menu_item_new (TerminalNautilus *nautilus,
Packit Service 3bdf47
                                 NautilusFileInfo *file_info,
Packit Service 3bdf47
                                 TerminalFileInfo  terminal_file_info,
Packit Service 3bdf47
                                 gboolean          run_in_mc,
Packit Service 3bdf47
                                 gboolean          remote_terminal,
Packit Service 3bdf47
                                 gboolean          is_file_item)
Packit Service 3bdf47
{
Packit Service 3bdf47
  TerminalNautilusMenuItem *item;
Packit Service 3bdf47
  const char *action_name;
Packit Service 3bdf47
  const char *name;
Packit Service 3bdf47
  const char *tooltip;
Packit Service 3bdf47
Packit Service 3bdf47
  if (!run_in_mc) {
Packit Service 3bdf47
    if (is_file_item) {
Packit Service 3bdf47
      action_name = remote_terminal ? "TerminalNautilus:OpenRemote"
Packit Service 3bdf47
                                    : "TerminalNautilus:OpenLocal";
Packit Service 3bdf47
    } else {
Packit Service 3bdf47
      action_name = remote_terminal ? "TerminalNautilus:OpenFolderRemote"
Packit Service 3bdf47
                                    : "TerminalNautilus:OpenFolderLocal";
Packit Service 3bdf47
    }
Packit Service 3bdf47
Packit Service 3bdf47
    switch (terminal_file_info) {
Packit Service 3bdf47
      case FILE_INFO_SFTP:
Packit Service 3bdf47
        if (remote_terminal) {
Packit Service 3bdf47
          name = _("Open in _Remote Terminal");
Packit Service 3bdf47
        } else {
Packit Service 3bdf47
          name = _("Open in _Local Terminal");
Packit Service 3bdf47
        }
Packit Service 3bdf47
Packit Service 3bdf47
        if (is_file_item) {
Packit Service 3bdf47
          tooltip = _("Open the currently selected folder in a terminal");
Packit Service 3bdf47
        } else {
Packit Service 3bdf47
          tooltip = _("Open the currently open folder in a terminal");
Packit Service 3bdf47
        }
Packit Service 3bdf47
        break;
Packit Service 3bdf47
Packit Service 3bdf47
      case FILE_INFO_LOCAL:
Packit Service 3bdf47
      case FILE_INFO_OTHER:
Packit Service 3bdf47
        name = _("Open in T_erminal");
Packit Service 3bdf47
Packit Service 3bdf47
        if (is_file_item) {
Packit Service 3bdf47
          tooltip = _("Open the currently selected folder in a terminal");
Packit Service 3bdf47
        } else {
Packit Service 3bdf47
          tooltip = _("Open the currently open folder in a terminal");
Packit Service 3bdf47
        }
Packit Service 3bdf47
        break;
Packit Service 3bdf47
Packit Service 3bdf47
      case FILE_INFO_DESKTOP:
Packit Service 3bdf47
        if (desktop_opens_home_dir (nautilus)) {
Packit Service 3bdf47
          name = _("Open T_erminal");
Packit Service 3bdf47
          tooltip = _("Open a terminal");
Packit Service 3bdf47
        } else {
Packit Service 3bdf47
          name = _("Open in T_erminal");
Packit Service 3bdf47
          tooltip = _("Open the currently open folder in a terminal");
Packit Service 3bdf47
        }
Packit Service 3bdf47
        break;
Packit Service 3bdf47
Packit Service 3bdf47
      default:
Packit Service 3bdf47
        g_assert_not_reached ();
Packit Service 3bdf47
    }
Packit Service 3bdf47
  } else {
Packit Service 3bdf47
    action_name = remote_terminal ? "TerminalNautilus:OpenRemoteMC"
Packit Service 3bdf47
                                  : "TerminalNautilus:OpenLocalMC";
Packit Service 3bdf47
Packit Service 3bdf47
    switch (terminal_file_info) {
Packit Service 3bdf47
      case FILE_INFO_LOCAL:
Packit Service 3bdf47
      case FILE_INFO_SFTP:
Packit Service 3bdf47
      case FILE_INFO_OTHER:
Packit Service 3bdf47
        name = _("Open in _Midnight Commander");
Packit Service 3bdf47
        if (is_file_item) {
Packit Service 3bdf47
          tooltip = _("Open the currently selected folder in the terminal file manager Midnight Commander");
Packit Service 3bdf47
        } else {
Packit Service 3bdf47
          tooltip = _("Open the currently open folder in the terminal file manager Midnight Commander");
Packit Service 3bdf47
        }
Packit Service 3bdf47
        break;
Packit Service 3bdf47
Packit Service 3bdf47
      case FILE_INFO_DESKTOP:
Packit Service 3bdf47
        if (desktop_opens_home_dir (nautilus)) {
Packit Service 3bdf47
          name = _("Open _Midnight Commander");
Packit Service 3bdf47
          tooltip = _("Open the terminal file manager Midnight Commander");
Packit Service 3bdf47
        } else {
Packit Service 3bdf47
          name = _("Open in _Midnight Commander");
Packit Service 3bdf47
          tooltip = _("Open the currently open folder in the terminal file manager Midnight Commander");
Packit Service 3bdf47
        }
Packit Service 3bdf47
        break;
Packit Service 3bdf47
Packit Service 3bdf47
      default:
Packit Service 3bdf47
              g_assert_not_reached ();
Packit Service 3bdf47
    }
Packit Service 3bdf47
  }
Packit Service 3bdf47
Packit Service 3bdf47
  item = g_object_new (TERMINAL_TYPE_NAUTILUS_MENU_ITEM,
Packit Service 3bdf47
                       "name", action_name,
Packit Service 3bdf47
                       "label", name,
Packit Service 3bdf47
                       "tip", tooltip,
Packit Service 3bdf47
                       "icon", TERMINAL_ICON_NAME,
Packit Service 3bdf47
                       NULL);
Packit Service 3bdf47
Packit Service 3bdf47
  item->nautilus = g_object_ref (nautilus);
Packit Service 3bdf47
  item->file_info = g_object_ref (file_info);
Packit Service 3bdf47
  item->run_in_mc = run_in_mc;
Packit Service 3bdf47
  item->remote_terminal = remote_terminal;
Packit Service 3bdf47
Packit Service 3bdf47
  return (NautilusMenuItem *) item;
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
/* Nautilus extension class implementation */
Packit Service 3bdf47
Packit Service 3bdf47
static GList *
Packit Service 3bdf47
terminal_nautilus_get_background_items (NautilusMenuProvider *provider,
Packit Service 3bdf47
                                        GtkWidget            *window,
Packit Service 3bdf47
                                        NautilusFileInfo     *file_info)
Packit Service 3bdf47
{
Packit Service 3bdf47
  TerminalNautilus *nautilus = TERMINAL_NAUTILUS (provider);
Packit Service 3bdf47
  gchar *uri;
Packit Service 3bdf47
  GList *items;
Packit Service 3bdf47
  NautilusMenuItem *item;
Packit Service 3bdf47
  TerminalFileInfo terminal_file_info;
Packit Service 3bdf47
Packit Service 3bdf47
  if (terminal_locked_down (nautilus))
Packit Service 3bdf47
    return NULL;
Packit Service 3bdf47
Packit Service 3bdf47
  uri = nautilus_file_info_get_activation_uri (file_info);
Packit Service 3bdf47
  if (uri == NULL)
Packit Service 3bdf47
    return NULL;
Packit Service 3bdf47
Packit Service 3bdf47
  items = NULL;
Packit Service 3bdf47
Packit Service 3bdf47
  terminal_file_info = get_terminal_file_info_from_uri (uri);
Packit Service 3bdf47
Packit Service 3bdf47
Packit Service 3bdf47
  if (terminal_file_info == FILE_INFO_SFTP) {
Packit Service 3bdf47
    /* remote SSH location */
Packit Service 3bdf47
    item = terminal_nautilus_menu_item_new (nautilus,
Packit Service 3bdf47
                                            file_info, 
Packit Service 3bdf47
                                            terminal_file_info,
Packit Service 3bdf47
                                            FALSE, 
Packit Service 3bdf47
                                            TRUE,
Packit Service 3bdf47
                                            FALSE);
Packit Service 3bdf47
    items = g_list_append (items, item);
Packit Service 3bdf47
  }
Packit Service 3bdf47
Packit Service 3bdf47
  if (terminal_file_info == FILE_INFO_DESKTOP ||
Packit Service 3bdf47
      uri_has_local_path (uri)) {
Packit Service 3bdf47
    /* local locations and remote locations that offer local back-mapping */
Packit Service 3bdf47
    item = terminal_nautilus_menu_item_new (nautilus,
Packit Service 3bdf47
                                            file_info, 
Packit Service 3bdf47
                                            terminal_file_info,
Packit Service 3bdf47
                                            FALSE, 
Packit Service 3bdf47
                                            FALSE, 
Packit Service 3bdf47
                                            FALSE);
Packit Service 3bdf47
    items = g_list_append (items, item);
Packit Service 3bdf47
  }
Packit Service 3bdf47
Packit Service 3bdf47
  if (display_mc_item (nautilus) &&
Packit Service 3bdf47
      nautilus->have_mc &&
Packit Service 3bdf47
      ((terminal_file_info == FILE_INFO_DESKTOP &&
Packit Service 3bdf47
       (desktop_is_home_dir (nautilus) || desktop_opens_home_dir (nautilus))) ||
Packit Service 3bdf47
       uri_has_local_path (uri))) {
Packit Service 3bdf47
    item = terminal_nautilus_menu_item_new (nautilus,
Packit Service 3bdf47
                                            file_info, 
Packit Service 3bdf47
                                            terminal_file_info,
Packit Service 3bdf47
                                            TRUE, 
Packit Service 3bdf47
                                            FALSE, 
Packit Service 3bdf47
                                            FALSE);
Packit Service 3bdf47
    items = g_list_append (items, item);
Packit Service 3bdf47
  }
Packit Service 3bdf47
Packit Service 3bdf47
  g_free (uri);
Packit Service 3bdf47
Packit Service 3bdf47
  return items;
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
static GList *
Packit Service 3bdf47
terminal_nautilus_get_file_items (NautilusMenuProvider *provider,
Packit Service 3bdf47
                                  GtkWidget            *window,
Packit Service 3bdf47
                                  GList                *files)
Packit Service 3bdf47
{
Packit Service 3bdf47
  TerminalNautilus *nautilus = TERMINAL_NAUTILUS (provider);
Packit Service 3bdf47
  gchar *uri;
Packit Service 3bdf47
  GList *items;
Packit Service 3bdf47
  NautilusMenuItem *item;
Packit Service 3bdf47
  NautilusFileInfo *file_info;
Packit Service 3bdf47
  GFileType file_type;
Packit Service 3bdf47
  TerminalFileInfo terminal_file_info;
Packit Service 3bdf47
Packit Service 3bdf47
  if (terminal_locked_down (nautilus))
Packit Service 3bdf47
    return NULL;
Packit Service 3bdf47
Packit Service 3bdf47
  /* Only add items when passed exactly one file */
Packit Service 3bdf47
  if (files == NULL || files->next != NULL)
Packit Service 3bdf47
    return NULL;
Packit Service 3bdf47
Packit Service 3bdf47
  file_info = (NautilusFileInfo *) files->data;
Packit Service 3bdf47
  file_type = nautilus_file_info_get_file_type (file_info);
Packit Service 3bdf47
  if (!nautilus_file_info_is_directory (file_info) &&
Packit Service 3bdf47
      file_type != G_FILE_TYPE_SHORTCUT &&
Packit Service 3bdf47
      file_type != G_FILE_TYPE_MOUNTABLE)
Packit Service 3bdf47
    return NULL;
Packit Service 3bdf47
Packit Service 3bdf47
  uri = nautilus_file_info_get_activation_uri (file_info);
Packit Service 3bdf47
  if (uri == NULL)
Packit Service 3bdf47
    return NULL;
Packit Service 3bdf47
Packit Service 3bdf47
  items = NULL;
Packit Service 3bdf47
Packit Service 3bdf47
  terminal_file_info = get_terminal_file_info_from_uri (uri);
Packit Service 3bdf47
Packit Service 3bdf47
  switch (terminal_file_info) {
Packit Service 3bdf47
    case FILE_INFO_LOCAL:
Packit Service 3bdf47
    case FILE_INFO_SFTP:
Packit Service 3bdf47
    case FILE_INFO_OTHER:
Packit Service 3bdf47
      if (terminal_file_info == FILE_INFO_SFTP || 
Packit Service 3bdf47
          uri_has_local_path (uri)) {
Packit Service 3bdf47
        item = terminal_nautilus_menu_item_new (nautilus,
Packit Service 3bdf47
                                                file_info,
Packit Service 3bdf47
                                                terminal_file_info,
Packit Service 3bdf47
                                                FALSE, 
Packit Service 3bdf47
                                                terminal_file_info == FILE_INFO_SFTP, 
Packit Service 3bdf47
                                                TRUE);
Packit Service 3bdf47
        items = g_list_append (items, item);
Packit Service 3bdf47
      }
Packit Service 3bdf47
Packit Service 3bdf47
      if (terminal_file_info == FILE_INFO_SFTP &&
Packit Service 3bdf47
          uri_has_local_path (uri)) {
Packit Service 3bdf47
        item = terminal_nautilus_menu_item_new (nautilus,
Packit Service 3bdf47
                                                file_info, 
Packit Service 3bdf47
                                                terminal_file_info,
Packit Service 3bdf47
                                                FALSE, 
Packit Service 3bdf47
                                                FALSE, 
Packit Service 3bdf47
                                                TRUE);
Packit Service 3bdf47
        items = g_list_append (items, item);
Packit Service 3bdf47
      }
Packit Service 3bdf47
Packit Service 3bdf47
      if (display_mc_item (nautilus) &&
Packit Service 3bdf47
          nautilus->have_mc &&
Packit Service 3bdf47
          uri_has_local_path (uri)) {
Packit Service 3bdf47
        item = terminal_nautilus_menu_item_new (nautilus,
Packit Service 3bdf47
                                                file_info, 
Packit Service 3bdf47
                                                terminal_file_info,
Packit Service 3bdf47
                                                TRUE, 
Packit Service 3bdf47
                                                TRUE, 
Packit Service 3bdf47
                                                FALSE);
Packit Service 3bdf47
        items = g_list_append (items, item);
Packit Service 3bdf47
      }
Packit Service 3bdf47
      break;
Packit Service 3bdf47
Packit Service 3bdf47
    case FILE_INFO_DESKTOP:
Packit Service 3bdf47
      break;
Packit Service 3bdf47
Packit Service 3bdf47
    default:
Packit Service 3bdf47
      g_assert_not_reached ();
Packit Service 3bdf47
  }
Packit Service 3bdf47
Packit Service 3bdf47
  g_free (uri);
Packit Service 3bdf47
Packit Service 3bdf47
  return items;
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
static void
Packit Service 3bdf47
terminal_nautilus_menu_provider_iface_init (NautilusMenuProviderIface *iface)
Packit Service 3bdf47
{
Packit Service 3bdf47
  iface->get_background_items = terminal_nautilus_get_background_items;
Packit Service 3bdf47
  iface->get_file_items = terminal_nautilus_get_file_items;
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
G_DEFINE_DYNAMIC_TYPE_EXTENDED (TerminalNautilus, terminal_nautilus, G_TYPE_OBJECT, 0,
Packit Service 3bdf47
                                G_IMPLEMENT_INTERFACE_DYNAMIC (NAUTILUS_TYPE_MENU_PROVIDER,
Packit Service 3bdf47
                                                               terminal_nautilus_menu_provider_iface_init))
Packit Service 3bdf47
Packit Service 3bdf47
static void 
Packit Service 3bdf47
terminal_nautilus_init (TerminalNautilus *nautilus)
Packit Service 3bdf47
{
Packit Service 3bdf47
  char *path;
Packit Service 3bdf47
Packit Service 3bdf47
  nautilus->lockdown_prefs = g_settings_new (GNOME_DESKTOP_LOCKDOWN_SETTINGS_SCHEMA);
Packit Service 3bdf47
Packit Service 3bdf47
  path = g_find_program_in_path ("mc");
Packit Service 3bdf47
  nautilus->have_mc = (path != NULL);
Packit Service 3bdf47
  g_free (path);
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
static void
Packit Service 3bdf47
terminal_nautilus_dispose (GObject *object)
Packit Service 3bdf47
{
Packit Service 3bdf47
  TerminalNautilus *nautilus = TERMINAL_NAUTILUS (object);
Packit Service 3bdf47
Packit Service 3bdf47
  g_clear_object (&nautilus->lockdown_prefs);
Packit Service 3bdf47
Packit Service 3bdf47
  G_OBJECT_CLASS (terminal_nautilus_parent_class)->dispose (object);
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
static void
Packit Service 3bdf47
terminal_nautilus_class_init (TerminalNautilusClass *klass)
Packit Service 3bdf47
{
Packit Service 3bdf47
  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
Packit Service 3bdf47
Packit Service 3bdf47
  gobject_class->dispose = terminal_nautilus_dispose;
Packit Service 3bdf47
Packit Service 3bdf47
  terminal_i18n_init (FALSE);
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
static void
Packit Service 3bdf47
terminal_nautilus_class_finalize (TerminalNautilusClass *class)
Packit Service 3bdf47
{
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
/* Nautilus extension */
Packit Service 3bdf47
Packit Service 3bdf47
static GType type_list[1];
Packit Service 3bdf47
Packit Service 3bdf47
#define EXPORT __attribute__((__visibility__("default"))) extern
Packit Service 3bdf47
Packit Service 3bdf47
EXPORT void
Packit Service 3bdf47
nautilus_module_initialize (GTypeModule *module)
Packit Service 3bdf47
{
Packit Service 3bdf47
  terminal_nautilus_register_type (module);
Packit Service 3bdf47
  terminal_nautilus_menu_item_register_type (module);
Packit Service 3bdf47
Packit Service 3bdf47
  type_list[0] = TERMINAL_TYPE_NAUTILUS;
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
EXPORT void
Packit Service 3bdf47
nautilus_module_shutdown (void)
Packit Service 3bdf47
{
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
EXPORT void
Packit Service 3bdf47
nautilus_module_list_types (const GType **types,
Packit Service 3bdf47
                            int          *num_types)
Packit Service 3bdf47
{
Packit Service 3bdf47
  *types = type_list;
Packit Service 3bdf47
  *num_types = G_N_ELEMENTS (type_list);
Packit Service 3bdf47
}