GNOME Shell正式采用类OS X的Modal Dialog了

差不多五个月前,我在《图形交互设计之:Modal Dialog(兼hack GNOME Shell)》介绍过操作系统界面的Modal Dialog,特别写了Mac OS X是如何设计Modal Dialog,为什么要这样设计,及这样设计的好处。

当时我还获取了两个GNOME Shell/Mutter的补丁,可以将GNOME Shell的Modal Dialog也改造成类似于Mac OS X的样式。我以为这个补丁永远也不可能被GNOME开发者所接纳,因为这完全是复制Mac嘛。可是我想错了,现在这个设计已经合并至主干,已经成为未来GNOME Shell的默认行为了!

关于这些更改的提交,分别在两个组件,一人是Mutter(窗口管理器):

可以看到,开发者在窗口管理器级别,只是可选的增加了Modal Dialog的Attach支持,用户若不喜欢可以关闭。这也是Linux的灵活性所在。

而在桌面级别,GNOME Shell默认启用了Attach Modal Dialog,并给予视觉特效(很遗憾不如Mac OS X漂亮):

效果图如下:

Modal Dialog GNOME Shell

我是觉得有点难看,不过行为还是可以接受的,这个Modal Dialog将会随着父窗口的移动而移动,同时完全覆盖了父窗口的事件响应。

看到GNOME开发者这样认真地学习其他操作系统界面的优秀元素,相信到时GNOME 3会越来越让人满意的。

<推广> 本站架设于 Linode 东京机房,同时使用 云梯 进行科学上网

» You can leave a comment.

13 Comments

  1. 这玩意真是优秀的设计吗……?

    挡住我要看的东西怎么办。

  2. 其实。。。。
    我不怎么喜欢这个设计,觉得好丑来的....

    Attach是必须的,但是能换个形式最好了....

  3. FIREFOXMMX

    我也觉得没有。以前那个好看。。感觉还是要标题栏,好看。不然就没有GNOME的感觉了。。真的。。

  4. KDE快copy,GNOME下看起来这个东西太恶心了~

  5. wangjl

    可以让人自由选择就好

  6. Laevus

    果然GNOME要走OS X 的路线啊

  7. wupeng

    gnome标题栏的黑色和菜单栏同是黑色有些不美观,如果把菜单栏换成灰色比较好,层次感会好些。

  8. 非 gnome-shell 下可以用这个通用的 python wnck 程序

    $ cat wnck_attach_modal_dialog.py
    &lt;pre&gt;#!/usr/bin/python
    # -*- coding: UTF-8 -*-
    # vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79:
    &#39;&#39;&#39;利用 wnck 来做 Attach Modal Dialog
    @author: Jiahua Huang &lt;jhuangjiahua@gmail.com&gt;
    @license: LGPLv3+
    @see: http://imtx.cn/archives/1552.html

    有两个方案::
    1. 直接将对话框 reparent 到程序窗口
    实现简单,但是有窗口焦点等问题
    2. 将对话框取消边框,跟踪跟随父窗口位置
    得处理父窗口移动(或改变大小)等情况

    本文是方案 1.

    &#39;&#39;&#39;

    import gtk, glib
    import wnck
    import thread
    import time
    import os

    class Attacher(object):
    def __init__(self):
    self.leaders_xid = {}
    self.screen = wnck.screen_get_default()
    for wnck_window in self.screen.get_windows_stacked():
    self._on_window_open(self.screen, wnck_window)
    pass
    self.screen.connect(&#39;window-opened&#39;, self._on_window_open)
    pass

    def _on_window_open(self, screen, wnck_window):
    leader = wnck_window.get_group_leader()
    if leader in self.leaders_xid:
    wnck_window.transient_xid = self.leaders_xid[leader]
    else:
    self.leaders_xid[leader] = wnck_window.get_xid()
    wnck_window.transient_xid = 0
    pass
    if wnck_window.get_window_type() == wnck.WINDOW_DIALOG and wnck_window.transient_xid:
    window = gtk.gdk.window_foreign_new(wnck_window.transient_xid)
    dialog = gtk.gdk.window_foreign_new(wnck_window.get_xid())
    dialog.hide()
    thread.start_new_thread(self.proc_dialog, (window, dialog))
    pass
    pass

    def proc_dialog(self, window, dialog):
    left, top = 20, 20
    glib.idle_add(dialog.hide)
    glib.idle_add(dialog.reparent, window, left, top)
    window_w, window_h = window.get_size()
    dialog_w, dialog_h = dialog.get_size()
    dialog_w = min(dialog_w, window_w - left - left)
    dialog_h = min(dialog_h, window_h - top - top)
    glib.idle_add(dialog.resize, dialog_w, dialog_h)
    left = int((window_w - dialog_w) / 2)
    glib.idle_add(dialog.move, left, -dialog_h)
    glib.idle_add(dialog.show)
    glib.idle_add(dialog.raise_)
    glib.idle_add(dialog.focus)
    for h in range(-dialog_h, top, 10) + [top]:
    glib.idle_add(dialog.move, left, h)
    time.sleep(0.01)
    pass
    pass

    def main():
    gtk.gdk.threads_init()
    attcher = Attacher()
    gtk.main()
    pass

    if __name__==&quot;__main__&quot;:
    main()

    &lt;/pre&gt;

    • 咦,主席不支持 &lt;pre&gt; 标记了,那么看
      http://pastebin.com/JjMvDwmj

      执行该 python wnck 程序后,
      再在 gtk 窗口里出现对话框,就会附在程序窗口,下滑到类似位置

  9. shujingjing

    不知道GNOME3支持javascript和CSS后能否直接支持在任何gtk和gtk+程序中使用所谓云输入法?

    • 搜狗:你的思路很好,我来试试
      腾讯:我比搜狗早
      百度:(封杀腾讯和搜狗)我是第一个出兼容GNOME3的

  10. 好棒好棒好棒!我很喜欢这个对话框。

Leave a Comment