From 157c7cc27764376d021d3b6562305b90212b7f5f Mon Sep 17 00:00:00 2001
From: Yevgen Muntyan <17531749+muntyan@users.noreply.github.com>
Date: Mon, 10 Jan 2011 02:13:44 -0800
Subject: [PATCH] New input type for shell commands: 'Document copy'
---
doc/user-tools.docbook | 18 ++-
moo/mooedit/mooeditfileinfo.c | 21 +++
moo/mooedit/mooeditfileinfo.h | 3 +
moo/plugins/usertools/menu-tmpl.xml | 10 ++
moo/plugins/usertools/moocommand-exe.c | 190 +++++++++++++++----------
moo/plugins/usertools/moocommand.c | 152 --------------------
moo/plugins/usertools/moocommand.h | 22 ---
moo/plugins/usertools/moousertools.c | 81 +----------
8 files changed, 165 insertions(+), 332 deletions(-)
diff --git a/doc/user-tools.docbook b/doc/user-tools.docbook
index 79498736..b7ab5f21 100644
--- a/doc/user-tools.docbook
+++ b/doc/user-tools.docbook
@@ -242,7 +242,8 @@ text field using default user shell on Unix systems or cmd.exe
- Input entry specifies what text from the document should be passed to the command via its standard input:
+ Input entry specifies what text from the document should be passed to the command.
+ The text is passed via command's standard input, except for Document copy case.
@@ -263,6 +264,12 @@ Its input and output are specified by the following controls:
Whole document
whole document contents.
+
+ Document copy
+ document contents will be saved to a temporary file and the file path will be stored
+ in INPUT_FILE environment variable. No text will be passed to the command via standard
+ input.
+
@@ -336,6 +343,10 @@ following environment variables are set when scripts are executed:
/home/user/file.c). Basename is always
$DOC_BASE$DOC_EXT.
+
+ DOC_PATH
+ full document path.
+
LINE
1-based number of the line containing cursor.
@@ -352,6 +363,11 @@ following environment variables are set when scripts are executed:
DATA_DIR
user data directory (&medit-user-data-dir-unix; on Unix systems).
+
+ INPUT_FILE
+ if input was set to "Document copy" then this is set to
+ full path of the temporary file containing document text.
+
diff --git a/moo/mooedit/mooeditfileinfo.c b/moo/mooedit/mooeditfileinfo.c
index 1fe1b3c1..0e8a098a 100644
--- a/moo/mooedit/mooeditfileinfo.c
+++ b/moo/mooedit/mooeditfileinfo.c
@@ -102,6 +102,13 @@ moo_edit_open_info_dup (MooEditOpenInfo *info)
return copy;
}
+void
+moo_edit_open_info_free (MooEditOpenInfo *info)
+{
+ if (info)
+ g_object_unref (info);
+}
+
static void
moo_edit_open_info_finalize (GObject *object)
{
@@ -202,6 +209,13 @@ moo_edit_save_info_dup (MooEditSaveInfo *info)
return copy;
}
+void
+moo_edit_save_info_free (MooEditSaveInfo *info)
+{
+ if (info)
+ g_object_unref (info);
+}
+
static void
moo_edit_save_info_finalize (GObject *object)
{
@@ -263,6 +277,13 @@ moo_edit_reload_info_dup (MooEditReloadInfo *info)
return copy;
}
+void
+moo_edit_reload_info_free (MooEditReloadInfo *info)
+{
+ if (info)
+ g_object_unref (info);
+}
+
static void
moo_edit_reload_info_finalize (GObject *object)
{
diff --git a/moo/mooedit/mooeditfileinfo.h b/moo/mooedit/mooeditfileinfo.h
index bfc4c50a..571c0226 100644
--- a/moo/mooedit/mooeditfileinfo.h
+++ b/moo/mooedit/mooeditfileinfo.h
@@ -103,9 +103,11 @@ MooEditOpenInfo *moo_edit_open_info_new_path (const char *path,
MooEditOpenInfo *moo_edit_open_info_new_uri (const char *uri,
const char *encoding);
MooEditOpenInfo *moo_edit_open_info_dup (MooEditOpenInfo *info);
+void moo_edit_open_info_free (MooEditOpenInfo *info);
MooEditReloadInfo *moo_edit_reload_info_new (const char *encoding);
MooEditReloadInfo *moo_edit_reload_info_dup (MooEditReloadInfo *info);
+void moo_edit_reload_info_free (MooEditReloadInfo *info);
MooEditSaveInfo *moo_edit_save_info_new (GFile *file,
const char *encoding);
@@ -114,6 +116,7 @@ MooEditSaveInfo *moo_edit_save_info_new_path (const char *path,
MooEditSaveInfo *moo_edit_save_info_new_uri (const char *uri,
const char *encoding);
MooEditSaveInfo *moo_edit_save_info_dup (MooEditSaveInfo *info);
+void moo_edit_save_info_free (MooEditSaveInfo *info);
G_END_DECLS
diff --git a/moo/plugins/usertools/menu-tmpl.xml b/moo/plugins/usertools/menu-tmpl.xml
index d9d0a07e..303d501e 100644
--- a/moo/plugins/usertools/menu-tmpl.xml
+++ b/moo/plugins/usertools/menu-tmpl.xml
@@ -43,6 +43,16 @@ end
table.sort(lines)
doc.replace_selected_lines(lines)
]]>
+
+
+ Diff to Disk
+ need-file
+ exe
+ doc-copy
+ $TEMP_DIR/m.diff
+medit -r $TEMP_DIR/m.diff
+]]>
Bison
diff --git a/moo/plugins/usertools/moocommand-exe.c b/moo/plugins/usertools/moocommand-exe.c
index e390273e..a7e86cf2 100644
--- a/moo/plugins/usertools/moocommand-exe.c
+++ b/moo/plugins/usertools/moocommand-exe.c
@@ -23,6 +23,7 @@
#include "mooutils/mooi18n.h"
#include "mooutils/mooutils-fs.h"
#include "mooutils/mooutils-misc.h"
+#include "mooutils/mooutils-script.h"
#include "mooutils/mooutils-debug.h"
#include "mooutils/moospawn.h"
#include "mooutils/mootype-macros.h"
@@ -45,7 +46,7 @@
#define SCRIPT_EXTENSION ".bat"
#endif
-#define MOO_COMMAND_EXE_MAX_INPUT (MOO_COMMAND_EXE_INPUT_DOC + 1)
+#define MOO_COMMAND_EXE_MAX_INPUT (MOO_COMMAND_EXE_INPUT_DOC_COPY + 1)
#define MOO_COMMAND_EXE_MAX_OUTPUT (MOO_COMMAND_EXE_OUTPUT_NEW_DOC + 1)
#define MOO_COMMAND_EXE_INPUT_DEFAULT MOO_COMMAND_EXE_INPUT_NONE
#define MOO_COMMAND_EXE_OUTPUT_DEFAULT MOO_COMMAND_EXE_OUTPUT_NONE
@@ -55,7 +56,8 @@ typedef enum
MOO_COMMAND_EXE_INPUT_NONE,
MOO_COMMAND_EXE_INPUT_LINES,
MOO_COMMAND_EXE_INPUT_SELECTION,
- MOO_COMMAND_EXE_INPUT_DOC
+ MOO_COMMAND_EXE_INPUT_DOC,
+ MOO_COMMAND_EXE_INPUT_DOC_COPY,
} MooCommandExeInput;
typedef enum
@@ -116,7 +118,6 @@ struct _MooCommandExePrivate {
char *filter;
};
-
G_DEFINE_TYPE (MooCommandExe, _moo_command_exe, MOO_TYPE_COMMAND)
typedef MooCommandFactory MooCommandFactoryExe;
@@ -167,9 +168,30 @@ get_lines (MooEdit *doc,
}
static char *
-get_input (MooCommandExe *cmd,
- MooCommandContext *ctx,
- gboolean select_it)
+save_input_file (MooEdit *doc)
+{
+ MooEditSaveInfo *info;
+ GError *error = NULL;
+ char *file;
+
+ file = moo_tempnam (NULL);
+ info = moo_edit_save_info_new_path (file, moo_edit_get_encoding (doc));
+
+ if (!moo_edit_save_copy (doc, info, &error))
+ {
+ g_error_free (error);
+ g_free (file);
+ file = NULL;
+ }
+
+ moo_edit_save_info_free (info);
+ return file;
+}
+
+static char *
+get_input (MooCommandExe *cmd,
+ MooCommandContext *ctx,
+ gboolean select_it)
{
MooEdit *doc = moo_command_context_get_doc (ctx);
MooEditView *view = doc ? moo_edit_get_view (doc) : NULL;
@@ -179,6 +201,7 @@ get_input (MooCommandExe *cmd,
switch (cmd->priv->input)
{
case MOO_COMMAND_EXE_INPUT_NONE:
+ case MOO_COMMAND_EXE_INPUT_DOC_COPY:
return NULL;
case MOO_COMMAND_EXE_INPUT_LINES:
return get_lines (doc, select_it);
@@ -188,7 +211,7 @@ get_input (MooCommandExe *cmd,
return moo_text_view_get_text (GTK_TEXT_VIEW (view));
}
- g_return_val_if_reached (NULL);
+ moo_return_val_if_reached (NULL);
}
@@ -196,20 +219,10 @@ static char *
save_temp (const char *data,
gssize length)
{
- int fd;
GError *error = NULL;
char *filename;
- fd = g_file_open_tmp ("medit-tmp-XXXXXX", &filename, &error);
-
- if (fd < 0)
- {
- g_critical ("%s: %s", G_STRLOC, error->message);
- g_error_free (error);
- return NULL;
- }
-
- close (fd);
+ filename = moo_tempnam (NULL);
/* XXX */
if (!_moo_save_file_utf8 (filename, data, length, &error))
@@ -232,7 +245,7 @@ make_cmd (const char *base_cmd_line,
input_len = input ? strlen (input) : 0;
- if (!input || !input_len)
+ if (!input_len)
return g_strdup (base_cmd_line);
if (input_len < 2048)
@@ -432,79 +445,93 @@ insert_text (MooEdit *doc,
static void
-set_variable (const char *name,
- const GValue *gval,
- gpointer array)
+get_extension (const char *string,
+ char **base,
+ char **ext)
{
- char *freeme = NULL;
- const char *value = NULL;
+ char *dot;
- switch (G_TYPE_FUNDAMENTAL (G_VALUE_TYPE (gval)))
+ g_return_if_fail (string != NULL);
+
+ dot = strrchr (string, '.');
+
+ if (dot)
{
- case G_TYPE_CHAR:
- freeme = g_strdup_printf ("%c", g_value_get_char (gval));
- break;
- case G_TYPE_UCHAR:
- freeme = g_strdup_printf ("%c", g_value_get_uchar (gval));
- break;
- case G_TYPE_INT:
- freeme = g_strdup_printf ("%d", g_value_get_int (gval));
- break;
- case G_TYPE_UINT:
- freeme = g_strdup_printf ("%u", g_value_get_uint (gval));
- break;
- case G_TYPE_LONG:
- freeme = g_strdup_printf ("%ld", g_value_get_long (gval));
- break;
- case G_TYPE_ULONG:
- freeme = g_strdup_printf ("%lu", g_value_get_ulong (gval));
- break;
- case G_TYPE_INT64:
- freeme = g_strdup_printf ("%" G_GINT64_FORMAT, g_value_get_int64 (gval));
- break;
- case G_TYPE_UINT64:
- freeme = g_strdup_printf ("%" G_GUINT64_FORMAT, g_value_get_uint64 (gval));
- break;
- case G_TYPE_STRING:
- value = g_value_get_string (gval);
- break;
- default:
- g_message ("ignoring value of type %s", g_type_name (G_VALUE_TYPE (gval)));
+ *base = g_strndup (string, dot - string);
+ *ext = g_strdup (dot);
+ }
+ else
+ {
+ *base = g_strdup (string);
+ *ext = g_strdup ("");
}
-
- if (freeme)
- value = freeme;
-
- if (value)
- g_ptr_array_add (array, g_strdup_printf ("%s=%s", name, value));
-
- g_free (freeme);
}
static void
-create_environment (MooCommandContext *ctx,
+create_environment (MooCommandExe *cmd,
+ MooCommandContext *ctx,
char **working_dir,
char ***envp)
{
GPtrArray *array;
- MooEdit *doc;
+ MooEdit *doc = moo_command_context_get_doc (ctx);
array = g_ptr_array_new ();
- moo_command_context_foreach (ctx, set_variable, array);
- if (array->len)
+ if (doc && !moo_edit_is_untitled (doc))
{
- g_ptr_array_add (array, NULL);
- *envp = (char**) g_ptr_array_free (array, FALSE);
- }
- else
- {
- g_ptr_array_free (array, TRUE);
- *envp = NULL;
+ char *filename, *basename;
+ char *dirname, *base = NULL, *extension = NULL;
+
+ filename = moo_edit_get_filename (doc);
+ basename = filename ? g_path_get_basename (filename) : NULL;
+ dirname = g_path_get_dirname (filename);
+ get_extension (basename, &base, &extension);
+
+ g_ptr_array_add (array, g_strdup_printf ("DOC=%s", basename));
+ g_ptr_array_add (array, g_strdup_printf ("DOC_DIR=%s", dirname));
+ g_ptr_array_add (array, g_strdup_printf ("DOC_BASE=%s", base));
+ g_ptr_array_add (array, g_strdup_printf ("DOC_EXT=%s", extension));
+ g_ptr_array_add (array, g_strdup_printf ("DOC_PATH=%s", filename));
+
+ g_free (basename);
+ g_free (dirname);
+ g_free (base);
+ g_free (extension);
+ g_free (filename);
}
+ if (doc)
+ {
+ MooEditView *view = moo_edit_get_view (doc);
+ int line = moo_text_view_get_cursor_line (GTK_TEXT_VIEW (view));
+ g_ptr_array_add (array, g_strdup_printf ("LINE0=%d", line));
+ g_ptr_array_add (array, g_strdup_printf ("LINE=%d", line + 1));
+ }
+
+ {
+ char *data_dir = moo_get_user_data_dir ();
+ char *temp_dir = moo_tempdir ();
+ g_ptr_array_add (array, g_strdup_printf ("DATA_DIR=%s", data_dir));
+ g_ptr_array_add (array, g_strdup_printf ("TEMP_DIR=%s", temp_dir));
+ g_free (data_dir);
+ g_free (temp_dir);
+ }
+
+ g_ptr_array_add (array, g_strdup_printf ("APP_PID=%s", _moo_get_pid_string ()));
+ g_ptr_array_add (array, g_strdup_printf ("MEDIT_PID=%s", _moo_get_pid_string ()));
+
+ if (cmd->priv->input == MOO_COMMAND_EXE_INPUT_DOC_COPY)
+ {
+ char *input_file = save_input_file (doc);
+ if (input_file)
+ g_ptr_array_add (array, g_strdup_printf ("INPUT_FILE=%s", input_file));
+ g_free (input_file);
+ }
+
+ g_ptr_array_add (array, NULL);
+ *envp = (char**) g_ptr_array_free (array, FALSE);
*working_dir = NULL;
- doc = moo_command_context_get_doc (ctx);
if (doc && !moo_edit_is_untitled (doc))
{
@@ -695,7 +722,7 @@ moo_command_exe_run (MooCommand *cmd_base,
char *output = NULL;
char *working_dir;
- create_environment (ctx, &working_dir, &envp);
+ create_environment (cmd, ctx, &working_dir, &envp);
switch (cmd->priv->output)
{
@@ -758,6 +785,7 @@ moo_command_exe_check_sensitive (MooCommand *cmd_base,
case MOO_COMMAND_EXE_INPUT_LINES:
case MOO_COMMAND_EXE_INPUT_SELECTION:
case MOO_COMMAND_EXE_INPUT_DOC:
+ case MOO_COMMAND_EXE_INPUT_DOC_COPY:
options |= MOO_COMMAND_NEED_DOC;
break;
}
@@ -849,6 +877,8 @@ parse_input (const char *string,
*input = MOO_COMMAND_EXE_INPUT_SELECTION;
else if (!strcmp (string, "doc"))
*input = MOO_COMMAND_EXE_INPUT_DOC;
+ else if (!strcmp (string, "doc-copy"))
+ *input = MOO_COMMAND_EXE_INPUT_DOC_COPY;
else
{
g_warning ("unknown input type %s", string);
@@ -1036,7 +1066,13 @@ unx_factory_create_widget (G_GNUC_UNUSED MooCommandFactory *factory)
ExePageXml *xml;
/* Translators: these are kinds of input for a shell command, do not translate the part before | */
- const char *input_names[] = {N_("Input|None"), N_("Input|Selected lines"), N_("Input|Selection"), N_("Input|Whole document")};
+ const char *input_names[] = {
+ N_("Input|None"),
+ N_("Input|Selected lines"),
+ N_("Input|Selection"),
+ N_("Input|Whole document"),
+ N_("Input|Document copy")
+ };
xml = exe_page_xml_new ();
@@ -1095,7 +1131,7 @@ unx_factory_save_data (G_GNUC_UNUSED MooCommandFactory *factory,
char *new_cmd_line;
gboolean changed = FALSE;
int index, old_index;
- const char *input_strings[4] = {"none", "lines", "selection", "doc"};
+ const char *input_strings[5] = { "none", "lines", "selection", "doc", "doc-copy" };
xml = exe_page_xml_get (page);
g_return_val_if_fail (xml != NULL, FALSE);
diff --git a/moo/plugins/usertools/moocommand.c b/moo/plugins/usertools/moocommand.c
index d849753f..5ce361d5 100644
--- a/moo/plugins/usertools/moocommand.c
+++ b/moo/plugins/usertools/moocommand.c
@@ -53,7 +53,6 @@ typedef struct {
} Variable;
struct _MooCommandContextPrivate {
- GHashTable *vars;
MooEditWindow *window;
MooEdit *doc;
};
@@ -78,8 +77,6 @@ static GHashTable *registered_factories;
static GHashTable *registered_filters;
-static Variable *variable_new (const GValue *value);
-static void variable_free (Variable *var);
static void moo_command_data_take_code (MooCommandData *data,
char *code);
@@ -566,118 +563,6 @@ out:
}
-static Variable *
-variable_new (const GValue *value)
-{
- Variable *var;
- g_return_val_if_fail (G_IS_VALUE (value), NULL);
- var = g_new0 (Variable, 1);
- g_value_init (&var->value, G_VALUE_TYPE (value));
- g_value_copy (value, &var->value);
- return var;
-}
-
-
-static void
-variable_free (Variable *var)
-{
- if (var)
- {
- g_value_unset (&var->value);
- g_free (var);
- }
-}
-
-
-void
-moo_command_context_set (MooCommandContext *ctx,
- const char *name,
- const GValue *value)
-{
- Variable *var;
-
- g_return_if_fail (MOO_IS_COMMAND_CONTEXT (ctx));
- g_return_if_fail (name != NULL);
- g_return_if_fail (G_IS_VALUE (value));
-
- var = variable_new (value);
- g_hash_table_insert (ctx->priv->vars, g_strdup (name), var);
-}
-
-
-void
-moo_command_context_set_string (MooCommandContext *ctx,
- const char *name,
- const char *value)
-{
- if (value)
- {
- GValue gval;
- gval.g_type = 0;
- g_value_init (&gval, G_TYPE_STRING);
- g_value_set_static_string (&gval, value);
- moo_command_context_set (ctx, name, &gval);
- g_value_unset (&gval);
- }
- else
- {
- moo_command_context_unset (ctx, name);
- }
-}
-
-
-gboolean
-moo_command_context_get (MooCommandContext *ctx,
- const char *name,
- GValue *value)
-{
- Variable *var;
-
- g_return_val_if_fail (MOO_IS_COMMAND_CONTEXT (ctx), FALSE);
- g_return_val_if_fail (name != NULL, FALSE);
- g_return_val_if_fail (value != NULL, FALSE);
- g_return_val_if_fail (G_VALUE_TYPE (value) == 0, FALSE);
-
- var = g_hash_table_lookup (ctx->priv->vars, name);
-
- if (!var)
- return FALSE;
-
- g_value_init (value, G_VALUE_TYPE (&var->value));
- g_value_copy (&var->value, value);
- return TRUE;
-}
-
-
-const char *
-moo_command_context_get_string (MooCommandContext *ctx,
- const char *name)
-{
- Variable *var;
-
- g_return_val_if_fail (MOO_IS_COMMAND_CONTEXT (ctx), NULL);
- g_return_val_if_fail (name != NULL, NULL);
-
- var = g_hash_table_lookup (ctx->priv->vars, name);
-
- if (!var)
- return NULL;
-
- g_return_val_if_fail (G_VALUE_TYPE (&var->value) == G_TYPE_STRING, NULL);
- return g_value_get_string (&var->value);
-}
-
-
-void
-moo_command_context_unset (MooCommandContext *ctx,
- const char *name)
-{
- g_return_if_fail (MOO_IS_COMMAND_CONTEXT (ctx));
- g_return_if_fail (name != NULL);
- g_hash_table_remove (ctx->priv->vars, name);
-}
-
-
static void
moo_command_context_dispose (GObject *object)
{
@@ -685,7 +570,6 @@ moo_command_context_dispose (GObject *object)
if (ctx->priv)
{
- g_hash_table_destroy (ctx->priv->vars);
if (ctx->priv->window)
g_object_unref (ctx->priv->window);
if (ctx->priv->doc)
@@ -767,42 +651,6 @@ static void
moo_command_context_init (MooCommandContext *ctx)
{
ctx->priv = G_TYPE_INSTANCE_GET_PRIVATE (ctx, MOO_TYPE_COMMAND_CONTEXT, MooCommandContextPrivate);
- ctx->priv->vars = g_hash_table_new_full (g_str_hash,
- g_str_equal,
- g_free,
- (GDestroyNotify) variable_free);
-}
-
-
-static void
-ctx_foreach_func (const char *name,
- Variable *var,
- gpointer user_data)
-{
- struct {
- MooCommandContextForeachFunc func;
- gpointer data;
- } *data = user_data;
-
- data->func (name, &var->value, data->data);
-}
-
-void
-moo_command_context_foreach (MooCommandContext *ctx,
- MooCommandContextForeachFunc func,
- gpointer func_data)
-{
- struct {
- MooCommandContextForeachFunc func;
- gpointer data;
- } data;
-
- g_return_if_fail (MOO_IS_COMMAND_CONTEXT (ctx));
- g_return_if_fail (func != NULL);
-
- data.func = func;
- data.data = func_data;
- g_hash_table_foreach (ctx->priv->vars, (GHFunc) ctx_foreach_func, &data);
}
diff --git a/moo/plugins/usertools/moocommand.h b/moo/plugins/usertools/moocommand.h
index 86885fd3..285e678f 100644
--- a/moo/plugins/usertools/moocommand.h
+++ b/moo/plugins/usertools/moocommand.h
@@ -162,28 +162,6 @@ void moo_command_context_set_window (MooCommandContext *ctx,
MooEdit *moo_command_context_get_doc (MooCommandContext *ctx);
MooEditWindow *moo_command_context_get_window (MooCommandContext *ctx);
-void moo_command_context_set (MooCommandContext *ctx,
- const char *name,
- const GValue *value);
-gboolean moo_command_context_get (MooCommandContext *ctx,
- const char *name,
- GValue *value);
-void moo_command_context_unset (MooCommandContext *ctx,
- const char *name);
-void moo_command_context_set_string (MooCommandContext *ctx,
- const char *name,
- const char *value);
-const char *moo_command_context_get_string (MooCommandContext *ctx,
- const char *name);
-
-typedef void (*MooCommandContextForeachFunc) (const char *name,
- const GValue *value,
- gpointer data);
-void moo_command_context_foreach (MooCommandContext *ctx,
- MooCommandContextForeachFunc func,
- gpointer data);
-
-
typedef MooOutputFilter *(*MooCommandFilterFactory) (const char *id,
gpointer data);
diff --git a/moo/plugins/usertools/moousertools.c b/moo/plugins/usertools/moousertools.c
index 168e7930..2161baca 100644
--- a/moo/plugins/usertools/moousertools.c
+++ b/moo/plugins/usertools/moousertools.c
@@ -76,8 +76,6 @@ typedef struct {
typedef MooEditActionClass MooToolActionClass;
-static MooCommandContext *create_command_context (MooEditWindow *window,
- MooEdit *doc);
static MooUserToolInfo *_moo_user_tool_info_ref (MooUserToolInfo *info);
static void add_info (MooUserToolInfo *info,
GSList **list,
@@ -1299,7 +1297,7 @@ moo_tool_action_activate (GtkAction *gtkaction)
doc = moo_edit_window_get_active_doc (window);
}
- ctx = create_command_context (window, doc);
+ ctx = moo_command_context_new (doc, window);
moo_command_run (action->cmd, ctx);
@@ -1354,83 +1352,6 @@ _moo_tool_action_class_init (MooToolActionClass *klass)
}
-static void
-get_extension (const char *string,
- char **base,
- char **ext)
-{
- char *dot;
-
- g_return_if_fail (string != NULL);
-
- dot = strrchr (string, '.');
-
- if (dot)
- {
- *base = g_strndup (string, dot - string);
- *ext = g_strdup (dot);
- }
- else
- {
- *base = g_strdup (string);
- *ext = g_strdup ("");
- }
-}
-
-static MooCommandContext *
-create_command_context (MooEditWindow *window,
- MooEdit *doc)
-{
- MooCommandContext *ctx;
- char *user_dir;
-
- ctx = moo_command_context_new (doc, window);
-
- if (doc && !moo_edit_is_untitled (doc))
- {
- char *filename, *basename;
- char *dirname, *base = NULL, *extension = NULL;
-
- filename = moo_edit_get_filename (doc);
- basename = filename ? g_path_get_basename (filename) : NULL;
- dirname = g_path_get_dirname (filename);
- get_extension (basename, &base, &extension);
-
- moo_command_context_set_string (ctx, "DOC", basename);
- moo_command_context_set_string (ctx, "DOC_DIR", dirname);
- moo_command_context_set_string (ctx, "DOC_BASE", base);
- moo_command_context_set_string (ctx, "DOC_EXT", extension);
-
- g_free (dirname);
- g_free (base);
- g_free (extension);
- g_free (basename);
- g_free (filename);
- }
-
- if (doc)
- {
- GValue val = { 0 };
- MooEditView *view = moo_edit_get_view (doc);
- g_value_init (&val, G_TYPE_INT);
- g_value_set_int (&val, moo_text_view_get_cursor_line (GTK_TEXT_VIEW (view)));
- moo_command_context_set (ctx, "LINE0", &val);
- g_value_set_int (&val, moo_text_view_get_cursor_line (GTK_TEXT_VIEW (view)) + 1);
- moo_command_context_set (ctx, "LINE", &val);
- g_value_unset (&val);
- }
-
- user_dir = moo_get_user_data_dir ();
-
- moo_command_context_set_string (ctx, "DATA_DIR", user_dir);
- moo_command_context_set_string (ctx, "APP_PID", _moo_get_pid_string ());
- /* XXX */
- moo_command_context_set_string (ctx, "MEDIT_PID", _moo_get_pid_string ());
-
- g_free (user_dir);
- return ctx;
-}
-
static GtkWidget *
user_tools_plugin_prefs_page (G_GNUC_UNUSED MooPlugin *plugin)
{