如何渲染 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...