AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 15971
In Process
intuited
intuited
Asked: 2010-12-03 16:30:22 +0800 CST2010-12-03 16:30:22 +0800 CST 2010-12-03 16:30:22 +0800 CST

在 xfce 中获取工作区切换的视觉反馈

  • 772

不确定这是否是该站点的适当问题,因为它并不是真正特定于 Ubuntu。那些认为不应该的人可能应该回复我在 Unix 和 Linux stackexchange 站点上的交叉帖子。抱歉有任何混淆,我仍在协商这些网站(和我也交叉发布的 superuser.com )之间的边界。我想我们都是。

我大量使用工作区,并且有很多工作区(6x4 网格)。我通常运行 openbox,但目前使用的机器没有设置 openbox,所以我使用的是 xfce,因为它已经根据我的喜好进行了大部分配置。当我切换工作区时,我已经习惯于获得视觉反馈,向我展示我刚刚移动到哪个工作区,并且发现自己在 xfce 中有点迷失方向。在 openbox 中,这是一个大的平视显示器,非常理想。我知道工作区切换器面板小程序将突出显示活动工作区,但这似乎只适用于显示一些桌面空间的工作区;因为我通常将所有窗口都最大化,所以这不是很有帮助。

在 xfce 中切换工作区时,有没有办法启用显示新工作区的视觉反馈?

workspaces xfce xubuntu
  • 9 9 个回答
  • 16521 Views

9 个回答

  • Voted
  1. Isaac Pessoa
    2012-08-04T00:24:29+08:002012-08-04T00:24:29+08:00

    我写了一个小代码,显示关于工作区切换操作的通知。此代码需要 libnotify 和 libwnck

    要编译它,请使用以下命令:

    gcc -O2 -o wsnd `pkg-config  --cflags --libs libnotify --libs libwnck` wsn.c
    

    如果您发现使用上述命令编译错误,请尝试以下命令:

    gcc -O2 -DWNCK_I_KNOW_THIS_IS_UNSTABLE -o wsnd `pkg-config  --cflags --libs libnotify --libs libwnck-1.0` wsn.c
    

    从终端测试它:./wsnd

    将其包含为 XFCE 启动应用程序:在 XFCE 中,您需要将其作为启动应用程序添加到设置管理器->会话和启动->应用程序自动启动

    编码:

    //////////////////////////////////////////////////////////////////////////////////////
    // Workspace Switch Notifier                                                        //
    // Shows a OSD with workspace name on workspace switching action                    //
    //                                                                                  //
    // wsn.c -                                                                          //
    //                                                                                  //
    // Authors:                                                                         //
    //    Isaac Maia Pessoa                                                             //
    //                                                                                  //
    // This program is free software: you can redistribute it and/or modify it          //
    // under the terms of the GNU General Public License version 3, as published        //
    // by the Free Software Foundation.                                                 //
    //                                                                                  //
    // This program is distributed in the hope that it will be useful, but              //
    // WITHOUT ANY WARRANTY; without even the implied warranties of                     //
    // MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR               //
    // PURPOSE.  See the GNU General Public License for more details.                   //
    //                                                                                  //
    // You should have received a copy of the GNU General Public License along          //
    // with this program.  If not, see <http://www.gnu.org/licenses/>.                  //
    //////////////////////////////////////////////////////////////////////////////////////
    
    #include <libnotify/notify.h>
    #include <libwnck/libwnck.h>
    
    #define N_SUMMARY "Workspace Changed"
    #define N_ICON    "dialog-information"
    #define N_APPNAME "workspace switch notifier"
    #define N_TIMEOUT 2000 /*2000ms = 2s */
    
    static NotifyNotification * m_notification = NULL;
    
    static void
    on_active_workspace_changed (WnckScreen    *screen,
                                 WnckWorkspace *space,
                                 gpointer      data)
    {
    
      WnckWorkspace * active_workspace = wnck_screen_get_active_workspace(screen);
      const char * w_name = wnck_workspace_get_name (active_workspace);
    
      notify_notification_update(m_notification, N_SUMMARY, w_name, N_ICON);
      notify_notification_show(m_notification, NULL);
    }
    
    int main(int argc, char ** argv)
    {
    
       GMainLoop *loop;   
       WnckScreen *screen;
    
       if (notify_init(N_APPNAME))
           m_notification = notify_notification_new(N_SUMMARY, "" , N_ICON);
       else
           fprintf(stderr, "Failed to init notifications\n");
       notify_notification_set_timeout(m_notification, N_TIMEOUT);
    
       gdk_init (&argc, &argv);
    
       loop = g_main_loop_new (NULL, FALSE);
       screen = wnck_screen_get_default();
    
       g_signal_connect (screen, "active-workspace-changed",
                        G_CALLBACK (on_active_workspace_changed), NULL);
    
       g_main_loop_run (loop);
    
       g_main_loop_unref (loop);    
    
       return 0;
    }
    
    • 10
  2. zspotter
    2014-01-12T08:22:33+08:002014-01-12T08:22:33+08:00

    我已经根据自己的喜好修改了 Isaac Pessoa 的答案。这不是在工作区更改时显示通知,而是简要地显示一个带有工作区切换器小部件的隐藏 Xfce 面板。

    这是切换工作区时的样子:例子

    将此文件另存为 wschanged.c:

    #include <libwnck/libwnck.h>
    #include <stdlib.h>
    
    static void
    on_active_workspace_changed (WnckScreen    *screen,
                                 WnckWorkspace *space,
                                 gpointer      data)
    {
        // Executes a script on workspace change
        system ("~/.workspace-changed");
    }
    
    int main(int argc, char ** argv)
    {
    
       GMainLoop *loop;   
       WnckScreen *screen;
    
       gdk_init (&argc, &argv);
    
       loop = g_main_loop_new (NULL, FALSE);
       screen = wnck_screen_get_default();
    
       g_signal_connect (screen, "active-workspace-changed",
                        G_CALLBACK (on_active_workspace_changed), NULL);
    
       g_main_loop_run (loop);
       g_main_loop_unref (loop);    
    
       return 0;
    }
    

    现在在屏幕边缘的任意位置创建一个新的 Xfce 面板并将其设置为自动隐藏。添加工作区切换器小部件。记下面板首选项窗口下拉菜单中显示的面板编号。

    在您的主目录中创建一个 .workspace-changed 文件,将 <P_NUMBER> 替换为您刚刚创建的面板编号。确保这个文件是可执行的!( chmod +x .workspace-changed )

    #!/bin/sh
    
    # Show the auto-hidden workspace panel for a moment, then set it to autohide again
    xfconf-query -c xfce4-panel -p /panels/panel-<P_NUMBER>/autohide -t bool -s false
    xfconf-query -c xfce4-panel -p /panels/panel-<P_NUMBER>/autohide -t bool -s true
    

    现在编译:

    gcc -O2 -DWNCK_I_KNOW_THIS_IS_UNSTABLE -o wschanged `pkg-config  --cflags --libs libwnck-1.0` wschanged.c
    

    在您的终端 ( ./wschanged ) 中对其进行测试,以确保一切正常。满意后,将程序添加为 Xfce 启动应用程序:设置 -> 会话和启动 -> 应用程序自动启动。

    • 3
  3. dsSTORM
    2018-10-17T07:26:13+08:002018-10-17T07:26:13+08:00

    大多数答案都是 5 岁,从 xubuntu 18.04 开始不再起作用。我已经整理了在 18.04 上运行的 zspotter 答案的更新版本。为简单起见,我假设所有文件都位于主目录中,您可以轻松地将脚本调整到不同的文件夹中。

    首先使用以下内容创建一个名为 wschanged.c 的文件:

    #include <libwnck/libwnck.h>
    #include <stdlib.h>
    
    static void
    on_active_workspace_changed (WnckScreen    *screen,
                                 WnckWorkspace *space,
                                 gpointer      data)
    {
        // Executes a script on workspace change
        system ("~/.workspace-changed");
    }
    
    int main(int argc, char ** argv)
    {
    
       GMainLoop *loop;   
       WnckScreen *screen;
    
       gdk_init (&argc, &argv);
    
       loop = g_main_loop_new (NULL, FALSE);
       screen = wnck_screen_get_default();
    
       g_signal_connect (screen, "active-workspace-changed",
                        G_CALLBACK (on_active_workspace_changed), NULL);
    
       g_main_loop_run (loop);
       g_main_loop_unref (loop);    
    
       return 0;
    }
    

    其次,在屏幕边缘的任意位置创建一个新的 Xfce 面板并将其设置为自动隐藏。添加工作区切换器小部件。记下面板首选项窗口下拉菜单中显示的面板编号,在我们的示例中面板编号为 2,并进行相应调整。

    第三,这里开始变得不一样了,在同一个文件夹中创建另一个名为 wschanged.sh 的脚本,其中包含这些内容(请记住使用右键单击将其设置为可执行文件 -> 属性 -> 设置为可执行文件,或chmod +x .wschanged.sh在终端中):

    #!/bin/sh
    
    # Show the auto-hidden workspace panel for a moment, then set it to autohide again
    xfconf-query -c xfce4-panel -p /panels/panel-2/autohide-behavior -s 1
    xfconf-query -c xfce4-panel -p /panels/panel-2/autohide-behavior -s 2
    

    面板不再具有自动隐藏属性,而是自动隐藏行为属性,因此脚本中的调整。

    第四,我们必须编译 .c 文件,之前答案中的命令不再起作用,建议在这里使用:

    gcc -O2 -DWNCK_I_KNOW_THIS_IS_UNSTABLE -o wschanged `pkg-config --cflags libwnck-3.0` wschanged.c `pkg-config --libs libwnck-3.0`
    

    如果您收到错误,请安装 libwnck-3-dev 和sudo apt install libwnck-3-dev.

    您现在可以使用./wschanged(将自己放在与可执行文件相同的目录中)来测试脚本。您现在还可以设置为在启动时运行命令。

    • 2
  4. RolandiXor
    2010-12-03T18:52:10+08:002010-12-03T18:52:10+08:00

    我唯一能想到的就是为每个桌面使用单独的壁纸(我相信这是可能的,但我无法确认,因为我不是每天都使用 xfce)。如果你不介意使用 compiz,你可以配置它像 xfwm 一样工作,并安装工作空间命名器插件,它允许你在切换时显示每个工作空间的名称。

    • 1
  5. Habitual
    2010-12-04T07:32:06+08:002010-12-04T07:32:06+08:00

    你可以安装 conky

    将此保存到文件中...

    # Static and Variable Values used by Habitual/John Jones
    
    # Static Values
    own_window yes
    own_window_transparent yes
    own_window_type desktop
    own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager
    double_buffer yes
    use_xft yes
    draw_outline no
    draw_borders no
    uppercase no
    draw_shades no
    draw_shades yes
    double_buffer yes
    border_width 0
    text_buffer_size 2048
    default_color white
    update_interval 1.0
    
    # Variable Values # These values are the ONLY thing that change from widget to widget
    alignment bm
    gap_x 5
    gap_y 44
    minimum_size 50 1
    maximum_width 100
    
    TEXT
    ${desktop_number}
    

    在 Xfce 中运行它。(终端)-> 带有 conky -c /path/to/file &

    图标/启动器 conky -c /path/to/file

    每次切换桌面时,桌面的编号都会显示在屏幕上。

    “alignment bm”值控制桌面放置。bm 处于中下。

    有关文档,请参见http://conky.sourceforge.net/docs.html。

    • 1
  6. Alan HArding
    2011-12-14T08:05:39+08:002011-12-14T08:05:39+08:00

    我对上面的 conky 脚本做了一点修改

    它将允许 XFCE 下的数字透明,您还可以修改字体大小。它还使用正确的变量来显示工作区标识

    # Static and Variable Values used by Habitual/John Jones
    # Added to by AMH to add transparency under newer XFCE, the gothic font
    # for sizing and changed the desktop variable to display the workspace
    # correctly
    
    # Static Values
    own_window yes
    own_window_transparent yes
    own_window_type desktop
    # Added to allow transparency in XFCE
    own_window_argb_visual yes
    own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager
    double_buffer yes
    use_xft yes
    draw_outline no
    draw_borders no
    uppercase no
    draw_shades no
    draw_shades yes
    double_buffer yes
    border_width 0
    text_buffer_size 2048
    default_color white
    update_interval 1.0
    
    # Variable Values # These values are the ONLY thing that change from widget to widget
    alignment bm
    gap_x 5
    gap_y 44
    minimum_size 50 1
    maximum_width 100
    
    TEXT
    ${color light blue}${font URW Gothic L:size=60}${desktop}
    
    • 1
  7. brciii
    2014-01-12T22:40:56+08:002014-01-12T22:40:56+08:00

    这正是我一直在寻找的。谢谢你,艾萨克·佩索阿和 zspotter!我在 Arch 上使用 Xfce,本着保持最小化的精神,我不想求助于安装 Compiz。

    我不确定这是否会或已经发生在其他人身上,但我注意到一些非常奇怪的事情:我设置为工作区指示器的面板被配置为显示 3 行(我有 9 个桌面)。它被设置为与您在 Ubuntu 中获得的大小大致相同(大约 3x6 英寸)。但是,它只会显示一行,直到我右键单击面板并选择属性(要明确的是,它是显示工作区切换器的属性窗口)。解决方法是删除另一个面板上的工作区切换器。

    此外,为了更改工作区指示器面板在再次自动隐藏之前显示的时间长度,您需要将其添加到您的 .gtkrc-2.0 文件中:

        style "xfce-panel-window-style"
    {
      # Time in miliseconds before the panel will unhide on an enter event
      XfcePanelWindow::popup-delay = 225
    
      # Time in miliseconds before the panel will hide on a leave event
      XfcePanelWindow::popdown-delay = 350
    
      # Size of autohide window in pixels
      XfcePanelWindow::autohide-size = 3
    }
    class "XfcePanelWindow" style "xfce-panel-window-style"
    

    在这里找到

    就我而言,因为我在 Arch 上,所以 gtkrc-2.0 文件不存在。我必须将它添加到我的 ~/.themes/[theme name here] 目录中的 gtkrc 文件中。

    根据您的喜好更改弹出延迟和弹出延迟。出于某种奇怪的原因,我不得不将值设置为我想要的值的一半左右。可能与 wschanged 执行脚本有关。

    如果您想在屏幕中间放置一个显示工作区网格的面板(类似于 Ubuntu),您需要一直设置该面板的 alpha(在面板首选项中的外观选项卡下)。这样您就不会在所有窗口的顶部看到一个小条。将 autohide-size 值设置为 1 将使该面板几乎不可能意外显示。

    最后一件事:如果您在切换工作区时光标恰好位于面板顶部,它将随机显示一个工具提示,我必须将光标移出面板以使其再次隐藏。不过也没什么大不了的。

    编辑:我为此使用了 zspotter 的修复程序。

    编辑:我刚刚注意到在桌面上滚动鼠标会切换工作区(使用 zspotter 的修复)。好的!

    编辑:这会导致我的通知弹出窗口(即使用音量键等时)出现在错误的位置。具体来说,当使用左上或右上选项时,通知显示在左中或右中。我没有安装 osd-notify——只是 xfce4-notifyd。设置中的所有内容似乎都是正确的。当我移除面板并从应用程序自动启动列表中删除 wschanged 时,问题得到了纠正。

    • 1
  8. RobotHumans
    2014-07-14T04:23:11+08:002014-07-14T04:23:11+08:00

    我有这个对工作区切换做出反应的小 python3 代码块。

    它不是为了显示通知,而是为了解决铬重绘错误。你想在工作区切换上发生的任何事情,你都可以轻松地投入到“fire_the_kludge”函数中。

    https://github.com/aking1012/chromiumKludge/blob/master/kludge.py

    这是一个使用 libnotify2 告诉您工作区的重新设计的示例:

    #!/usr/bin/env python3
    
    from gi.repository import Wnck, Gtk, Notify
    import signal, time
    
    class Kludge:
        def __init__(self):
            self.first = True
            signal.signal(signal.SIGINT, signal.SIG_DFL)
            self.screen = Wnck.Screen.get_default()
            Notify.init("Workspace Switch Notifier")
    
        def fire_the_kludge(self, data_a, data_b):
            time.sleep(.1)
            try:
                workspace_num = str(self.screen.get_active_workspace().get_number())
            except:
                workspace_num = "Some error happened"
            popup = Notify.Notification.new("Workspace: " + workspace_num)
            popup.show()
            time.sleep(1)
            popup.close()
    
        def main(self):
            self.screen.connect("active-workspace-changed", self.fire_the_kludge)
            Gtk.main()
    
    if __name__ == '__main__':
        print("Here comes the kludge")
        kludge = Kludge()
        kludge.main()
    
    • 1
  9. Jim At Your Service
    2022-04-29T12:51:27+08:002022-04-29T12:51:27+08:00

    完美的。谢谢 dsSTORM、zspotter 和 Isaac Pessoa。dsSTORM 的答案在第一次尝试 xfce over ubuntu 20.04 时起作用。如果您使用 Ctrl-Alt-Arrows 切换空格,您可能希望保持切换器面板可见,直到您释放 Alt 键。这样一来,只要您按住 Alt,您就可以根据该问题的操作人员的需要,在工作区之间导航并提供反馈,花费尽可能多的时间。

    感谢https://blog.robertelder.org/detect-keyup-event-linux-terminal中的 key.py,我们有这段代码,您可以将其放入 wait-until-alt-up.py

    import signal
    import keyboard
    import time
    
    class MyKeyEventClass1(object):
      def __init__(self):
        self.done = False
        signal.signal(signal.SIGINT, self.cleanup)
        keyboard.hook(self.my_on_key_event)
        while not self.done:
          time.sleep(1)  #  Wait for Ctrl+C
    
      def cleanup(self, signum, frame):
        self.done = True
    
      def my_on_key_event(self, e):
        # print("key event: " + str(e))
        if e.name == 'alt' and e.event_type == 'up':
            self.done = True
    
    a = MyKeyEventClass1()
    

    然后将您的 wschanged.sh 更改为:

    xfconf-query -c xfce4-panel -p /panels/panel-3/autohide-behavior -s 1 # 1 means show, 2 means hide
    
    DIR=$(dirname $0)
    sudo python $DIR/wait-until-alt-up.py
    
    xfconf-query -c xfce4-panel -p /panels/panel-3/autohide-behavior -s 2 # 1 means show, 2 means hide
    

    并执行 sudo visudo,然后将这些行添加到底部。此键盘侦听器必须以 root 身份运行,因为它“侦听”原始设备。

    # Note next line must be after the %sudo line since the last matching line for the user wins.
    #   # gratitude https://askubuntuh.com/questions/10051
    #
    #   user ALL = NOPASSWD: /usr/bin/python /home/user/dir/wait-until-alt-up.py
    

    现在使用一个巨大的 6x6 网格,它很漂亮。如果您按下 ctrl-alt-arrow 并很快释放 alt,脚本将看不到 alt-up,并且网格将保持活动状态。如果发生这种情况,只需再次按下并释放 Alt 键即可隐藏面板。谢谢大家。

    顺便说一句,您可以使用 Settings / Window Manager / Keyboard 来设置 Ctrl-Alt-Arrows 来切换工作区,并使用 Shift-Ctrl-Alt-Arrows 来带上您的活动窗口,或者您可以运行:

    xfconf-query -c xfce4-keyboard-shortcuts -p '/xfwm4/custom/<Primary><Alt>Up' -t string -s up_workspace_key -n
    xfconf-query -c xfce4-keyboard-shortcuts -p '/xfwm4/custom/<Primary><Alt>Down' -t string -s down_workspace_key -n
    xfconf-query -c xfce4-keyboard-shortcuts -p '/xfwm4/custom/<Primary><Alt>Left' -t string -s left_workspace_key -n
    xfconf-query -c xfce4-keyboard-shortcuts -p '/xfwm4/custom/<Primary><Alt>Right' -t string -s right_workspace_key -n
    xfconf-query -c xfce4-keyboard-shortcuts -p '/xfwm4/custom/<Primary><Shift><Alt>Up' -t string -s move_window_up_workspace_key -n
    xfconf-query -c xfce4-keyboard-shortcuts -p '/xfwm4/custom/<Primary><Shift><Alt>Down' -t string -s move_window_down_workspace_key -n
    xfconf-query -c xfce4-keyboard-shortcuts -p '/xfwm4/custom/<Primary><Shift><Alt>Left' -t string -s move_window_left_workspace_key -n
    xfconf-query -c xfce4-keyboard-shortcuts -p '/xfwm4/custom/<Primary><Shift><Alt>Right' -t string -s move_window_right_workspace_key -n
    
    • 0

相关问题

  • AppIndicators 可以在 Xubuntu 上运行吗?

  • 自动添加新的无线接入点

  • 如何更改工作区选择器工具栏小程序的突出显示颜色?

  • 无法在窗口之间切换[关闭]

  • 按下电源按钮时如何关闭计算机?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何安装 .run 文件?

    • 7 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    如何获得 CPU 温度?

    • 21 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Marko Smith

    如何使用命令行将用户添加为新的 sudoer?

    • 7 个回答
  • Marko Smith

    更改文件夹权限和所有权

    • 9 个回答
  • Marko Smith

    你如何重新启动Apache?

    • 13 个回答
  • Marko Smith

    如何卸载软件?

    • 11 个回答
  • Marko Smith

    如何删除 PPA?

    • 26 个回答
  • Martin Hope
    NES 如何启用或禁用服务? 2010-12-30 13:03:32 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    Olivier Lalonde 如何在结束 ssh 会话后保持进程运行? 2010-10-22 04:09:13 +0800 CST
  • Martin Hope
    David B 如何使用命令行将用户添加为新的 sudoer? 2010-10-16 04:02:45 +0800 CST
  • Martin Hope
    Hans 如何删除旧内核版本以清理启动菜单? 2010-08-21 19:37:01 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve