You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为GTK2控件文本设置透明度 实现Xfce任务栏半透明文字效果

实现Xfce4.12任务栏最小化窗口文本半透明效果方案

核心思路

GTK2 没有为 GtkLabel 提供直接设置文本透明度的原生接口,你之前用到的 Pixbuf 透明度方案仅适用于图像控件,文本渲染由 Pango 直接完成,没有独立的图像缓存层,因此需要通过颜色混合的方式模拟半透明效果:复用你已有的最小化图标透明度配置minimized_icon_lucency,将正常文本颜色和任务栏按钮背景色按透明度比例混合,将混合后的颜色直接设置为标签的前景色即可。

修改后的完整代码

xfce_tasklist_button_name_changed (WnckWindow *window, XfceTasklistChild *child)
{
    const gchar *name;
    gchar *label = NULL;
    XfceTasklist *tasklist = child->tasklist;

    panel_return_if_fail (window == NULL || child->window == window);
    panel_return_if_fail (WNCK_IS_WINDOW (child->window));
    panel_return_if_fail (XFCE_IS_TASKLIST (tasklist));

    name = wnck_window_get_name (child->window);
    gtk_widget_set_tooltip_text (GTK_WIDGET (child->button), name);

    if (!tasklist->only_minimized && wnck_window_is_minimized (child->window))
        name = label = g_strdup_printf ("[%s]", name);
    else if (wnck_window_is_shaded (child->window))
        name = label = g_strdup_printf ("=%s=", name);

    gtk_label_set_text (GTK_LABEL (child->label), name);

    // 新增半透明文本逻辑
    GtkStyle *style = gtk_widget_get_style(GTK_WIDGET(child->button));
    GdkColor fg_normal = style->fg[GTK_STATE_NORMAL];
    GdkColor bg_normal = style->bg[GTK_STATE_NORMAL];
    gdouble alpha = tasklist->minimized_icon_lucency; // 可替换为自定义透明度参数,范围0~1

    if (wnck_window_is_minimized(child->window) && !tasklist->only_minimized) {
        // 按alpha比例混合前景色和背景色,模拟半透明效果
        GdkColor translucent_fg;
        translucent_fg.red = (gushort)(fg_normal.red * alpha + bg_normal.red * (1 - alpha));
        translucent_fg.green = (gushort)(fg_normal.green * alpha + bg_normal.green * (1 - alpha));
        translucent_fg.blue = (gushort)(fg_normal.blue * alpha + bg_normal.blue * (1 - alpha));
        gtk_widget_modify_fg(GTK_WIDGET(child->label), GTK_STATE_NORMAL, &translucent_fg);
    } else {
        // 非最小化状态重置为默认主题色
        gtk_widget_modify_fg(GTK_WIDGET(child->label), GTK_STATE_NORMAL, NULL);
    }

    g_free (label);

    if (window != NULL)
        xfce_tasklist_sort (tasklist);
}

补充说明

  • 如果你需要按钮在悬停、按下状态下也保持半透明效果,可以对应修改GTK_STATE_PRELIGHT、GTK_STATE_ACTIVE状态的前景色
  • 如果不想和图标透明度保持一致,可以单独新增配置项替换代码中的alpha参数即可

内容的提问来源于stack exchange,提问作者Fulalas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 05:54:03