Fixed includes
This commit is contained in:
parent
c66a399502
commit
a758884b1e
|
@ -18,7 +18,10 @@
|
|||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include <libintl.h>
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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), \
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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), \
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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))
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Reference in New Issue