![工作区秒表?](https://linux22.com/image/979574/%E5%B7%A5%E4%BD%9C%E5%8C%BA%E7%A7%92%E8%A1%A8%EF%BC%9F.png)
有没有可以作为工作区秒表的程序?我想知道每天在每个工作区花了多少时间。
编辑:我正在使用 Unity。
答案1
好问题!
下面的脚本~/viewport_log.txt
在您的主目录中创建一个日志文件:,其中报告当前会话的每个视口(工作区)的使用时间。
该报告每两秒更新一次,如下所示(快速运行):
workspace1 0:00:24
workspace2 0:00:05
workspace6 0:00:04
workspace8 0:00:05
在格式中
hours:minutse:seconds
如您所见,我只使用了工作区 1、2、6 和 8。
如何使用
该脚本使用wmctrl -d
命令获取当前视口数据,因此需要先安装它:
sudo apt-get install wmctrl
然后:
- 将以下脚本复制到一个空文件中,并将其另存为
workspace_log.py
通过命令测试运行:
python3 /path/to/workspace_log.py
浏览不同的工作区并打开文件
~/viewport_log.txt
以查看结果(或者,在终端中运行cat ~/viewport_log.txt
以方便阅读,因为日志每秒更新一次)。如果一切按预期工作,请将命令添加到启动应用程序中。由于如果脚本启动得太早(在桌面完全加载之前),它很可能会崩溃,因此您可能需要在启动命令中添加一个小中断以使其作为启动应用程序工作,因此命令如下:
/bin/bash -c "sleep 15&&python3 /path/to/workspace_log.py"
要将其添加到启动应用程序:Dash > 启动应用程序 > 添加,然后添加命令。
剧本
import subprocess
import os
import time
# define / clear log file
home = os.environ["HOME"]
logfile = home+"/"+"viewport_log.txt"
open(logfile, "wt").write("")
vplist = []
def get_res():
# get resolution
xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
pos = xr.index("current")
return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]
def get_dt():
# get the current viewport
res = get_res()
vp_data = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split()
dt = [int(n) for n in vp_data[3].split("x")]
cols = int(dt[0]/res[0])
curr_vpdata = [int(n) for n in vp_data[5].split(",")]
curr_col = int(curr_vpdata[0]/res[0])+1; curr_row = int(curr_vpdata[1]/res[1])
return str(curr_col+curr_row*cols)
def time_format(s):
# convert time format from seconds to h:m:s
m, s = divmod(s, 60)
h, m = divmod(m, 60)
return "%d:%02d:%02d" % (h, m, s)
current_time1 = float(time.time())
curr_dt1 = get_dt()
while True:
time.sleep(2)
curr_dt2 = get_dt()
if curr_dt2 == curr_dt1:
current_time2 = float(time.time())
span = current_time2-current_time1
vp = "workspace "+curr_dt1+" . "*10
vplist.sort(key=lambda x: x[0])
if not vp in [v[0] for v in vplist]:
vplist.append([vp, span])
else:
index = vplist.index([vplist[i] for i in range(len(vplist)) if vplist[i][0] == vp][0])
vplist[index][1] = float(vplist[index][1])+span
with open(logfile, "wt") as out:
for item in vplist:
out.write(item[0]+" "+time_format(item[1])+"\n")
current_time1 = current_time2
curr_dt1 = curr_dt2
脚本的属性
该脚本会计算两个时刻之间准确的时间跨度以及该时刻使用的工作空间(即 2 秒,即行中的间隔time.sleep(2)
),如果两个时刻的工作空间相同,则将该时间添加到相应工作空间的总使用时间中。
如果两个时刻的工作空间不同,则显然存在工作空间切换,并且该时间不会被添加到任何工作空间的生产时间中;~/viewport_log.txt
因此,概览中的时间四舍五入为每个工作空间每个周期两秒。
编辑
在后台运行上述脚本,您可以通过将下面的脚本放在组合键下来查看每个工作区的当前使用时间:
#!/bin/bash
lines="$( cat ~/viewport_log.txt )"
zenity --info --title='Usage per Viewport' --text="$lines"
- 将脚本复制到一个空文件中,另存为
view_vplog.sh
运行,当第一个脚本在后台运行时,通过以下命令:
sh /path/to/view_vplog.sh
使其可用(经过测试)快捷键组合:选择:系统设置 > “键盘” > “快捷键” > “自定义快捷键”。单击“+”并将命令添加到您选择的键组合中。