+LINE[:COLUMN] command line support. Fixes bug #168769.

This patch is based on Jan Nieuwenhuizen patch.
parent 4b846402
......@@ -123,6 +123,7 @@ load_file_list (GeditWindow *window,
const GSList *files,
const GeditEncoding *encoding,
gint line_pos,
gint column_pos,
gboolean create)
{
GeditTab *tab;
......@@ -196,6 +197,7 @@ load_file_list (GeditWindow *window,
l->data,
encoding,
line_pos,
column_pos,
create);
l = g_slist_next (l);
......@@ -213,6 +215,7 @@ load_file_list (GeditWindow *window,
l->data,
encoding,
line_pos,
column_pos,
create,
jump_to);
......@@ -267,7 +270,8 @@ void
gedit_commands_load_location (GeditWindow *window,
GFile *location,
const GeditEncoding *encoding,
gint line_pos)
gint line_pos,
gint column_pos)
{
GSList *locations = NULL;
gchar *uri;
......@@ -282,7 +286,7 @@ gedit_commands_load_location (GeditWindow *window,
locations = g_slist_prepend (locations, location);
load_file_list (window, locations, encoding, line_pos, FALSE);
load_file_list (window, locations, encoding, line_pos, column_pos, FALSE);
g_slist_free (locations);
}
......@@ -296,14 +300,15 @@ gint
gedit_commands_load_locations (GeditWindow *window,
const GSList *locations,
const GeditEncoding *encoding,
gint line_pos)
gint line_pos,
gint column_pos)
{
g_return_val_if_fail (GEDIT_IS_WINDOW (window), 0);
g_return_val_if_fail ((locations != NULL) && (locations->data != NULL), 0);
gedit_debug (DEBUG_COMMANDS);
return load_file_list (window, locations, encoding, line_pos, FALSE);
return load_file_list (window, locations, encoding, line_pos, column_pos, FALSE);
}
/*
......@@ -315,11 +320,12 @@ gint
_gedit_cmd_load_files_from_prompt (GeditWindow *window,
GSList *files,
const GeditEncoding *encoding,
gint line_pos)
gint line_pos,
gint column_pos)
{
gedit_debug (DEBUG_COMMANDS);
return load_file_list (window, files, encoding, line_pos, TRUE);
return load_file_list (window, files, encoding, line_pos, column_pos, TRUE);
}
static void
......@@ -363,6 +369,7 @@ open_dialog_response_cb (GeditFileChooserDialog *dialog,
gedit_commands_load_locations (window,
files,
encoding,
0,
0);
g_slist_foreach (files, (GFunc) g_object_unref, NULL);
......
......@@ -43,13 +43,15 @@ G_BEGIN_DECLS
void gedit_commands_load_location (GeditWindow *window,
GFile *location,
const GeditEncoding *encoding,
gint line_pos);
gint line_pos,
gint column_pos);
/* Ignore non-existing URIs */
gint gedit_commands_load_locations (GeditWindow *window,
const GSList *locations,
const GeditEncoding *encoding,
gint line_pos);
gint line_pos,
gint column_pos);
void gedit_commands_save_document (GeditWindow *window,
GeditDocument *document);
......@@ -64,7 +66,8 @@ void gedit_commands_save_all_documents (GeditWindow *window);
gint _gedit_cmd_load_files_from_prompt (GeditWindow *window,
GSList *files,
const GeditEncoding *encoding,
gint line_pos);
gint line_pos,
gint column_pos);
void _gedit_cmd_file_new (GtkAction *action,
GeditWindow *window);
......
......@@ -82,6 +82,7 @@ static void gedit_document_load_real (GeditDocument *doc,
GFile *location,
const GeditEncoding *encoding,
gint line_pos,
gint column_pos,
gboolean create);
static void gedit_document_save_real (GeditDocument *doc,
GFile *location,
......@@ -127,6 +128,7 @@ struct _GeditDocumentPrivate
* to a non existing file */
const GeditEncoding *requested_encoding;
gint requested_line_pos;
gint requested_column_pos;
/* Saving stuff */
GeditDocumentSaver *saver;
......@@ -1239,6 +1241,7 @@ reset_temp_loading_data (GeditDocument *doc)
doc->priv->requested_encoding = NULL;
doc->priv->requested_line_pos = 0;
doc->priv->requested_column_pos = 0;
}
static void
......@@ -1291,10 +1294,15 @@ document_loader_loaded (GeditDocumentLoader *loader,
/* move the cursor at the requested line if any */
if (doc->priv->requested_line_pos > 0)
{
gint column;
column = (doc->priv->requested_column_pos < 1) ? 0 : doc->priv->requested_column_pos - 1;
/* line_pos - 1 because get_iter_at_line counts from 0 */
gtk_text_buffer_get_iter_at_line (GTK_TEXT_BUFFER (doc),
&iter,
doc->priv->requested_line_pos - 1);
gtk_text_buffer_get_iter_at_line_offset (GTK_TEXT_BUFFER (doc),
&iter,
doc->priv->requested_line_pos - 1,
column);
}
/* else, if enabled, to the position stored in the metadata */
else if (gedit_prefs_manager_get_restore_cursor_position ())
......@@ -1390,6 +1398,7 @@ gedit_document_load_real (GeditDocument *doc,
GFile *location,
const GeditEncoding *encoding,
gint line_pos,
gint column_pos,
gboolean create)
{
gchar *uri;
......@@ -1411,6 +1420,7 @@ gedit_document_load_real (GeditDocument *doc,
doc->priv->create = create;
doc->priv->requested_encoding = encoding;
doc->priv->requested_line_pos = line_pos;
doc->priv->requested_column_pos = column_pos;
set_location (doc, location);
set_content_type (doc, NULL);
......@@ -1433,6 +1443,7 @@ gedit_document_load (GeditDocument *doc,
GFile *location,
const GeditEncoding *encoding,
gint line_pos,
gint column_pos,
gboolean create)
{
g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
......@@ -1440,7 +1451,7 @@ gedit_document_load (GeditDocument *doc,
g_return_if_fail (gedit_utils_is_valid_location (location));
g_signal_emit (doc, document_signals[LOAD], 0, location, encoding,
line_pos, create);
line_pos, column_pos, create);
}
/**
......
......@@ -129,6 +129,7 @@ struct _GeditDocumentClass
GFile *location,
const GeditEncoding *encoding,
gint line_pos,
gint column_pos,
gboolean create);
void (* loading) (GeditDocument *document,
......@@ -205,6 +206,7 @@ void gedit_document_load (GeditDocument *doc,
GFile *location,
const GeditEncoding *encoding,
gint line_pos,
gint column_pos,
gboolean create);
gboolean gedit_document_load_cancel (GeditDocument *doc);
......
......@@ -571,6 +571,7 @@ parse_window (GKeyFile *state_file, const char *group_name)
location,
NULL,
0,
0,
FALSE,
jump_to);
if (location)
......
......@@ -70,6 +70,7 @@ struct _GeditTabPrivate
/* tmp data for loading */
gint tmp_line_pos;
gint tmp_column_pos;
const GeditEncoding *tmp_encoding;
GTimer *timer;
......@@ -526,6 +527,7 @@ io_loading_error_message_area_response (GtkWidget *message_area,
location,
tab->priv->tmp_encoding,
tab->priv->tmp_line_pos,
tab->priv->tmp_column_pos,
FALSE);
break;
case GTK_RESPONSE_YES:
......@@ -1610,6 +1612,7 @@ GtkWidget *
_gedit_tab_new_from_location (GFile *location,
const GeditEncoding *encoding,
gint line_pos,
gint column_pos,
gboolean create)
{
GeditTab *tab;
......@@ -1622,6 +1625,7 @@ _gedit_tab_new_from_location (GFile *location,
location,
encoding,
line_pos,
column_pos,
create);
return GTK_WIDGET (tab);
......@@ -1994,6 +1998,7 @@ _gedit_tab_load (GeditTab *tab,
GFile *location,
const GeditEncoding *encoding,
gint line_pos,
gint column_pos,
gboolean create)
{
GeditDocument *doc;
......@@ -2008,6 +2013,7 @@ _gedit_tab_load (GeditTab *tab,
gedit_tab_set_state (tab, GEDIT_TAB_STATE_LOADING);
tab->priv->tmp_line_pos = line_pos;
tab->priv->tmp_column_pos = column_pos;
tab->priv->tmp_encoding = encoding;
if (tab->priv->auto_save_timeout > 0)
......@@ -2017,6 +2023,7 @@ _gedit_tab_load (GeditTab *tab,
location,
encoding,
line_pos,
column_pos,
create);
}
......@@ -2053,6 +2060,7 @@ _gedit_tab_revert (GeditTab *tab)
location,
tab->priv->tmp_encoding,
0,
0,
FALSE);
g_object_unref (location);
......
......@@ -133,6 +133,7 @@ GtkWidget *_gedit_tab_new (void);
GtkWidget *_gedit_tab_new_from_location (GFile *location,
const GeditEncoding *encoding,
gint line_pos,
gint column_pos,
gboolean create);
gchar *_gedit_tab_get_name (GeditTab *tab);
gchar *_gedit_tab_get_tooltips (GeditTab *tab);
......@@ -141,6 +142,7 @@ void _gedit_tab_load (GeditTab *tab,
GFile *location,
const GeditEncoding *encoding,
gint line_pos,
gint column_pos,
gboolean create);
void _gedit_tab_revert (GeditTab *tab);
void _gedit_tab_save (GeditTab *tab);
......
......@@ -1203,7 +1203,7 @@ open_recent_file (GFile *location,
locations = g_slist_prepend (locations, (gpointer) location);
if (gedit_commands_load_locations (window, locations, NULL, 0) != 1)
if (gedit_commands_load_locations (window, locations, NULL, 0, 0) != 1)
{
_gedit_recent_remove (window, location);
}
......@@ -2853,6 +2853,7 @@ load_uris_from_drop (GeditWindow *window,
gedit_commands_load_locations (window,
locations,
NULL,
0,
0);
g_slist_foreach (locations, (GFunc) g_object_unref, NULL);
......@@ -4203,6 +4204,7 @@ gedit_window_create_tab_from_location (GeditWindow *window,
GFile *location,
const GeditEncoding *encoding,
gint line_pos,
gint column_pos,
gboolean create,
gboolean jump_to)
{
......@@ -4214,6 +4216,7 @@ gedit_window_create_tab_from_location (GeditWindow *window,
tab = _gedit_tab_new_from_location (location,
encoding,
line_pos,
column_pos,
create);
if (tab == NULL)
return NULL;
......
......@@ -109,6 +109,7 @@ GeditTab *gedit_window_create_tab_from_location (GeditWindow *window,
GFile *location,
const GeditEncoding *encoding,
gint line_pos,
gint column_pos,
gboolean create,
gboolean jump_to);
......
......@@ -90,6 +90,8 @@ static BaconMessageConnection *connection;
/* command line */
static gint line_position = 0;
static gint column_position = 0;
static gchar *line_column_position = NULL;
static gchar *encoding_charset = NULL;
static gboolean new_window_option = FALSE;
static gboolean new_document_option = FALSE;
......@@ -137,6 +139,9 @@ static const GOptionEntry options [] =
{ "new-document", '\0', 0, G_OPTION_ARG_NONE, &new_document_option,
N_("Create a new document in an existing instance of gedit"), NULL },
{ "+LINE[:COLUMN]", '\0', 0, G_OPTION_ARG_NONE, &line_column_position,
N_("Move cursor to LINE, COLUMN"), NULL },
{ G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_FILENAME_ARRAY, &remaining_args,
NULL, N_("[FILE...]") }, /* collects file arguments */
......@@ -159,6 +164,26 @@ free_command_line_data (void)
new_window_option = FALSE;
new_document_option = FALSE;
line_position = 0;
column_position = 0;
}
static void
get_line_column_position (const gchar *arg)
{
gchar **split;
split = g_strsplit (arg, ":", 2);
if (split != NULL)
{
if (split[0] != NULL)
line_position = atoi (split[0]);
if (split[1] != NULL)
column_position = atoi (split[1]);
}
g_strfreev (split);
}
static void
......@@ -173,10 +198,13 @@ gedit_get_command_line_data (void)
if (*remaining_args[i] == '+')
{
if (*(remaining_args[i] + 1) == '\0')
{
/* goto the last line of the document */
line_position = G_MAXINT;
column_position = 0;
}
else
line_position = atoi (remaining_args[i] + 1);
get_line_column_position (remaining_args[i] + 1);
}
else
{
......@@ -322,7 +350,7 @@ on_message_received (const char *message,
gint n_uris, j;
gchar **uris;
line_position = atoi (params[1]);
get_line_column_position (params[1]);
if (params[2] != '\0')
encoding = gedit_encoding_get_from_charset (params[2]);
......@@ -375,7 +403,8 @@ on_message_received (const char *message,
_gedit_cmd_load_files_from_prompt (window,
file_list,
encoding,
line_position);
line_position,
column_position);
if (new_document_option)
gedit_window_create_tab (window, TRUE);
......@@ -488,8 +517,8 @@ send_bacon_message (void)
command = g_string_append (command, "OPEN-URIS");
g_string_append_printf (command,
"\t%d\t%s\t%u\t",
line_position,
"\t%d:%d\t%s\t%u\t",
line_position, column_position,
encoding_charset ? encoding_charset : "",
g_slist_length (file_list));
......@@ -725,7 +754,8 @@ main (int argc, char *argv[])
_gedit_cmd_load_files_from_prompt (window,
file_list,
encoding,
line_position);
line_position,
column_position);
}
else
{
......
......@@ -839,7 +839,7 @@ static void
on_location_activated_cb (GeditFileBrowserWidget * tree_widget,
GFile *location, GeditWindow * window)
{
gedit_commands_load_location (window, location, NULL, 0);
gedit_commands_load_location (window, location, NULL, 0, 0);
}
static void
......
......@@ -122,7 +122,7 @@ test_loader (const gchar *filename,
G_CALLBACK (on_document_loaded),
data);
gedit_document_load (document, file, gedit_encoding_get_utf8 (), 0, FALSE);
gedit_document_load (document, file, gedit_encoding_get_utf8 (), 0, 0, FALSE);
while (!test_completed)
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment