Redesign the goto line popup dialog
This commit is contained in:
553
xed/xed-view.c
553
xed/xed-view.c
@@ -19,7 +19,6 @@
|
||||
#include "xed-app.h"
|
||||
|
||||
#define XED_VIEW_SCROLL_MARGIN 0.02
|
||||
#define XED_VIEW_SEARCH_DIALOG_TIMEOUT (30*1000) /* 30 seconds */
|
||||
|
||||
#define XED_VIEW_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), XED_TYPE_VIEW, XedViewPrivate))
|
||||
|
||||
@@ -31,43 +30,29 @@ enum
|
||||
struct _XedViewPrivate
|
||||
{
|
||||
GSettings *editor_settings;
|
||||
GtkTextIter start_search_iter;
|
||||
GtkWidget *search_window;
|
||||
GtkWidget *search_entry;
|
||||
guint typeselect_flush_timeout;
|
||||
guint search_entry_changed_id;
|
||||
gboolean disable_popdown;
|
||||
GtkTextBuffer *current_buffer;
|
||||
PeasExtensionSet *extensions;
|
||||
guint view_realized : 1;
|
||||
};
|
||||
|
||||
|
||||
static gboolean start_interactive_goto_line (XedView *view);
|
||||
static void hide_search_window (XedView *view, gboolean cancel);
|
||||
|
||||
G_DEFINE_TYPE(XedView, xed_view, GTK_SOURCE_TYPE_VIEW)
|
||||
G_DEFINE_TYPE (XedView, xed_view, GTK_SOURCE_TYPE_VIEW)
|
||||
|
||||
/* Signals */
|
||||
enum
|
||||
{
|
||||
START_INTERACTIVE_GOTO_LINE, DROP_URIS, LAST_SIGNAL
|
||||
DROP_URIS,
|
||||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
static guint view_signals[LAST_SIGNAL] = { 0 };
|
||||
|
||||
typedef enum
|
||||
{
|
||||
XED_SEARCH_ENTRY_NORMAL, XED_SEARCH_ENTRY_NOT_FOUND
|
||||
} XedSearchEntryState;
|
||||
|
||||
static void
|
||||
document_read_only_notify_handler (XedDocument *document,
|
||||
GParamSpec *pspec,
|
||||
XedView *view)
|
||||
{
|
||||
xed_debug (DEBUG_VIEW);
|
||||
gtk_text_view_set_editable (GTK_TEXT_VIEW(view), !xed_document_get_readonly (document));
|
||||
gtk_text_view_set_editable (GTK_TEXT_VIEW (view), !xed_document_get_readonly (document));
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -177,8 +162,6 @@ xed_view_init (XedView *view)
|
||||
|
||||
view->priv->editor_settings = g_settings_new ("org.x.editor.preferences.editor");
|
||||
|
||||
view->priv->typeselect_flush_timeout = 0;
|
||||
|
||||
/* Drag and drop support */
|
||||
tl = gtk_drag_dest_get_target_list (GTK_WIDGET(view));
|
||||
|
||||
@@ -207,18 +190,6 @@ xed_view_dispose (GObject *object)
|
||||
g_clear_object (&view->priv->extensions);
|
||||
g_clear_object (&view->priv->editor_settings);
|
||||
|
||||
if (view->priv->search_window != NULL)
|
||||
{
|
||||
gtk_widget_destroy (view->priv->search_window);
|
||||
view->priv->search_window = NULL;
|
||||
view->priv->search_entry = NULL;
|
||||
if (view->priv->typeselect_flush_timeout != 0)
|
||||
{
|
||||
g_source_remove (view->priv->typeselect_flush_timeout);
|
||||
view->priv->typeselect_flush_timeout = 0;
|
||||
}
|
||||
}
|
||||
|
||||
current_buffer_removed (view);
|
||||
|
||||
/* Disconnect notify buffer because the destroy of the textview will set
|
||||
@@ -328,16 +299,8 @@ static gint
|
||||
xed_view_focus_out (GtkWidget *widget,
|
||||
GdkEventFocus *event)
|
||||
{
|
||||
XedView *view = XED_VIEW (widget);
|
||||
|
||||
gtk_widget_queue_draw (widget);
|
||||
|
||||
/* hide interactive search dialog */
|
||||
if (view->priv->search_window != NULL)
|
||||
{
|
||||
hide_search_window (view, FALSE);
|
||||
}
|
||||
|
||||
GTK_WIDGET_CLASS (xed_view_parent_class)->focus_out_event (widget, event);
|
||||
|
||||
return FALSE;
|
||||
@@ -508,13 +471,11 @@ static gboolean
|
||||
xed_view_button_press_event (GtkWidget *widget,
|
||||
GdkEventButton *event)
|
||||
{
|
||||
if ((event->type == GDK_BUTTON_PRESS)
|
||||
&& (event->button == 3)
|
||||
&& (event->window == gtk_text_view_get_window (GTK_TEXT_VIEW(widget), GTK_TEXT_WINDOW_LEFT)))
|
||||
if ((event->type == GDK_BUTTON_PRESS) &&
|
||||
(event->button == 3) &&
|
||||
(event->window == gtk_text_view_get_window (GTK_TEXT_VIEW(widget), GTK_TEXT_WINDOW_LEFT)))
|
||||
{
|
||||
|
||||
show_line_numbers_menu (widget, event);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -675,19 +636,9 @@ xed_view_class_init (XedViewClass *klass)
|
||||
widget_class->drag_drop = xed_view_drag_drop;
|
||||
widget_class->button_press_event = xed_view_button_press_event;
|
||||
widget_class->realize = xed_view_realize;
|
||||
klass->start_interactive_goto_line = start_interactive_goto_line;
|
||||
|
||||
text_view_class->delete_from_cursor = xed_view_delete_from_cursor;
|
||||
|
||||
view_signals[START_INTERACTIVE_GOTO_LINE] =
|
||||
g_signal_new ("start_interactive_goto_line",
|
||||
G_TYPE_FROM_CLASS (object_class),
|
||||
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
|
||||
G_STRUCT_OFFSET (XedViewClass, start_interactive_goto_line),
|
||||
NULL, NULL,
|
||||
xed_marshal_BOOLEAN__NONE,
|
||||
G_TYPE_BOOLEAN, 0);
|
||||
|
||||
/* A new signal DROP_URIS has been added to allow plugins to intercept
|
||||
* the default dnd behaviour of 'text/uri-list'. XedView now handles
|
||||
* dnd in the default handlers of drag_drop, drag_motion and
|
||||
@@ -710,8 +661,6 @@ xed_view_class_init (XedViewClass *klass)
|
||||
|
||||
binding_set = gtk_binding_set_by_class (klass);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_i, GDK_CONTROL_MASK, "start_interactive_goto_line", 0);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_d, GDK_CONTROL_MASK, "delete_from_cursor", 2, G_TYPE_ENUM,
|
||||
GTK_DELETE_PARAGRAPHS, G_TYPE_INT, 1);
|
||||
}
|
||||
@@ -914,491 +863,3 @@ xed_view_set_font (XedView *view,
|
||||
gtk_widget_modify_font (GTK_WIDGET (view), font_desc);
|
||||
pango_font_description_free (font_desc);
|
||||
}
|
||||
|
||||
static void
|
||||
set_entry_state (GtkWidget *entry,
|
||||
XedSearchEntryState state)
|
||||
{
|
||||
GtkStyleContext *context = gtk_widget_get_style_context (GTK_WIDGET(entry));
|
||||
|
||||
if (state == XED_SEARCH_ENTRY_NOT_FOUND)
|
||||
{
|
||||
gtk_style_context_add_class (context, GTK_STYLE_CLASS_ERROR);
|
||||
}
|
||||
else
|
||||
{
|
||||
gtk_style_context_remove_class (context, GTK_STYLE_CLASS_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
/* Cut and paste from gtkwindow.c */
|
||||
static void
|
||||
send_focus_change (GtkWidget *widget,
|
||||
gboolean in)
|
||||
{
|
||||
GdkEvent *fevent = gdk_event_new (GDK_FOCUS_CHANGE);
|
||||
|
||||
g_object_ref (widget);
|
||||
|
||||
fevent->focus_change.type = GDK_FOCUS_CHANGE;
|
||||
fevent->focus_change.window = g_object_ref (gtk_widget_get_window (widget));
|
||||
fevent->focus_change.in = in;
|
||||
|
||||
gtk_widget_event (widget, fevent);
|
||||
|
||||
g_object_notify (G_OBJECT(widget), "has-focus");
|
||||
|
||||
g_object_unref (widget);
|
||||
gdk_event_free (fevent);
|
||||
}
|
||||
|
||||
static void
|
||||
hide_search_window (XedView *view,
|
||||
gboolean cancel)
|
||||
{
|
||||
if (view->priv->disable_popdown)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (view->priv->search_entry_changed_id != 0)
|
||||
{
|
||||
g_signal_handler_disconnect (view->priv->search_entry, view->priv->search_entry_changed_id);
|
||||
view->priv->search_entry_changed_id = 0;
|
||||
}
|
||||
|
||||
if (view->priv->typeselect_flush_timeout != 0)
|
||||
{
|
||||
g_source_remove (view->priv->typeselect_flush_timeout);
|
||||
view->priv->typeselect_flush_timeout = 0;
|
||||
}
|
||||
|
||||
/* send focus-in event */
|
||||
send_focus_change (GTK_WIDGET(view->priv->search_entry), FALSE);
|
||||
gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW(view), TRUE);
|
||||
gtk_widget_hide (view->priv->search_window);
|
||||
|
||||
if (cancel)
|
||||
{
|
||||
GtkTextBuffer *buffer;
|
||||
buffer = GTK_TEXT_BUFFER(gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)));
|
||||
gtk_text_buffer_place_cursor (buffer, &view->priv->start_search_iter);
|
||||
xed_view_scroll_to_cursor (view);
|
||||
}
|
||||
|
||||
/* make sure a focus event is sent for the edit area */
|
||||
send_focus_change (GTK_WIDGET(view), TRUE);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
search_entry_flush_timeout (XedView *view)
|
||||
{
|
||||
view->priv->typeselect_flush_timeout = 0;
|
||||
hide_search_window (view, FALSE);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
update_search_window_position (XedView *view)
|
||||
{
|
||||
gint x, y;
|
||||
gint view_x, view_y;
|
||||
GdkWindow *view_window = gtk_widget_get_window (GTK_WIDGET(view));
|
||||
|
||||
gtk_widget_realize (view->priv->search_window);
|
||||
gdk_window_get_origin (view_window, &view_x, &view_y);
|
||||
|
||||
x = MAX(12, view_x + 12);
|
||||
y = MAX(12, view_y - 12);
|
||||
|
||||
gtk_window_move (GTK_WINDOW(view->priv->search_window), x, y);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
search_window_deleted (GtkWidget *widget,
|
||||
GdkEventAny *event,
|
||||
XedView *view)
|
||||
{
|
||||
hide_search_window (view, FALSE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
search_window_button_pressed (GtkWidget *widget,
|
||||
GdkEventButton *event,
|
||||
XedView *view)
|
||||
{
|
||||
hide_search_window (view, FALSE);
|
||||
gtk_propagate_event (GTK_WIDGET(view), (GdkEvent *) event);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
search_window_key_pressed (GtkWidget *widget,
|
||||
GdkEventKey *event,
|
||||
XedView *view)
|
||||
{
|
||||
gboolean retval = FALSE;
|
||||
guint modifiers;
|
||||
|
||||
modifiers = gtk_accelerator_get_default_mod_mask ();
|
||||
|
||||
/* Close window */
|
||||
if (event->keyval == GDK_KEY_Tab)
|
||||
{
|
||||
hide_search_window (view, FALSE);
|
||||
retval = TRUE;
|
||||
}
|
||||
|
||||
/* Close window and cancel the search */
|
||||
if (event->keyval == GDK_KEY_Escape)
|
||||
{
|
||||
hide_search_window (view, TRUE);
|
||||
retval = TRUE;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void
|
||||
search_entry_activate (GtkEntry *entry,
|
||||
XedView *view)
|
||||
{
|
||||
hide_search_window (view, FALSE);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
real_search_enable_popdown (gpointer data)
|
||||
{
|
||||
XedView *view = (XedView *) data;
|
||||
view->priv->disable_popdown = FALSE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
search_enable_popdown (GtkWidget *widget,
|
||||
XedView *view)
|
||||
{
|
||||
g_timeout_add (200, real_search_enable_popdown, view);
|
||||
|
||||
/* renew the flush timeout */
|
||||
if (view->priv->typeselect_flush_timeout != 0)
|
||||
{
|
||||
g_source_remove (view->priv->typeselect_flush_timeout);
|
||||
}
|
||||
|
||||
view->priv->typeselect_flush_timeout = g_timeout_add (XED_VIEW_SEARCH_DIALOG_TIMEOUT,
|
||||
(GSourceFunc) search_entry_flush_timeout, view);
|
||||
}
|
||||
|
||||
static void
|
||||
search_entry_populate_popup (GtkEntry *entry,
|
||||
GtkMenu *menu,
|
||||
XedView *view)
|
||||
{
|
||||
GtkWidget *menu_item;
|
||||
view->priv->disable_popdown = TRUE;
|
||||
g_signal_connect(menu, "hide", G_CALLBACK (search_enable_popdown), view);
|
||||
}
|
||||
|
||||
static void
|
||||
search_entry_insert_text (GtkEditable *editable,
|
||||
const gchar *text,
|
||||
gint length,
|
||||
gint *position,
|
||||
XedView *view)
|
||||
{
|
||||
gunichar c;
|
||||
const gchar *p;
|
||||
const gchar *end;
|
||||
const gchar *next;
|
||||
|
||||
p = text;
|
||||
end = text + length;
|
||||
|
||||
if (p == end)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
c = g_utf8_get_char (p);
|
||||
|
||||
if (((c == '-' || c == '+') && *position == 0) || (c == ':' && *position != 0))
|
||||
{
|
||||
gchar *s = NULL;
|
||||
if (c == ':')
|
||||
{
|
||||
s = gtk_editable_get_chars (editable, 0, -1);
|
||||
s = g_utf8_strchr (s, -1, ':');
|
||||
}
|
||||
if (s == NULL || s == p)
|
||||
{
|
||||
next = g_utf8_next_char(p);
|
||||
p = next;
|
||||
}
|
||||
g_free (s);
|
||||
}
|
||||
|
||||
while (p != end)
|
||||
{
|
||||
next = g_utf8_next_char(p);
|
||||
c = g_utf8_get_char (p);
|
||||
if (!g_unichar_isdigit (c))
|
||||
{
|
||||
g_signal_stop_emission_by_name (editable, "insert_text");
|
||||
gtk_widget_error_bell (view->priv->search_entry);
|
||||
break;
|
||||
}
|
||||
p = next;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
customize_for_search_mode (XedView *view)
|
||||
{
|
||||
gtk_entry_set_icon_from_stock (GTK_ENTRY(view->priv->search_entry), GTK_ENTRY_ICON_PRIMARY, GTK_STOCK_JUMP_TO);
|
||||
gtk_widget_set_tooltip_text (view->priv->search_entry, _("Line you want to move the cursor to"));
|
||||
}
|
||||
|
||||
static void
|
||||
ensure_search_window (XedView *view)
|
||||
{
|
||||
GtkWidget *frame;
|
||||
GtkWidget *vbox;
|
||||
GtkWidget *toplevel;
|
||||
GtkWindowGroup *group;
|
||||
GtkWindowGroup *search_group;
|
||||
|
||||
toplevel = gtk_widget_get_toplevel (GTK_WIDGET(view));
|
||||
group = gtk_window_get_group (GTK_WINDOW(toplevel));
|
||||
if (view->priv->search_window != NULL)
|
||||
{
|
||||
search_group = gtk_window_get_group (GTK_WINDOW(view->priv->search_window));
|
||||
}
|
||||
|
||||
if (view->priv->search_window != NULL)
|
||||
{
|
||||
if (group)
|
||||
{
|
||||
gtk_window_group_add_window (group, GTK_WINDOW(view->priv->search_window));
|
||||
}
|
||||
else if (search_group)
|
||||
{
|
||||
gtk_window_group_remove_window (search_group, GTK_WINDOW(view->priv->search_window));
|
||||
}
|
||||
customize_for_search_mode (view);
|
||||
return;
|
||||
}
|
||||
|
||||
view->priv->search_window = gtk_window_new (GTK_WINDOW_POPUP);
|
||||
|
||||
if (group)
|
||||
{
|
||||
gtk_window_group_add_window (group, GTK_WINDOW(view->priv->search_window));
|
||||
}
|
||||
|
||||
gtk_window_set_modal (GTK_WINDOW(view->priv->search_window), TRUE);
|
||||
|
||||
g_signal_connect(view->priv->search_window, "delete_event", G_CALLBACK (search_window_deleted), view);
|
||||
g_signal_connect(view->priv->search_window, "key_press_event", G_CALLBACK (search_window_key_pressed), view);
|
||||
g_signal_connect(view->priv->search_window, "button_press_event", G_CALLBACK (search_window_button_pressed), view);
|
||||
|
||||
frame = gtk_frame_new (NULL);
|
||||
gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN);
|
||||
gtk_widget_show (frame);
|
||||
gtk_container_add (GTK_CONTAINER(view->priv->search_window), frame);
|
||||
|
||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||
gtk_widget_show (vbox);
|
||||
gtk_container_add (GTK_CONTAINER(frame), vbox);
|
||||
gtk_container_set_border_width (GTK_CONTAINER(vbox), 3);
|
||||
|
||||
/* add entry */
|
||||
view->priv->search_entry = gtk_entry_new ();
|
||||
gtk_widget_show (view->priv->search_entry);
|
||||
|
||||
g_signal_connect(view->priv->search_entry, "populate_popup", G_CALLBACK (search_entry_populate_popup), view);
|
||||
g_signal_connect(view->priv->search_entry, "activate", G_CALLBACK (search_entry_activate), view);
|
||||
g_signal_connect(view->priv->search_entry, "insert_text", G_CALLBACK (search_entry_insert_text), view);
|
||||
|
||||
gtk_container_add (GTK_CONTAINER(vbox), view->priv->search_entry);
|
||||
gtk_widget_realize (view->priv->search_entry);
|
||||
|
||||
customize_for_search_mode (view);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
get_selected_text (GtkTextBuffer *doc,
|
||||
gchar **selected_text,
|
||||
gint *len)
|
||||
{
|
||||
GtkTextIter start, end;
|
||||
|
||||
g_return_val_if_fail(selected_text != NULL, FALSE);
|
||||
g_return_val_if_fail(*selected_text == NULL, FALSE);
|
||||
|
||||
if (!gtk_text_buffer_get_selection_bounds (doc, &start, &end))
|
||||
{
|
||||
if (len != NULL)
|
||||
{
|
||||
len = 0;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
*selected_text = gtk_text_buffer_get_slice (doc, &start, &end, TRUE);
|
||||
|
||||
if (len != NULL)
|
||||
{
|
||||
*len = g_utf8_strlen (*selected_text, -1);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
init_search_entry (XedView *view)
|
||||
{
|
||||
gint line;
|
||||
gchar *line_str;
|
||||
|
||||
line = gtk_text_iter_get_line (&view->priv->start_search_iter);
|
||||
line_str = g_strdup_printf ("%d", line + 1);
|
||||
gtk_entry_set_text (GTK_ENTRY(view->priv->search_entry), line_str);
|
||||
|
||||
g_free (line_str);
|
||||
return;
|
||||
}
|
||||
|
||||
static void
|
||||
search_init (GtkWidget *entry,
|
||||
XedView *view)
|
||||
{
|
||||
XedDocument *doc;
|
||||
const gchar *entry_text;
|
||||
|
||||
/* renew the flush timeout */
|
||||
if (view->priv->typeselect_flush_timeout != 0)
|
||||
{
|
||||
g_source_remove (view->priv->typeselect_flush_timeout);
|
||||
view->priv->typeselect_flush_timeout = g_timeout_add (XED_VIEW_SEARCH_DIALOG_TIMEOUT,
|
||||
(GSourceFunc) search_entry_flush_timeout, view);
|
||||
}
|
||||
doc = XED_DOCUMENT(gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)));
|
||||
|
||||
entry_text = gtk_entry_get_text (GTK_ENTRY(entry));
|
||||
|
||||
if (*entry_text != '\0')
|
||||
{
|
||||
gboolean moved, moved_offset;
|
||||
gint line;
|
||||
gint offset_line = 0;
|
||||
gint line_offset = 0;
|
||||
gchar **split_text = NULL;
|
||||
const gchar *text;
|
||||
|
||||
split_text = g_strsplit (entry_text, ":", -1);
|
||||
|
||||
if (g_strv_length (split_text) > 1)
|
||||
{
|
||||
text = split_text[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
text = entry_text;
|
||||
}
|
||||
|
||||
if (*text == '-')
|
||||
{
|
||||
gint cur_line = gtk_text_iter_get_line (&view->priv->start_search_iter);
|
||||
|
||||
if (*(text + 1) != '\0')
|
||||
{
|
||||
offset_line = MAX(atoi (text + 1), 0);
|
||||
}
|
||||
|
||||
line = MAX(cur_line - offset_line, 0);
|
||||
}
|
||||
else if (*entry_text == '+')
|
||||
{
|
||||
gint cur_line = gtk_text_iter_get_line (&view->priv->start_search_iter);
|
||||
|
||||
if (*(text + 1) != '\0')
|
||||
{
|
||||
offset_line = MAX(atoi (text + 1), 0);
|
||||
}
|
||||
|
||||
line = cur_line + offset_line;
|
||||
}
|
||||
else
|
||||
{
|
||||
line = MAX(atoi (text) - 1, 0);
|
||||
}
|
||||
|
||||
if (split_text[1] != NULL)
|
||||
{
|
||||
line_offset = atoi (split_text[1]);
|
||||
}
|
||||
|
||||
g_strfreev (split_text);
|
||||
|
||||
moved = xed_document_goto_line (doc, line);
|
||||
moved_offset = xed_document_goto_line_offset (doc, line, line_offset);
|
||||
|
||||
xed_view_scroll_to_cursor (view);
|
||||
|
||||
if (!moved || !moved_offset)
|
||||
{
|
||||
set_entry_state (view->priv->search_entry, XED_SEARCH_ENTRY_NOT_FOUND);
|
||||
}
|
||||
else
|
||||
{
|
||||
set_entry_state (view->priv->search_entry, XED_SEARCH_ENTRY_NORMAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
start_interactive_goto_line (XedView *view)
|
||||
{
|
||||
GtkTextBuffer *buffer;
|
||||
|
||||
if ((view->priv->search_window != NULL) && gtk_widget_get_visible (view->priv->search_window))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (!gtk_widget_has_focus (GTK_WIDGET(view)))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(view));
|
||||
|
||||
gtk_text_buffer_get_iter_at_mark (buffer, &view->priv->start_search_iter, gtk_text_buffer_get_insert (buffer));
|
||||
|
||||
ensure_search_window (view);
|
||||
|
||||
/* done, show it */
|
||||
update_search_window_position (view);
|
||||
gtk_widget_show (view->priv->search_window);
|
||||
|
||||
if (view->priv->search_entry_changed_id == 0)
|
||||
{
|
||||
view->priv->search_entry_changed_id = g_signal_connect(view->priv->search_entry, "changed",
|
||||
G_CALLBACK (search_init), view);
|
||||
}
|
||||
|
||||
init_search_entry (view);
|
||||
|
||||
view->priv->typeselect_flush_timeout = g_timeout_add (XED_VIEW_SEARCH_DIALOG_TIMEOUT,
|
||||
(GSourceFunc) search_entry_flush_timeout, view);
|
||||
|
||||
gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW(view), FALSE);
|
||||
gtk_widget_grab_focus (view->priv->search_entry);
|
||||
|
||||
send_focus_change (view->priv->search_entry, TRUE);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
Reference in New Issue
Block a user