如何解决如何渲染 gtksourcegutterrenderer
他的 Gtk 开发者,
如何渲染gtksourcegutterrenderer,这是我的问题? 请在C中找到以下代码源以进行测试
我需要将 textsymbol 设为“!”例如在客户排水沟中。使用此代码,我知道添加标记并检测它。
但我不知道什么是坏的。
- 在阴沟里是不是位置不好?我在 -30 和 -5 之间设置了不同的值
- 更新装订线的方法不好
你有什么看法? 可以帮助更新测试
名称来源为 gtksourceview_gutter.c
#include <gtk/gtk.h>
#include <gtksourceview/gtksource.h>
//gtksourceview_gutter.c
/* Compile with:
* gcc -std=c11 -Wall -fmax-errors=10 -Wextra gtksourceview_gutter.c -o gtksourceview_gutter `pkg-config --cflags --libs gtk+-3.0 gtksourceview-3.0`
*/
GtkWindow *current_window;
static gboolean open_file (GtkSourceBuffer *sBuf,const gchar *filename)
{
GError *err = NULL;
gboolean reading;
GtkTextIter iter;
GIOChannel *io;
gchar *buffer;
g_return_val_if_fail (sBuf != NULL,FALSE);
g_return_val_if_fail (filename != NULL,FALSE);
g_return_val_if_fail (GTK_SOURCE_BUFFER (sBuf),FALSE);
/* Now load the file from disk */
io = g_io_channel_new_file (filename,"r",&err);
if (!io)
{
g_print("error: %s %s\n",(err)->message,filename);
return FALSE;
}
if (g_io_channel_set_encoding (io,"utf-8",&err) != G_IO_STATUS_norMAL)
{
g_print("err: Failed to set encoding:\n%s\n%s",filename,(err)->message);
return FALSE;
}
gtk_source_buffer_begin_not_undoable_action (sBuf);
buffer = g_malloc (4096);
reading = TRUE;
while (reading)
{
gsize bytes_read;
GIOStatus status;
status = g_io_channel_read_chars (io,buffer,4096,&bytes_read,&err);
switch (status)
{
case G_IO_STATUS_EOF: reading = FALSE;
case G_IO_STATUS_norMAL:
if (bytes_read == 0) continue;
gtk_text_buffer_get_end_iter ( GTK_TEXT_BUFFER (sBuf),&iter);
gtk_text_buffer_insert (GTK_TEXT_BUFFER(sBuf),&iter,bytes_read);
break;
case G_IO_STATUS_AGAIN: continue;
case G_IO_STATUS_ERROR:
default:
g_print("err (%s): %s",(err)->message);
/* because of error in input we clear already loaded text */
gtk_text_buffer_set_text (GTK_TEXT_BUFFER (sBuf),"",0);
reading = FALSE;
break;
}
}
g_free (buffer);
gtk_source_buffer_end_not_undoable_action (sBuf);
g_io_channel_unref (io);
if (err)
{
g_error_free (err);
return FALSE;
}
gtk_text_buffer_set_modified (GTK_TEXT_BUFFER (sBuf),FALSE);
/* move cursor to the beginning */
gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (sBuf),&iter);
gtk_text_buffer_place_cursor (GTK_TEXT_BUFFER (sBuf),&iter);
g_object_set_data_full (G_OBJECT (sBuf),"filename",g_strdup (filename),(GDestroyNotify) g_free);
return TRUE;
}
typedef struct
{
GtkSourceBuffer *buffer;
GtkWidget *sourceview;
}struct_search;
void insert_mark(GtkSourceBuffer *buffer,const GtkTextIter where)
{
g_print("Insert mark\n");
GtkSourceMark * mark = gtk_source_buffer_create_source_mark(buffer,"namemark","category",&where);
}
void mark(struct_search *doc)
{
//pose une marque
GtkTextIter position_iter;
/** Getting cursor position. **/
GtkTextMark *mark = gtk_text_buffer_get_insert(GTK_TEXT_BUFFER(doc->buffer)) ;
gtk_text_buffer_get_iter_at_mark(GTK_TEXT_BUFFER(doc->buffer),&position_iter,mark);
// my fonction
insert_mark(doc->buffer,position_iter);
// in order to control
GSList* marks = gtk_source_buffer_get_source_marks_at_iter (
doc->buffer,NULL);//If category is NULL it returns all marks at iter .
if (marks != NULL)
g_print ("There are %d marks\n",g_slist_length(marks));
else
g_print ("no mark\n");
}
gboolean key_pressed(GtkWidget *window,GdkEventKey* event,gpointer data)
{
//gestion des touches raccourcies
struct_search * doc = (struct_search*) data;
GdkModifierType modifiers = gtk_accelerator_get_default_mod_mask ();
if ((event->keyval == GDK_KEY_m || event->keyval == GDK_KEY_M)
&& (event->state & modifiers) == GDK_CONTROL_MASK)
{
g_print ("Control-M was pressed for Mark \n");
mark(doc);
return TRUE;
}
(void)window;
return FALSE;
}
static void gutter_renderer_query_data (GtkSourceGutterRenderer *renderer,GtkTextIter *start,GtkTextIter *end,GtkSourceGutterRendererState state)
{
g_print("actualise renderer \n");
gtk_source_gutter_renderer_text_set_text(GTK_SOURCE_GUTTER_RENDERER_TEXT(renderer),"!",1);
// or
g_object_set (G_OBJECT (renderer),"text",NULL);
(void)end;
(void)state;
}
static void do_activate (GtkApplication *app,gpointer user_data)
{
/* Create a window with a title,and a default size */
GtkWidget *window = gtk_application_window_new (app);
gtk_window_set_title (GTK_WINDOW (window),"sourceview Example with gtksource view and custom gutter");
gtk_window_set_default_size (GTK_WINDOW(window),660,500);
GtkSourceBuffer *buffer = gtk_source_buffer_new (NULL);
GtkWidget *sourceview = gtk_source_view_new_with_buffer (buffer);
current_window = gtk_application_get_active_window(app);
struct_search *source_docs = g_slice_new (struct_search);
source_docs->sourceview =sourceview;
source_docs->buffer =buffer;
g_signal_connect(G_OBJECT(current_window),"key-press-event",G_CALLBACK(key_pressed),source_docs);
// To get a GtkSourceGutter,use the gtk_source_view_get_gutter() function.
GtkTextwindowType window_type =GTK_TEXT_WINDOW_LEFT;
GtkSourceGutter * gutter = gtk_source_view_get_gutter (GTK_SOURCE_VIEW(sourceview),window_type);
GtkSourceGutterRenderer *renderer = gtk_source_gutter_renderer_text_new ();
gtk_source_gutter_renderer_text_set_text(GTK_SOURCE_GUTTER_RENDERER_TEXT(renderer),1);
if (gtk_source_gutter_insert (gutter,renderer,-25))
g_print("renderer inserted into the gutter\n");
g_signal_connect(renderer,"query-data",G_CALLBACK (gutter_renderer_query_data),NULL);
gtk_source_view_set_show_line_numbers(GTK_SOURCE_VIEW (sourceview),TRUE);
gtk_widget_set_name (GTK_WIDGET(sourceview),"sourceview");
GtkCssprovider *provider = gtk_css_provider_new ();
Gdkdisplay *display = gdk_display_get_default ();
GdkScreen *screen = gdk_display_get_default_screen (display);
gtk_style_context_add_provider_for_screen (screen,GTK_STYLE_PROVIDER (provider),GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
gtk_css_provider_load_from_data (GTK_CSS_PROVIDER(provider)," .sourceview {\n"
" background-image: -gtk-gradient (radial,\n"
"0.1 0.1,0.2,\n"
"0.2 0.2,1,\n"
" from (lightgreen),\n"
" to (shade (red,0.9)));\n"
" font-family: Helvetica,sans-serif;\n"
"}\n",-1,NULL);
g_object_unref (provider);
gchar *filename = "gtksourceview_gutter.c";
if (open_file (buffer,filename) == FALSE)
{
g_print ("No file found `%s'\n",filename);
}
GtkWidget *scrolledwindow = gtk_scrolled_window_new (NULL,NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
gtk_container_add (GTK_CONTAINER (scrolledwindow),sourceview);
gtk_container_set_border_width (GTK_CONTAINER (scrolledwindow),5);
gtk_container_add (GTK_CONTAINER (window),scrolledwindow);
gtk_widget_show_all (window);
(void)user_data;
}
int main (int argc,char **argv)
{
GtkApplication *app = gtk_application_new ("org.gtk.example",G_APPLICATION_FLAGS_NONE);
g_signal_connect (app,"activate",G_CALLBACK (do_activate),NULL);
int status = g_application_run (G_APPLICATION (app),argc,argv);
g_object_unref (app);
return status;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。