Merged new-combo branch (again)
svn merge -r 978:985 svn+ssh://svn.berlios.de/svnroot/repos/ggap/moo/branches/new-combomaster
parent
c64bc0467c
commit
6be577cd37
10
moo.kdevelop
10
moo.kdevelop
|
@ -33,7 +33,7 @@
|
||||||
<kdevautoproject>
|
<kdevautoproject>
|
||||||
<general>
|
<general>
|
||||||
<activetarget>moo/libmoo.la</activetarget>
|
<activetarget>moo/libmoo.la</activetarget>
|
||||||
<useconfiguration>debug</useconfiguration>
|
<useconfiguration>optimized</useconfiguration>
|
||||||
</general>
|
</general>
|
||||||
<run>
|
<run>
|
||||||
<mainprogram>./medit</mainprogram>
|
<mainprogram>./medit</mainprogram>
|
||||||
|
@ -268,16 +268,16 @@
|
||||||
</kdevdoctreeview>
|
</kdevdoctreeview>
|
||||||
<kdevfilecreate>
|
<kdevfilecreate>
|
||||||
<filetypes>
|
<filetypes>
|
||||||
<type icon="source" ext="g" name="GAP source" create="template" >
|
<type icon="source" ext="g" create="template" name="GAP source" >
|
||||||
<descr>A new empty GAP source file</descr>
|
<descr>A new empty GAP source file</descr>
|
||||||
</type>
|
</type>
|
||||||
<type icon="source_cpp" ext="cpp" name="C++ Source" create="template" >
|
<type icon="source_cpp" ext="cpp" create="template" name="C++ Source" >
|
||||||
<descr>A new empty C++ file.</descr>
|
<descr>A new empty C++ file.</descr>
|
||||||
</type>
|
</type>
|
||||||
<type icon="source_h" ext="h" name="C/C++ Header" create="template" >
|
<type icon="source_h" ext="h" create="template" name="C/C++ Header" >
|
||||||
<descr>A new empty header file for C/C++.</descr>
|
<descr>A new empty header file for C/C++.</descr>
|
||||||
</type>
|
</type>
|
||||||
<type icon="source_c" ext="c" name="C Source" create="template" >
|
<type icon="source_c" ext="c" create="template" name="C Source" >
|
||||||
<descr>A new empty C file.</descr>
|
<descr>A new empty C file.</descr>
|
||||||
</type>
|
</type>
|
||||||
</filetypes>
|
</filetypes>
|
||||||
|
|
|
@ -4,3 +4,4 @@ mooterm/mootermline.h: #if 0...
|
||||||
mooterm: remove dependency on yacc
|
mooterm: remove dependency on yacc
|
||||||
mooedit/moohighlighter.c:iter_get_syntax_tag(): #if 0 ...
|
mooedit/moohighlighter.c:iter_get_syntax_tag(): #if 0 ...
|
||||||
mooedit/moolang.h; mooedit/moolang-rules.c: Rule::debug_string
|
mooedit/moolang.h; mooedit/moolang-rules.c: Rule::debug_string
|
||||||
|
mooedit/mooeditprefs.c: remove Courier New
|
||||||
|
|
|
@ -82,6 +82,9 @@ struct _MooAppPrivate {
|
||||||
char *tmpdir;
|
char *tmpdir;
|
||||||
|
|
||||||
gboolean use_python_console;
|
gboolean use_python_console;
|
||||||
|
|
||||||
|
gboolean new_app;
|
||||||
|
char **open_files;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -179,7 +182,9 @@ enum {
|
||||||
PROP_RUN_OUTPUT,
|
PROP_RUN_OUTPUT,
|
||||||
PROP_USE_EDITOR,
|
PROP_USE_EDITOR,
|
||||||
PROP_USE_TERMINAL,
|
PROP_USE_TERMINAL,
|
||||||
PROP_USE_PYTHON_CONSOLE
|
PROP_USE_PYTHON_CONSOLE,
|
||||||
|
PROP_OPEN_FILES,
|
||||||
|
PROP_NEW_APP
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -305,6 +310,21 @@ moo_app_class_init (MooAppClass *klass)
|
||||||
FALSE,
|
FALSE,
|
||||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
||||||
|
|
||||||
|
g_object_class_install_property (gobject_class,
|
||||||
|
PROP_OPEN_FILES,
|
||||||
|
g_param_spec_pointer ("open-files",
|
||||||
|
"open-files",
|
||||||
|
"open-files",
|
||||||
|
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
|
||||||
|
|
||||||
|
g_object_class_install_property (gobject_class,
|
||||||
|
PROP_NEW_APP,
|
||||||
|
g_param_spec_boolean ("new-app",
|
||||||
|
"new-app",
|
||||||
|
"new-app",
|
||||||
|
FALSE,
|
||||||
|
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
|
||||||
|
|
||||||
signals[INIT] =
|
signals[INIT] =
|
||||||
g_signal_new ("init",
|
g_signal_new ("init",
|
||||||
G_OBJECT_CLASS_TYPE (klass),
|
G_OBJECT_CLASS_TYPE (klass),
|
||||||
|
@ -312,7 +332,7 @@ moo_app_class_init (MooAppClass *klass)
|
||||||
G_STRUCT_OFFSET (MooAppClass, init),
|
G_STRUCT_OFFSET (MooAppClass, init),
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
_moo_marshal_BOOLEAN__VOID,
|
_moo_marshal_BOOLEAN__VOID,
|
||||||
G_TYPE_STRING, 0);
|
G_TYPE_BOOLEAN, 0);
|
||||||
|
|
||||||
signals[RUN] =
|
signals[RUN] =
|
||||||
g_signal_new ("run",
|
g_signal_new ("run",
|
||||||
|
@ -495,6 +515,20 @@ moo_app_set_property (GObject *object,
|
||||||
app->priv->use_python_console = g_value_get_boolean (value);
|
app->priv->use_python_console = g_value_get_boolean (value);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case PROP_NEW_APP:
|
||||||
|
app->priv->new_app = g_value_get_boolean (value);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_OPEN_FILES:
|
||||||
|
g_strfreev (app->priv->open_files);
|
||||||
|
app->priv->open_files = g_strdupv (g_value_get_pointer (value));
|
||||||
|
if (app->priv->open_files && !*app->priv->open_files)
|
||||||
|
{
|
||||||
|
g_strfreev (app->priv->open_files);
|
||||||
|
app->priv->open_files = NULL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
}
|
}
|
||||||
|
@ -849,6 +883,49 @@ moo_app_init_real (MooApp *app)
|
||||||
MooUIXML *ui_xml;
|
MooUIXML *ui_xml;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
|
||||||
|
if (!app->priv->new_app)
|
||||||
|
{
|
||||||
|
char **p;
|
||||||
|
GString *msg = g_string_new (NULL);
|
||||||
|
|
||||||
|
if (!app->priv->open_files || !*(app->priv->open_files))
|
||||||
|
g_string_append_len (msg, CMD_PRESENT, strlen (CMD_PRESENT) + 1);
|
||||||
|
|
||||||
|
for (p = app->priv->open_files; p && *p; ++p)
|
||||||
|
{
|
||||||
|
char *freeme = NULL;
|
||||||
|
const char *basename, *filename;
|
||||||
|
|
||||||
|
basename = *p;
|
||||||
|
|
||||||
|
if (g_path_is_absolute (basename))
|
||||||
|
{
|
||||||
|
filename = basename;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char *dir = g_get_current_dir ();
|
||||||
|
freeme = g_build_filename (dir, basename, NULL);
|
||||||
|
filename = freeme;
|
||||||
|
g_free (dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_string_append_len (msg, CMD_OPEN_FILE, strlen (CMD_OPEN_FILE));
|
||||||
|
g_string_append_len (msg, filename, strlen (filename) + 1);
|
||||||
|
|
||||||
|
g_free (freeme);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (moo_app_send_msg (app, msg->str, msg->len))
|
||||||
|
{
|
||||||
|
g_string_free (msg, TRUE);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_string_free (msg, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
app->priv->new_app = TRUE;
|
||||||
gdk_set_program_class (app->priv->info->full_name);
|
gdk_set_program_class (app->priv->info->full_name);
|
||||||
|
|
||||||
#ifdef __WIN32__
|
#ifdef __WIN32__
|
||||||
|
@ -939,6 +1016,10 @@ moo_app_init_real (MooApp *app)
|
||||||
start_io (app);
|
start_io (app);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
app->priv->new_app = FALSE;
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1047,14 +1128,37 @@ static gboolean on_gtk_main_quit (MooApp *app)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int moo_app_run_real (MooApp *app)
|
static int
|
||||||
|
moo_app_run_real (MooApp *app)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (!app->priv->running, 0);
|
g_return_val_if_fail (!app->priv->running, 0);
|
||||||
app->priv->running = TRUE;
|
app->priv->running = TRUE;
|
||||||
|
|
||||||
|
if (!app->priv->new_app)
|
||||||
|
return 0;
|
||||||
|
|
||||||
app->priv->quit_handler_id =
|
app->priv->quit_handler_id =
|
||||||
gtk_quit_add (0, (GtkFunction) on_gtk_main_quit, app);
|
gtk_quit_add (0, (GtkFunction) on_gtk_main_quit, app);
|
||||||
|
|
||||||
|
if (app->priv->open_files)
|
||||||
|
{
|
||||||
|
char **file;
|
||||||
|
MooEditor *editor;
|
||||||
|
MooEditWindow *window;
|
||||||
|
|
||||||
|
editor = moo_app_get_editor (app);
|
||||||
|
window = moo_editor_get_active_window (editor);
|
||||||
|
|
||||||
|
if (!window)
|
||||||
|
window = moo_editor_new_window (editor);
|
||||||
|
|
||||||
|
for (file = app->priv->open_files; file && *file; ++file)
|
||||||
|
moo_editor_open_file (editor, window, NULL, *file, NULL);
|
||||||
|
|
||||||
|
g_strfreev (app->priv->open_files);
|
||||||
|
app->priv->open_files = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
gtk_main ();
|
gtk_main ();
|
||||||
|
|
||||||
return app->priv->exit_code;
|
return app->priv->exit_code;
|
||||||
|
@ -1155,19 +1259,23 @@ static void moo_app_quit_real (MooApp *app)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void moo_app_init (MooApp *app)
|
gboolean
|
||||||
|
moo_app_init (MooApp *app)
|
||||||
{
|
{
|
||||||
g_return_if_fail (MOO_IS_APP (app));
|
gboolean retval;
|
||||||
|
g_return_val_if_fail (MOO_IS_APP (app), FALSE);
|
||||||
MOO_APP_GET_CLASS(app)->init (app);
|
g_signal_emit (app, signals[INIT], 0, &retval);
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int moo_app_run (MooApp *app)
|
int
|
||||||
|
moo_app_run (MooApp *app)
|
||||||
{
|
{
|
||||||
|
int retval;
|
||||||
g_return_val_if_fail (MOO_IS_APP (app), -1);
|
g_return_val_if_fail (MOO_IS_APP (app), -1);
|
||||||
|
g_signal_emit (app, signals[RUN], 0, &retval);
|
||||||
return MOO_APP_GET_CLASS(app)->run (app);
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -87,7 +87,7 @@ GType moo_app_window_policy_get_type (void) G_GNUC_CONST;
|
||||||
|
|
||||||
MooApp *moo_app_get_instance (void);
|
MooApp *moo_app_get_instance (void);
|
||||||
|
|
||||||
void moo_app_init (MooApp *app);
|
gboolean moo_app_init (MooApp *app);
|
||||||
int moo_app_run (MooApp *app);
|
int moo_app_run (MooApp *app);
|
||||||
gboolean moo_app_quit (MooApp *app);
|
gboolean moo_app_quit (MooApp *app);
|
||||||
|
|
||||||
|
|
|
@ -78,6 +78,8 @@ enum {
|
||||||
COMMENT,
|
COMMENT,
|
||||||
UNCOMMENT,
|
UNCOMMENT,
|
||||||
VARIABLE_CHANGED,
|
VARIABLE_CHANGED,
|
||||||
|
SAVE_BEFORE,
|
||||||
|
SAVE_AFTER,
|
||||||
LAST_SIGNAL
|
LAST_SIGNAL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -163,6 +165,24 @@ moo_edit_class_init (MooEditClass *klass)
|
||||||
_moo_marshal_VOID__VOID,
|
_moo_marshal_VOID__VOID,
|
||||||
G_TYPE_NONE, 0);
|
G_TYPE_NONE, 0);
|
||||||
|
|
||||||
|
signals[SAVE_BEFORE] =
|
||||||
|
g_signal_new ("save-before",
|
||||||
|
G_OBJECT_CLASS_TYPE (klass),
|
||||||
|
G_SIGNAL_RUN_FIRST,
|
||||||
|
G_STRUCT_OFFSET (MooEditClass, save_before),
|
||||||
|
NULL, NULL,
|
||||||
|
_moo_marshal_VOID__VOID,
|
||||||
|
G_TYPE_NONE, 0);
|
||||||
|
|
||||||
|
signals[SAVE_AFTER] =
|
||||||
|
g_signal_new ("save-after",
|
||||||
|
G_OBJECT_CLASS_TYPE (klass),
|
||||||
|
G_SIGNAL_RUN_FIRST,
|
||||||
|
G_STRUCT_OFFSET (MooEditClass, save_after),
|
||||||
|
NULL, NULL,
|
||||||
|
_moo_marshal_VOID__VOID,
|
||||||
|
G_TYPE_NONE, 0);
|
||||||
|
|
||||||
/* TODO: this is wrong */
|
/* TODO: this is wrong */
|
||||||
_moo_edit_set_default_settings ();
|
_moo_edit_set_default_settings ();
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,16 +87,19 @@ struct _MooEditClass
|
||||||
|
|
||||||
/* emitted when filename, modified status, or file on disk
|
/* emitted when filename, modified status, or file on disk
|
||||||
are changed. for use in editor to adjust title bar, etc. */
|
are changed. for use in editor to adjust title bar, etc. */
|
||||||
void (* doc_status_changed) (MooEdit *edit);
|
void (* doc_status_changed) (MooEdit *edit);
|
||||||
|
|
||||||
void (* filename_changed) (MooEdit *edit,
|
void (* filename_changed) (MooEdit *edit,
|
||||||
const char *new_filename);
|
const char *new_filename);
|
||||||
|
|
||||||
void (* lang_changed) (MooEdit *edit);
|
void (* lang_changed) (MooEdit *edit);
|
||||||
|
|
||||||
void (* variable_changed) (MooEdit *edit,
|
void (* variable_changed) (MooEdit *edit,
|
||||||
const char *variable,
|
const char *variable,
|
||||||
const char *value);
|
const char *value);
|
||||||
|
|
||||||
|
void (* save_before) (MooEdit *edit);
|
||||||
|
void (* save_after) (MooEdit *edit);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -274,8 +274,9 @@ _moo_text_view_move_cursor (GtkTextView *text_view,
|
||||||
GtkTextBuffer *buffer;
|
GtkTextBuffer *buffer;
|
||||||
GtkTextMark *insert;
|
GtkTextMark *insert;
|
||||||
GtkTextIter iter;
|
GtkTextIter iter;
|
||||||
|
MooTextView *view = MOO_TEXT_VIEW (text_view);
|
||||||
|
|
||||||
if (!text_view->cursor_visible)
|
if (!text_view->cursor_visible && !view->priv->overwrite_mode)
|
||||||
return GTK_TEXT_VIEW_CLASS (parent_class())->move_cursor (text_view, step, count, extend_selection);
|
return GTK_TEXT_VIEW_CLASS (parent_class())->move_cursor (text_view, step, count, extend_selection);
|
||||||
|
|
||||||
buffer = gtk_text_view_get_buffer (text_view);
|
buffer = gtk_text_view_get_buffer (text_view);
|
||||||
|
@ -293,10 +294,31 @@ _moo_text_view_move_cursor (GtkTextView *text_view,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return GTK_TEXT_VIEW_CLASS (parent_class())->move_cursor (text_view, step, count, extend_selection);
|
if (view->priv->overwrite_mode)
|
||||||
|
gtk_text_view_set_cursor_visible (text_view, TRUE);
|
||||||
|
GTK_TEXT_VIEW_CLASS (parent_class())->move_cursor (text_view, step, count, extend_selection);
|
||||||
|
if (view->priv->overwrite_mode)
|
||||||
|
gtk_text_view_set_cursor_visible (text_view, FALSE);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
move_cursor_to (text_view, &iter, extend_selection);
|
move_cursor_to (text_view, &iter, extend_selection);
|
||||||
|
_moo_text_view_pend_cursor_blink (view);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
_moo_text_view_page_horizontally (GtkTextView *text_view,
|
||||||
|
int count,
|
||||||
|
gboolean extend_selection)
|
||||||
|
{
|
||||||
|
MooTextView *view = MOO_TEXT_VIEW (text_view);
|
||||||
|
if (view->priv->overwrite_mode)
|
||||||
|
gtk_text_view_set_cursor_visible (text_view, TRUE);
|
||||||
|
GTK_TEXT_VIEW_CLASS (parent_class())->page_horizontally (text_view, count, extend_selection);
|
||||||
|
if (view->priv->overwrite_mode)
|
||||||
|
gtk_text_view_set_cursor_visible (text_view, FALSE);
|
||||||
|
_moo_text_view_pend_cursor_blink (view);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -943,6 +965,7 @@ _moo_text_view_key_press_event (GtkWidget *widget,
|
||||||
view->priv->in_key_press = FALSE;
|
view->priv->in_key_press = FALSE;
|
||||||
|
|
||||||
_moo_text_view_check_char_inserted (view);
|
_moo_text_view_check_char_inserted (view);
|
||||||
|
_moo_text_view_pend_cursor_blink (view);
|
||||||
|
|
||||||
return handled;
|
return handled;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1376,6 +1376,7 @@ do_save (MooEditor *editor,
|
||||||
const char *encoding,
|
const char *encoding,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
|
gboolean result;
|
||||||
gboolean strip_whitespace = FALSE;
|
gboolean strip_whitespace = FALSE;
|
||||||
const char *var;
|
const char *var;
|
||||||
|
|
||||||
|
@ -1390,8 +1391,12 @@ do_save (MooEditor *editor,
|
||||||
if (strip_whitespace)
|
if (strip_whitespace)
|
||||||
moo_text_view_strip_whitespace (MOO_TEXT_VIEW (doc));
|
moo_text_view_strip_whitespace (MOO_TEXT_VIEW (doc));
|
||||||
|
|
||||||
return moo_edit_saver_save (saver, doc, filename, encoding,
|
g_signal_emit_by_name (doc, "save-before");
|
||||||
moo_editor_get_save_flags (editor), error);
|
result = moo_edit_saver_save (saver, doc, filename, encoding,
|
||||||
|
moo_editor_get_save_flags (editor), error);
|
||||||
|
g_signal_emit_by_name (doc, "save-after");
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -200,7 +200,7 @@ apply_tag (MooHighlighter *hl,
|
||||||
|
|
||||||
if (tag)
|
if (tag)
|
||||||
{
|
{
|
||||||
line->hl_info->tags = g_slist_prepend (line->hl_info->tags, tag);
|
line->hl_info->tags = g_slist_prepend (line->hl_info->tags, g_object_ref (tag));
|
||||||
hl->last_tag = tag;
|
hl->last_tag = tag;
|
||||||
_moo_text_buffer_apply_syntax_tag (MOO_TEXT_BUFFER (hl->buffer), tag, start, end);
|
_moo_text_buffer_apply_syntax_tag (MOO_TEXT_BUFFER (hl->buffer), tag, start, end);
|
||||||
}
|
}
|
||||||
|
@ -450,6 +450,7 @@ hl_compute_line (MooHighlighter *hl,
|
||||||
while (tags)
|
while (tags)
|
||||||
{
|
{
|
||||||
gtk_text_buffer_remove_tag (hl->buffer, tags->data, &start, &end);
|
gtk_text_buffer_remove_tag (hl->buffer, tags->data, &start, &end);
|
||||||
|
g_object_unref (tags->data);
|
||||||
tags = g_slist_delete_link (tags, tags);
|
tags = g_slist_delete_link (tags, tags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -820,6 +821,7 @@ moo_highlighter_apply_tags (MooHighlighter *hl,
|
||||||
while (tags)
|
while (tags)
|
||||||
{
|
{
|
||||||
gtk_text_buffer_remove_tag (hl->buffer, tags->data, &t_start, &t_end);
|
gtk_text_buffer_remove_tag (hl->buffer, tags->data, &t_start, &t_end);
|
||||||
|
g_object_unref (tags->data);
|
||||||
tags = g_slist_delete_link (tags, tags);
|
tags = g_slist_delete_link (tags, tags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -853,7 +853,7 @@ lang_mgr_get_lang_for_bak_filename (MooLangMgr *mgr,
|
||||||
|
|
||||||
if (base)
|
if (base)
|
||||||
{
|
{
|
||||||
char *opsys_name = g_filename_from_utf8 (utf8_name, len, NULL, NULL, NULL);
|
char *opsys_name = g_filename_from_utf8 (base, len, NULL, NULL, NULL);
|
||||||
|
|
||||||
if (opsys_name)
|
if (opsys_name)
|
||||||
lang = moo_lang_mgr_get_lang_for_filename (mgr, opsys_name);
|
lang = moo_lang_mgr_get_lang_for_filename (mgr, opsys_name);
|
||||||
|
|
|
@ -218,6 +218,7 @@ hl_info_free (HLInfo *info)
|
||||||
{
|
{
|
||||||
#ifdef __MOO__
|
#ifdef __MOO__
|
||||||
g_free (info->segments);
|
g_free (info->segments);
|
||||||
|
g_slist_foreach (info->tags, (GFunc) g_object_unref, NULL);
|
||||||
g_slist_free (info->tags);
|
g_slist_free (info->tags);
|
||||||
hl_info_free__ (info);
|
hl_info_free__ (info);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -57,6 +57,9 @@ void _moo_text_view_move_cursor (GtkTextView *text_view,
|
||||||
GtkMovementStep step,
|
GtkMovementStep step,
|
||||||
gint count,
|
gint count,
|
||||||
gboolean extend_selection);
|
gboolean extend_selection);
|
||||||
|
void _moo_text_view_page_horizontally (GtkTextView *text_view,
|
||||||
|
int count,
|
||||||
|
gboolean extend_selection);
|
||||||
void _moo_text_view_delete_from_cursor (GtkTextView *text_view,
|
void _moo_text_view_delete_from_cursor (GtkTextView *text_view,
|
||||||
GtkDeleteType type,
|
GtkDeleteType type,
|
||||||
gint count);
|
gint count);
|
||||||
|
@ -76,6 +79,7 @@ int _moo_text_view_extend_selection (MooTextView *view,
|
||||||
GtkTextIter *selection_bound);
|
GtkTextIter *selection_bound);
|
||||||
|
|
||||||
void _moo_text_view_check_char_inserted (MooTextView *view);
|
void _moo_text_view_check_char_inserted (MooTextView *view);
|
||||||
|
void _moo_text_view_pend_cursor_blink (MooTextView *view);
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -91,6 +95,12 @@ struct _MooTextViewPrivate {
|
||||||
/* Clipboard */
|
/* Clipboard */
|
||||||
gboolean manage_clipboard;
|
gboolean manage_clipboard;
|
||||||
|
|
||||||
|
/* Overwrite mode cursor */
|
||||||
|
gboolean overwrite_mode;
|
||||||
|
gboolean saved_cursor_visible;
|
||||||
|
gboolean cursor_visible;
|
||||||
|
guint blink_timeout;
|
||||||
|
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
/* Drawing
|
/* Drawing
|
||||||
/*/
|
/*/
|
||||||
|
|
|
@ -46,6 +46,10 @@ static void moo_text_view_realize (GtkWidget *widget);
|
||||||
static void moo_text_view_unrealize (GtkWidget *widget);
|
static void moo_text_view_unrealize (GtkWidget *widget);
|
||||||
static gboolean moo_text_view_expose (GtkWidget *widget,
|
static gboolean moo_text_view_expose (GtkWidget *widget,
|
||||||
GdkEventExpose *event);
|
GdkEventExpose *event);
|
||||||
|
static gboolean moo_text_view_focus_in (GtkWidget *widget,
|
||||||
|
GdkEventFocus *event);
|
||||||
|
static gboolean moo_text_view_focus_out (GtkWidget *widget,
|
||||||
|
GdkEventFocus *event);
|
||||||
|
|
||||||
static void moo_text_view_cut_clipboard (GtkTextView *text_view);
|
static void moo_text_view_cut_clipboard (GtkTextView *text_view);
|
||||||
static void moo_text_view_paste_clipboard (GtkTextView *text_view);
|
static void moo_text_view_paste_clipboard (GtkTextView *text_view);
|
||||||
|
@ -89,6 +93,11 @@ static void highlighting_changed (GtkTextView *view,
|
||||||
const GtkTextIter *start,
|
const GtkTextIter *start,
|
||||||
const GtkTextIter *end);
|
const GtkTextIter *end);
|
||||||
|
|
||||||
|
static void overwrite_changed (MooTextView *view);
|
||||||
|
static void check_cursor_blink (MooTextView *view);
|
||||||
|
static void moo_text_view_draw_cursor (GtkTextView *view,
|
||||||
|
GdkEventExpose *event);
|
||||||
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
DELETE_SELECTION,
|
DELETE_SELECTION,
|
||||||
|
@ -148,6 +157,8 @@ static void moo_text_view_class_init (MooTextViewClass *klass)
|
||||||
widget_class->realize = moo_text_view_realize;
|
widget_class->realize = moo_text_view_realize;
|
||||||
widget_class->unrealize = moo_text_view_unrealize;
|
widget_class->unrealize = moo_text_view_unrealize;
|
||||||
widget_class->expose_event = moo_text_view_expose;
|
widget_class->expose_event = moo_text_view_expose;
|
||||||
|
widget_class->focus_in_event = moo_text_view_focus_in;
|
||||||
|
widget_class->focus_out_event = moo_text_view_focus_out;
|
||||||
#if 0
|
#if 0
|
||||||
widget_class->drag_data_received = _moo_text_view_drag_data_received;
|
widget_class->drag_data_received = _moo_text_view_drag_data_received;
|
||||||
widget_class->drag_drop = _moo_text_view_drag_drop;
|
widget_class->drag_drop = _moo_text_view_drag_drop;
|
||||||
|
@ -156,6 +167,7 @@ static void moo_text_view_class_init (MooTextViewClass *klass)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
text_view_class->move_cursor = _moo_text_view_move_cursor;
|
text_view_class->move_cursor = _moo_text_view_move_cursor;
|
||||||
|
text_view_class->page_horizontally = _moo_text_view_page_horizontally;
|
||||||
text_view_class->delete_from_cursor = _moo_text_view_delete_from_cursor;
|
text_view_class->delete_from_cursor = _moo_text_view_delete_from_cursor;
|
||||||
text_view_class->cut_clipboard = moo_text_view_cut_clipboard;
|
text_view_class->cut_clipboard = moo_text_view_cut_clipboard;
|
||||||
text_view_class->paste_clipboard = moo_text_view_paste_clipboard;
|
text_view_class->paste_clipboard = moo_text_view_paste_clipboard;
|
||||||
|
@ -459,6 +471,8 @@ moo_text_view_constructor (GType type,
|
||||||
view->priv->dnd_mark = gtk_text_buffer_create_mark (get_buffer (view), NULL, &iter, FALSE);
|
view->priv->dnd_mark = gtk_text_buffer_create_mark (get_buffer (view), NULL, &iter, FALSE);
|
||||||
gtk_text_mark_set_visible (view->priv->dnd_mark, FALSE);
|
gtk_text_mark_set_visible (view->priv->dnd_mark, FALSE);
|
||||||
|
|
||||||
|
g_signal_connect (view, "notify::overwrite", G_CALLBACK (overwrite_changed), NULL);
|
||||||
|
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1269,6 +1283,13 @@ moo_text_view_unrealize (GtkWidget *widget)
|
||||||
add_selection_clipboard (view);
|
add_selection_clipboard (view);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (view->priv->blink_timeout)
|
||||||
|
{
|
||||||
|
g_warning ("%s: oops", G_STRLOC);
|
||||||
|
g_source_remove (view->priv->blink_timeout);
|
||||||
|
view->priv->blink_timeout = 0;
|
||||||
|
}
|
||||||
|
|
||||||
GTK_WIDGET_CLASS(moo_text_view_parent_class)->unrealize (widget);
|
GTK_WIDGET_CLASS(moo_text_view_parent_class)->unrealize (widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1472,6 +1493,9 @@ moo_text_view_expose (GtkWidget *widget,
|
||||||
if (event->window == text_window && view->priv->draw_trailing_spaces)
|
if (event->window == text_window && view->priv->draw_trailing_spaces)
|
||||||
moo_text_view_draw_trailing_spaces (text_view, event, &start, &end);
|
moo_text_view_draw_trailing_spaces (text_view, event, &start, &end);
|
||||||
|
|
||||||
|
if (event->window == text_window && view->priv->cursor_visible)
|
||||||
|
moo_text_view_draw_cursor (text_view, event);
|
||||||
|
|
||||||
return handled;
|
return handled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1764,3 +1788,223 @@ moo_text_view_populate_popup (GtkTextView *text_view,
|
||||||
g_signal_connect_swapped (item, "activate", G_CALLBACK (moo_text_view_undo), view);
|
g_signal_connect_swapped (item, "activate", G_CALLBACK (moo_text_view_undo), view);
|
||||||
gtk_widget_set_sensitive (item, moo_text_view_can_undo (view));
|
gtk_widget_set_sensitive (item, moo_text_view_can_undo (view));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
overwrite_changed (MooTextView *view)
|
||||||
|
{
|
||||||
|
GtkTextView *text_view;
|
||||||
|
|
||||||
|
text_view = GTK_TEXT_VIEW (view);
|
||||||
|
|
||||||
|
if (text_view->overwrite_mode)
|
||||||
|
{
|
||||||
|
view->priv->saved_cursor_visible = text_view->cursor_visible != 0;
|
||||||
|
gtk_text_view_set_cursor_visible (text_view, FALSE);
|
||||||
|
view->priv->overwrite_mode = TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gtk_text_view_set_cursor_visible (text_view,
|
||||||
|
view->priv->saved_cursor_visible);
|
||||||
|
view->priv->overwrite_mode = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
check_cursor_blink (view);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
moo_text_view_focus_in (GtkWidget *widget,
|
||||||
|
GdkEventFocus *event)
|
||||||
|
{
|
||||||
|
gboolean ret;
|
||||||
|
ret = GTK_WIDGET_CLASS(moo_text_view_parent_class)->focus_in_event (widget, event);
|
||||||
|
check_cursor_blink (MOO_TEXT_VIEW (widget));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
moo_text_view_focus_out (GtkWidget *widget,
|
||||||
|
GdkEventFocus *event)
|
||||||
|
{
|
||||||
|
gboolean ret;
|
||||||
|
ret = GTK_WIDGET_CLASS(moo_text_view_parent_class)->focus_out_event (widget, event);
|
||||||
|
check_cursor_blink (MOO_TEXT_VIEW (widget));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define CURSOR_ON_MULTIPLIER 0.66
|
||||||
|
#define CURSOR_OFF_MULTIPLIER 0.34
|
||||||
|
#define CURSOR_PEND_MULTIPLIER 0.5
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
get_cursor_rectangle (GtkTextView *view,
|
||||||
|
GdkRectangle *cursor_rect)
|
||||||
|
{
|
||||||
|
GtkTextIter iter;
|
||||||
|
GdkRectangle visible_rect;
|
||||||
|
GtkTextBuffer *buffer;
|
||||||
|
GtkTextMark *insert;
|
||||||
|
|
||||||
|
buffer = gtk_text_view_get_buffer (view);
|
||||||
|
insert = gtk_text_buffer_get_insert (buffer);
|
||||||
|
gtk_text_buffer_get_iter_at_mark (buffer, &iter, insert);
|
||||||
|
|
||||||
|
gtk_text_view_get_iter_location (view, &iter, cursor_rect);
|
||||||
|
gtk_text_view_get_visible_rect (view, &visible_rect);
|
||||||
|
|
||||||
|
if (gtk_text_iter_ends_line (&iter))
|
||||||
|
cursor_rect->width = 6;
|
||||||
|
|
||||||
|
if (gdk_rectangle_intersect (cursor_rect, &visible_rect, cursor_rect))
|
||||||
|
{
|
||||||
|
gtk_text_view_buffer_to_window_coords (view, GTK_TEXT_WINDOW_TEXT,
|
||||||
|
cursor_rect->x, cursor_rect->y,
|
||||||
|
&cursor_rect->x, &cursor_rect->y);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
moo_text_view_draw_cursor (GtkTextView *view,
|
||||||
|
GdkEventExpose *event)
|
||||||
|
{
|
||||||
|
GdkRectangle cursor_rect;
|
||||||
|
|
||||||
|
if (!get_cursor_rectangle (view, &cursor_rect))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!gdk_rectangle_intersect (&cursor_rect, &event->area, &cursor_rect))
|
||||||
|
return;
|
||||||
|
|
||||||
|
gdk_draw_rectangle (event->window,
|
||||||
|
GTK_WIDGET(view)->style->text_gc[GTK_STATE_NORMAL],
|
||||||
|
TRUE,
|
||||||
|
cursor_rect.x,
|
||||||
|
cursor_rect.y,
|
||||||
|
cursor_rect.width,
|
||||||
|
cursor_rect.height);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
invalidate_cursor (GtkTextView *view)
|
||||||
|
{
|
||||||
|
GdkRectangle rect;
|
||||||
|
|
||||||
|
if (get_cursor_rectangle (view, &rect))
|
||||||
|
{
|
||||||
|
GdkWindow *window = gtk_text_view_get_window (view, GTK_TEXT_WINDOW_TEXT);
|
||||||
|
g_return_if_fail (window != NULL);
|
||||||
|
gdk_window_invalidate_rect (window, &rect, FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
cursor_blinks (GtkWidget *widget)
|
||||||
|
{
|
||||||
|
gboolean blink;
|
||||||
|
GtkSettings *settings = gtk_widget_get_settings (widget);
|
||||||
|
g_object_get (settings, "gtk-cursor-blink", &blink, NULL);
|
||||||
|
return blink;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
get_cursor_time (GtkWidget *widget)
|
||||||
|
{
|
||||||
|
int time;
|
||||||
|
GtkSettings *settings = gtk_widget_get_settings (widget);
|
||||||
|
g_object_get (settings, "gtk-cursor-blink-time", &time, NULL);
|
||||||
|
return time;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
blink_cb (MooTextView *view)
|
||||||
|
{
|
||||||
|
GtkTextView *text_view = GTK_TEXT_VIEW (view);
|
||||||
|
int time;
|
||||||
|
|
||||||
|
g_return_val_if_fail (view->priv->overwrite_mode, FALSE);
|
||||||
|
|
||||||
|
time = get_cursor_time (GTK_WIDGET (view));
|
||||||
|
|
||||||
|
if (view->priv->cursor_visible)
|
||||||
|
time *= CURSOR_OFF_MULTIPLIER;
|
||||||
|
else
|
||||||
|
time *= CURSOR_ON_MULTIPLIER;
|
||||||
|
|
||||||
|
view->priv->blink_timeout = g_timeout_add (time, (GSourceFunc) blink_cb, view);
|
||||||
|
view->priv->cursor_visible = !view->priv->cursor_visible;
|
||||||
|
invalidate_cursor (text_view);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
stop_cursor_blink (MooTextView *view)
|
||||||
|
{
|
||||||
|
if (view->priv->blink_timeout)
|
||||||
|
{
|
||||||
|
g_source_remove (view->priv->blink_timeout);
|
||||||
|
view->priv->blink_timeout = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
check_cursor_blink (MooTextView *view)
|
||||||
|
{
|
||||||
|
GtkTextView *text_view = GTK_TEXT_VIEW (view);
|
||||||
|
|
||||||
|
if (view->priv->overwrite_mode && GTK_WIDGET_HAS_FOCUS (view))
|
||||||
|
{
|
||||||
|
if (cursor_blinks (GTK_WIDGET (view)))
|
||||||
|
{
|
||||||
|
if (!view->priv->blink_timeout)
|
||||||
|
{
|
||||||
|
int time = get_cursor_time (GTK_WIDGET (view)) * CURSOR_OFF_MULTIPLIER;
|
||||||
|
view->priv->cursor_visible = TRUE;
|
||||||
|
view->priv->blink_timeout = g_timeout_add (time, (GSourceFunc) blink_cb, view);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
view->priv->cursor_visible = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
view->priv->cursor_visible = FALSE;
|
||||||
|
stop_cursor_blink (view);
|
||||||
|
if (GTK_WIDGET_DRAWABLE (text_view))
|
||||||
|
invalidate_cursor (text_view);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_moo_text_view_pend_cursor_blink (MooTextView *view)
|
||||||
|
{
|
||||||
|
if (view->priv->overwrite_mode &&
|
||||||
|
GTK_WIDGET_HAS_FOCUS (view) &&
|
||||||
|
cursor_blinks (GTK_WIDGET (view)))
|
||||||
|
{
|
||||||
|
int time;
|
||||||
|
|
||||||
|
if (view->priv->blink_timeout != 0)
|
||||||
|
{
|
||||||
|
g_source_remove (view->priv->blink_timeout);
|
||||||
|
view->priv->blink_timeout = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
view->priv->cursor_visible = TRUE;
|
||||||
|
|
||||||
|
time = get_cursor_time (GTK_WIDGET (view)) * CURSOR_PEND_MULTIPLIER;
|
||||||
|
view->priv->blink_timeout = g_timeout_add (time, (GSourceFunc) blink_cb, view);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -5,13 +5,16 @@ noinst_PROGRAMS =
|
||||||
|
|
||||||
EXTRA_DIST += \
|
EXTRA_DIST += \
|
||||||
tests/pyapp.py.in \
|
tests/pyapp.py.in \
|
||||||
tests/medit-ui.xml
|
tests/medit-ui.xml \
|
||||||
|
tests/medit-app.opag
|
||||||
|
|
||||||
BUILT_SOURCES += medit-ui.h
|
BUILT_SOURCES += medit-ui.h tests/medit-app.c
|
||||||
medit-ui.h: tests/medit-ui.xml
|
medit-ui.h: tests/medit-ui.xml
|
||||||
sh $(srcdir)/moo/mooutils/xml2h.sh MEDIT_UI $(srcdir)/tests/medit-ui.xml > medit-ui.h
|
sh $(srcdir)/moo/mooutils/xml2h.sh MEDIT_UI $(srcdir)/tests/medit-ui.xml > medit-ui.h
|
||||||
|
tests/medit-app.c: tests/medit-app.opag
|
||||||
|
opag -f _medit_parse_options -O _medit_opt_ -A _medit_arg_ $(srcdir)/tests/medit-app.opag $(srcdir)/tests/medit-app.c
|
||||||
|
|
||||||
all-am: tests/pyapp.py medit-ui.h
|
all-am: tests/pyapp.py
|
||||||
|
|
||||||
if MOO_BUILD_APP
|
if MOO_BUILD_APP
|
||||||
medit = medit
|
medit = medit
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
|
/* This file has been generated with opag 0.8.0. */
|
||||||
/*
|
/*
|
||||||
* tests/editor.c.in
|
* medit-app.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2004-2005 by Yevgen Muntyan <muntyan@math.tamu.edu>
|
* Copyright (C) 2004-2005 by Yevgen Muntyan <muntyan@math.tamu.edu>
|
||||||
*
|
*
|
||||||
|
@ -11,40 +12,337 @@
|
||||||
* See COPYING file that comes with this distribution.
|
* See COPYING file that comes with this distribution.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "mooapp/mooapp.h"
|
#include "config.h"
|
||||||
#include "medit-ui.h"
|
#include "medit-ui.h"
|
||||||
|
#include <mooapp/mooapp.h>
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
|
int _medit_parse_options (const char *const program_name,
|
||||||
|
const int argc,
|
||||||
|
char **const argv);
|
||||||
|
|
||||||
|
/********************************************************
|
||||||
|
* command line parsing code generated by Opag
|
||||||
|
* http://www.zero-based.org/software/opag/
|
||||||
|
*/
|
||||||
|
#ifndef STR_ERR_UNKNOWN_LONG_OPT
|
||||||
|
# define STR_ERR_UNKNOWN_LONG_OPT "%s: unrecognized option `--%s'\n"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STR_ERR_LONG_OPT_AMBIGUOUS
|
||||||
|
# define STR_ERR_LONG_OPT_AMBIGUOUS "%s: option `--%s' is ambiguous\n"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STR_ERR_MISSING_ARG_LONG
|
||||||
|
# define STR_ERR_MISSING_ARG_LONG "%s: option `--%s' requires an argument\n"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STR_ERR_UNEXPEC_ARG_LONG
|
||||||
|
# define STR_ERR_UNEXPEC_ARG_LONG "%s: option `--%s' doesn't allow an argument\n"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STR_ERR_UNKNOWN_SHORT_OPT
|
||||||
|
# define STR_ERR_UNKNOWN_SHORT_OPT "%s: unrecognized option `-%c'\n"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STR_ERR_MISSING_ARG_SHORT
|
||||||
|
# define STR_ERR_MISSING_ARG_SHORT "%s: option `-%c' requires an argument\n"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define STR_HELP_NEW_APP "\
|
||||||
|
-n, --new-app Run new instance of application\n"
|
||||||
|
|
||||||
|
#define STR_HELP_LOG "\
|
||||||
|
-l, --log[=FILE] Show debug output or write it to FILE\n"
|
||||||
|
|
||||||
|
#define STR_HELP_LOG_PYTHON "\
|
||||||
|
-p, --log-python Redirect output to python console\n"
|
||||||
|
|
||||||
|
#define STR_HELP_VERSION "\
|
||||||
|
--version Display version information and exit\n"
|
||||||
|
|
||||||
|
#define STR_HELP_HELP "\
|
||||||
|
-h, --help Display this help text and exit\n"
|
||||||
|
|
||||||
|
#define STR_HELP "\
|
||||||
|
-n, --new-app Run new instance of application\n\
|
||||||
|
-l, --log[=FILE] Show debug output or write it to FILE\n\
|
||||||
|
-p, --log-python Redirect output to python console\n\
|
||||||
|
--version Display version information and exit\n\
|
||||||
|
-h, --help Display this help text and exit\n"
|
||||||
|
|
||||||
|
/* Set to 1 if option --new-app (-n) has been specified. */
|
||||||
|
char _medit_opt_new_app;
|
||||||
|
|
||||||
|
#ifdef __WIN32__
|
||||||
|
/* Set to 1 if option --log (-l) has been specified. */
|
||||||
|
char _medit_opt_log;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MOO_USE_PYTHON
|
||||||
|
/* Set to 1 if option --log-python (-p) has been specified. */
|
||||||
|
char _medit_opt_log_python;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Set to 1 if option --version has been specified. */
|
||||||
|
char _medit_opt_version;
|
||||||
|
|
||||||
|
/* Set to 1 if option --help (-h) has been specified. */
|
||||||
|
char _medit_opt_help;
|
||||||
|
|
||||||
|
#ifdef __WIN32__
|
||||||
|
/* Argument to option --log (-l), or a null pointer if no argument. */
|
||||||
|
const char *_medit_arg_log;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Parse command line options. Return index of first non-option argument,
|
||||||
|
or -1 if an error is encountered. */
|
||||||
|
int _medit_parse_options (const char *const program_name, const int argc, char **const argv)
|
||||||
|
{
|
||||||
|
static const char *const optstr__new_app = "new-app";
|
||||||
|
#ifdef MOO_USE_PYTHON
|
||||||
|
static const char *const optstr__log_python = "log-python";
|
||||||
|
#endif
|
||||||
|
static const char *const optstr__version = "version";
|
||||||
|
static const char *const optstr__help = "help";
|
||||||
|
int i = 0;
|
||||||
|
_medit_opt_new_app = 0;
|
||||||
|
#ifdef __WIN32__
|
||||||
|
_medit_opt_log = 0;
|
||||||
|
#endif
|
||||||
|
#ifdef MOO_USE_PYTHON
|
||||||
|
_medit_opt_log_python = 0;
|
||||||
|
#endif
|
||||||
|
_medit_opt_version = 0;
|
||||||
|
_medit_opt_help = 0;
|
||||||
|
#ifdef __WIN32__
|
||||||
|
_medit_arg_log = 0;
|
||||||
|
#endif
|
||||||
|
while (++i < argc)
|
||||||
|
{
|
||||||
|
const char *option = argv [i];
|
||||||
|
if (*option != '-')
|
||||||
|
return i;
|
||||||
|
else if (*++option == '\0')
|
||||||
|
return i;
|
||||||
|
else if (*option == '-')
|
||||||
|
{
|
||||||
|
const char *argument;
|
||||||
|
size_t option_len;
|
||||||
|
++option;
|
||||||
|
if ((argument = strchr (option, '=')) == option)
|
||||||
|
goto error_unknown_long_opt;
|
||||||
|
else if (argument == 0)
|
||||||
|
option_len = strlen (option);
|
||||||
|
else
|
||||||
|
option_len = argument++ - option;
|
||||||
|
switch (*option)
|
||||||
|
{
|
||||||
|
case '\0':
|
||||||
|
return i + 1;
|
||||||
|
case 'h':
|
||||||
|
if (strncmp (option + 1, optstr__help + 1, option_len - 1) == 0)
|
||||||
|
{
|
||||||
|
if (argument != 0)
|
||||||
|
{
|
||||||
|
option = optstr__help;
|
||||||
|
goto error_unexpec_arg_long;
|
||||||
|
}
|
||||||
|
_medit_opt_help = 1;
|
||||||
|
return i + 1;
|
||||||
|
}
|
||||||
|
goto error_unknown_long_opt;
|
||||||
|
case 'l':
|
||||||
|
#ifdef __WIN32__
|
||||||
|
if (strncmp (option + 1, "og", option_len - 1) == 0)
|
||||||
|
{
|
||||||
|
if (option_len < 3)
|
||||||
|
goto error_long_opt_ambiguous;
|
||||||
|
_medit_arg_log = argument;
|
||||||
|
_medit_opt_log = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef MOO_USE_PYTHON
|
||||||
|
if (strncmp (option + 1, optstr__log_python + 1, option_len - 1) == 0)
|
||||||
|
{
|
||||||
|
if (option_len <= 3)
|
||||||
|
goto error_long_opt_ambiguous;
|
||||||
|
if (argument != 0)
|
||||||
|
{
|
||||||
|
option = optstr__log_python;
|
||||||
|
goto error_unexpec_arg_long;
|
||||||
|
}
|
||||||
|
_medit_opt_log_python = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
goto error_unknown_long_opt;
|
||||||
|
case 'n':
|
||||||
|
if (strncmp (option + 1, optstr__new_app + 1, option_len - 1) == 0)
|
||||||
|
{
|
||||||
|
if (argument != 0)
|
||||||
|
{
|
||||||
|
option = optstr__new_app;
|
||||||
|
goto error_unexpec_arg_long;
|
||||||
|
}
|
||||||
|
_medit_opt_new_app = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
goto error_unknown_long_opt;
|
||||||
|
case 'v':
|
||||||
|
if (strncmp (option + 1, optstr__version + 1, option_len - 1) == 0)
|
||||||
|
{
|
||||||
|
if (argument != 0)
|
||||||
|
{
|
||||||
|
option = optstr__version;
|
||||||
|
goto error_unexpec_arg_long;
|
||||||
|
}
|
||||||
|
_medit_opt_version = 1;
|
||||||
|
return i + 1;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
error_unknown_long_opt:
|
||||||
|
fprintf (stderr, STR_ERR_UNKNOWN_LONG_OPT, program_name, option);
|
||||||
|
return -1;
|
||||||
|
error_long_opt_ambiguous:
|
||||||
|
fprintf (stderr, STR_ERR_LONG_OPT_AMBIGUOUS, program_name, option);
|
||||||
|
return -1;
|
||||||
|
error_unexpec_arg_long:
|
||||||
|
fprintf (stderr, STR_ERR_UNEXPEC_ARG_LONG, program_name, option);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
do
|
||||||
|
{
|
||||||
|
switch (*option)
|
||||||
|
{
|
||||||
|
case 'h':
|
||||||
|
_medit_opt_help = 1;
|
||||||
|
return i + 1;
|
||||||
|
#ifdef __WIN32__
|
||||||
|
case 'l':
|
||||||
|
if (option [1] != '\0')
|
||||||
|
{
|
||||||
|
_medit_arg_log = option + 1;
|
||||||
|
option = "\0";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
_medit_arg_log = 0;
|
||||||
|
_medit_opt_log = 1;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case 'n':
|
||||||
|
_medit_opt_new_app = 1;
|
||||||
|
break;
|
||||||
|
#ifdef MOO_USE_PYTHON
|
||||||
|
case 'p':
|
||||||
|
_medit_opt_log_python = 1;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
fprintf (stderr, STR_ERR_UNKNOWN_SHORT_OPT, program_name, *option);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} while (*++option != '\0');
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
/* end of generated code
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
static void usage (void)
|
||||||
|
{
|
||||||
|
g_print ("Usage: %s [OPTIONS] [FILES]\n", g_get_prgname ());
|
||||||
|
g_print ("Options:\n");
|
||||||
|
|
||||||
|
g_print ("%s", STR_HELP_NEW_APP);
|
||||||
|
#ifdef __WIN32__
|
||||||
|
g_print ("%s", STR_HELP_LOG);
|
||||||
|
#endif
|
||||||
|
#ifdef MOO_USE_PYTHON
|
||||||
|
g_print ("%s", STR_HELP_LOG_PYTHON);
|
||||||
|
#endif
|
||||||
|
g_print ("%s", STR_HELP_VERSION);
|
||||||
|
g_print ("%s", STR_HELP_HELP);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void version (void)
|
||||||
|
{
|
||||||
|
g_print ("medit %s\n", MOO_VERSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int main (int argc, char *argv[])
|
int main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
MooApp *app;
|
MooApp *app;
|
||||||
|
int opt_remain;
|
||||||
MooUIXML *xml;
|
MooUIXML *xml;
|
||||||
MooEditor *editor;
|
MooEditor *editor;
|
||||||
MooEditWindow *win;
|
G_GNUC_UNUSED gboolean use_python_console = FALSE;
|
||||||
|
|
||||||
gtk_init (&argc, &argv);
|
gtk_init (&argc, &argv);
|
||||||
// gdk_window_set_debug_updates (TRUE);
|
// gdk_window_set_debug_updates (TRUE);
|
||||||
|
|
||||||
|
opt_remain = _medit_parse_options (g_get_prgname (), argc, argv);
|
||||||
|
|
||||||
|
if (opt_remain < 0)
|
||||||
|
{
|
||||||
|
usage ();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_medit_opt_help)
|
||||||
|
{
|
||||||
|
usage ();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if (_medit_opt_version)
|
||||||
|
{
|
||||||
|
version ();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __WIN32__
|
||||||
|
if (_medit_opt_log)
|
||||||
|
{
|
||||||
|
if (_medit_arg_log)
|
||||||
|
moo_set_log_func_file (_medit_arg_log);
|
||||||
|
else
|
||||||
|
moo_set_log_func_window (TRUE);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MOO_USE_PYTHON
|
||||||
|
if (_medit_opt_log_python)
|
||||||
|
use_python_console = TRUE;
|
||||||
|
#endif
|
||||||
|
|
||||||
app = g_object_new (MOO_TYPE_APP,
|
app = g_object_new (MOO_TYPE_APP,
|
||||||
"argv", argv,
|
"argv", argv,
|
||||||
"short-name", "medit",
|
"short-name", "medit",
|
||||||
"full-name", "medit",
|
"full-name", "medit",
|
||||||
"description", "medit is a text editor",
|
"description", "medit is a text editor",
|
||||||
|
#ifdef MOO_USE_PYTHON
|
||||||
|
"use-python-console", use_python_console,
|
||||||
|
#endif
|
||||||
|
"open-files", argv + opt_remain,
|
||||||
|
"new-app", (gboolean) _medit_opt_new_app,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
xml = moo_app_get_ui_xml (app);
|
xml = moo_app_get_ui_xml (app);
|
||||||
moo_ui_xml_add_ui_from_string (xml, MEDIT_UI, -1);
|
moo_ui_xml_add_ui_from_string (xml, MEDIT_UI, -1);
|
||||||
|
|
||||||
moo_app_init (app);
|
if (!moo_app_init (app))
|
||||||
|
return 0;
|
||||||
|
|
||||||
editor = moo_app_get_editor (app);
|
editor = moo_app_get_editor (app);
|
||||||
|
moo_editor_new_window (editor);
|
||||||
win = moo_editor_new_window (editor);
|
|
||||||
|
|
||||||
if (argc > 1)
|
|
||||||
moo_editor_open_file (editor, MOO_EDIT_WINDOW (win),
|
|
||||||
GTK_WIDGET (win), argv[1], NULL);
|
|
||||||
|
|
||||||
return moo_app_run (app);
|
return moo_app_run (app);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,134 @@
|
||||||
|
/*
|
||||||
|
* medit-app.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2004-2005 by Yevgen Muntyan <muntyan@math.tamu.edu>
|
||||||
|
*
|
||||||
|
* This program 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.
|
||||||
|
*
|
||||||
|
* See COPYING file that comes with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "medit-ui.h"
|
||||||
|
#include <mooapp/mooapp.h>
|
||||||
|
#include <gtk/gtk.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
|
int _medit_parse_options (const char *const program_name,
|
||||||
|
const int argc,
|
||||||
|
char **const argv);
|
||||||
|
|
||||||
|
/********************************************************
|
||||||
|
* command line parsing code generated by Opag
|
||||||
|
* http://www.zero-based.org/software/opag/
|
||||||
|
*/
|
||||||
|
%%
|
||||||
|
n new-app "Run new instance of application"
|
||||||
|
#ifdef __WIN32__
|
||||||
|
l log "[=FILE] Show debug output or write it to FILE" optarg
|
||||||
|
#endif
|
||||||
|
#ifdef MOO_USE_PYTHON
|
||||||
|
p log-python "Redirect output to python console"
|
||||||
|
#endif
|
||||||
|
version "Display version information and exit" return
|
||||||
|
h help "Display this help text and exit" return
|
||||||
|
%%
|
||||||
|
/* end of generated code
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
static void usage (void)
|
||||||
|
{
|
||||||
|
g_print ("Usage: %s [OPTIONS] [FILES]\n", g_get_prgname ());
|
||||||
|
g_print ("Options:\n");
|
||||||
|
|
||||||
|
g_print ("%s", STR_HELP_NEW_APP);
|
||||||
|
#ifdef __WIN32__
|
||||||
|
g_print ("%s", STR_HELP_LOG);
|
||||||
|
#endif
|
||||||
|
#ifdef MOO_USE_PYTHON
|
||||||
|
g_print ("%s", STR_HELP_LOG_PYTHON);
|
||||||
|
#endif
|
||||||
|
g_print ("%s", STR_HELP_VERSION);
|
||||||
|
g_print ("%s", STR_HELP_HELP);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void version (void)
|
||||||
|
{
|
||||||
|
g_print ("medit %s\n", MOO_VERSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main (int argc, char *argv[])
|
||||||
|
{
|
||||||
|
MooApp *app;
|
||||||
|
int opt_remain;
|
||||||
|
MooUIXML *xml;
|
||||||
|
MooEditor *editor;
|
||||||
|
G_GNUC_UNUSED gboolean use_python_console = FALSE;
|
||||||
|
|
||||||
|
gtk_init (&argc, &argv);
|
||||||
|
// gdk_window_set_debug_updates (TRUE);
|
||||||
|
|
||||||
|
opt_remain = _medit_parse_options (g_get_prgname (), argc, argv);
|
||||||
|
|
||||||
|
if (opt_remain < 0)
|
||||||
|
{
|
||||||
|
usage ();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_medit_opt_help)
|
||||||
|
{
|
||||||
|
usage ();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if (_medit_opt_version)
|
||||||
|
{
|
||||||
|
version ();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __WIN32__
|
||||||
|
if (_medit_opt_log)
|
||||||
|
{
|
||||||
|
if (_medit_arg_log)
|
||||||
|
moo_set_log_func_file (_medit_arg_log);
|
||||||
|
else
|
||||||
|
moo_set_log_func_window (TRUE);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MOO_USE_PYTHON
|
||||||
|
if (_medit_opt_log_python)
|
||||||
|
use_python_console = TRUE;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
app = g_object_new (MOO_TYPE_APP,
|
||||||
|
"argv", argv,
|
||||||
|
"short-name", "medit",
|
||||||
|
"full-name", "medit",
|
||||||
|
"description", "medit is a text editor",
|
||||||
|
#ifdef MOO_USE_PYTHON
|
||||||
|
"use-python-console", use_python_console,
|
||||||
|
#endif
|
||||||
|
"open-files", argv + opt_remain,
|
||||||
|
"new-app", (gboolean) _medit_opt_new_app,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
xml = moo_app_get_ui_xml (app);
|
||||||
|
moo_ui_xml_add_ui_from_string (xml, MEDIT_UI, -1);
|
||||||
|
|
||||||
|
if (!moo_app_init (app))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
editor = moo_app_get_editor (app);
|
||||||
|
moo_editor_new_window (editor);
|
||||||
|
|
||||||
|
return moo_app_run (app);
|
||||||
|
}
|
Loading…
Reference in New Issue