Merge pull request #41 from infirit/master

Add dist-hook for ChangeLog and remove caja dir
master-1.22
Stefano Karapetsas 2013-11-11 05:41:21 -08:00
commit d44e4bd8dd
8 changed files with 12 additions and 1051 deletions

View File

@ -56,13 +56,18 @@ distuninstallcheck_listfiles = \
find -regex '.*/var/scrollkeeper/.*' -prune -or -type f -print find -regex '.*/var/scrollkeeper/.*' -prune -or -type f -print
# Build ChangeLog from GIT history # Build ChangeLog from GIT history
ChangeLog: dist-hook:
$(AM_V_GEN) if test -d $(top_srcdir)/.git; then \ @if test -d "$(srcdir)/.git"; \
GIT_DIR="$(top_srcdir)/.git" git log --stat > $@; \ then \
echo Creating ChangeLog && \
( cd "$(top_srcdir)" && \
echo '# Generated by Makefile. Do not edit.'; echo; \
$(top_srcdir)/missing --run git log --stat ) > ChangeLog.tmp \
&& mv -f ChangeLog.tmp $(distdir)/ChangeLog \
|| ( rm -f ChangeLog.tmp ; \
echo Failed to generate ChangeLog >&2 ); \
else \
echo A git clone is required to generate a ChangeLog >&2; \
fi fi
dist: ChangeLog
.PHONY: ChangeLog
-include $(top_srcdir)/git.mk -include $(top_srcdir)/git.mk

View File

@ -1,27 +0,0 @@
libcaja_open_terminal_la_CFLAGS = \
-DG_LOG_DOMAIN=\"Caja-Open-Terminal\" \
-DDATADIR=\"$(datadir)\" \
-DMATELOCALEDIR=\""$(datadir)/locale"\" \
-I$(top_srcdir) \
-I$(top_builddir) \
$(WARN_CFLAGS) \
-Werror \
$(DISABLE_DEPRECATED_CFLAGS) \
$(AM_CFLAGS) \
$(TERM_CFLAGS) \
$(MATEDESKTOP_CFLAGS)
caja_extensiondir=$(CAJA_EXTENSION_DIR)
caja_extension_LTLIBRARIES=libcaja-open-terminal.la
libcaja_open_terminal_la_SOURCES = \
eel-mate-extensions.c \
eel-mate-extensions.h \
caja-open-terminal.h \
caja-open-terminal.c \
caja-open-terminal.h \
open-terminal.c
libcaja_open_terminal_la_LDFLAGS = -module -avoid-version
libcaja_open_terminal_la_LIBADD = $(AM_LIBS) $(TERM_LIBS) $(MATEDESKTOP_LIBS)

View File

@ -1,663 +0,0 @@
/*
* caja-open-terminal.c
*
* Copyright (C) 2004, 2005 Free Software Foundation, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Author: Christian Neumair <chris@mate-de.org>
*
*/
#ifdef HAVE_CONFIG_H
#include <config.h> /* for GETTEXT_PACKAGE */
#endif
#include "caja-open-terminal.h"
#include "eel-mate-extensions.h"
#include <libcaja-extension/caja-menu-provider.h>
#include <glib.h>
#include <glib/gi18n-lib.h>
#include <gio/gio.h>
#include <gtk/gtk.h>
#include <libmate/mate-desktop-item.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h> /* for atoi */
#include <string.h> /* for strcmp */
#include <unistd.h> /* for chdir */
#include <sys/stat.h>
static void caja_open_terminal_instance_init (CajaOpenTerminal *cvs);
static void caja_open_terminal_class_init (CajaOpenTerminalClass *class);
static GType terminal_type = 0;
typedef enum {
/* local files. Always open "conventionally", i.e. cd and spawn. */
FILE_INFO_LOCAL,
FILE_INFO_DESKTOP,
/* SFTP: Shell terminals are opened "remote" (i.e. with ssh client),
* commands are executed like *_OTHER */
FILE_INFO_SFTP,
/* OTHER: Terminals and commands are opened by mapping the URI back
* to ~/.gvfs, i.e. to the GVFS FUSE bridge
*/
FILE_INFO_OTHER
} TerminalFileInfo;
static TerminalFileInfo
get_terminal_file_info (const char *uri)
{
TerminalFileInfo ret;
char *uri_scheme;
uri_scheme = g_uri_parse_scheme (uri);
if (uri_scheme == NULL) {
ret = FILE_INFO_OTHER;
} else if (strcmp (uri_scheme, "file") == 0) {
ret = FILE_INFO_LOCAL;
} else if (strcmp (uri_scheme, "x-caja-desktop") == 0) {
ret = FILE_INFO_DESKTOP;
} else if (strcmp (uri_scheme, "sftp") == 0 ||
strcmp (uri_scheme, "ssh") == 0) {
ret = FILE_INFO_SFTP;
} else {
ret = FILE_INFO_OTHER;
}
g_free (uri_scheme);
return ret;
}
static GSettings *settings_open = NULL;
static GSettings *settings_preferences = NULL;
static GSettings *settings_lockdown = NULL;
static inline gboolean
desktop_opens_home_dir (void)
{
return g_settings_get_boolean (settings_open, "desktop-opens-home-dir");
}
static inline gboolean
display_mc_item (void)
{
return g_settings_get_boolean (settings_open, "display-mc-items");
}
static inline gboolean
desktop_is_home_dir ()
{
return g_settings_get_boolean (settings_preferences, "desktop-is-home-dir");
}
/* a very simple URI parsing routine from Launchpad #333462, until GLib supports URI parsing (MATE #489862) */
#define SFTP_PREFIX "sftp://"
static void
parse_sftp_uri (GFile *file,
char **user,
char **host,
unsigned int *port,
char **path)
{
char *tmp, *save;
char *uri;
uri = g_file_get_uri (file);
g_assert (uri != NULL);
save = uri;
*path = NULL;
*user = NULL;
*host = NULL;
*port = 0;
/* skip intial 'sftp:// prefix */
g_assert (!strncmp (uri, SFTP_PREFIX, strlen (SFTP_PREFIX)));
uri += strlen (SFTP_PREFIX);
/* cut out the path */
tmp = strchr (uri, '/');
if (tmp != NULL) {
*path = g_uri_unescape_string (tmp, "/");
*tmp = '\0';
}
/* read the username - it ends with @ */
tmp = strchr (uri, '@');
if (tmp != NULL) {
*tmp++ = '\0';
*user = strdup (uri);
if (strchr (*user, ':') != NULL) {
/* chop the password */
*(strchr (*user, ':')) = '\0';
}
uri = tmp;
}
/* now read the port, starts with : */
tmp = strchr (uri, ':');
if (tmp != NULL) {
*tmp++ = '\0';
*port = atoi (tmp); /*FIXME: getservbyname*/
}
/* what is left is the host */
*host = strdup (uri);
g_free (save);
}
static char *
get_remote_ssh_command (const char *uri,
const char *command_to_run)
{
GFile *file;
char *host_name, *path, *user_name;
char *command, *user_host, *unescaped_path;
char *quoted_path;
char *remote_command;
char *quoted_remote_command;
char *port_str;
guint host_port;
g_assert (uri != NULL);
file = g_file_new_for_uri (uri);
parse_sftp_uri (file, &user_name, &host_name, &host_port, &path);
g_object_unref (file);
/* FIXME to we have to consider the remote file encoding? */
unescaped_path = g_uri_unescape_string (path, NULL);
quoted_path = g_shell_quote (unescaped_path);
port_str = NULL;
if (host_port != 0) {
port_str = g_strdup_printf (" -p %d", host_port);
} else {
port_str = g_strdup ("");
}
if (user_name != NULL) {
user_host = g_strdup_printf ("%s@%s", user_name, host_name);
} else {
user_host = g_strdup (host_name);
}
if (command_to_run != NULL) {
remote_command = g_strdup_printf ("cd %s && exec %s", quoted_path, command_to_run);
} else {
remote_command = g_strdup_printf ("cd %s && exec $SHELL -l", quoted_path);
}
quoted_remote_command = g_shell_quote (remote_command);
command = g_strdup_printf ("ssh %s%s -t %s", user_host, port_str, quoted_remote_command);
g_free (user_name);
g_free (user_host);
g_free (host_name);
g_free (port_str);
g_free (path);
g_free (unescaped_path);
g_free (quoted_path);
g_free (remote_command);
g_free (quoted_remote_command);
return command;
}
static inline char *
get_gvfs_path_for_uri (const char *uri)
{
GFile *file;
char *path;
file = g_file_new_for_uri (uri);
path = g_file_get_path (file);
g_object_unref (file);
return path;
}
static char *
get_terminal_command_for_file_info (cajaFileInfo *file_info,
const char *command_to_run,
gboolean remote_terminal)
{
char *uri, *path, *quoted_path;
char *command;
uri = caja_file_info_get_activation_uri (file_info);
path = NULL;
command = NULL;
switch (get_terminal_file_info (uri)) {
case FILE_INFO_LOCAL:
if (uri != NULL) {
path = g_filename_from_uri (uri, NULL, NULL);
}
break;
case FILE_INFO_DESKTOP:
if (desktop_is_home_dir () || desktop_opens_home_dir ()) {
path = g_strdup (g_get_home_dir ());
} else {
path = g_strdup (g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP));
}
break;
case FILE_INFO_SFTP:
if (remote_terminal && uri != NULL) {
command = get_remote_ssh_command (uri, command_to_run);
break;
}
/* fall through */
case FILE_INFO_OTHER:
if (uri != NULL) {
/* map back remote URI to local path */
path = get_gvfs_path_for_uri (uri);
}
break;
default:
g_assert_not_reached ();
}
if (command == NULL && path != NULL) {
quoted_path = g_shell_quote (path);
if (command_to_run != NULL) {
command = g_strdup_printf ("cd %s && exec %s", quoted_path, command_to_run);
} else {
command = g_strdup_printf ("cd %s && exec $SHELL -l", quoted_path);
}
g_free (quoted_path);
}
g_free (path);
g_free (uri);
return command;
}
static void
open_terminal (cajaMenuItem *item,
cajaFileInfo *file_info)
{
char *terminal_command, *command_to_run;
GdkScreen *screen;
gboolean remote_terminal;
screen = g_object_get_data (G_OBJECT (item), "CajaOpenTerminal::screen");
command_to_run = g_object_get_data (G_OBJECT (item), "CajaOpenTerminal::command-to-run");
remote_terminal = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (item), "CajaOpenTerminal::remote-terminal"));
terminal_command = get_terminal_command_for_file_info (file_info, command_to_run, remote_terminal);
if (terminal_command != NULL) {
_not_eel_mate_open_terminal_on_screen (terminal_command, screen);
}
g_free (terminal_command);
}
static void
open_terminal_callback (cajaMenuItem *item,
cajaFileInfo *file_info)
{
open_terminal (item, file_info);
}
static cajaMenuItem *
open_terminal_menu_item_new (cajaFileInfo *file_info,
TerminalFileInfo terminal_file_info,
GdkScreen *screen,
const char *command_to_run,
gboolean remote_terminal,
gboolean is_file_item)
{
cajaMenuItem *ret;
char *action_name;
const char *name;
const char *tooltip;
if (command_to_run == NULL) {
switch (terminal_file_info) {
case FILE_INFO_SFTP:
if (remote_terminal) {
name = _("Open in _Remote Terminal");
} else {
name = _("Open in _Local Terminal");
}
if (is_file_item) {
tooltip = _("Open the currently selected folder in a terminal");
} else {
tooltip = _("Open the currently open folder in a terminal");
}
break;
case FILE_INFO_LOCAL:
case FILE_INFO_OTHER:
name = _("Open in T_erminal");
if (is_file_item) {
tooltip = _("Open the currently selected folder in a terminal");
} else {
tooltip = _("Open the currently open folder in a terminal");
}
break;
case FILE_INFO_DESKTOP:
if (desktop_opens_home_dir ()) {
name = _("Open T_erminal");
tooltip = _("Open a terminal");
} else {
name = _("Open in T_erminal");
tooltip = _("Open the currently open folder in a terminal");
}
break;
default:
g_assert_not_reached ();
}
} else if (!strcmp (command_to_run, "mc")) {
switch (terminal_file_info) {
case FILE_INFO_LOCAL:
case FILE_INFO_SFTP:
case FILE_INFO_OTHER:
name = _("Open in _Midnight Commander");
if (is_file_item) {
tooltip = _("Open the currently selected folder in the terminal file manager Midnight Commander");
} else {
tooltip = _("Open the currently open folder in the terminal file manager Midnight Commander");
}
break;
case FILE_INFO_DESKTOP:
if (desktop_opens_home_dir ()) {
name = _("Open _Midnight Commander");
tooltip = _("Open the terminal file manager Midnight Commander");
} else {
name = _("Open in _Midnight Commander");
tooltip = _("Open the currently open folder in the terminal file manager Midnight Commander");
}
break;
default:
g_assert_not_reached ();
}
} else {
g_assert_not_reached ();
}
if (command_to_run != NULL) {
action_name = g_strdup_printf (remote_terminal ?
"CajaOpenTerminal::open_remote_terminal_%s" :
"CajaOpenTerminal::open_terminal_%s",
command_to_run);
} else {
action_name = g_strdup (remote_terminal ?
"CajaOpenTerminal::open_remote_terminal" :
"CajaOpenTerminal::open_terminal");
}
ret = caja_menu_item_new (action_name, name, tooltip, "utilities-terminal");
g_free (action_name);
g_object_set_data (G_OBJECT (ret),
"CajaOpenTerminal::screen",
screen);
g_object_set_data_full (G_OBJECT (ret), "CajaOpenTerminal::command-to-run",
g_strdup (command_to_run),
(GDestroyNotify) g_free);
g_object_set_data (G_OBJECT (ret), "CajaOpenTerminal::remote-terminal",
GUINT_TO_POINTER (remote_terminal));
g_object_set_data_full (G_OBJECT (ret), "file-info",
g_object_ref (file_info),
(GDestroyNotify) g_object_unref);
g_signal_connect (ret, "activate",
G_CALLBACK (open_terminal_callback),
file_info);
return ret;
}
static gboolean
terminal_locked_down (void)
{
return g_settings_get_boolean (settings_lockdown, "disable-command-line");
}
/* used to determine for remote URIs whether GVFS is capable of mapping them to ~/.gvfs */
static gboolean
uri_has_local_path (const char *uri)
{
GFile *file;
char *path;
gboolean ret;
file = g_file_new_for_uri (uri);
path = g_file_get_path (file);
ret = (path != NULL);
g_free (path);
g_object_unref (file);
return ret;
}
static GList *
caja_open_terminal_get_background_items (cajaMenuProvider *provider,
GtkWidget *window,
cajaFileInfo *file_info)
{
gchar *uri;
GList *items;
cajaMenuItem *item;
TerminalFileInfo terminal_file_info;
if (terminal_locked_down ()) {
return NULL;
}
items = NULL;
uri = caja_file_info_get_activation_uri (file_info);
terminal_file_info = get_terminal_file_info (uri);
if (terminal_file_info == FILE_INFO_SFTP ||
terminal_file_info == FILE_INFO_DESKTOP ||
uri_has_local_path (uri)) {
/* local locations or SSH */
item = open_terminal_menu_item_new (file_info, terminal_file_info, gtk_widget_get_screen (window),
NULL, terminal_file_info == FILE_INFO_SFTP, FALSE);
items = g_list_append (items, item);
}
if ((terminal_file_info == FILE_INFO_SFTP ||
terminal_file_info == FILE_INFO_OTHER) &&
uri_has_local_path (uri)) {
/* remote locations that offer local back-mapping */
item = open_terminal_menu_item_new (file_info, terminal_file_info, gtk_widget_get_screen (window),
NULL, FALSE, FALSE);
items = g_list_append (items, item);
}
if (display_mc_item () &&
g_find_program_in_path ("mc") &&
((terminal_file_info == FILE_INFO_DESKTOP &&
(desktop_is_home_dir () || desktop_opens_home_dir ())) ||
uri_has_local_path (uri))) {
item = open_terminal_menu_item_new (file_info, terminal_file_info, gtk_widget_get_screen (window), "mc", FALSE, FALSE);
items = g_list_append (items, item);
}
g_free (uri);
return items;
}
GList *
caja_open_terminal_get_file_items (cajaMenuProvider *provider,
GtkWidget *window,
GList *files)
{
gchar *uri;
GList *items;
cajaMenuItem *item;
TerminalFileInfo terminal_file_info;
if (terminal_locked_down ()) {
return NULL;
}
if (g_list_length (files) != 1 ||
(!caja_file_info_is_directory (files->data) &&
caja_file_info_get_file_type (files->data) != G_FILE_TYPE_SHORTCUT &&
caja_file_info_get_file_type (files->data) != G_FILE_TYPE_MOUNTABLE)) {
return NULL;
}
items = NULL;
uri = caja_file_info_get_activation_uri (files->data);
terminal_file_info = get_terminal_file_info (uri);
switch (terminal_file_info) {
case FILE_INFO_LOCAL:
case FILE_INFO_SFTP:
case FILE_INFO_OTHER:
if (terminal_file_info == FILE_INFO_SFTP || uri_has_local_path (uri)) {
item = open_terminal_menu_item_new (files->data, terminal_file_info, gtk_widget_get_screen (window),
NULL, terminal_file_info == FILE_INFO_SFTP, TRUE);
items = g_list_append (items, item);
}
if (terminal_file_info == FILE_INFO_SFTP &&
uri_has_local_path (uri)) {
item = open_terminal_menu_item_new (files->data, terminal_file_info, gtk_widget_get_screen (window), NULL, FALSE, TRUE);
items = g_list_append (items, item);
}
if (display_mc_item () &&
g_find_program_in_path ("mc") &&
uri_has_local_path (uri)) {
item = open_terminal_menu_item_new (files->data, terminal_file_info, gtk_widget_get_screen (window), "mc", TRUE, FALSE);
items = g_list_append (items, item);
}
break;
case FILE_INFO_DESKTOP:
break;
default:
g_assert_not_reached ();
}
g_free (uri);
return items;
}
static void
caja_open_terminal_menu_provider_iface_init (cajaMenuProviderIface *iface)
{
iface->get_background_items = caja_open_terminal_get_background_items;
iface->get_file_items = caja_open_terminal_get_file_items;
}
static void
caja_open_terminal_instance_init (CajaOpenTerminal *cvs)
{
}
static void
caja_open_terminal_class_init (CajaOpenTerminalClass *class)
{
g_assert (settings_open == NULL);
settings_open = g_settings_new ("org.mate.caja-open-terminal");
g_assert (settings_preferences == NULL);
settings_preferences = g_settings_new ("org.mate.caja.preferences");
g_assert (settings_lockdown == NULL);
settings_lockdown = g_settings_new ("org.mate.lockdown");
}
static void
caja_open_terminal_class_finalize (CajaOpenTerminalClass *class)
{
g_assert (settings_open != NULL);
g_object_unref (settings_open);
g_assert (settings_preferences != NULL);
g_object_unref (settings_preferences);
g_assert (settings_lockdown != NULL);
g_object_unref (settings_lockdown);
}
GType
caja_open_terminal_get_type (void)
{
return terminal_type;
}
void
caja_open_terminal_register_type (GTypeModule *module)
{
static const GTypeInfo info = {
sizeof (CajaOpenTerminalClass),
(GBaseInitFunc) NULL,
(GBaseFinalizeFunc) NULL,
(GClassInitFunc) caja_open_terminal_class_init,
(GClassFinalizeFunc) caja_open_terminal_class_finalize,
NULL,
sizeof (CajaOpenTerminal),
0,
(GInstanceInitFunc) caja_open_terminal_instance_init,
};
static const GInterfaceInfo menu_provider_iface_info = {
(GInterfaceInitFunc) caja_open_terminal_menu_provider_iface_init,
NULL,
NULL
};
terminal_type = g_type_module_register_type (module,
G_TYPE_OBJECT,
"CajaOpenTerminal",
&info, 0);
g_type_module_add_interface (module,
terminal_type,
caja_TYPE_MENU_PROVIDER,
&menu_provider_iface_info);
}

View File

@ -1,55 +0,0 @@
/*
* caja-open-terminal.h
*
* Copyright (C) 2004, 2005 Free Software Foundation, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Author: Christian Neumair <chris@mate-de.org>
*
*/
#ifndef CAJA_OPEN_TERMINAL_H
#define CAJA_OPEN_TERMINAL_H
#include <glib-object.h>
G_BEGIN_DECLS
/* Declarations for the open terminal extension object. This object will be
* instantiated by caja. It implements the GInterfaces
* exported by libcaja. */
#define CAJA_TYPE_OPEN_TERMINAL (caja_open_terminal_get_type ())
#define CAJA_OPEN_TERMINAL(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), CAJA_TYPE_OPEN_TERMINAL, CajaOpenTerminal))
#define CAJA_IS_OPEN_TERMINAL(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), CAJA_TYPE_OPEN_TERMINAL))
typedef struct _CajaOpenTerminal CajaOpenTerminal;
typedef struct _CajaOpenTerminalClass CajaOpenTerminalClass;
struct _CajaOpenTerminal {
GObject parent_slot;
};
struct _CajaOpenTerminalClass {
GObjectClass parent_slot;
};
GType caja_open_terminal_get_type (void);
void caja_open_terminal_register_type (GTypeModule *module);
G_END_DECLS
#endif

View File

@ -1,200 +0,0 @@
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
/* eel-mate-extensions.c - implementation of new functions that operate on
mate classes. Perhaps some of these should be
rolled into mate someday.
Copyright (C) 1999, 2000, 2001 Eazel, Inc.
The Mate Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The Mate Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the Mate Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
Boston, MA 02110-1301, USA.
Authors: Darin Adler <darin@eazel.com>
*/
#include <config.h>
#define MATE_DESKTOP_USE_UNSTABLE_API
#include <X11/Xatom.h>
#include <errno.h>
#include <fcntl.h>
#include <gdk/gdkx.h>
#include <gtk/gtk.h>
#include <libmate/mate-desktop-utils.h>
#include <limits.h>
#include <signal.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <unistd.h>
/* Return a command string containing the path to a terminal on this system. */
static char *
try_terminal_command (const char *program,
const char *args)
{
char *program_in_path, *quoted, *result;
if (program == NULL) {
return NULL;
}
program_in_path = g_find_program_in_path (program);
if (program_in_path == NULL) {
return NULL;
}
quoted = g_shell_quote (program_in_path);
if (args == NULL || args[0] == '\0') {
return quoted;
}
result = g_strconcat (quoted, " ", args, NULL);
g_free (quoted);
return result;
}
static char *
try_terminal_command_argv (int argc,
char **argv)
{
GString *string;
int i;
char *quoted, *result;
if (argc == 0) {
return NULL;
}
if (argc == 1) {
return try_terminal_command (argv[0], NULL);
}
string = g_string_new (argv[1]);
for (i = 2; i < argc; i++) {
quoted = g_shell_quote (argv[i]);
g_string_append_c (string, ' ');
g_string_append (string, quoted);
g_free (quoted);
}
result = try_terminal_command (argv[0], string->str);
g_string_free (string, TRUE);
return result;
}
static char *
get_terminal_command_prefix (gboolean for_command)
{
int argc;
char **argv;
char *command;
guint i;
static const char *const commands[][3] = {
{ "comando", "-x", "" },
{ "terminal", "-x", "" },
{ "lxterminal", "-x", "" },
{ "vte", "-x", "" },
{ "mate-terminal", "-x", "" },
{ "dtterm", "-e", "-ls" },
{ "nxterm", "-e", "-ls" },
{ "color-xterm", "-e", "-ls" },
{ "rxvt", "-e", "-ls" },
{ "xterm", "-e", "-ls" },
};
/* Try the terminal from preferences. Use without any
* arguments if we are just doing a standalone terminal.
*/
argc = 0;
argv = g_new0 (char *, 1);
mate_desktop_prepend_terminal_to_vector (&argc, &argv);
command = NULL;
if (argc != 0) {
if (for_command) {
command = try_terminal_command_argv (argc, argv);
} else {
/* Strip off the arguments in a lame attempt
* to make it be an interactive shell.
*/
command = try_terminal_command (argv[0], NULL);
}
}
while (argc != 0) {
g_free (argv[--argc]);
}
g_free (argv);
if (command != NULL) {
return command;
}
/* Try well-known terminal applications in same order that gmc did. */
for (i = 0; i < G_N_ELEMENTS (commands); i++) {
command = try_terminal_command (commands[i][0],
commands[i][for_command ? 1 : 2]);
if (command != NULL) {
break;
}
}
return command;
}
char *
_not_eel_mate_make_terminal_command (const char *command)
{
char *prefix, *quoted, *terminal_command;
if (command == NULL) {
return get_terminal_command_prefix (FALSE);
}
prefix = get_terminal_command_prefix (TRUE);
quoted = g_shell_quote (command);
terminal_command = g_strconcat (prefix, " /bin/sh -c ", quoted, NULL);
g_free (prefix);
g_free (quoted);
return terminal_command;
}
void
_not_eel_mate_open_terminal_on_screen (const char *command,
GdkScreen *screen)
{
char *command_line;
if (screen == NULL) {
screen = gdk_screen_get_default ();
}
command_line = _not_eel_mate_make_terminal_command (command);
if (command_line == NULL) {
g_message ("Could not start a terminal");
return;
}
gdk_spawn_command_line_on_screen (screen, command_line, NULL);
g_free (command_line);
}
void
_not_eel_mate_open_terminal (const char *command)
{
_not_eel_mate_open_terminal_on_screen (command, NULL);
}

View File

@ -1,40 +0,0 @@
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
/* eel-mate-extensions.h - interface for new functions that operate on
mate classes. Perhaps some of these should be
rolled into mate someday.
Copyright (C) 1999, 2000, 2001 Eazel, Inc.
The Mate Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The Mate Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the Mate Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
Boston, MA 02110-1301, USA.
Authors: Darin Adler <darin@eazel.com>
*/
#ifndef _NOT_EEL_MATE_EXTENSIONS_H
#define _NOT_EEL_MATE_EXTENSIONS_H
#include <gtk/gtk.h>
/* Return a command string containing the path to a terminal on this system. */
char * _not_eel_mate_make_terminal_command (const char *command);
/* Open up a new terminal, optionally passing in a command to execute */
void _not_eel_mate_open_terminal (const char *command);
void _not_eel_mate_open_terminal_on_screen (const char *command,
GdkScreen *screen);
#endif /* _NOT_EEL_MATE_EXTENSIONS_H */

View File

@ -1,58 +0,0 @@
/*
* open-terminal.c
*
* Copyright (C) 2004, 2005 Free Software Foundation, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Author: Christian Neumair <chris@mate-de.org>
*
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "caja-open-terminal.h"
#include <libintl.h>
static GType type_list[1];
void
caja_module_initialize (GTypeModule *module)
{
g_print ("Initializing caja-open-terminal extension\n");
caja_open_terminal_register_type (module);
type_list[0] = CAJA_TYPE_OPEN_TERMINAL;
bindtextdomain (GETTEXT_PACKAGE, MATELOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
}
void
caja_module_shutdown (void)
{
g_print ("Shutting down caja-open-terminal extension\n");
}
void
caja_module_list_types (const GType **types,
int *num_types)
{
*types = type_list;
*num_types = G_N_ELEMENTS (type_list);
}

View File

@ -1,7 +1,6 @@
[encoding: UTF-8] [encoding: UTF-8]
# List of source files containing translatable strings. # List of source files containing translatable strings.
# Please keep this file sorted alphabetically. # Please keep this file sorted alphabetically.
caja/caja-open-terminal.c
mate-terminal.desktop.in.in mate-terminal.desktop.in.in
src/eggsmclient.c src/eggsmclient.c
src/encodings-dialog.glade src/encodings-dialog.glade