void dma_data_view_refresh (DmaDataView *view) { gchar *data = ""; gint offset; GtkTextIter cur; GtkTextMark *mark; GtkTextBuffer *buffer; /* Save all cursor offset */ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view->address)); mark = gtk_text_buffer_get_insert (buffer); gtk_text_buffer_get_iter_at_mark (buffer, &cur, mark); offset = gtk_text_iter_get_offset (&cur); data = dma_data_buffer_get_address (view->buffer, view->start, view->line_by_page * view->bytes_by_line, view->bytes_by_line, sizeof(view->start) * 2); gtk_text_buffer_set_text (buffer, data, -1); g_free (data); mark = gtk_text_buffer_get_insert (buffer); gtk_text_buffer_get_iter_at_mark (buffer, &cur, mark); gtk_text_iter_set_offset (&cur, offset); gtk_text_buffer_move_mark_by_name (buffer, "insert", &cur); gtk_text_buffer_move_mark_by_name (buffer, "selection_bound", &cur); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view->data)); mark = gtk_text_buffer_get_insert (buffer); gtk_text_buffer_get_iter_at_mark (buffer, &cur, mark); offset = gtk_text_iter_get_offset (&cur); data = dma_data_buffer_get_data (view->buffer, view->start, view->line_by_page * view->bytes_by_line, view->bytes_by_line, DMA_HEXADECIMAL_BASE); gtk_text_buffer_set_text (buffer, data, -1); g_free (data); mark = gtk_text_buffer_get_insert (buffer); gtk_text_buffer_get_iter_at_mark (buffer, &cur, mark); gtk_text_iter_set_offset (&cur, offset); gtk_text_buffer_move_mark_by_name (buffer, "insert", &cur); gtk_text_buffer_move_mark_by_name (buffer, "selection_bound", &cur); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view->ascii)); mark = gtk_text_buffer_get_insert (buffer); gtk_text_buffer_get_iter_at_mark (buffer, &cur, mark); offset = gtk_text_iter_get_offset (&cur); data = dma_data_buffer_get_data (view->buffer, view->start, view->line_by_page * view->bytes_by_line, view->bytes_by_line, DMA_ASCII_BASE); gtk_text_buffer_set_text (buffer, data, -1); g_free (data); mark = gtk_text_buffer_get_insert (buffer); gtk_text_buffer_get_iter_at_mark (buffer, &cur, mark); gtk_text_iter_set_offset (&cur, offset); gtk_text_buffer_move_mark_by_name (buffer, "insert", &cur); gtk_text_buffer_move_mark_by_name (buffer, "selection_bound", &cur); }
void dma_sparse_view_refresh (DmaSparseView *view) { gint offset; GtkTextIter cur; GtkTextMark *mark; GtkTextIter start, end; GtkTextBuffer *buffer; buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); /* Save all cursor offset */ mark = gtk_text_buffer_get_insert (buffer); gtk_text_buffer_get_iter_at_mark (buffer, &cur, mark); offset = gtk_text_iter_get_offset (&cur); /* Remove old data */ view->priv->stamp++; gtk_text_buffer_get_bounds (buffer, &start, &end); gtk_text_buffer_delete (buffer, &start, &end); gtk_text_buffer_get_iter_at_offset (buffer, &end, 0); /* Get data */ dma_sparse_iter_insert_lines (&view->priv->start, &end, view->priv->line_by_page); /* Restore cursor */ mark = gtk_text_buffer_get_insert (buffer); gtk_text_buffer_get_iter_at_mark(buffer, &cur, mark); gtk_text_iter_set_offset (&cur, offset); gtk_text_buffer_move_mark_by_name (buffer, "insert", &cur); gtk_text_buffer_move_mark_by_name (buffer, "selection_bound", &cur); }
static void text_inserted_after_cb (GbColorPickerDocumentMonitor *self, GtkTextIter *iter, gchar *text, gint len, GtkTextBuffer *buffer) { GtkTextIter begin, end; gint offset; g_assert (GB_IS_COLOR_PICKER_DOCUMENT_MONITOR (self)); g_assert (GTK_IS_TEXT_BUFFER (buffer)); g_assert (iter != NULL); begin = *iter; offset = gtk_text_iter_get_offset (&begin); gtk_text_iter_set_offset (&begin, offset - len); gtk_text_iter_set_line_offset (&begin, 0); end = *iter; if (!gtk_text_iter_ends_line (&end)) gtk_text_iter_forward_to_line_end (&end); gb_color_picker_document_monitor_queue_colorize (self, &begin, &end); }
void gTextArea::setPosition(int vl) { GtkTextIter *iter = getIterAt(); gtk_text_iter_set_offset(iter, vl); gtk_text_buffer_place_cursor(_buffer, iter); ensureVisible(); }
void pTextEdit::setCursorPosition(unsigned position) { GtkTextMark *mark = gtk_text_buffer_get_mark(textBuffer, "insert"); GtkTextIter iter; gtk_text_buffer_get_end_iter(textBuffer, &iter); gtk_text_iter_set_offset(&iter, min(position, gtk_text_iter_get_offset(&iter))); gtk_text_buffer_place_cursor(textBuffer, &iter); gtk_text_view_scroll_mark_onscreen(GTK_TEXT_VIEW(subWidget), mark); }
void gTextArea::selDelete() { GtkTextIter start, end; if (gtk_text_buffer_get_selection_bounds(_buffer, &start, &end)) { gtk_text_iter_set_offset(&end, gtk_text_iter_get_offset(&start)); gtk_text_buffer_select_range(_buffer, &start, &end); } }
void pHexEdit::setCursorPosition(unsigned position) { GtkTextIter iter; gtk_text_buffer_get_iter_at_mark(textBuffer, &iter, textCursor); //GTK+ will throw many errors to the terminal if you set iterator past end of buffer GtkTextIter endIter; gtk_text_buffer_get_end_iter(textBuffer, &iter); unsigned endPosition = gtk_text_iter_get_offset(&iter); gtk_text_iter_set_offset(&iter, min(position, endPosition)); gtk_text_buffer_place_cursor(textBuffer, &iter); }
void gTextArea::selSelect(int pos, int length) { GtkTextIter start, end; gtk_text_buffer_get_end_iter(_buffer, &start); if (gtk_text_iter_get_offset(&start) < pos) pos = gtk_text_iter_get_offset(&start); if (pos < 0) { length -= pos; pos = 0; } if ((pos + length) < 0) length = (-pos); gtk_text_buffer_get_selection_bounds(_buffer, &start, &end); gtk_text_iter_set_offset(&start, pos); gtk_text_iter_set_offset(&end, pos + length); gtk_text_buffer_select_range(_buffer, &start, &end); }
/** * find: * @callback_data: TRUE if I have to continue a previous search * * Search operation. */ void find (GtkWidget *widget, gpointer callback_data) { guint again = GPOINTER_TO_UINT(callback_data); static gboolean only_current, case_sens; gint found, offset = 0; guchar *buf; GtkTextIter position; GtkTextMark *cursor, *endsel; GtkWidget *parent = gtk_widget_get_toplevel(widget); if (!again) if (!grg_find_dialog (&needle, &only_current, &case_sens, GTK_WINDOW (parent))) return; buf = grg_entries_get_Body (); if (((current_mode == SIMPLE_ENTRY) && GTK_WIDGET_HAS_FOCUS (simpleSheet))/* || ((current_mode == STRUCT_ENTRY) && GTK_WIDGET_HAS_FOCUS (structSheet))*/) { cursor = gtk_text_buffer_get_mark (entryBuf, "insert"); gtk_text_buffer_get_iter_at_mark (entryBuf, &position, cursor); offset = gtk_text_iter_get_offset (&position); } while (TRUE) { found = grg_entries_find (needle, offset, only_current, case_sens); if (found >= 0) { buf = grg_entries_get_Body (); g_signal_handler_block (entryBuf, simpleSigID); gtk_text_buffer_set_text (entryBuf, buf, -1); g_signal_handler_unblock (entryBuf, simpleSigID); //to avoid that searching again and again the same text finds //the same portion, we set the cursor AFTER the found text cursor = gtk_text_buffer_get_mark (entryBuf, "insert"); gtk_text_buffer_get_iter_at_mark (entryBuf, &position, cursor); endsel = gtk_text_buffer_get_mark (entryBuf, "selection_bound"); gtk_text_iter_set_offset (&position, found); gtk_text_buffer_move_mark (entryBuf, cursor, &position); gtk_text_iter_set_offset (&position, found + g_utf8_strlen (needle, -1)); gtk_text_buffer_move_mark (entryBuf, endsel, &position); break; } else { if (only_current) { grg_msg (_ ("The text searched could not be found!"), GTK_MESSAGE_ERROR, parent); break; } else { if (grg_ask_dialog (_("Wrap around?"), _("Text not found. Continue search from beginning?"), FALSE, parent) == GRG_YES) { grg_entries_first (); offset = 0; continue; } else break; } } } }
/** * find: * @callback_data: TRUE if I have to continue a previous search * * Search operation. */ void find (GtkWidget *widget, gpointer callback_data) { guint again = GPOINTER_TO_UINT(callback_data); static gboolean only_current, case_sens; gint found, offset = 0; gchar *buf; GtkTextIter position; GtkTextMark *cursor, *endsel; GtkWidget *parent = gtk_widget_get_toplevel(widget); if (!again) if (!grg_find_dialog (&needle, &only_current, &case_sens, GTK_WINDOW (parent))) return; buf = grg_entries_get_Body (); if (((current_mode == SIMPLE_ENTRY) && GTK_WIDGET_HAS_FOCUS (simpleSheet))/* || ((current_mode == STRUCT_ENTRY) && GTK_WIDGET_HAS_FOCUS (structSheet))*/) { cursor = gtk_text_buffer_get_mark (entryBuf, "insert"); gtk_text_buffer_get_iter_at_mark (entryBuf, &position, cursor); offset = gtk_text_iter_get_offset (&position); } while (TRUE) { found = grg_entries_find (needle, offset, only_current, case_sens); if (found >= 0) { buf = grg_entries_get_Body (); g_signal_handler_block (entryBuf, simpleSigID); gtk_text_buffer_set_text (entryBuf, buf, -1); g_signal_handler_unblock (entryBuf, simpleSigID); //to avoid that searching again and again the same text finds //the same portion, we set the cursor AFTER the found text /* And this time really do it -- Shlomi Fish */ cursor = gtk_text_buffer_get_mark (entryBuf, "insert"); gtk_text_buffer_get_iter_at_mark (entryBuf, &position, cursor); endsel = gtk_text_buffer_get_mark (entryBuf, "selection_bound"); gtk_text_iter_set_offset (&position, found + g_utf8_strlen (needle, -1)); gtk_text_buffer_move_mark (entryBuf, cursor, &position); gtk_text_iter_set_offset (&position, found); gtk_text_buffer_move_mark (entryBuf, endsel, &position); /* * Make sure that the text-view window scrolls to * view the current selection. * */ gtk_text_view_scroll_mark_onscreen (GTK_TEXT_VIEW (simpleSheet), gtk_text_buffer_get_mark (entryBuf, "insert")); /* * Make sure that the sheet gets focus, this is so * pressing "Find again" consecutively will yield * a second result, as well, as let the user move the * cursor immediately. * */ gtk_widget_grab_focus (GTK_WIDGET (simpleSheet)); break; } else { if (only_current) { grg_msg (_ ("The text searched could not be found!"), GTK_MESSAGE_ERROR, parent); break; } else { if (grg_ask_dialog (_("Wrap around?"), _("Text not found. Continue search from beginning?"), FALSE, parent) == GRG_YES) { grg_entries_first (); /* Call update() now, because we changed the page and * sync() may be called later, which will otherwise * cause the first page to be over-rided with the * info in the current page. * */ update(); offset = 0; continue; } else break; } } } }