static gboolean gtkui_connections_scroll(gpointer data)
{
   if((int)data == 1 && textview1 && endmark1 && textview2 && endmark2) {
      /* scroll split data views to bottom */
      gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW (textview1), endmark1, 0, FALSE, 0, 0);
      gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW (textview2), endmark2, 0, FALSE, 0, 0); 
   } else if(textview3 && endmark3) {
      /* scroll joined data view to bottom */
      gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW (textview3), endmark3, 0, FALSE, 0, 0);
   }

   /* only execute once, don't repeat */
   return(FALSE);
}
示例#2
0
void write(std::string stringToInsert)
{
    const char *charToInsert;
    charToInsert = stringToInsert.c_str();
    gtk_text_buffer_insert (dialogBuffer, &endIter, charToInsert, -1);
    gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (dialogText), endMark, 0.0, FALSE, 0.0, 1.0);
};
示例#3
0
文件: gui.c 项目: oreoPanda/chatnut
extern void show_message_history(const char *history)
{
	GtkTextBuffer *historybuffer = NULL;
	GtkTextIter end;
	GtkTextMark *mark;

	historybuffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(history_view) );

	if(history)
	{
		//TODO not checking if historybuffer is non-NULL because I think gtktextview always has a gtktextbuffer
		gtk_text_buffer_set_text( historybuffer, history, -1 );	//-1 cuz text is terminated

		/*scroll down*/
		gtk_text_buffer_get_end_iter( historybuffer, &end );
		mark = gtk_text_mark_new( NULL, FALSE );
		gtk_text_buffer_add_mark( historybuffer, mark, &end );
		gtk_text_view_scroll_to_mark( GTK_TEXT_VIEW(history_view), mark, 0, FALSE, 1.0, 1.0 );
	}
	else
	{
		gtk_text_buffer_set_text( historybuffer, "<No recent chats found>", -1 );	//-1 cuz text is terminated
	}

	return;
}
示例#4
0
void upload_cb(GtkWidget *tool, GtkTextView *output)
{
	if (project_path->str == NULL)
		return;

	FILE *make;
	char tmp[BUF_LEN];
	GtkTextBuffer *text_buffer;
	GtkTextIter end;
	GtkTextMark *mk;
	
	text_buffer = gtk_text_view_get_buffer(output);

	make = popen("make upload 2>&1", "r");
	if (make == NULL) {
		fprintf(stderr, "Failed to call 'make clean'\n");
		return;
	}

	while (fgets(tmp, BUF_LEN, make) != NULL) {
		gtk_text_buffer_get_end_iter(text_buffer, &end);
		gtk_text_buffer_insert(text_buffer, &end, tmp, -1);
	}

	mk = gtk_text_buffer_get_mark (text_buffer, "insert");
	gtk_text_view_scroll_to_mark (output, mk, 0.0, FALSE, 0.0, 0.0);	
}
示例#5
0
static gint
progress_log_cb(GWEN_GUI *gwen_gui, guint32 id, GWEN_LOGGER_LEVEL level,
                const gchar *text)
{
    GncGWENGui *gui = GETDATA_GUI(gwen_gui);
    GtkTextBuffer *tb;
    GtkTextView *tv;

    g_return_val_if_fail(gui, -1);

    ENTER("gui=%p, text=%s", gui, text ? text : "(null)");

    tv = GTK_TEXT_VIEW(gui->log_text);
    tb = gtk_text_view_get_buffer(tv);
    gtk_text_buffer_insert_at_cursor(tb, text, -1);
    gtk_text_buffer_insert_at_cursor(tb, "\n", -1);

    /* Scroll to the end of the buffer */
    gtk_text_view_scroll_to_mark(tv, gtk_text_buffer_get_insert(tb),
                                 0.0, FALSE, 0.0, 0.0);

    /* Cache loglevel */
    if (level < gui->min_loglevel)
        gui->min_loglevel = level;

    LEAVE(" ");
    return !keep_alive(gui);
}
示例#6
0
void chatbox_insert_msg(chatbox_t *chatbox, char *sender, time_t *tm, char *msg) {
	char buf[65535];
	GtkTextView *output_textview;
	

	GtkTextBuffer *output_buffer;
	GtkTextIter start;
	GtkTextIter end;
	GtkTextMark *mark;

	chatbox = (chatbox_t*)(chatbox);

	output_textview = chatbox->display_textview;

	output_buffer = gtk_text_view_get_buffer(output_textview);

	sprintf(buf, "%s(%s):\n", sender, my_ctime(tm));
	gtk_text_buffer_get_end_iter(output_buffer, &end);
	gtk_text_buffer_insert_with_tags_by_name(output_buffer, &end,
			buf, -1, "blue_fg", "lmarg", "title_font", NULL);

	insert_msg_with_emotion_to_textview(output_textview, msg);
	
	gtk_text_buffer_get_end_iter(output_buffer, &end);
	mark = gtk_text_buffer_create_mark(output_buffer, NULL, &end, FALSE);
	gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(output_textview), mark,
		0.0, TRUE, 0.0, 0.0);
	gtk_text_buffer_delete_mark(output_buffer, mark);
}
示例#7
0
void ctk_help_set_page(CtkHelp *ctk_help, GtkTextBuffer *buffer)
{
    GtkTextBuffer *b;
    GtkTextIter iter;
    GtkTextView *view;
    GtkTextMark *mark;

    if (buffer) {
        b = buffer;
    } else {
        b = ctk_help->default_help;
    }

    view = GTK_TEXT_VIEW(ctk_help->text_viewer);

    /* set the buffer in the TextView */

    gtk_text_view_set_buffer(view, b);

    /* ensure that the top of the buffer is displayed */

    gtk_text_buffer_get_start_iter(b, &iter);
    mark = gtk_text_buffer_create_mark(b, NULL, &iter, TRUE);
    gtk_text_view_scroll_to_mark(view, mark, 0.0, TRUE, 0.0, 0.0);
    gtk_text_buffer_place_cursor(b, &iter);
}
示例#8
0
文件: popup.c 项目: sina-ht/ebview
static gint scroll_to_top()
{
	GtkTextIter iter;
	GtkTextMark *mark;

	LOG(LOG_DEBUG, "IN : scroll_to_top()");

	gtk_text_buffer_get_start_iter (text_buffer, &iter);

	mark =  gtk_text_buffer_create_mark(text_buffer,
					    "start",
					    &iter,
					    TRUE);

	gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(popup_view),
				     mark,
				     0.0,
				     TRUE,
				     0.0, 0.0);

	gtk_text_buffer_delete_mark(text_buffer, mark);


	LOG(LOG_DEBUG, "OUT : scroll_to_top()");
	return(0);
}
示例#9
0
gint
add_text(gpointer data)
{
    GtkTextBuffer *text_buffer = gtk_text_view_get_buffer(
            GTK_TEXT_VIEW(text_view));

    GtkTextIter text_iter;
    gtk_text_buffer_get_end_iter(text_buffer, &text_iter);

    if (count == 0) {
        gtk_text_buffer_insert(text_buffer, &text_iter, "First line\n", -1);
    }
    else if (count % 5 == 0) {
        gtk_text_buffer_insert(text_buffer, &text_iter, "world\n", -1);
    }
    else {
        gtk_text_buffer_insert(text_buffer, &text_iter, "hello\n", -1);
    }

    count++;

    /* - - DOES NOT WORK LIKE I EXPECT */
    GtkTextMark *mark = gtk_text_buffer_get_insert(text_buffer);
    gtk_text_buffer_move_mark(text_buffer, mark, &text_iter);
    gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(text_view), mark, 0.0,
        FALSE, 0, 0);
    /* - - */

    return TRUE;
}
示例#10
0
文件: cmUI.c 项目: entalent/SkyQ
void scroll_to_the_end(struct text_view_info *viewinfo){
    GtkTextIter end;
    gtk_text_buffer_get_end_iter(viewinfo->view1_buffer,&end);
    GtkTextMark *mark=gtk_text_buffer_create_mark(viewinfo->view1_buffer,NULL,&end,1);
    gtk_text_buffer_move_mark(viewinfo->view1_buffer,mark,&end);
    gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(viewinfo->view1),mark,0,1,1,1);
}
示例#11
0
//================================================================
  int GUI_edi_scroll_s (MemObj *mo) {
//================================================================
/// scroll to active insert-mark
/// makes unselect ?

  GtkTextMark *mk1;
  GtkTextIter it1;

  // printf("GUI_edi_scroll_s \n");

  if(mo) {   // for internal call: mo=NULL
    if(GUI_ed1_decode(mo)) return -1;
  }

  // scroll to insert-mark:
  mk1 = gtk_text_buffer_get_mark (GUI_ed1_buff, "insert");

  // gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW(wTx->view), &it1,
  gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (GUI_ed1_view), mk1,
     0.1,              // within_margin
     FALSE,            // use_align
     0.5, 0.0);        // xalign,yalign


  // ohne foc selection nicht sichbar !!
  GUI_edi_Focus (NULL);


  return 0;

}
示例#12
0
static VALUE
textview_scroll_to_mark(VALUE self, VALUE mark, VALUE within_margin, VALUE use_align, VALUE xalign, VALUE yalign)
{
    gtk_text_view_scroll_to_mark(_SELF(self), RVAL2MARK(mark), 
                                 NUM2DBL(within_margin), RVAL2CBOOL(use_align), 
                                 NUM2DBL(xalign), NUM2DBL(yalign));
    return self;
}
示例#13
0
/*
 * Function: refresh_textview_from_fd
 *
 * This function is called when data are readable from our pipe.
 * It reads the data and adds it to the GTK textview.
 */
gboolean refresh_textview_from_fd(GIOChannel * channel,
				  GIOCondition condition, gpointer data)
{
    GtkTextView *view = GTK_TEXT_VIEW(data);
    GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));

    gchar buf[1024];
    gsize len;
    GError *error = NULL;
    gint status;


    while ((status =
	    g_io_channel_read_chars(channel, buf, 1024, &len, &error))
	   == G_IO_STATUS_AGAIN) {

	while (gtk_events_pending())
	    gtk_main_iteration();
    }

    if (status != G_IO_STATUS_NORMAL) {
	/* status = G_IO_STATUS_ERROR or G_IO_STATUS_EOF */
	if (error) {
	    fprintf(stderr, _("Error while reading sub-child output : %s"),
		    error->message);
	    g_error_free(error);
	    error = NULL;
	}
	return FALSE;
    }

    if (len > 0) {
	GtkTextIter end;
	GtkTextMark *mark;
	gchar *utftext;
	gsize localelen;
	gsize utflen;

	gtk_text_buffer_get_end_iter(buffer, &end);

	if (!g_utf8_validate(buf, len, NULL)) {
	    utftext =
		g_convert_with_fallback(buf, len, "UTF-8",
					"ISO-8859-1", NULL, &localelen,
					&utflen, NULL);
	    gtk_text_buffer_insert(buffer, &end, utftext, utflen);
	    g_free(utftext);
	} else {
	    gtk_text_buffer_insert(buffer, &end, buf, len);
	}

	/* Scroll down TextView */
	mark = gtk_text_buffer_get_insert(buffer);
	gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(view), mark, 0.0, FALSE,
				     0.0, 1.0);
    }
    return TRUE;
}
示例#14
0
文件: ui_tabs.c 项目: tadzik/gtkabber
static void
tab_scroll_down(Chattab *tab)
{
	GtkAdjustment *adj;
	gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(tab->tview), tab->mk,
	                             0.0, FALSE, 0.0, 0.0);
	adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(tab->scrolled));
	gtk_adjustment_set_value(adj, adj->upper);
} /* tab_scroll_down */
示例#15
0
文件: gui.c 项目: oreoPanda/chatnut
extern void append_to_history_view( const char *buffer, const char *sender )
{
	GtkTextBuffer *historybuffer = NULL;
	GtkTextIter start;
	GtkTextIter end;
	GtkTextMark *mark;

	char *history = NULL;
	unsigned int char_count;
	char *to_append = NULL;
	gboolean need_newline = TRUE;

	historybuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(history_view));

	/*check for "<No recent chats found>" at the top of historybuffer and remove it*/
	char_count = gtk_text_buffer_get_char_count(historybuffer);
	if( char_count == strlen("<No recent chats found>") )
	{
		gtk_text_buffer_get_bounds( historybuffer, &start, &end );
		//TODO check if history needs to be free()d (look at source of gtk_text_buffer)
		history = gtk_text_buffer_get_text( historybuffer, &start, &end, FALSE );
		if( strcmp( history, "<No recent chats found>" ) == 0 )
		{
			gtk_text_buffer_delete( historybuffer, &start, &end );
			need_newline = FALSE;
		}
		free(history);
	}
	/*"<No recent chats found>" is not or no longer at the top of historybuffer*/
	/*prepend a '\n' to buffer and insert into historybuffer*/
	if(need_newline)
	{
		to_append = calloc( 1 + strlen(sender) + 2 + strlen(buffer) + 1, sizeof(char) );
		*to_append = '\n';
		strncpy( to_append+1, sender, strlen(sender)+1 );
		strncat( to_append, ": ", strlen(": ") );
		strncat( to_append, buffer, strlen(buffer) );
	}
	else
	{
		to_append = calloc( strlen(sender) + 2 + strlen(buffer) + 1, sizeof(char) );
		strncpy( to_append, sender, strlen(sender)+1 );//TODO there was no +1 at first, that's not good or? (~10 lines above there was +1)
		strncat( to_append, ": ", strlen(": ") );
		strncat( to_append, buffer, strlen(buffer) );
	}
	gtk_text_buffer_get_end_iter( historybuffer, &end );
	gtk_text_buffer_insert( historybuffer, &end, to_append, -1 );

	/*scroll down*/
	gtk_text_buffer_get_end_iter( historybuffer, &end );
	mark = gtk_text_mark_new( NULL, FALSE );
	gtk_text_buffer_add_mark( historybuffer, mark, &end );
	gtk_text_view_scroll_to_mark( GTK_TEXT_VIEW(history_view), mark, 0, FALSE, 1.0, 1.0 );

	return;
}
示例#16
0
void write(int intToInsert)
{
    const char *charToInsert;
    std::stringstream tempStringStream;
    tempStringStream << intToInsert;
    std::string tempString = tempStringStream.str();
    charToInsert = tempString.c_str();
    gtk_text_buffer_insert (dialogBuffer, &endIter, charToInsert, -1);
    gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (dialogText), endMark, 0.0, FALSE, 0.0, 1.0);
};
示例#17
0
文件: editor.c 项目: lemonjia/Avocado
/*
 * 'Search Backward'
 */
void av_editor_search_backward(const av_editor *editor)
{
  GtkTextIter iter_search_start, iter_search_end;
  GtkTextIter iter_match_start, iter_match_end;
  GtkTextIter iter_end;
  GtkTextSearchFlags flags_search;
  gchar *text_search = NULL;
  gboolean found = FALSE;
  gboolean status = FALSE;

  g_return_if_fail(editor != NULL && editor->textbuf != NULL);

  status = gtk_text_buffer_get_selection_bounds(GTK_TEXT_BUFFER(editor->textbuf),
                                                &iter_search_start,
                                                &iter_search_end);
  g_return_if_fail(status == TRUE);

  text_search = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(editor->textbuf),
                                         &iter_search_start,
                                         &iter_search_end,
                                         FALSE);
  g_return_if_fail(text_search != NULL);
 
  iter_end = iter_search_start;
  flags_search = GTK_TEXT_SEARCH_VISIBLE_ONLY | GTK_TEXT_SEARCH_TEXT_ONLY;

  found = editor_search_backward(editor,
                                 text_search,
                                 flags_search,
                                 NULL,
                                 &iter_end,
                                 &iter_match_start,
                                 &iter_match_end);

  if (found)
  {
    gtk_text_buffer_place_cursor(GTK_TEXT_BUFFER(editor->textbuf), &iter_match_start);

    gtk_text_buffer_move_mark_by_name (GTK_TEXT_BUFFER(editor->textbuf),
                                       AV_EDITOR_MARK_NAME_SELECTION_BOUND,
                                       &iter_match_end);

    gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(editor->textview),
                                 gtk_text_buffer_get_insert(editor->textbuf),
                                 AV_EDITOR_VIEW_SCROLL_MARGIN,
                                 FALSE,
                                 AV_EDITOR_VIEW_SCROLL_XALIGN,
                                 AV_EDITOR_VIEW_SCROLL_YALIGN);
  }
  else
  {
    // Do nothing here
    AV_DBG("%s: search text backward: %s: not found\n", __func__, text_search);
  }
}
示例#18
0
文件: main.c 项目: shihyu/chatroom
//处理接收到的数据,加入接收框内
void deal_message(char *data)
{
	GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(textRecv));
	char msg[1024];
	char *p;
	char *delim = ":|";
	time_t t;
	p = strtok(data, delim);
	if (strcmp(p, "message") != 0)
	{
		return;
	}
	int i = 0;
	while((p = strtok(NULL, delim)))
	{
		switch (i)
		{
			case 0:
				strcpy(msg, p);
				strcat(msg, "\t");
				break;
			case 1:
				t = atoi(p);
				strcat(msg, ctime(&t));
				break;
			case 3:
				strcat(msg, p);
				strcat(msg, "\n\n");
				break;
			default:
				break;
		}
		i++;
	}
	int msg_len = strlen(msg);
	GtkTextIter start;
	GtkTextIter end;
	gtk_text_buffer_get_start_iter (buffer, &start);
	gtk_text_buffer_get_end_iter (buffer, &end);
	//消息框文本达到最大长度
	if (length + msg_len >= MAXSIZE)
	{
		gtk_text_buffer_delete (buffer, &start, &end);
		gtk_text_buffer_insert(buffer, &end, (gchar*)msg, strlen(msg));
		length = msg_len;
	}
	else
	{
		gtk_text_buffer_insert (buffer, &end,(gchar *)msg, strlen(msg));
		length += msg_len;
	}

	GtkTextMark *mk = gtk_text_buffer_get_insert (buffer);
	gtk_text_view_scroll_to_mark (textRecv, mk, 0.0, FALSE, 0,0);
}
示例#19
0
static gboolean
gb_vim_jump_to_line (GtkWidget      *active_widget,
                     const gchar    *command,
                     const gchar    *options,
                     GError        **error)
{
  g_assert (GTK_IS_WIDGET (active_widget));

  if (IDE_IS_EDITOR_VIEW (active_widget))
    {
      GtkSourceView  *source_view = GTK_SOURCE_VIEW (IDE_EDITOR_VIEW (active_widget)->frame1->source_view);
      GtkTextBuffer *buffer;
      gboolean extend_selection;
      gint line;

      if (!int32_parse (&line, options, 0, G_MAXINT32, "line number", error))
        return FALSE;

      buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (source_view));
      extend_selection = gtk_text_buffer_get_has_selection (buffer);
      ide_source_view_set_count (IDE_SOURCE_VIEW (source_view), line);

      if (line == 0)
        {
          GtkTextIter iter;

          /*
           * Zero is not a valid line number, and IdeSourceView treats
           * that as a move to the end of the buffer. Instead, we want
           * line 1 to be like vi/vim.
           */
          gtk_text_buffer_get_start_iter (buffer, &iter);
          gtk_text_buffer_select_range (buffer, &iter, &iter);
          gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (source_view),
                                        gtk_text_buffer_get_insert (buffer),
                                        0.0, FALSE, 0.0, 0.0);
        }
      else
        {
          g_signal_emit_by_name (source_view,
                                 "movement",
                                 IDE_SOURCE_VIEW_MOVEMENT_NTH_LINE,
                                 extend_selection, TRUE, TRUE);
        }

      ide_source_view_set_count (IDE_SOURCE_VIEW (source_view), 0);

      g_signal_emit_by_name (source_view, "save-insert-mark");

      return TRUE;
    }
  else
    return gb_vim_set_source_view_error (error);
}
示例#20
0
/* Set length to a positive number to enable line input; set to 0 to disable */
void gglk_text_line_input_set(GglkText *tb, int length,
			      const gunichar *text)
{
    GtkTextIter b, e;
    gchar *line_utf8;

    if(tb->line_maxlen != 0) {
	gglk_text_line_input_end(tb);

	/* Clear out old text there */
	gtk_text_buffer_get_iter_at_mark(tb->buffer, &b, tb->startedit);
	gtk_text_buffer_get_iter_at_mark(tb->buffer, &e, tb->endedit);
	gtk_text_buffer_delete(tb->buffer, &b, &e);

	gtk_text_buffer_get_iter_at_mark(tb->buffer, &tb->iter, tb->startedit);
    }
    
    tb->line_maxlen = length;
    if(length == 0) {
	gglk_text_line_input_end(tb);
	return;
    }

    /* Add new text */
    gtk_text_buffer_get_end_iter(tb->buffer, &b);
    gtk_text_buffer_move_mark(tb->buffer, tb->startedit, &b);
    line_utf8 = g_ucs4_to_utf8(text, -1, NULL, NULL, NULL);
    gtk_text_buffer_insert(tb->buffer, &b, line_utf8, -1);
    g_free(line_utf8);

    /* Extra character at end to maintain editability */
    gtk_text_buffer_get_end_iter(tb->buffer, &e);
    gtk_text_buffer_insert(tb->buffer, &e, " ", -1);

    /* Make editable */
    gtk_text_buffer_get_iter_at_mark(tb->buffer, &b, tb->startedit);
    gtk_text_buffer_apply_tag_by_name(tb->buffer, "Input", &b, &e);
    gtk_text_buffer_apply_tag_by_name(tb->buffer, "editable", &b, &e);

    /* Set end mark */
    gtk_text_iter_backward_char(&e);
    gtk_text_buffer_move_mark(tb->buffer, tb->endedit, &e);

    gtk_text_buffer_place_cursor(tb->buffer, &e);
    gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(tb), tb->endedit, 0,FALSE,0,0);

    /* Add signals to handle user interaction */
    tb->cursor_handler = g_signal_connect(
	tb->buffer, "mark-set",
	GTK_SIGNAL_FUNC(gglk_text_cursor_event), tb);
    tb->update_handler = g_signal_connect(
	tb->buffer, "end-user-action",
	GTK_SIGNAL_FUNC(gglk_text_update_editable_region), tb);
}
示例#21
0
文件: chat.c 项目: acieroid/tetristar
void chat_scroll_to_end(GtkTextBuffer *buffer, GtkTextIter *location,
                        gchar *text, gint len, gpointer data)
{
  Chat *chat = (Chat *) data;
  GtkTextIter end;

  gtk_text_buffer_get_end_iter(buffer, &end);
  gtk_text_buffer_create_mark(buffer, "end", &end, FALSE);
  gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(chat->text_view),
                               gtk_text_buffer_get_mark(buffer, "end"),
                               0.0, TRUE, 0.0, 0.5);
}
示例#22
0
/*******************************************************************************
 * Advance the cursor n positions on the tutor text view
 */
gint
cursor_advance (gint n)
{
	gint i;
	gboolean cursor_out_screen;
	GtkWidget *wg;
	GtkTextBuffer *buf;
	GtkTextIter new_start;
	GtkTextIter old_start;
	GtkTextIter end;
	GtkTextMark *mark;

	wg = get_wg ("text_tutor");
	buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (wg));

	/* Get current position for the iter old_start */
	gtk_text_buffer_get_iter_at_mark (buf, &new_start, gtk_text_buffer_get_insert (buf));
	old_start = new_start;

	/* Get new position for the iter new_start */
	if (n > 0)
		for (i = 0; i < n && gtk_text_iter_forward_cursor_position (&new_start); i++);
	else
		for (i = 0; i > n && gtk_text_iter_backward_cursor_position (&new_start); i--);

	/* Move cursor blinking */
	end = new_start;
	gtk_text_iter_forward_char (&end);
	gtk_text_buffer_apply_tag_by_name (buf, "cursor_blink", &new_start, &end);

	end = old_start;
	gtk_text_iter_forward_char (&end);
	gtk_text_buffer_remove_tag_by_name (buf, "cursor_blink", &old_start, &end);

	/* Move cursor */
	gtk_text_buffer_place_cursor (buf, &new_start);

	/* Check need for auto-scrolling */
	if (i == n)
	{
		end = new_start;
		gtk_text_iter_forward_line (&end);
		mark = gtk_text_buffer_create_mark (buf, "aux", &end, FALSE);
		cursor_out_screen = gtk_text_view_move_mark_onscreen (GTK_TEXT_VIEW (wg), mark);
		if (cursor_out_screen)
		{
			gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (wg),
				       	gtk_text_buffer_get_insert (buf), 0.0, TRUE, 0.5, 0.12);
		}
	}
	return (i);
}
示例#23
0
int32_t startwin_puts(const char *str)
{
    GtkWidget *textview;
    GtkTextBuffer *textbuffer;
    GtkTextIter enditer;
    GtkTextMark *mark;
    const char *aptr, *bptr;

    if (!gtkenabled || !str) return 0;
    if (!stwidgets.startwin) return 1;
    if (!(textview = stwidgets.messagestext)) return -1;
    textbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));

    gtk_text_buffer_get_end_iter(textbuffer, &enditer);
    for (aptr = bptr = str; *aptr != 0;)
    {
        switch (*bptr)
        {
        case '\b':
            if (bptr > aptr)
                gtk_text_buffer_insert(textbuffer, &enditer, (const gchar *)aptr, (gint)(bptr-aptr)-1);
#if GTK_CHECK_VERSION(2,6,0)
            gtk_text_buffer_backspace(textbuffer, &enditer, FALSE, TRUE);
#else
            {
                GtkTextIter iter2 = enditer;
                gtk_text_iter_backward_cursor_position(&iter2);
                //FIXME: this seems be deleting one too many chars somewhere!
                if (!gtk_text_iter_equal(&iter2, &enditer))
                    gtk_text_buffer_delete_interactive(textbuffer, &iter2, &enditer, TRUE);
            }
#endif
            aptr = ++bptr;
            break;
        case 0:
            if (bptr > aptr)
                gtk_text_buffer_insert(textbuffer, &enditer, (const gchar *)aptr, (gint)(bptr-aptr));
            aptr = bptr;
            break;
        case '\r':	// FIXME
        default:
            bptr++;
            break;
        }
    }

    mark = gtk_text_buffer_create_mark(textbuffer, NULL, &enditer, 1);
    gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(textview), mark, 0.0, FALSE, 0.0, 1.0);
    gtk_text_buffer_delete_mark(textbuffer, mark);

    return 0;
}
示例#24
0
文件: log.c 项目: Hamakor/geany
static void update_dialog(void)
{
	if (dialog_textbuffer != NULL)
	{
		GtkTextMark *mark;
		GtkTextView *textview = g_object_get_data(G_OBJECT(dialog_textbuffer), "textview");

		gtk_text_buffer_set_text(dialog_textbuffer, log_buffer->str, log_buffer->len);
		/* scroll to the end of the messages as this might be most interesting */
		mark = gtk_text_buffer_get_insert(dialog_textbuffer);
		gtk_text_view_scroll_to_mark(textview, mark, 0.0, FALSE, 0.0, 0.0);
	}
}
示例#25
0
void src_view___::scroll2__(GtkTextIter* ti) {
	gtk_text_buffer_place_cursor(buf2__(), ti);
	GtkTextIter i1,i2;
	gtk_text_buffer_get_selection_bounds (buf2__(), &i1,&i2);

	GdkRectangle rect;
	gtk_text_view_get_visible_rect (handle2__(), &rect);
	int y = -1;
	int height = -1;
	gtk_text_view_get_line_yrange (handle2__(), &i1, &y, &height);
	if (y < rect.y + rect.height + 16)
		gtk_text_view_scroll_to_mark (handle2__(), gtk_text_buffer_get_insert(buf2__()), 0, false, 0, 0);
}
示例#26
0
static void bmark_popup_menu_goto_lcb(GtkWidget * widget, gpointer user_data)
{
	Tbmark *b;
	GtkTextIter it;

	if (!user_data)
		return;
	b = get_current_bmark(BFWIN(user_data));
	if (!b)
		return;
	if (b->filepath && !b->doc) {
		/* check if that document _is_ open */
		Tdocument *tmpdoc;
		GList *doclist = return_allwindows_documentlist();
		tmpdoc = documentlist_return_document_from_filename(doclist, b->filepath);
		g_list_free(doclist);
		if (tmpdoc == NULL) {
			if (!g_file_test(b->filepath, G_FILE_TEST_EXISTS)) {
				gchar *string = g_strdup_printf(_("Could not find the file \"%s\"."), b->filepath);
				error_dialog(BFWIN(user_data)->main_window, string,
							 _("This bookmark is set in a file that no longer exists."));
				g_free(string);
				return;
			}
			tmpdoc = doc_new_with_file(BFWIN(user_data), b->filepath, FALSE, TRUE);
		}
		/* now I have to check all bookmarks */
		bmark_set_for_doc(tmpdoc);
	}

	if (b->doc) {
		GdkRectangle visirect;
		GtkTextIter visi_so, visi_eo;
		gtk_text_view_get_visible_rect(GTK_TEXT_VIEW(b->doc->view),&visirect);
		gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(b->doc->view), &visi_so, visirect.x, visirect.y);
		gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(b->doc->view), &visi_eo, visirect.x + visirect.width, visirect.y + visirect.height);
		
		gtk_text_buffer_get_iter_at_mark(b->doc->buffer, &it, b->mark);
		gtk_text_buffer_place_cursor(b->doc->buffer, &it);

		if (!gtk_text_iter_in_range(&it,&visi_so,&visi_eo)) {
			DEBUG_MSG("bmark_popup_menu_goto_lcb, cursor NOT visible!\n");
			/* gtk_text_view_scroll_mark_onscreen(GTK_TEXT_VIEW(b->doc->view), b->mark); */
			gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(b->doc->view),b->mark,0.0,
                                             TRUE,0.5,0.5);
		}
		if (b->doc != BFWIN(user_data)->current_document)
			switch_to_document_by_pointer(BFWIN(user_data), b->doc);
		gtk_widget_grab_focus(b->doc->view);
	}
}
示例#27
0
void
gimp_error_console_add (GimpErrorConsole    *console,
                        GimpMessageSeverity  severity,
                        const gchar         *domain,
                        const gchar         *message)
{
  const gchar *desc;
  GtkTextIter  end;
  GtkTextMark *end_mark;
  GdkPixbuf   *pixbuf;
  gchar       *str;

  g_return_if_fail (GIMP_IS_ERROR_CONSOLE (console));
  g_return_if_fail (domain != NULL);
  g_return_if_fail (message != NULL);

  gimp_enum_get_value (GIMP_TYPE_MESSAGE_SEVERITY, severity,
                       NULL, NULL, &desc, NULL);

  gtk_text_buffer_get_end_iter (console->text_buffer, &end);

  pixbuf = gtk_widget_render_icon (console->text_view,
                                   gimp_get_message_stock_id (severity),
                                   GTK_ICON_SIZE_BUTTON, NULL);
  gtk_text_buffer_insert_pixbuf (console->text_buffer, &end, pixbuf);
  g_object_unref (pixbuf);

  gtk_text_buffer_insert (console->text_buffer, &end, "  ", -1);

  str = g_strdup_printf ("%s %s", domain, desc);
  gtk_text_buffer_insert_with_tags_by_name (console->text_buffer, &end,
                                            str, -1,
                                            "title",
                                            NULL);
  g_free (str);

  gtk_text_buffer_insert (console->text_buffer, &end, "\n", -1);

  gtk_text_buffer_insert_with_tags_by_name (console->text_buffer, &end,
                                            message, -1,
                                            "message",
                                            NULL);

  gtk_text_buffer_insert (console->text_buffer, &end, "\n\n", -1);

  end_mark = gtk_text_buffer_create_mark (console->text_buffer,
                                          NULL, &end, TRUE);
  gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (console->text_view), end_mark,
                                FALSE, TRUE, 1.0, 0.0);
  gtk_text_buffer_delete_mark (console->text_buffer, end_mark);
}
示例#28
0
void gglk_text_auto_scroll(GglkText *tb)
{
    if(!tb->should_scroll)
	return;
    tb->should_scroll = FALSE;

    if(tb->vadjust)
	g_signal_handler_block(tb->vadjust, tb->scroll_handler);

    gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(tb),
				 tb->scrollmark, 0.1,
				 TRUE, 0.0, 0.0);
    if(tb->vadjust)
	g_signal_handler_unblock(tb->vadjust, tb->scroll_handler);
}
示例#29
0
文件: ec_gtk.c 项目: ftbe/ettercap
/*
 * print a USER_MSG() extracting it from the queue
 */
static void gtkui_msg(const char *msg)
{
   GtkTextIter iter;
   gchar *unicode = NULL;

   DEBUG_MSG("gtkui_msg: %s", msg);

   if((unicode = gtkui_utf8_validate((char *)msg)) == NULL)
         return;

   gtk_text_buffer_get_end_iter(msgbuffer, &iter);
   gtk_text_buffer_insert(msgbuffer, &iter, unicode, -1);
   gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW (textview), 
                                endmark, 0, FALSE, 0, 0);
   return;
}
示例#30
0
void shoes_native_edit_box_scroll_to_end(SHOES_CONTROL_REF ref) {
    GtkWidget *textview;
    GTK_CHILD(textview, ref);
    GtkTextIter end;
    GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
    gtk_text_buffer_get_end_iter (buffer, &end);
    /* get the current ( cursor )mark name */
    GtkTextMark *insert_mark = gtk_text_buffer_get_insert (buffer);

    /* move mark and selection bound to the end */
    gtk_text_buffer_place_cursor(buffer, &end);

    /* scroll to the end view */
    gtk_text_view_scroll_to_mark( GTK_TEXT_VIEW (textview),
                                  insert_mark, 0.0, TRUE, 0.0, 1.0);
}