- 主题设计
-
- 配置文件
- 基本概念
- 测试 Themes
- 应用主题
- 进一步细究
- 配置
-
- 打开复合特性
主题设计
Metacity 主题配置文件基于 XML 格式。
配置文件
创建文件和目录:
$PREFIX/share/themes/[theme_name]/metacity-1/ $HOME/.themes/[theme_name]/metacity-1/
比如 Moblin 的主题 Moblin-Netbook ,以后都以这个主题为例。
/usr/share/themes/Moblin-Netbook/metacity-1/metacity-theme-1.xml
基本概念
支持的 Window 类型
Metacity 有 6 中窗口类型:
- normal
a normal top-level window
- dialog
a dialog window
- modal_dialog
a dialog window that has modal state ie. intervention required by user before they can interact with it's parent window
- menu
a pinnable menu window ie. tearoff menu
- utility
a small persistant utility window ie. paletde or toolbox
- border
a window that should not show any decorations typically ie. full screen window
Styles
对于每种 Window 类型,都需要为之设置一个 "style set" (或者称 window decoration )。 一个 "style set" 是几中不同的 "frame states" 的组合 styles 。"frame states" 有以下几种声明:
- window 是聚焦还是没聚焦 (focused or un-focused)
- window 是 maximized or shaded [or both]
- window 能否被 vertically, horizontally, vertically and horizontally resized
一个 "frame state" 对于一个 "frame style" (都没有s,指单个)。"frame style" 化分为两部分: frame 'pieces' 和 window 'buttons'。这样分开更容 易定制 Metacity 主题。
Frame pieces
Metacity 有以下几种 frame pieces :
entire_background | the whole frame of the window which is drawn first |
titlebar | 程序窗口的上面(俗称:标题栏) |
titlebar_middle | 标题栏的中间,不包括任何 "edge" |
left_titlebar_edge | 标题栏左边边缘 |
right_titlebar_edge | 标题栏右边边缘 |
top_titlebar_edge | 标题栏顶部边缘 |
bottom_titlebar_edge | 标题栏底部边缘 |
title | 包含标题的部分 |
left_edge | frame 的左边边缘 |
right_edge | frame 的右边边缘 |
bottom_edge | frame 的底部边缘 |
overlay | same as entire_background, only that it is drawn last |
Window Buttons
Metacity 有以下几种 Window Buttons :
close | 关闭按钮 |
maximize | 最大化按钮 |
minimize | 最小化 |
menu | 菜单按钮 |
Buttons 可以有下面几种位置:
left_left_background | 左边第一个按钮的背景 |
left_middle_background | 左边第二个按钮的背景 |
left_right_background | 左边第三个按钮的背景 |
right_left_background | 右边第一个按钮的背景 |
right_middle_background | 右边第二个按钮的背景 |
right_right_background | 右边第三个按钮的背景 |
对于窗口上的每个按钮,需要设置一个在给出一个 "button state" 时的怎么样 显示。 Metacity 的按钮状态有:
normal | 常规显示 |
pressed | 鼠标点击 (clicked) 后的显示 |
prelight | 聚焦时候显示 |
Window menus
通常是在标题栏点击右键弹出 menu ,或者标题栏设置一个 menu icons,点击这 个 menu icons 弹出菜单。菜单的上通常有下列列表:
close | 关闭 |
maximize | 最大化 |
minimize | 最小化 |
unmaximize | 取消最大化 |
而且可以设置在下面几种情况下,对于的 GtkStateType :
normal | menu icon 常规显示 |
prelight | menu icon 列表中的项目被聚焦后怎样显示 |
active | 激活后又怎么显示 |
selected | 选择后又怎么显示 |
insensitive | 灰色状态(此时不可用)如何显示 |
测试 Themes
当然可以直接安装主题测试了,不过这有点傻。可以使用 metacity-theme-viewer 工具查看一个主题的面貌。不带参数的时候,显示当前 主题,后接一个主题名字作为参数,可以显示这个主题的面貌,这样很方便。注 意:主题名字是 /usr/share/themes 下的目录名,或者其他地方。
应用主题
使用 gconftool-2 或者使用 GUI 程序可以应用一个主题。
gconftool-2 --type=string --set /apps/metacity/general/theme 主题名
再次提醒:主题通常放在 /usr/share/themes 下。
查看当前主题,可以使用 gconf-editor 工具,也可以使用 :
gconftool-2 --dump /apps/metacity/general
进一步细究
Frame Geometry
这是你第一个要设置的! 如下所示,name 字段是后面给出 "frame style" 时的 参考名字。
下面图片显示了在 frame_geometry 中可以设置的宽度或长度:
frame geometry 有一些可选的属性:
has_title | 默认是 true ,确定 title text height 是否包括进 height 计算 |
title_scale | 使用 Pango 标记 — xx-small, x-small, small, medium, large, x-large and xx-large 。缺省取决于桌面字体。 |
rounded_top_left | Determines whether the top left corner of the window should be rounded. This defaults to false if not specified. |
rounded_top_right | Determines whether the top right corner of the window should be rounded. This defaults to false if not specified. |
rounded_bottom_left | Determines whether the bottom left corner of the window should be rounded. This defaults to false if not specified. |
rounded_bottom_right | Determines whether the bottom right corner of the window should be rounded. This defaults to false if not specified. |
示例:
frame geomtry 设置可以继承,设置 parent 字段:
Instead of specifying button widths and heights, you can specify an aspect ratio instead.
Drawing Operations
这个是 Metacity 主题设计的核心任务。要为 frame 设置一个 draw opt,需要 为 'frame piece' 匹配一个 drawing operation 。
Operators
下面一些操作符可以用在 Drawing operations 里:
Operator | Meaning | Example |
---|---|---|
+ | Plus | 2 + 3 |
- | Minus | 5 - 4 |
星号 | Multiply | 3 * 2 |
/ | Divide | 10 / 2 |
% | Modulus | 34 % 3 |
`max` | Maximum | 4 `max` 5 |
`min` | Minimum | 7 `min` 3 |
() | Parenthesis | (5 * 3) + 5 |
Constants (常量)
在 drawing operations 过程中,可以使用以前定义的变量或常量。常量的定义 需要声明,并且名字首字母要大写:
下面是可以直接使用的预定义变量:
width | Width of the target area |
height | Height of the target area |
object_width | Natural width of the object being drawn |
object_height | Natural height of the object being drawn |
left_width | Distance from left of frame to client window |
right_width | Distance from right of frame to client window |
top_height | Distance from top of frame to client window |
bottom_height | Distance from bottom of frame to client window |
mini_icon_width | Width of mini icon for window |
mini_icon_height | Height of mini icon for window |
icon_width | Width of large icon |
icon_height | Height of large icon |
title_width | Width of title text |
title_height | Height of title text |
Operations
Metacity 支持下面几种操作:
line
通过给出 origin (x1,y1) 和 destination (x2,y2) 和 color ,画一条线。 color 可以是如 "blue" 一样的名字,也可以是如 "#FF0099" 一样的数值,或者 是 GTK theme 的形式:"gtk:base[NORMAL]"。
rectangle (矩形)
通过给出 origin (x,y) 、 width 和 height 画一个 rectangle 。有 "filled" 属性,默认值是 "flase"。
arc (弧)
给定 origin (x,y) 、 width 、 height 、 start_angle 和 extent_angle , 画一个 arc 。有 "filled" 属性,默认值为 "flase"。
tint (色彩,浅色,痕迹)
gradient (倾斜度,坡度,升降率;倾斜的,步行的)
image
默认属性 "alpha" 是 0 , "colorize" 是 no color。
gtk_arrow
gtk_box
gtk_vline
icon
title
clip
include
tile (砖瓦;铺以瓦,铺以瓷砖)
Frame Style
创建一个 'frame style' 就是把一堆不同的 'frame pieces' 和 'window buttons' 绑定到特定的 'frame geometry' 上。通常创建的 style 要能对 window 进行 ”normal, maximized, shaded, maximized_and_shaded“ 操作,还 要能判断 window 是否聚焦。
首先,创建一个模板,这个模板将来会包含所有 draw a given frame style 需 要的信息。
上面的 "focused" 继承了 "normal" 。
Frame pieces
画 frame 的各部分,需要为每个 frame piece 提过一个 drawing operation 。 如果漏掉了一个 piece,这个 piece 部分就不会显示。
也可以 inline ,在里面画:
下面图片标出了一个 frame 的 style 可以有的多种 pieces :
Non-title frame pieces |
Titlebar frame pieces |
Title frame piece |
Window Buttons
对于一个 theme 需要设置一个最小集合的 window buttons。 "normal" 和 "pressed" 两种 "states" 的每一个都要都 "close","maximize","minimize" 和 "menu" buttons 的 "drawing methods"。如果 "prelight" 没有设置,就使用 "normal" 代替这个 "state"。
Along with specifying the window buttons, you can can specify how to draw part of the button depending on the position within the window frame. If all your buttons have the same background, you need only specify drawing operations for left_middle_background and right_middle_background.
Menu Icons
Frame Style Set
Windows
配置
打开复合特性
在 gconf-edit 里找到下面键值,打上勾,就可以让 Alt+Tab 键显示美观点
/apps/metacity/general/compositing_manager