/* compose_scroll_to_offset */ void compose_scroll_to_offset(Compose * compose, int offset) { GtkTextBuffer * buffer; GtkTextIter iter; buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(compose->view)); gtk_text_buffer_get_iter_at_offset(buffer, &iter, offset); gtk_text_buffer_place_cursor(buffer, &iter); gtk_text_view_place_cursor_onscreen(GTK_TEXT_VIEW(compose->view)); }
void goto_local_label (const gchar *l) { gchar *t = g_utf8_find_next_char (l, NULL); gchar *s = g_strconcat ("<a name=\"", t, NULL); GtkTextIter iter; GtkTextIter match_start; GtkTextMark *m = gtk_text_buffer_get_insert (GTK_TEXT_BUFFER(cur_text_doc->text_buffer)); gtk_text_buffer_get_iter_at_mark (GTK_TEXT_BUFFER(cur_text_doc->text_buffer), &iter, m); if (gtk_text_iter_forward_search (&iter, s, GTK_TEXT_SEARCH_TEXT_ONLY, &match_start, NULL, NULL)) { gtk_text_buffer_place_cursor (GTK_TEXT_BUFFER(cur_text_doc->text_buffer), &match_start ); gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW(cur_text_doc->text_view), &match_start, 0.0, TRUE, 0.0, 0.0 ); gtk_text_view_place_cursor_onscreen (GTK_TEXT_VIEW (cur_text_doc->text_view)); } g_free (s); }
static VALUE textview_place_cursor_onscreen(VALUE self) { return CBOOL2RVAL(gtk_text_view_place_cursor_onscreen(_SELF(self))); }
/*-------------------------------textview------------------------------*/ static gboolean textview2_key_press_event_cb(GtkWidget *winParent, GdkEvent *event, gpointer userdata) { gboolean setFalseG = TRUE; /*Receive input in search mode*/ if (inSearch == TRUE) { unsigned int c = event->key.keyval; /*get keyval as char*/ if( c != GDK_KEY_KP_Enter && c != GDK_Return ) { if(isascii(c))/*can not input cjk thus not accounted*/ strOper++[0] = c; else if(c == GDK_BackSpace && strOper > searchStr) strOper--; else { ;/*skip*/ } strOper[0] = '\0'; } else { /*highlight and try moving forward to target on Enter*/ if(strlen(searchStr) != 0) { my_text_buffer_highlight(text2, searchStr, 4); myre_move_to_string(text2, searchStr, 1); } inSearch = FALSE; } if(inSearch) gtk_statusbar_push(status, gtk_statusbar_get_context_id(status,"status"), searchStr); else gtk_statusbar_push(status, gtk_statusbar_get_context_id(status, "status"), "End Search"); return TRUE; } switch(event->key.keyval) { case GDK_i: gtk_widget_grab_focus(entry); break; case GDK_I: gtk_widget_grab_focus(entry); gtk_editable_set_position((GtkEditable *)entry, 0); break; case GDK_a: case GDK_A: gtk_widget_grab_focus(entry); gtk_editable_set_position((GtkEditable *)entry, -1); break; case GDK_x: case GDK_X: button2_clicked_cb(); return TRUE; case GDK_j: case GDK_KEY_Down: g_signal_emit_by_name(textview2, "move-cursor", GTK_MOVEMENT_DISPLAY_LINES, 1, inSelect && inCursor, NULL); break; case GDK_k: case GDK_KEY_Up: g_signal_emit_by_name(textview2, "move-cursor", GTK_MOVEMENT_DISPLAY_LINES, -1, inSelect && inCursor, NULL); break; case GDK_h: case GDK_KEY_Left: g_signal_emit_by_name(textview2, "move-cursor", GTK_MOVEMENT_VISUAL_POSITIONS, -1, inSelect && inCursor, NULL); break; case GDK_l: case GDK_KEY_Right: g_signal_emit_by_name(textview2, "move-cursor", GTK_MOVEMENT_VISUAL_POSITIONS, 1, inSelect && inCursor, NULL); break; case GDK_w: case GDK_e: g_signal_emit_by_name(textview2, "move-cursor", GTK_MOVEMENT_WORDS, 1, inSelect && inCursor, NULL); break; case GDK_b: g_signal_emit_by_name(textview2, "move-cursor", GTK_MOVEMENT_WORDS, -1, inSelect && inCursor, NULL); break; case GDK_n: myre_move_to_string(text2, searchStr, 1); break; case GDK_N: myre_move_to_string(text2, searchStr, 0); break; case GDK_g: if(inVimG) { gtk_text_buffer_get_iter_at_offset(text2, ¤t, 0); gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(textview2), ¤t, 0, /* 0.0-0.5 screen */ TRUE, /* use xy align */ 0, /* x */ 0 /* y */ ); gtk_text_buffer_place_cursor(text2, ¤t); } inVimG = !inVimG; setFalseG = FALSE; break; case GDK_G: gtk_text_iter_forward_to_end (¤t); gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(textview2), ¤t, 0, TRUE, 0, 0 ); gtk_text_buffer_place_cursor(text2, ¤t); break; case GDK_KEY_slash: /* toggle search */ inSearch = !inSearch; if(NULL == searchStr) { searchStr = malloc(MAX_LENGTH); } /* try unmarking last search */ if (strlen(searchStr) != 0) { my_text_buffer_highlight(text2, searchStr, 5); } memset(searchStr, '\0', MAX_LENGTH); strOper = searchStr; gtk_statusbar_push(status, gtk_statusbar_get_context_id(status, "status"), "--Search--"); break; case GDK_KEY_KP_Enter: case GDK_Return: /*end search string input*/ inSearch = FALSE; break; case GDK_p: /* put selection to entry */ gtk_widget_grab_focus(entry); g_signal_emit_by_name(entry, "paste-clipboard", entry, NULL); break; case GDK_y: /* copy to clipboard */ if(gtk_text_buffer_get_has_selection(text2)) { g_signal_emit_by_name(textview2, "copy-clipboard", GTK_TEXT_VIEW(textview2), NULL); g_signal_emit_by_name(textview2, "move-cursor", GTK_MOVEMENT_VISUAL_POSITIONS, 0, FALSE, NULL); gtk_statusbar_push(status, gtk_statusbar_get_context_id(status, "status"), "Selection copied to clipboard."); /* cursor off after yank */ inCursor = FALSE; gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(textview2), inCursor); /* selection off */ inSelect = FALSE; } else /* vacant yank attempts */ gtk_statusbar_push(status, gtk_statusbar_get_context_id(status, "status"), "--Search--Empty Yank Ignored"); break; case GDK_v: /* toggle select mode */ if(!inCursor) /* make sure cursor is shown */ { inCursor = TRUE; vCursor = TRUE; gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(textview2), inCursor); } if (inSelect) { /* clear selection */ if(gtk_text_buffer_get_has_selection(text2)) g_signal_emit_by_name(textview2, "move-cursor", GTK_MOVEMENT_VISUAL_POSITIONS, 0, FALSE, NULL); gtk_statusbar_push(status, gtk_statusbar_get_context_id(status, "status"), ""); /* exit vCursor after move-cursor dependency */ if (inCursor && vCursor) { gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(textview2), FALSE); inCursor = FALSE; vCursor = FALSE; } } else { gtk_statusbar_push(status, gtk_statusbar_get_context_id(status, "status"), "--Selection--"); } inSelect = !inSelect; break; case GDK_c: /* always expire select mode */ inSelect = FALSE; /* clear selection, should be inCursor */ if(gtk_text_buffer_get_has_selection(text2)) g_signal_emit_by_name(textview2, "move-cursor", GTK_MOVEMENT_VISUAL_POSITIONS, 0, FALSE, NULL); gtk_statusbar_push(status, gtk_statusbar_get_context_id(status, "status"), ""); /* show cursor for selection */ inCursor = !inCursor; gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(textview2), inCursor); break; default: return FALSE; } if(setFalseG) inVimG = FALSE; if( !(inSearch || inSelect) ) { gtk_text_view_place_cursor_onscreen(GTK_TEXT_VIEW(textview2)); } return TRUE; }