Linux窗口管理器——Qtile之初体验

Tiling window manager——平铺式窗口管理器,不同于浮动式那样以层的形式管理窗口,平铺式将所有窗口平铺开来,窗口之间无缝对接,这有助于同时查看多个窗口的内容,对于程序员来说这尤其有用。

平铺式窗口管理器有很多,比较有名的像awesome,i3等等,不过awesome是以lua语言写的,我没用过,对此不做介绍。而qtile是以纯Python写的,作为一个Python迷(虽然海是菜鸟中的菜鸟),我自然选择qtile。

Qtile的官网:http://www.qtile.org

Qtile的图形对象(object graph)共七个部分:layouts、windows、screen、groups、bars、widgets还有一个root。

layouts:布局,以什么方式来分布窗口,包括Max(单窗口占据整个屏幕)、Tiling(按比例分配窗口)、Floationg(浮动窗口)、MonadTall(模拟XMonad的平铺式窗口)、Slice、Stack(将屏幕分成多个栈),TreeTab、Zoomy

groups:相当于其他桌面环境的工作区。

screens:物理屏幕

bar:栏,可以理解为任务栏

widget:小工具,组件,包括很多,像是时间,天气,邮件查看,任务列表,groupbox等等。。。

安装qtile的方法可以参考官网,不过我当时照着官网编译的时候提示错误,是一个ImportError,好像是说缺少某个模块,不过这个模块我没有找到。。。后来在google了一番后,找到如下的解决方法:

pip install cffi
pip install xcffib
git clone -b xcb https://github.com/flacjacket/cairocffi.git
cd cairocffi && sudo python setup.py install
git clone git://github.com/qtile/qtile.git
cd qtile
sudo python setup.py install

貌似是作者把几个模块编译到了一起。。。

关于配置文件的写法官网上提供了很多,既有默认配置,也有其他用户写的配置,可以借鉴后使用。之后我会给出我的配置,不过就是并不好。

详细的内容可以看官方文档,不过官方文档并不全面,很多配置都未提到。尤其是关于windows(窗口对象)方面的,除了官方默认配置外,其他用户的配置都用到了windows方面的内容。我谷歌、度娘了半天,一无所获(也可能是我查的方式不对)。看来可能要直接看源代码了。。。

刚才传了一下,好像不怎么好上传,现直接贴出配置文件:

#!/usr/bin/env python
#-*-coding:utf-8-*-

import os

from libqtile import layout,widget,bar,manager,hook
from libqtile.widget import base
from libqtile.manager import Screen,Drag
from libqtile.command import lazy
try:
    from libqtile.manager import Key,Group
except ImportError:
    from libqtile.config import Key,Group

sup=‘mod4‘
alt=‘mod1‘

#键位映射
keys=[
    #Layout
    Key([sup],‘Down‘,lazy.layout.down()),
    Key([sup],‘Up‘,lazy.layout.up()),
    Key([alt],‘Tab‘,lazy.layout.next()),
    Key([alt,‘shift‘],‘Tab‘,lazy.layout.previous()),
    Key([sup],‘space‘,lazy.nextlayout()),
    Key([sup],‘k‘,lazy.layout.increase_ratio()),
    Key([sup],‘j‘,lazy.layout.decrease_ratio()),
    Key([sup],‘l‘,lazy.layout.increase_nmaster()),
    Key([sup],‘h‘,lazy.layout.decrease_nmaster()),

    #Window
    Key([alt],‘F4‘,lazy.window.kill()),
    Key([alt],‘F10‘,lazy.window.toggle_maximize()),

    #Group
    Key([sup],‘Left‘,lazy.group.prevgroup()),
    Key([sup],‘Right‘,lazy.group.nextgroup()),

    #Application launchers
    Key([sup],‘Return‘,lazy.spawn(‘sakura‘)),
    Key([sup],‘f‘,lazy.spawn(‘firefox‘)),
    Key([sup],‘m‘,lazy.spawn(‘vlc‘)),
    Key([sup],‘v‘,lazy.spawn(‘virtualbox‘)),
    Key([sup],‘t‘,lazy.spawn(‘Thunar‘)),
    Key([sup],‘q‘,lazy.spawn(‘QQ‘)),
    Key([sup],‘z‘,lazy.spawn(‘zim‘)),

    #Audio
    Key([sup],‘F8‘,lazy.spawn(‘amixer --quiet set Master mute‘)),
    Key([sup],‘F9‘,lazy.spawn(‘amixer --quiet set Master unmute‘)),
    Key([alt],‘minus‘,lazy.spawn(‘amixer --quiet set Master 2dB-‘)),
    Key([alt,‘shift‘],‘equal‘,lazy.spawn(‘amixer --quiet set Master 2dB+‘)),

    #restart qtile
    Key([sup],‘r‘,lazy.restart()),
    #shutdown
    Key([sup,‘shift‘],‘q‘,lazy.spawn(‘shutdown -h now‘)),

    #interact with prompts:
    Key([sup],‘s‘,lazy.spawncmd()),    
]

mouse=[
    Drag([sup],"Button1",lazy.window.set_position_floating(),
        start=lazy.window.get_position()),
    Drag([sup],"Button3",lazy.window.set_size_floating(),
        start=lazy.window.get_size()),
]

#建立groups
group_names=[
    ("code1",{‘layout‘:‘tile‘}),
    ("code2",{"layout":‘tile‘}),
    ("web",{"layout":"max"}),
    ("vbox",{"layout":"max"}),
    (‘music‘,{‘layout‘:‘max‘}),
    (‘doc‘,{‘layout‘:‘max‘}),
    (‘chat‘,{‘layout‘:‘max‘})
]

groups=[Group(name,**kwargs) for name,kwargs in group_names]

for i , (name,kwargs) in enumerate(group_names,1):
    keys.append(Key([sup],str(i),lazy.group[name].toscreen()))
    keys.append(Key([sup,‘shift‘],str(i),lazy.window.togroup(name)))

#建立layouts
layouts=[
    layout.Tile(border_focus=‘#196ff2‘,border_width=1),
    layout.Max()
]

font=‘WenQuanYi Micro Hei‘
fontsize=16
foreground=‘#FFFFFF‘
background=‘#000000‘

def humanize_bytes(value):
    suff=[‘B‘,‘K‘,‘M‘,‘G‘,‘T‘]
    while value > 1024. and len(suff)>1:
        value/=1024.
        suff.pop(0)
    return "% 3s%s" %(‘%.3s‘%value,suff[0])

#本来这个是用来显示CPU、Mem、Net的情况,后来不知为何无法显示
class Metrics(base._TextBox):
    
    defaults=[
        (‘font‘,‘Arial‘,‘Metrics font‘),
        (‘fontsize‘,None,‘Metircs pixel size‘),
        (‘pading‘,None,‘Metrics padding‘),
        (‘background‘,‘00000‘,‘background color‘),
        (‘foreground‘,‘ffffff‘,‘foreground color‘)
        ]

    def __init__(self,**kwargs):
        base._TextBox.__init__(self,**kwargs)
        self.cpu_usage,self.cpu_total=self.get_cpu_stat()
        self.interfaces={}
        self.idle_ifaces={}

    def _configure(self,qtile,bar):
        base._TextBox._configure(self,qtile,bar)
        self.timeout_add(0,self._update)

    def get_cpu_stat(self):
        stat=[int(i) for i in open(‘/proc/stat‘).readline().split()[1:]]
        return sum(stat[:3]),sum(stat)

    def get_cpu_usage(self):
        new_cpu_usage,new_cput_total=self.get_cpu_stat()
        cput_usage=new_cpu_usage-self.cpu_usage
        cpu_total=new_cpu_total-self.cpu_total
        self.cpu_usage=new_cpu_usage
        self.cpu_tptal=new_cpu_total
        return ‘Cpu: %d%%‘ % (float(cpu_usage)/float(cpu_total)*100.)

    def get_mem_usage(self):
        info={}
        for line in open(‘/proc/meminfo‘):
            key,val=line.split(‘:‘)
            info[key]=int(val.spilt()[0])
        mem=info[‘MemTotal‘]
        mem-=info[‘MemFree‘]
        mem-=info[‘Buffers‘]
        mem-=info[‘Cached‘]
        return ‘Mem: %d%%‘ % (float(mem)/float(info[‘MemTotal‘])*100)

    def get_net_usage(self):
        interfaces=[]
        basedir=‘/sys/class/net‘
        for iface in os.listdir(basedir):
            j=os.path.join
            ifacedir=j(basedir,iface)
            statdir=j(ifacedir,‘statistics‘)
            idle=iface in self.idle_ifaces
            try:
                if int(open(j(ifacedir, ‘carrier‘)).read()):
                    rx = int(open(j(statdir, ‘rx_bytes‘)).read())
                    tx = int(open(j(statdir, ‘tx_bytes‘)).read())
                    if iface not in self.interfaces:
                        self.interfaces[iface] = (rx, tx)
                    old_rx, old_tx = self.interfaces[iface]
                    self.interfaces[iface] = (rx, tx)
                    rx = rx - old_rx
                    tx = tx - old_tx
                    if rx or tx:
                        idle = False
                        self.idle_ifaces[iface] = 0
                        rx = humanize_bytes(rx)
                        tx = humanize_bytes(tx)
                        interfaces.append(‘%s: %s / %s‘ % (iface, rx, tx))
            except:
                pass
            if idle:
                interfaces.append(‘%s: %-11s‘ % (iface, ("%ds idle" % self.idle_ifaces[iface]))
                )
                self.idle_ifaces[iface] += 1
                if self.idle_ifaces[iface] > 30:
                    del self.idle_ifaces[iface]
        return " | ".join(interfaces)
    

    def _update(self):
        self.update()
        self.timeout_add(1, self.update)
        return False

    def update(self):
        stat = [self.get_cpu_usage(), self.get_mem_usage()]
        net = self.get_net_usage()
        if net:
            stat.append(net)
        self.text = " | ".join(stat)
        self.bar.draw()
        return True

screens=[
    Screen(top=bar.Bar([
        widget.TextBox(text=‘◤ ‘,fontsize=40,foreground=‘#323335‘,padding=0),
        widget.GroupBox(font=font,fontsize=fontsize,active=foreground,inactive="#808080",borderwidth=3),
        widget.Prompt(font=font,fontsize=fontsize),
        widget.CurrentLayout(font=font,foreground=foreground,fontsize=fontsize),
        widget.Sep(foreground=background,linewidth=3),
        widget.WindowName(font=font,fontsize=fontsize,foreground=foreground),
        widget.Notify(font=font,fontsize=fontsize),
        Metrics(font=font,fontsize=fontsize,foreground=foreground),
        widget.Volume(foreground="#70ff70"),
        widget.BatteryIcon(),
        widget.Systray(icon_size=18),
        widget.Clock(font=font,fontsize=fontsize,foreground=foreground,fmt=‘%Y-%m-%d %a %H:%M‘),
    ],30))
]

@hook.subscribe.client_new
def dialogs(window):
    if(window.window.get_wm_type() == ‘dialog‘
        or window.window.get_wm_transient_for()):
        window.floating = True
时间: 2024-10-11 13:20:43

Linux窗口管理器——Qtile之初体验的相关文章

SAMSUNG S3C2440 ARM LINUX 开发板 上手初体验 --开发环境搭建

1,linux开发环境搭建 2,程序测试 easyOpentag驱动安装,打开连接,选择ARM-linux 链接:http://pan.baidu.com/s/1pJKK4w7 密码:a0re 1,环境搭建 我的系统版本 [email protected]:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.3 LTS Release: 14.04 Cod

linux初体验

第一次听到linux这个'词语'是在一次偶然的朋友聊天中朋友提到的,之前压根没听到过'这个东西',所以我可以说是个linux的新新手,菜鸟都不算. 截至到目前,我已经开始linux系统运维学习有差不多10天时间了.在没接触linux之前,我对它的认识仅仅是:它是个计算机系统.决定学习linux系统运维之前,自我以为运维应该是对系统的一些日常维护之类的,不会很难的东西,我更希望运维是个不难的东西,我个人很笨,对难的东西可能接受的很慢,所以我愿意认为运维是很简单的,这样我就可以轻轻松松的掌握运维相关

Linux初体验(一)

Linux初体验(一) Shell date echo alias screen 安装VMware Tools Shell 用途说明 人机交互接口 Shell是Linux系统的用户界面,是用户操作Linux系统的一个直接工具,亦即人机交互接口,其既为用户提供了一个命令界面,也为用户命令提供解释执行的能力,故而Shell也称为Linux的命令解释器(command interpreter). 在Shell中可执行的命令分为两类,内置命令与外部命令,所谓内置命令,即shell自带的命令,可通过命令启

第三次随笔--安装虚拟机及学习linux系统初体验

第三次随笔--安装虚拟机及学习linux系统初体验 ·学习基于VirtualBox虚拟机安装Ubuntu图文教程在自己笔记本上安装Linux操作系统 首先按照老师的提示步骤进行VirtualBox虚拟机的安装,安装过程可谓一帆风顺,一马平川,并没有遇到什么问题. ·成功安装之后打开虚拟机 对就是这个样子,略微有一点激动,还好,在自己的电脑上运行并不会有太多的卡顿 ·参考老师的学习方法通过实践学习Linux 基础入门(新版)课程,掌握常用的Linux命令,重点是3/4/5/6/7/8节. 虚拟机安

Linux初体验(五)

Linux初体验(五) 文件通配符 绝对路径与相对路径 发邮件 file tree 文件通配符 用途说明 文件通配符是一种简洁高效的语句,主要用来精确搜索或模糊搜索文件.其用一个或多个特殊的字符来实现对真正字符的替换,从而完成相关的任务. 在Linux中,主要有以下文件通配符: *  匹配零个或多个字符 ?  匹配任意单个字符 ~  当前用户家目录 ~username  用户家目录  [0-9]  匹配一个数字范围 [a-z]  大写与小写字母 [A-Z]  大写字母 [ ]  匹配列表中的任意

1.菜鸟的linux学习之路------linux初体验

脚本编程语言通常是解释型的.这类程序的执行,是由解释器读入代码,并将其转换成内部的形式,在执行.请注意,解释器本身是一般的编译型程序. 常用的脚本编程语言有 :awk,Perl,Python,Ruby,Shell.这里的Ruby是日本人研发的. 注释: linux : 1.rm 删除指定的文件 例:rm /Users/apple/Desktop/QQDock.plist 2.假设你想知道现在的系统有多少人在登录,那么 who命令可以实现 3.|管道符号可以在两个程序之间建立管道:who的输出,成

Linux初体验之练习篇(七)

Linux初体验之练习篇(七) tr IO重定向 神奇的自动挂载 tr 主要用途 转换或删除字符 tr - translate or delete characters tr [OPTION]... SET1 [SET2] tr命令是一个强大的字符转换工具,可以对来自标准输入的字符进行各种转换,包括字符集对应转换.删除或都取字符补集.压缩和格式调整.格式调整包括换行.回车.加入制表符等. 常用参数 -c, -C: --complemen, 取字符集的补集 -d: --delete, 删除所有属于

Linux初体验(六)

Linux初体验(六) inode cp mv rm ln 时间戳(touch.stat) 环境: CentOS 6.8 inode 用途说明 索引节点,存放文件的元数据 一个索引节点就是一个表项,包含了文件的元数据信息,包括: - 文件类型,权限,UID, GID- 链接数(指向文件名路径名称的个数) - 文件的大小与时间戳- 指向磁盘上文件的数据块指针  - 有关文件的其他数据 inode 本质上是一种数据结构,包含了文件系统中各个文件的元数据:inode表就是一份包含了对应文件系统中的所有

linux 驱动模块开发初体验

2020-02-09 关键字: 在嵌入式 Linux 开发中,驱动程序通常都是用 C语言 来编写的,并经编译后生成为目标文件,即 '.o' 文件.随后又可在编译系统时以两种形式打包成系统镜像文件: 1.uImage 即内核的二进制文件.这种形式是直接将内核驱动程序打包进系统文件中.这种形式的驱动程序将会在内核加载时运行,即随系统启动而运行.这种形式的驱动预置在一定程度上会影响系统的开机耗时. 2.ko 文件 即 kernel object,这种形式是将驱动程序以独立的模块文件存在于系统中.这种形