Fixed includes

This commit is contained in:
Jesse van den Kieboom 2006-01-10 00:39:05 +00:00
parent c66a399502
commit a758884b1e
19 changed files with 607 additions and 406 deletions

View File

@ -18,7 +18,10 @@
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <string.h>
#include <libintl.h>

View File

@ -15,16 +15,16 @@
#include <libgnome/gnome-url.h>
#include <vte/vte.h>
#include "../gm-debug.h"
#include "gm-debug.h"
#include "gm-app-view.h"
#include "../gm-ui.h"
#include "gm-ui.h"
#include "gm-world-view.h"
#include "../gm-world.h"
#include "../dialogs/gm-worlds-list-dialog.h"
#include "../dialogs/gm-world-logs-dialog.h"
#include "../dialogs/gm-world-properties-dialog.h"
#include "../dialogs/gm-scripts-dialog.h"
#include "../dialogs/gm-preferences-dialog.h"
#include "gm-world.h"
#include "dialogs/gm-worlds-list-dialog.h"
#include "dialogs/gm-world-logs-dialog.h"
#include "dialogs/gm-world-properties-dialog.h"
#include "dialogs/gm-scripts-dialog.h"
#include "dialogs/gm-preferences-dialog.h"
#include "gm-world-tab.h"
#include "mcp/gm-mcp-session.h"
#include "mcp/gm-mcp-package.h"
@ -36,8 +36,8 @@
//#include "if_preferences.h"
//#include "if_mcpconsole.h"
#include "../gm-pixbuf.h"
#include "../gm-support.h"
#include "gm-pixbuf.h"
#include "gm-support.h"
//#include "term.h"
//#include "world.h"
//#include "net.h"
@ -151,6 +151,8 @@ struct _GmAppViewPrivate {
gint y_start;
gint tab;
GdkCursor *cursor;
guint tray_idle_create;
};
/* Signals */
@ -175,9 +177,17 @@ gm_app_view_finalize(GObject *object) {
gdk_cursor_unref(view->priv->cursor);
}
//if (view->priv->tray) {
// gtk_widget_destroy(GTK_WIDGET(view->priv->tray));
//}
if (view->priv->tray_idle_create) {
g_source_remove(view->priv->tray_idle_create);
}
if (view->priv->tray) {
g_signal_handlers_disconnect_by_func(view->priv->tray,
on_gm_app_view_tray_destroy, view);
gtk_widget_destroy(GTK_WIDGET(view->priv->tray));
g_object_unref(view->priv->tray);
}
g_hash_table_destroy(view->priv->world_menu_items);
G_OBJECT_CLASS(gm_app_view_parent_class)->finalize(object);
@ -236,7 +246,40 @@ gm_app_view_focus_out_event(GtkWidget *widget, GdkEventFocus *event) {
}
return FALSE;
}
}
static void
gm_app_view_size_allocate(GtkWidget *widget, GtkAllocation *allocation) {
GmAppView *view = GM_APP_VIEW(widget);
gm_options_set_int(gm_app_options(view->priv->application), "width",
allocation->width);
gm_options_set_int(gm_app_options(view->priv->application), "height",
allocation->height);
if (GTK_WIDGET_CLASS(gm_app_view_parent_class)->size_allocate) {
GTK_WIDGET_CLASS(gm_app_view_parent_class)->size_allocate(widget,
allocation);
}
}
static gboolean
gm_app_view_window_state_event(GtkWidget *widget, GdkEventWindowState *event) {
GmAppView *view = GM_APP_VIEW(widget);
if (event->changed_mask & GDK_WINDOW_STATE_MAXIMIZED &&
GTK_WIDGET_VISIBLE(widget)) {
gm_options_set_int(gm_app_options(view->priv->application), "maximized",
(event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) != 0);
}
if (GTK_WIDGET_CLASS(gm_app_view_parent_class)->window_state_event) {
return GTK_WIDGET_CLASS(gm_app_view_parent_class)->window_state_event(
widget, event);
}
return FALSE;
}
static void
gm_app_view_class_init(GmAppViewClass *klass) {
@ -249,7 +292,9 @@ gm_app_view_class_init(GmAppViewClass *klass) {
widget_class->focus_in_event = gm_app_view_focus_in_event;
widget_class->focus_out_event = gm_app_view_focus_out_event;
widget_class->size_allocate = gm_app_view_size_allocate;
widget_class->window_state_event = gm_app_view_window_state_event;
g_type_class_add_private(object_class, sizeof(GmAppViewPrivate));
}
@ -267,7 +312,7 @@ gm_app_view_create_menu(GmAppView *view) {
PACKAGE_DATA_DIR "/" PACKAGE "/ui/gm-ui.xml", &error);
if (error) {
gm_debug_msg(DEBUG_DEFAULT, "Could not merge UI file");
gm_debug_msg(DEBUG_ALWAYS, "Could not merge UI file");
g_error_free(error);
}
@ -494,6 +539,26 @@ gm_app_view_create_keybindings(GmAppView *view) {
gtk_window_add_accel_group(GTK_WINDOW(view), grp);
}
static void
gm_app_view_create_tray(GmAppView *view) {
view->priv->tray = g_object_ref(gm_tray_new(_("GnoeMoe Gnome MOO Client")));
gm_tray_set_icon(view->priv->tray, TRAY_STATE_NORMAL,
gm_pixbuf_get("tray/default.svg"));
gm_tray_set_icon(view->priv->tray, TRAY_STATE_ACTIVE,
gm_pixbuf_get("tray/active.svg"));
gm_tray_set_icon(view->priv->tray, TRAY_STATE_NOTIFY,
gm_pixbuf_get("tray/notify.svg"));
gm_tray_set_icon(view->priv->tray, TRAY_STATE_ACTIVITY,
gm_pixbuf_get("tray/activity.svg"));
gtk_widget_show(GTK_WIDGET(view->priv->tray));
g_signal_connect(view->priv->tray, "button-press-event",
G_CALLBACK(on_gm_app_view_tray_button_press), view);
g_signal_connect(view->priv->tray, "destroy",
G_CALLBACK(on_gm_app_view_tray_destroy), view);
}
static void
gm_app_view_init(GmAppView *view) {
@ -509,6 +574,7 @@ gm_app_view_init(GmAppView *view) {
gtk_container_add(GTK_CONTAINER(view), vbox);
menu = gm_app_view_create_menu(view);
gtk_widget_show(menu);
gtk_box_pack_start(GTK_BOX(vbox), menu, FALSE, TRUE, 0);
@ -552,27 +618,27 @@ gm_app_view_init(GmAppView *view) {
gm_scripts_dialog_init();
#endif
if (gm_tray_has_manager()) {
view->priv->tray = gm_tray_new(_("GnoeMoe Gnome MOO Client"));
gm_tray_set_icon(view->priv->tray, TRAY_STATE_NORMAL,
gm_pixbuf_get("tray/default.svg"));
gm_tray_set_icon(view->priv->tray, TRAY_STATE_ACTIVE,
gm_pixbuf_get("tray/active.svg"));
gm_tray_set_icon(view->priv->tray, TRAY_STATE_NOTIFY,
gm_pixbuf_get("tray/notify.svg"));
gm_tray_set_icon(view->priv->tray, TRAY_STATE_ACTIVITY,
gm_pixbuf_get("tray/activity.svg"));
gtk_widget_show(GTK_WIDGET(view->priv->tray));
g_signal_connect(view->priv->tray, "button-press-event",
G_CALLBACK(on_gm_app_view_tray_button_press), view);
g_signal_connect(view->priv->tray, "destroy",
G_CALLBACK(on_gm_app_view_tray_destroy), view);
}
gm_app_view_create_tray(view);
}
void
gm_app_view_restore_size(GmAppView *view) {
gint width, height;
width = gm_options_get_int(gm_app_options(view->priv->application),
"width");
height = gm_options_get_int(gm_app_options(view->priv->application),
"height");
if (height > 10 && width > 10) {
gtk_window_set_default_size(GTK_WINDOW(view), width, height);
}
if (gm_options_get_int(gm_app_options(view->priv->application),
"maximized")) {
gtk_window_maximize(GTK_WINDOW(view));
}
}
// Public functions
GmAppView *
@ -581,6 +647,9 @@ gm_app_view_new(GmApp *application) {
view->priv->application = application;
view->priv->active_world = NULL;
// Set stored width and height
gm_app_view_restore_size(view);
// Toggle search direction
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
@ -790,6 +859,10 @@ gm_app_view_toggle_visibility(GmAppView *view) {
gboolean visible = GTK_WIDGET_VISIBLE(view);
if (!visible || !gtk_window_is_active(GTK_WINDOW(view))) {
if (!visible) {
gm_app_view_restore_size(view);
}
gtk_widget_show(GTK_WIDGET(view));
gtk_window_present(GTK_WINDOW(view));
@ -1086,57 +1159,17 @@ on_gm_app_view_entry_find_activate(GtkEntry *entry, GmAppView *view) {
}
void
gm_app_view_show_replace_box(GmAppView *view) {
GmWorldView *world_view;
gint i, n;
gm_app_view_show_replace_box(GmAppView *view) {
if (!GTK_WIDGET_VISIBLE(view->priv->hbox_replace)) {
n = gtk_notebook_get_n_pages(view->priv->notebook);
for (i = 0; i < gtk_notebook_get_n_pages(view->priv->notebook); i++) {
world_view = GM_WORLD_VIEW(gtk_notebook_get_nth_page(
view->priv->notebook, i));
gm_world_view_scroll_end_prepare(world_view);
}
gtk_widget_show(GTK_WIDGET(view->priv->label_replace));
gtk_widget_show(GTK_WIDGET(view->priv->hbox_replace));
gm_do_events();
for (i = 0; i < gtk_notebook_get_n_pages(view->priv->notebook); i++) {
world_view = GM_WORLD_VIEW(gtk_notebook_get_nth_page(
view->priv->notebook, i));
gm_world_view_scroll_end(world_view);
}
}
}
void
gm_app_view_show_find_box(GmAppView *view) {
GmWorldView *world_view;
gint i, n;
if (!GTK_WIDGET_VISIBLE(view->priv->vbox_find)) {
n = gtk_notebook_get_n_pages(view->priv->notebook);
for (i = 0; i < gtk_notebook_get_n_pages(view->priv->notebook); i++) {
world_view = GM_WORLD_VIEW(gtk_notebook_get_nth_page(
view->priv->notebook, i));
gm_world_view_scroll_end_prepare(world_view);
}
gtk_widget_show(GTK_WIDGET(view->priv->vbox_find));
gm_do_events();
for (i = 0; i < gtk_notebook_get_n_pages(view->priv->notebook); i++) {
world_view = GM_WORLD_VIEW(gtk_notebook_get_nth_page(
view->priv->notebook, i));
gm_world_view_scroll_end(world_view);
}
}
}
@ -1536,7 +1569,7 @@ void
on_gm_app_view_help_about(GtkMenuItem *menuitem, GmAppView *view) {
gtk_show_about_dialog(GTK_WINDOW(view),
"name", _("GnoeMoe"),
"version", IVERSION,
"version", PACKAGE_VERSION,
"copyright", _("(C) 2004-2005 Icecrew.nl"),
"comments", _("GnoeMoe Gnome MOO Client"),
"authors", authors,
@ -1737,9 +1770,27 @@ on_gm_app_view_tray_button_press(GmTray *tray, GdkEventButton *event,
return FALSE;
}
gboolean
idle_create_tray(gpointer user_data) {
GmAppView *view = GM_APP_VIEW(user_data);
view->priv->tray_idle_create = 0;
gm_app_view_create_tray(view);
if (!gm_tray_has_manager() && !GTK_WIDGET_VISIBLE(view)) {
gm_app_view_toggle_visibility(view);
gtk_window_present(GTK_WINDOW(view));
}
return FALSE;
}
void
on_gm_app_view_tray_destroy(GtkWidget *caller, GmAppView *view) {
// Make sure the view is visible
g_object_unref(G_OBJECT(caller));
view->priv->tray = NULL;
gtk_widget_show(GTK_WIDGET(view));
view->priv->tray_idle_create = g_idle_add(idle_create_tray, view);
}

View File

@ -4,8 +4,8 @@
#include <gtk/gtk.h>
#include <glib.h>
#include <glade/glade.h>
#include "../gm-world.h"
#include "../gm-app.h"
#include "gm-world.h"
#include "gm-app.h"
G_BEGIN_DECLS

View File

@ -6,14 +6,14 @@
#include <gtksourceview/gtksourcetag.h>
#include "gm-editor-view.h"
#include "../gm-pixbuf.h"
#include "../gm-support.h"
#include "../gm-debug.h"
#include "../gm-string.h"
#include "../gm-options.h"
#include "../gm-color-table.h"
#include "../gm-app.h"
#include "../parser/gm-parser.h"
#include "gm-pixbuf.h"
#include "gm-support.h"
#include "gm-debug.h"
#include "gm-string.h"
#include "gm-options.h"
#include "gm-color-table.h"
#include "gm-app.h"
#include "parser/gm-parser.h"
#include "gm-searchable.h"

View File

@ -3,8 +3,8 @@
#include <glib-object.h>
#include <gtk/gtk.h>
#include "../gm-editor.h"
#include "../gm-world.h"
#include "gm-editor.h"
#include "gm-world.h"
G_BEGIN_DECLS

View File

@ -5,10 +5,10 @@
#include <libgnomevfs/gnome-vfs.h>
#include <libgnome/libgnome.h>
#include "gm-embedded-view.h"
#include "../gm-app.h"
#include "../gm-color-table.h"
#include "../gm-options.h"
#include "../gm-debug.h"
#include "gm-app.h"
#include "gm-color-table.h"
#include "gm-options.h"
#include "gm-debug.h"
#define GM_EMBEDDED_VIEW_GET_PRIVATE(object)( \
G_TYPE_INSTANCE_GET_PRIVATE((object), \

View File

@ -3,8 +3,8 @@
#include <glib-object.h>
#include <gtk/gtk.h>
#include "../gm-editor.h"
#include "../gm-world.h"
#include "gm-editor.h"
#include "gm-world.h"
G_BEGIN_DECLS

View File

@ -5,9 +5,9 @@
#include <stdlib.h>
#include "gm-external-view.h"
#include "../gm-debug.h"
#include "../gm-app.h"
#include "../gm-options.h"
#include "gm-debug.h"
#include "gm-app.h"
#include "gm-options.h"
void on_gm_external_view_exited(GPid pid, gint status, GmExternalView *view);
void on_gm_external_view_file_changed(GnomeVFSMonitorHandle *handle,

View File

@ -1,7 +1,7 @@
#include <glib.h>
#include <libgnomevfs/gnome-vfs.h>
#include "../gm-editor.h"
#include "../gm-world.h"
#include "gm-editor.h"
#include "gm-world.h"
#define GM_EXTERNAL_VIEW(obj) (GmExternalView *)(obj)

View File

@ -1,10 +1,10 @@
#include "gm-log-view.h"
#include "gm-searchable.h"
#include "../gm-app.h"
#include "../gm-color-table.h"
#include "../gm-support.h"
#include "../gm-options.h"
#include "../gm-debug.h"
#include "gm-app.h"
#include "gm-color-table.h"
#include "gm-support.h"
#include "gm-options.h"
#include "gm-debug.h"
#define GM_LOG_VIEW_GET_PRIVATE(object)( \
G_TYPE_INSTANCE_GET_PRIVATE((object), \

View File

@ -1,9 +1,11 @@
#include <glib-object.h>
#include <gtk/gtk.h>
#include <string.h>
#include <stdlib.h>
#include "gm-text-scroller.h"
#include "../gm-debug.h"
#include "../gm-support.h"
#include "gm-debug.h"
#include "gm-support.h"
#define GM_TEXT_SCROLLER_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE((object), GM_TYPE_TEXT_SCROLLER, GmTextScrollerPrivate))
@ -15,6 +17,8 @@ struct _GmTextScrollerPrivate {
gint character_height;
gboolean end_scrolled;
gint idle_handler;
GtkAllocation allocation;
};
void on_gm_text_scroller_text_view_style_set(GtkTextView *view,
@ -162,16 +166,30 @@ gm_text_scroller_scroll_end_idle(GmTextScroller *scroller) {
}
void
gm_text_scroller_prepare(GmTextScroller *scroller) {
gboolean
gm_text_scroller_is_end_scrolled_margin(GmTextScroller *scroller,
gint margin) {
GtkAdjustment *ad = gtk_scrolled_window_get_vadjustment(
scroller->priv->scrolled_window);
scroller->priv->end_scrolled = scroller->priv->end_scrolled ||
return scroller->priv->end_scrolled ||
((ad->page_size + ad->value) >= ad->upper -
(double)(scroller->priv->character_height));
(double)(scroller->priv->character_height) - margin);
}
gboolean
gm_text_scroller_is_end_scrolled(GmTextScroller *scroller) {
return gm_text_scroller_is_end_scrolled_margin(scroller, 0);
}
void
gm_text_scroller_prepare(GmTextScroller *scroller) {
scroller->priv->end_scrolled = gm_text_scroller_is_end_scrolled(scroller);
if (scroller->priv->idle_handler == 0 && scroller->priv->end_scrolled) {
gm_text_scroller_scroll_end(scroller);
// Ensure the end scroll for large texts
scroller->priv->idle_handler = g_idle_add((GSourceFunc)
gm_text_scroller_scroll_end_idle, scroller);
}
@ -204,6 +222,17 @@ gm_text_scroller_update_character_height(GmTextScroller *scroller) {
g_object_unref(pc);
}
void
on_gm_text_scroller_text_view_size_allocate(GtkWidget *widget,
GtkAllocation *allocation, GmTextScroller *scroller) {
if (gm_text_scroller_is_end_scrolled_margin(scroller,
abs(allocation->height - scroller->priv->allocation.height))) {
gm_text_scroller_scroll_end(scroller);
}
scroller->priv->allocation = *allocation;
}
GmTextScroller *
gm_text_scroller_new(GtkTextView *text_view) {
GmTextScroller *obj;
@ -219,15 +248,20 @@ gm_text_scroller_new(GtkTextView *text_view) {
obj->priv->text_view = text_view;
obj->priv->scrolled_window = GTK_SCROLLED_WINDOW(parent);
obj->priv->allocation = (GTK_WIDGET(text_view)->allocation);
gm_text_scroller_update_text_buffer(obj);
gm_text_scroller_update_character_height(obj);
g_signal_connect(text_view, "notify",
g_signal_connect(text_view, "notify::buffer",
G_CALLBACK(on_gm_text_scroller_text_view_notify), obj);
g_signal_connect(text_view, "style-set",
G_CALLBACK(on_gm_text_scroller_text_view_style_set), obj);
g_signal_connect(text_view, "destroy",
G_CALLBACK(on_gm_text_scroller_text_view_destroy), obj);
g_signal_connect(text_view, "size-allocate",
G_CALLBACK(on_gm_text_scroller_text_view_size_allocate), obj);
obj->priv->idle_handler = g_idle_add((GSourceFunc)
gm_text_scroller_scroll_end_idle, obj);
@ -240,10 +274,8 @@ gm_text_scroller_new(GtkTextView *text_view) {
void
on_gm_text_scroller_text_view_notify(GtkTextView *text_view, GParamSpec *arg1,
GmTextScroller *scroller) {
if (strcmp(arg1->name, "buffer") == 0) {
// Buffer changed
gm_text_scroller_update_text_buffer(scroller);
}
// Buffer changed
gm_text_scroller_update_text_buffer(scroller);
}
void

View File

@ -1,6 +1,7 @@
#include <gtk/gtk.h>
#include "gm-tray.h"
#include "eggtrayicon.h"
#include "gm-debug.h"
#define GM_TRAY_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE((object), GM_TYPE_TRAY, GmTrayPrivate))

View File

@ -5,9 +5,9 @@
#include "gm-world-input-view.h"
#include "gm-world-view.h"
#include "../gm-world.h"
#include "../gm-color-table.h"
#include "../gm-debug.h"
#include "gm-world.h"
#include "gm-color-table.h"
#include "gm-debug.h"
#define GM_WORLD_INPUT_VIEW_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE((object), GM_TYPE_WORLD_INPUT_VIEW, GmWorldInputViewPrivate))
@ -16,16 +16,18 @@ void on_gm_world_input_view_color_table_color_changed(GmColorTable *table,
void on_gm_world_input_view_color_table_font_changed(GmColorTable *table,
gchar *font_description, GmWorldInputView *view);
gboolean on_gm_world_input_view_key_pressed(GtkWidget *widget,
GdkEventKey * event, gpointer userdata);
gboolean on_gm_world_input_view_key_released(GtkWidget *widget,
GdkEventKey *event, gpointer userdata);
void on_gm_world_input_view_changed(GtkTextBuffer *buffer,
GmWorldInputView *view);
struct _GmWorldInputViewPrivate {
GmColorTable *color_table;
GList **history;
GList *position;
gchar *prefix;
gulong changed_id;
guint idle_scroll;
gboolean is_scrolled;
};
/* Signals */
@ -36,6 +38,7 @@ enum {
};
static guint world_input_view_signals[NUM_SIGNALS] = {0};
static GtkWidgetClass *widget_parent_class;
G_DEFINE_TYPE(GmWorldInputView, gm_world_input_view, GTK_TYPE_TEXT_VIEW)
@ -46,15 +49,204 @@ gm_world_input_view_finalize(GObject *object) {
gm_world_input_view_set_color_table(view, NULL);
if (view->priv->idle_scroll) {
g_source_remove(view->priv->idle_scroll);
}
G_OBJECT_CLASS(gm_world_input_view_parent_class)->finalize(object);
}
static gchar *
gm_world_input_view_str_new_value(gchar *old, gchar *new) {
g_free(old);
if (new) {
return g_strdup(new);
} else {
return NULL;
}
}
void
gm_world_input_view_set_text(GmWorldInputView *view, gchar *text, gint len) {
GtkTextIter end;
GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
gtk_text_buffer_set_text(buffer, text, len);
gtk_text_buffer_get_end_iter(buffer, &end);
gtk_text_buffer_place_cursor(buffer, &end);
}
static void
gm_world_input_view_reset_prefix(GmWorldInputView *view) {
view->priv->prefix = gm_world_input_view_str_new_value(
view->priv->prefix, NULL);
}
gboolean
gm_world_input_view_key_press_event(GtkWidget *widget, GdkEventKey *event) {
GmWorldInputView *view = GM_WORLD_INPUT_VIEW(widget);
gchar *text;
gboolean result = FALSE, isUp;
GtkTextBuffer *buf;
GtkTextIter start, end, cursor;
GtkTextMark *insert;
GList *item, *found = NULL;
gint line, len;
buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
gtk_text_buffer_get_bounds(buf, &start, &end);
switch (event->keyval) {
case GDK_Up: case GDK_Down:
isUp = event->keyval == GDK_Up;
if (!view->priv->history) {
break;
}
insert = gtk_text_buffer_get_insert(buf);
gtk_text_buffer_get_iter_at_mark(buf, &cursor, insert);
line = gtk_text_iter_get_line(&cursor);
if ((isUp && line != 0) || (!isUp && line !=
gtk_text_buffer_get_line_count(buf) - 1)) {
break;
}
text = gtk_text_buffer_get_text(buf, &start, &end, FALSE);
// If the current position is empty then append a new history item
if (!view->priv->position) {
*view->priv->history = g_list_append(*view->priv->history,
g_strdup(text));
view->priv->position = g_list_last(*view->priv->history);
}
// If there is nowhere to move, don't even bother
if ((isUp && !view->priv->position->prev)
|| (!isUp && !view->priv->position->next)) {
result = TRUE;
break;
}
// If the current prefix is NULL then we set the new prefix to
// the current text
if (view->priv->prefix == NULL) {
view->priv->prefix = g_strdup(text);
}
// If the prefix is an empty string then simply advance to the
// next item
if (*(view->priv->prefix) == '\0') {
if (isUp) {
found = view->priv->position->prev;
} else {
found = view->priv->position->next;
}
} else {
// Else find the closest matching history line
item = isUp ? view->priv->position->prev :
view->priv->position->next;
while (item) {
if (strncmp((gchar *)item->data, view->priv->prefix,
strlen(view->priv->prefix)) == 0) {
// Change current position to the matched item
found = item;
break;
}
item = isUp ? item->prev : item->next;
}
}
// If a match is found then set this history text
if (found) {
// Change the data of the current position to the text
// now in the buffer.
view->priv->position->data =
gm_world_input_view_str_new_value(
view->priv->position->data, text);
gm_world_input_view_set_text(view, (gchar *)found->data, -1);
view->priv->position = found;
if (found == g_list_last(*view->priv->history)) {
gm_world_input_view_reset_prefix(view);
}
}
g_free(text);
result = TRUE;
break;
case GDK_Return:
// Emit the text_activate signal
if (!(event->state & GDK_CONTROL_MASK) &&
!(event->state & GDK_SHIFT_MASK)) {
text = gtk_text_buffer_get_text(buf, &start, &end, FALSE);
g_signal_emit(view, world_input_view_signals[TEXT_ACTIVATE], 0,
text);
if (view->priv->history) {
item = g_list_last(*view->priv->history);
if (item) {
item->data = gm_world_input_view_str_new_value(
(gchar *)(item->data), text);
} else {
*view->priv->history =
g_list_append(*view->priv->history,
g_strdup(text));
}
}
len = g_list_length(*view->priv->history);
for (line = 0; line < len - 500; ++line) {
*view->priv->history = g_list_remove(*view->priv->history,
(*view->priv->history)->data);
}
// Append new empty history item which will become our new
// current item
if (view->priv->history) {
*view->priv->history =
g_list_append(*view->priv->history, g_strdup(""));
view->priv->position = g_list_last(*view->priv->history);
}
gm_world_input_view_reset_prefix(view);
// Set textview text to an empty string
gm_world_input_view_set_text(view, "", 0);
g_free(text);
result = TRUE;
}
break;
default:
break;
}
if (!result) {
if (widget_parent_class->key_press_event) {
return widget_parent_class->key_press_event(widget, event);
}
}
return result;
}
static void
gm_world_input_view_class_init(GmWorldInputViewClass *klass) {
GObjectClass *object_class = G_OBJECT_CLASS(klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
object_class->finalize = gm_world_input_view_finalize;
widget_class->key_press_event = gm_world_input_view_key_press_event;
widget_parent_class = GTK_WIDGET_CLASS(gm_world_input_view_parent_class);
world_input_view_signals[TEXT_ACTIVATE] =
g_signal_new("text_activate",
G_OBJECT_CLASS_TYPE(object_class),
@ -84,38 +276,55 @@ gm_world_input_view_init(GmWorldInputView *view) {
gtk_text_view_set_right_margin(GTK_TEXT_VIEW(view), 3);
gtk_text_view_set_pixels_above_lines(GTK_TEXT_VIEW(view), 1);
gtk_text_view_set_pixels_below_lines(GTK_TEXT_VIEW(view), 1);
g_signal_connect(view, "key_press_event",
G_CALLBACK(on_gm_world_input_view_key_pressed), NULL);
g_signal_connect(view, "key_release_event",
G_CALLBACK(on_gm_world_input_view_key_released), NULL);
g_signal_connect(gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)), "changed",
G_CALLBACK(on_gm_world_input_view_changed), view);
}
gchar *
gm_world_input_view_str_new_value(gchar *old, gchar *new) {
g_free(old);
if (new) {
return g_strdup(new);
} else {
return NULL;
static void
modify_cursor_color(GtkWidget *textview, GdkColor *color) {
static const char cursor_color_rc[] =
"style \"svs-cc\"\n"
"{\n"
"GtkTextView::cursor-color=\"#%04x%04x%04x\"\n"
"}\n"
"widget \"*.%s\" style : application \"svs-cc\"\n";
const gchar *name;
gchar *rc_temp;
name = gtk_widget_get_name(textview);
if (!name) {
gtk_widget_set_name(textview, "GmWorldInputView");
name = gtk_widget_get_name(textview);
}
g_return_if_fail(name != NULL);
if (color != NULL) {
rc_temp = g_strdup_printf(cursor_color_rc, color->red, color->green,
color->blue, name);
} else {
GtkRcStyle *rc_style;
rc_style = gtk_widget_get_modifier_style(textview);
rc_temp = g_strdup_printf(cursor_color_rc,
rc_style->text[GTK_STATE_NORMAL].red,
rc_style->text[GTK_STATE_NORMAL].green,
rc_style->text[GTK_STATE_NORMAL].blue,
name);
}
gtk_rc_parse_string(rc_temp);
gtk_widget_reset_rc_styles(textview);
g_free(rc_temp);
}
void
gm_world_input_view_set_text(GmWorldInputView *view, gchar *text, gint len) {
GtkTextIter end;
GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
gtk_text_buffer_set_text(buffer, text, len);
gtk_text_buffer_get_end_iter(buffer, &end);
gtk_text_buffer_place_cursor(buffer, &end);
}
void
gm_world_input_view_update_colors(GmWorldInputView *view) {
/*GdkColor col;
GdkColor col;
if (view->priv->color_table != NULL) {
if (gm_color_table_get(view->priv->color_table, "bg_default", &col)) {
gtk_widget_modify_base(GTK_WIDGET(view), GTK_STATE_NORMAL,
@ -123,9 +332,10 @@ gm_world_input_view_update_colors(GmWorldInputView *view) {
}
if (gm_color_table_get(view->priv->color_table, "fg_default", &col)) {
gtk_widget_modify_text(GTK_WIDGET(view), GTK_STATE_NORMAL,
&col);
&col);
modify_cursor_color(GTK_WIDGET(view), &col);
}
}*/
}
}
void
@ -165,7 +375,8 @@ gm_world_input_view_set_history(GmWorldInputView *view, GList **history) {
view->priv->history = history;
view->priv->position = NULL;
view->priv->prefix = NULL;
gm_world_input_view_reset_prefix(view);
}
GList **
@ -219,179 +430,62 @@ on_gm_world_input_view_color_table_font_changed(GmColorTable *table,
}
gboolean
on_gm_world_input_view_key_released(GtkWidget *widget, GdkEventKey *event,
gpointer userdata) {
GmWorldInputView *view = GM_WORLD_INPUT_VIEW(widget);
GtkTextBuffer *buffer;
GtkTextIter start, end;
gchar *text;
idle_scroll(gpointer user_data) {
GmWorldInputView *view = GM_WORLD_INPUT_VIEW(user_data);
GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
gtk_text_buffer_get_bounds(buffer, &start, &end);
text = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
view->priv->idle_scroll = 0;
switch (event->keyval) {
case GDK_Delete: case GDK_BackSpace:
if (text[0] == '\0') {
// Reset position to the last item in the history
view->priv->position = g_list_last(*view->priv->history);
// Reset prefix to NULL
view->priv->prefix = gm_world_input_view_str_new_value(
view->priv->prefix, NULL);
}
break;
}
g_free(text);
gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(view),
gtk_text_buffer_get_insert(buffer), 0.0, TRUE, 0.5, 1.0);
return FALSE;
}
gboolean
on_gm_world_input_view_key_pressed(GtkWidget *widget, GdkEventKey *event,
gpointer userdata) {
GmWorldInputView *view = GM_WORLD_INPUT_VIEW(widget);
gchar *text;
gboolean result = TRUE, isUp;
GtkTextBuffer *buf;
GtkTextIter start, end, cursor;
GtkTextMark *insert;
GList *item, *found = NULL;
gint line, len;
void
on_gm_world_input_view_changed(GtkTextBuffer *buffer,
GmWorldInputView *view) {
GtkTextIter start, end;
GtkWidget *parent = gtk_widget_get_parent(GTK_WIDGET(view));
GtkScrolledWindow *sw;
gint lineheight, y;
if (view->priv->prefix) {
gtk_text_buffer_get_bounds(buffer, &start, &end);
buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
gtk_text_buffer_get_bounds(buf, &start, &end);
text = gtk_text_buffer_get_text(buf, &start, &end, FALSE);
switch (event->keyval) {
case GDK_Up: case GDK_Down:
isUp = event->keyval == GDK_Up;
if (!view->priv->history) {
break;
}
insert = gtk_text_buffer_get_insert(buf);
gtk_text_buffer_get_iter_at_mark(buf, &cursor, insert);
line = gtk_text_iter_get_line(&cursor);
if ((isUp && line != 0) || (!isUp && line !=
gtk_text_buffer_get_line_count(buf) - 1)) {
g_free(text);
return FALSE;
}
// If the current position is empty then append a new history item
if (!view->priv->position) {
*view->priv->history = g_list_append(*view->priv->history,
g_strdup(text));
view->priv->position = g_list_last(*view->priv->history);
}
// If there is nowhere to move, don't even bother
if ((isUp && !view->priv->position->prev)
|| (!isUp && !view->priv->position->next)) {
break;
}
// If the current prefix is NULL then we set the new prefix to
// the current text
if (view->priv->prefix == NULL) {
view->priv->prefix = g_strdup(text);
}
// If the prefix is an empty string then simply advance to the
// next item
if (view->priv->prefix[0] == '\0') {
if (isUp) {
found = view->priv->position->prev;
} else {
found = view->priv->position->next;
}
} else {
// Else find the closest matching history line
item = isUp ? view->priv->position->prev :
view->priv->position->next;
while (item) {
if (strncmp((gchar *)item->data, view->priv->prefix,
strlen(view->priv->prefix)) == 0) {
// Change current position to the matched item
found = item;
break;
}
item = isUp ? item->prev : item->next;
}
}
// If a match is found then set this history text
if (found) {
// Change the data of the current position to the text
// now in the buffer.
view->priv->position->data =
gm_world_input_view_str_new_value(
view->priv->position->data, text);
gm_world_input_view_set_text(view, (gchar *)found->data, -1);
view->priv->position = found;
if (gtk_text_iter_equal(&start, &end)) {
// Reset position to the last item in the history
view->priv->position = g_list_last(*view->priv->history);
if (found == g_list_last(*view->priv->history)) {
view->priv->prefix = gm_world_input_view_str_new_value(
view->priv->prefix, NULL);
}
}
break;
case GDK_Return:
// Emit the text_activate signal
if (!(event->state & GDK_CONTROL_MASK) &&
!(event->state & GDK_SHIFT_MASK)) {
g_signal_emit(view, world_input_view_signals[TEXT_ACTIVATE], 0,
text);
if (view->priv->history) {
item = g_list_last(*view->priv->history);
if (item) {
item->data = gm_world_input_view_str_new_value(
(gchar *)(item->data), text);
} else {
*view->priv->history =
g_list_append(*view->priv->history,
g_strdup(text));
}
}
len = g_list_length(*view->priv->history);
for (line = 0; line < len - 500; ++line) {
*view->priv->history = g_list_remove(*view->priv->history,
(*view->priv->history)->data);
}
// Append new empty history item which will become our new
// current item
if (view->priv->history) {
*view->priv->history =
g_list_append(*view->priv->history, g_strdup(""));
view->priv->position = g_list_last(*view->priv->history);
}
// Reset prefix to NULL
view->priv->prefix = gm_world_input_view_str_new_value(
view->priv->prefix, NULL);
// Set textview text to an empty string
gm_world_input_view_set_text(view, "", 0);
} else {
result = FALSE;
}
break;
default:
result = FALSE;
break;
gm_world_input_view_reset_prefix(view);
}
}
if (!GTK_IS_SCROLLED_WINDOW(parent)) {
return;
}
if (!view->priv->is_scrolled &&
gtk_text_buffer_get_line_count(buffer) > 6) {
sw = GTK_SCROLLED_WINDOW(parent);
view->priv->is_scrolled = TRUE;
gtk_text_buffer_get_start_iter(buffer, &start);
gtk_text_view_get_line_yrange(GTK_TEXT_VIEW(view), &start, &y,
&lineheight);
g_free(text);
return result;
gtk_widget_set_size_request(parent, -1,
lineheight * 6 +
gtk_container_get_border_width(GTK_CONTAINER(sw))
+ 2);
gtk_scrolled_window_set_policy(sw, GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
view->priv->idle_scroll = g_idle_add(idle_scroll, view);
} else if (view->priv->is_scrolled &&
gtk_text_buffer_get_line_count(buffer) <= 6) {
sw = GTK_SCROLLED_WINDOW(parent);
view->priv->is_scrolled = FALSE;
gtk_scrolled_window_set_policy(sw, GTK_POLICY_NEVER, GTK_POLICY_NEVER);
gtk_widget_set_size_request(parent, -1, -1);
}
}

View File

@ -2,7 +2,7 @@
#define __GM_WORLD_INPUT_VIEW_H__
#include <gtk/gtk.h>
#include "../gm-color-table.h"
#include "gm-color-table.h"
G_BEGIN_DECLS

View File

@ -1,9 +1,9 @@
#include <gtk/gtk.h>
#include "../gm-world.h"
#include "gm-world.h"
#include "gm-world-tab.h"
#include "../gm-support.h"
#include "../gm-pixbuf.h"
#include "../gm-debug.h"
#include "gm-support.h"
#include "gm-pixbuf.h"
#include "gm-debug.h"
#define GM_WORLD_TAB_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE((object), GM_TYPE_WORLD_TAB, GmWorldTabPrivate))

View File

@ -2,18 +2,17 @@
#include <string.h>
#include <gdk/gdk.h>
#include "gm-world-text-view.h"
#include "../gm-color-table.h"
#include "../gm-marshal.h"
#include "../ansi.h"
#include "../gm-debug.h"
#include "../gm-support.h"
#include "gm-color-table.h"
#include "gm-marshal.h"
#include "gm-ansi.h"
#include "gm-debug.h"
#include "gm-support.h"
static gboolean gm_world_text_view_button_press_event(GtkWidget *widget,
GdkEventButton *event);
static gboolean gm_world_text_view_button_release_event(GtkWidget *widget,
GdkEventButton *event);
static gboolean gm_world_text_view_motion_event(GtkWidget *widget,
GdkEventMotion *event);
static gboolean gm_world_text_view_leave_event(GtkWidget *widget,
GdkEventCrossing *event);
static void gm_world_text_view_drag_data_get(GtkWidget *widget,
@ -157,7 +156,7 @@ gm_world_text_view_class_init(GmWorldTextViewClass *klass) {
gm_world_text_view_button_press_event;
widget_class->button_release_event =
gm_world_text_view_button_release_event;
widget_class->motion_notify_event = gm_world_text_view_motion_event;
widget_class->leave_notify_event = gm_world_text_view_leave_event;
widget_class->drag_data_get = gm_world_text_view_drag_data_get;
widget_class->drag_end = gm_world_text_view_drag_end;
@ -243,32 +242,6 @@ blink_info_free(BlinkInfo *info) {
g_free(info);
}
static gboolean
gm_world_text_view_motion_event(GtkWidget *widget, GdkEventMotion *event) {
GtkTextView *text_view = GTK_TEXT_VIEW(widget);
GmWorldTextView *view = GM_WORLD_TEXT_VIEW(widget);
if (event->window == gtk_text_view_get_window(text_view,
GTK_TEXT_WINDOW_TEXT) && view->priv->drag_url &&
gtk_drag_check_threshold(widget, view->priv->drag_x,
view->priv->drag_y, event->x, event->y)) {
view->priv->drag_url = FALSE;
gtk_drag_begin(widget, view->priv->source_target_list,
GDK_ACTION_COPY | GDK_ACTION_LINK | GDK_ACTION_ASK,
1, (GdkEvent *)event);
return FALSE;
}
if (GTK_WIDGET_CLASS(parent_class)->motion_notify_event) {
return GTK_WIDGET_CLASS(parent_class)->motion_notify_event(
widget, event);
}
return FALSE;
}
static gboolean
gm_world_text_view_button_press_event(GtkWidget *widget,
GdkEventButton *event) {
@ -279,7 +252,8 @@ gm_world_text_view_button_press_event(GtkWidget *widget,
GtkTextTag *tag;
gint x, y;
if (event->button == 1 && event->state == 0 && event->window ==
if (event->button == 1 && !(event->state & GDK_MOD1_MASK) &&
!(event->state & GDK_SHIFT_MASK) && event->window ==
gtk_text_view_get_window(text_view, GTK_TEXT_WINDOW_TEXT)) {
// Are we at a link
gtk_text_view_window_to_buffer_coords(text_view, GTK_TEXT_WINDOW_TEXT,
@ -396,7 +370,7 @@ gm_world_text_view_drag_end(GtkWidget *widget, GdkDragContext *context) {
if (view->priv->drag_url_text) {
g_free(view->priv->drag_url_text);
view->priv->drag_url_text = NULL;
} else if (GTK_WIDGET_CLASS(parent_class)->motion_notify_event) {
} else if (GTK_WIDGET_CLASS(parent_class)->drag_end) {
GTK_WIDGET_CLASS(parent_class)->drag_end(widget, context);
}
}
@ -1437,6 +1411,16 @@ on_gm_world_text_view_event(GmWorldTextView *view, GdkEventMotion *event,
gdk_window_set_cursor(win, NULL);
}
if (view->priv->drag_url && gtk_drag_check_threshold(GTK_WIDGET(view),
view->priv->drag_x, view->priv->drag_y, event->x, event->y)) {
view->priv->drag_url = FALSE;
gtk_drag_begin(GTK_WIDGET(view), view->priv->source_target_list,
GDK_ACTION_COPY | GDK_ACTION_LINK | GDK_ACTION_ASK,
1, (GdkEvent *)event);
}
return FALSE;
}

View File

@ -2,7 +2,7 @@
#define __GM_WORLD_TEXT_VIEW_H__
#include <gtk/gtk.h>
#include "../gm-color-table.h"
#include "gm-color-table.h"
G_BEGIN_DECLS

View File

@ -1,7 +1,7 @@
#include <gdk/gdkkeysyms.h>
#include <string.h>
#include "../gm-app.h"
#include "gm-app.h"
#include "gm-world-view.h"
#include "gm-world-text-view.h"
#include "gm-world-input-view.h"
@ -11,12 +11,12 @@
#include "gm-external-view.h"
#include "gm-log-view.h"
#include "../gm-debug.h"
#include "../gm-support.h"
#include "../gm-color-table.h"
#include "../mcp/gm-mcp-package.h"
#include "../mcp/gm-mcp-session.h"
#include "../gm-editor.h"
#include "gm-debug.h"
#include "gm-support.h"
#include "gm-color-table.h"
#include "mcp/gm-mcp-package.h"
#include "mcp/gm-mcp-session.h"
#include "gm-editor.h"
#include "gm-searchable.h"
#define GM_WORLD_VIEW_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE((object), \
@ -138,15 +138,86 @@ gm_world_view_finalize(GObject *object) {
G_OBJECT_CLASS(gm_world_view_parent_class)->finalize(object);
}
static void
gm_world_view_destroy(GtkObject *object) {
GmWorldView *view = GM_WORLD_VIEW(object);
gm_options_set_int(gm_world_options(view->priv->world), "pane_position",
GTK_WIDGET(view->priv->hpaned)->allocation.width -
gtk_paned_get_position(GTK_PANED(view->priv->hpaned)));
gm_options_save(gm_world_options(view->priv->world));
if (GTK_OBJECT_CLASS(gm_world_view_parent_class)->destroy) {
GTK_OBJECT_CLASS(gm_world_view_parent_class)->destroy(object);
}
}
static void
gm_world_view_show(GtkWidget *widget) {
GmWorldView *view = GM_WORLD_VIEW(widget);
if (GTK_WIDGET_CLASS(gm_world_view_parent_class)->show) {
GTK_WIDGET_CLASS(gm_world_view_parent_class)->show(widget);
}
gm_do_events();
gtk_paned_set_position(GTK_PANED(view->priv->hpaned),
GTK_WIDGET(view->priv->hpaned)->allocation.width
- gm_options_get_int(gm_world_options(view->priv->world),
"pane_position"));
}
static void
gm_world_view_class_init(GmWorldViewClass *klass) {
GObjectClass *object_class = G_OBJECT_CLASS(klass);
object_class->finalize = gm_world_view_finalize;
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS(klass);
object_class->finalize = gm_world_view_finalize;
widget_class->show = gm_world_view_show;
gtk_object_class->destroy = gm_world_view_destroy;
g_type_class_add_private(object_class, sizeof(GmWorldViewPrivate));
}
/*gboolean
timeout_text(gpointer user_data) {
GtkTextView *view = GTK_TEXT_VIEW(user_data);
GtkTextBuffer *buffer = gtk_text_view_get_buffer(view);
GtkTextIter end, start;
static GdkEvent *event_press = NULL;
static GdkEvent *event_release = NULL;
gboolean result;
gtk_text_buffer_get_bounds(buffer, &start, &end);
if (gtk_text_iter_get_offset(&end) > 80) {
gtk_text_buffer_delete(buffer, &start, &end);
} else {
if (!event_press) {
gtk_widget_realize(GTK_WIDGET(view));
event_press = gdk_event_new(GDK_KEY_PRESS);
event_press->key.keyval = 119;
event_press->key.window = gtk_text_view_get_window(view, GTK_TEXT_WINDOW_TEXT);
event_release = gdk_event_new(GDK_KEY_RELEASE);
event_release->key.keyval = 119;
event_release->key.window = event_press->key.window;
}
event_press->key.time = gtk_get_current_event_time();
event_release->key.time = gtk_get_current_event_time();
g_signal_emit_by_name(GTK_WIDGET(view), "key_press_event", event_press, &result);
g_signal_emit_by_name(GTK_WIDGET(view), "key_release_event", event_release, &result);
}
return TRUE;
}*/
GtkWidget *
gm_world_view_create_input_text_view(GmWorldView *view) {
GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL);
@ -349,25 +420,6 @@ gm_world_view_init(GmWorldView *view) {
G_CALLBACK(on_gm_world_view_switch_page), NULL);
}
void
on_gm_world_view_destroy(GmWorldView *view, gpointer user_data) {
gm_options_set_int(gm_world_options(view->priv->world), "pane_position",
GTK_WIDGET(view->priv->hpaned)->allocation.width -
gtk_paned_get_position(GTK_PANED(view->priv->hpaned)));
gm_options_save(gm_world_options(view->priv->world));
}
void
on_gm_world_view_show(GmWorldView *view, gpointer user_data) {
gm_do_events();
gtk_paned_set_position(GTK_PANED(view->priv->hpaned),
GTK_WIDGET(view->priv->hpaned)->allocation.width
- gm_options_get_int(gm_world_options(view->priv->world),
"pane_position"));
}
GtkWidget *
gm_world_view_new(GmWorld *world) {
GmWorldView *view = GM_WORLD_VIEW(g_object_new(GM_TYPE_WORLD_VIEW, NULL));
@ -398,10 +450,6 @@ gm_world_view_new(GmWorld *world) {
g_signal_connect(view->priv->text_view_input, "text_activate",
G_CALLBACK(on_gm_world_input_view_world_text_activate), view);
g_signal_connect(view, "destroy",
G_CALLBACK(on_gm_world_view_destroy), NULL);
g_signal_connect(view, "show",
G_CALLBACK(on_gm_world_view_show), NULL);
return GTK_WIDGET(view);
}
@ -411,16 +459,6 @@ gm_world_view_text_active(GmWorldView *view) {
return gtk_notebook_get_current_page(GTK_NOTEBOOK(view)) == 0;
}
void
gm_world_view_scroll_end_prepare(GmWorldView *view) {
// TODO
}
void
gm_world_view_scroll_end(GmWorldView *view) {
// TODO
}
gboolean
gm_world_view_page_can_find(GmWorldView *view, gint page_num) {
GtkWidget *page;

View File

@ -2,8 +2,8 @@
#define __GM_WORLD_VIEW_H__
#include <gtk/gtk.h>
#include "../gm-support.h"
#include "../gm-world.h"
#include "gm-support.h"
#include "gm-world.h"
#include "gm-world-input-view.h"
#include "gm-world-text-view.h"
#include "gm-searchable.h"
@ -69,8 +69,6 @@ gboolean gm_world_view_replace_all(GmWorldView *view, gchar const *str,
gboolean gm_world_view_can_replace(GmWorldView *view);
gboolean gm_world_view_page_can_replace(GmWorldView *view, gint page_num);
void gm_world_view_scroll_end_prepare(GmWorldView *view);
void gm_world_view_scroll_end(GmWorldView *view);
GmWorld *gm_world_view_world(GmWorldView *view);
GmWorldInputView *gm_world_view_input(GmWorldView *view);
GmWorldTextView *gm_world_view_text_view(GmWorldView *view);