Gtk.CssProvider设置等宽字体仅部分生效,显示'ff'时异常求助
问题:GTK TextView显示特定文本时等宽字体失效
我用C语言写了一个GTK程序,通过TextView显示数据包内容,CSS里指定了Courier等宽字体,但显示"ff"时字体变成了比例字体,希望始终保持等宽效果(类似xxd输出)。
相关代码片段如下:
创建窗口和TextView的代码
// Create new window to display unfragmented packet. window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_resizable (GTK_WINDOW (window1), TRUE); gtk_window_set_position (GTK_WINDOW (window1), GTK_WIN_POS_NONE); gtk_window_set_title (GTK_WINDOW (window1), title[0]); gtk_window_set_default_size (GTK_WINDOW (window1), 1000, 200); gtk_container_set_border_width (GTK_CONTAINER (window1), 1); // Create a textview object to display unfragmented packet. textview1 = gtk_text_view_new (); buffer1 = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview1)); gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (textview1), TRUE); provider = gtk_css_provider_new (); gtk_css_provider_load_from_path (provider, "./packet.css", NULL); context = gtk_widget_get_style_context (textview1); gtk_style_context_add_provider (context, GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
填充文本并显示的代码
// Put the text into the buffer. gtk_text_buffer_set_text (buffer1, nofrag_string, -1); // Add scrolled window and textview to new window1 and display unfragmented packet. scrolled_win1 = gtk_scrolled_window_new (NULL, NULL); gtk_container_add (GTK_CONTAINER (scrolled_win1), textview1); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win1), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_container_add (GTK_CONTAINER (window1), scrolled_win1); gtk_widget_show_all (window1);
对应的packet.css
textview { font-family: Courier; }
解决方案
可以从以下几个方面修复这个问题:
指定更可靠的等宽字体族
系统中的Courier可能不是严格等宽,或者存在变体。改用通用等宽族+多个备选字体,确保系统能找到合适的严格等宽字体:textview { font-family: "Courier New", Courier, monospace; }monospace是CSS通用字体族,系统会自动选择默认的等宽字体,兼容性最好。禁用字体连字
"ff"变成比例字体很可能是因为字体启用了连字(ligature),把两个f合并成一个宽字符。在CSS中禁用连字:textview { font-family: "Courier New", Courier, monospace; font-variant-ligatures: none; /* 兼容旧版本的写法 */ font-feature-settings: "liga" 0, "clig" 0; }检查文本缓冲区的格式
确保nofrag_string中没有混入特殊格式标签,或者代码中没有给部分文本设置非等宽的字体属性。如果使用了gtk_text_buffer_insert_with_tags之类的方法,要确保所有文本都应用了统一的等宽样式。
内容的提问来源于stack exchange,提问作者Dave Buchan
相关产品推荐
相关产品推荐

