Ant-Veil

Caspar Blog

又对 Awn-applet 的通知栏图标 Hack 了一下

| Comments

曾经写过一篇文章《对 awn-applet 的 notification area 的一个小改动》,目的是为了避免高像素图标将 notification area 这个 applet 的高度撑破,经过修改,确实能将每个图标的像素给固定住,使得 applet 保持原大小。今天通过重新解读代码,发现原来的修改步骤并不那么完美,事实上只需要修改一条语句即可,仍旧是在 applet.c 这个源文件中,看到如下代码:

static void
tray_icon_added (EggTrayManager *manager,
                 GtkWidget      *icon,
                 TrayApplet     *applet)
{
  //gtk_widget_set_size_request (GTK_WIDGET (icon), 24, 24);
  g_object_set_qdata (G_OBJECT (icon), new_quark, GINT_TO_POINTER (1));
  g_object_set_qdata (G_OBJECT (icon), del_quark, GINT_TO_POINTER (0));

applet->icons = g_list_append (applet->icons, icon);
gtk_widget_set_size_request (icon, icon_size, icon_size);
tray_applet_refresh (applet);
}

其中的 11 行的gtk_widget_set_size_request函数,在中有声明,含义为为第一个参数指定的 widget 请求大小,第二个参数为 width,第三个参数为 height。经过添加 printf 监听变量,发现除了 awn 启动后 icon_size 为原先指定好的 24,此后一直就变为-1(其意义为不约束图标大小,使用原大小)。而图标通常都是尽可能使用高像素图标的,所以会造成撑破 applet 高度的现象。

因此不用我以前那么麻烦的修改,只需要在第 11 行上将后一个 icon_size 指定好大小即可。

但是有些细节还是不尽完美。比如 grnotify 这个软件在 notification area 上的高宽比不是 1:1,图标右侧有未读订阅数显示,效果如下图:

而经过我修改的新 applet 中,grnotify 这个软件的高宽比变成是 1:1,也就是它图标右侧的未读订阅数不能显示,如下图:

我是个偏向完美主义的人,自然要继续修改代码。

弄了半天之后发现,原来将第 11 行代码上的 24 改成 22 就可以了。因为以前修改过 pidgin 的图标,知道 trayicon 一般有三种分辨率:18x18,22x22,48x48。为什么修改成 22 就可以显示真实的宽高比了呢?估计和图标的显示机制有关。

不猜了,反正我现在用着正常就好,嗯。

Comments