Мой рабочий стол. — Минимализм, загубленный коньками
Решил поделиться своим рабочим столом, может кому что-то пригодится. Ранее частично выкладывал на русском форуме Ubuntu, но с тех пор кое-что поменялось.
Что имею:
Лаптоп HP ProBook 5310m (на обоине он же) с Ubuntu 10.10, Gnome 2.32.0
Тема GTK: Модифицированная старая human
Тема Metacity: Модифицированная mist
Значки: ubuntu-mono-dark
Шрифты: sans 8 (новый шрифт ubuntu не особо приглянулся)
Compiz не использую, композитинг в metacity тоже отключен. Поведение окон корректирует devilspie. При допиливании темы старался сделать все максимально компактным. Красная рамка для выделения активного окна, прозрачная Gnome-панель. В качестве эмулятора терминала - tilda (нет на скринах), иногда врубаю тайлинг в виде pytyle.
Рабочий стол с окнами:
Голый рабочий стол с conky и стилизованной обоиной (магия GIMP):
Идея взята отсюда. Здесь, как обычно, отображаются различные системные датчики и графики. Также я добавил информацию из аудиоплеера audacious типа прогресса текущей песни и очереди воспроизведения, количество непрочитанных писем в GMail, непрочитанных сообщений в Google Reader и внешний IP адрес (на всякий случай).
Рабочий стол при отключенном conky (опять же GIMP):
Тайлинг:
Как этого всего добиться? Если вам лень читать, то вконце есть ссылка на архив с нужным барахлом.
Все по порядку:
Ругайте, спрашивайте.
Тема gtk+metacity
Обоина со включенным conky
Обоина без conky
Conky (конфиг, обои, скрипты)
Что имею:
Лаптоп HP ProBook 5310m (на обоине он же) с Ubuntu 10.10, Gnome 2.32.0
Тема GTK: Модифицированная старая human
Тема Metacity: Модифицированная mist
Значки: ubuntu-mono-dark
Шрифты: sans 8 (новый шрифт ubuntu не особо приглянулся)
Compiz не использую, композитинг в metacity тоже отключен. Поведение окон корректирует devilspie. При допиливании темы старался сделать все максимально компактным. Красная рамка для выделения активного окна, прозрачная Gnome-панель. В качестве эмулятора терминала - tilda (нет на скринах), иногда врубаю тайлинг в виде pytyle.
Рабочий стол с окнами:
Голый рабочий стол с conky и стилизованной обоиной (магия GIMP):
Идея взята отсюда. Здесь, как обычно, отображаются различные системные датчики и графики. Также я добавил информацию из аудиоплеера audacious типа прогресса текущей песни и очереди воспроизведения, количество непрочитанных писем в GMail, непрочитанных сообщений в Google Reader и внешний IP адрес (на всякий случай).
Рабочий стол при отключенном conky (опять же GIMP):
Тайлинг:
Как этого всего добиться? Если вам лень читать, то вконце есть ссылка на архив с нужным барахлом.
Все по порядку:
- Создаем в домашнем каталоге директорию .conky с файлом конфигурации conky:
1
2
3
4
5cd ~
mkdir .conky
cd .conky
touch 1366x768.conkyrc
gedit 1366x768.conkyrc
Содержимое 1366x768.conkyrc:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163# -*- conf -*-
#
# ~/.conkyrc - Conky configuration file
#
# Author: Roman Krylov <[email protected]>
# Original idea by Henrik Brix Andersen (http://blog.brixandersen.dk/?p=67)
#
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# First run:
# crontab -e
# Then add a new cron task:
# */3 * * * * /home/xxx/.conky/scripts/conky-helper
# This will run every 3 minutes script for getting ip, count
# of unread gmail messages and google reader feeds
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# do not fork to background
background no
# font settings
use_xft yes
font monospace-8
uppercase no
# update every 2 secs
update_interval 2
# stay running forever
total_run_times 0
# draw to root window
own_window no
# avoid flickering
double_buffer yes
# size
minimum_size 1366 768
maximum_width 1366
# position
alignment top_left
gap_x 0
gap_y 0
# colors
default_color white
default_shade_color black
default_outline_color black
color1 33b0dc #light
color2 207B9B #darker
color3 144556 #dark
color4 CA9529 #yellow
color5 D93A36 #red
# borders
draw_borders no
stippled_borders 8
#border_margin 4
border_width 1
# shades
draw_shades yes
# outline
draw_outline no
# spacer
use_spacer none
# buffers
no_buffers yes
# sampling
cpu_avg_samples 2
net_avg_samples 2
# bar size
default_bar_size 130 6
# configuration
TEXT
${voffset 60}${offset 430}${color1}LED
${offset 430}$color3 Brightness: $color1${exec cat /proc/acpi/video/GFX0/DD02/brightness | grep current | cut -d" " -f2}%
${offset 950}${color1}Network (wlan0)
${offset 950}$color3 ESSID: ${color1}${wireless_essid wlan0} ${if_match "${wireless_essid wlan0}" != "off/any"}(${wireless_bitrate wlan0}) ${color3}Signal: ${color1}${wireless_link_qual_perc wlan0}%${endif}
${offset 950}$color3 IPv4: $color1${addr wlan0}
${offset 950}$color3 Download: $color1${downspeed wlan0}
${voffset -13}${offset 1090}${color3}Total: ${color1}${totaldown wlan0}
${offset 950}$color3 Upload: $color1${upspeed wlan0}
${voffset -13}${offset 1090}${color3}Total: ${color1}${totalup wlan0}
${offset 950}$color3 ${downspeedgraph wlan0 12,250 000000 33b0dc}
${offset 950}$color3 ${upspeedgraph wlan0 12,250 000000 33b0dc}
${voffset 20}${offset 90}${color1}CPU
${offset 90}$color3 Frequency: $color1${freq} MHz
${voffset -13}${offset 216}$color3 Temperature:$color1 $acpitemp C
${offset 90}$color3 Core 1 Load: $color1${cpu cpu0}%
${voffset -13}${offset 216}${if_match ${cpu cpu0} >= 50}${color4}${endif}${if_match ${cpu cpu0} >= 80}${color5}${endif}${cpubar cpu0 6,130}
${offset 90}$color3 Core 2 Load: $color1${cpu cpu1}%
${voffset -13}${offset 216}${if_match ${cpu cpu1} >= 50}${color4}${endif}${if_match ${cpu cpu1} >= 80}${color5}${endif}${cpubar cpu1 6,130}
${offset 90}$color3 ${cpugraph cpu0 12,250 000000 33b0dc}
${offset 90}$color3 ${cpugraph cpu1 12,250 000000 33b0dc}
${offset 90}$color3 Top CPU:
${voffset -13}${offset 216}${color1}${top name 1}
${voffset -13}${offset 305}${top cpu 1}%
${offset 216}${color2}${top name 2}
${voffset -13}${offset 305}${top cpu 2}%
${offset 216}${color3}${top name 3}
${voffset -13}${offset 305}${top cpu 3}%
${voffset 20}${offset 1100}${color1}System
${offset 1100} ${color3}IP: ${color1}${execi 30 cat /tmp/conky-ip}
${voffset -13}${offset 1226}${color3}Mail: ${color1}${execi 30 cat /tmp/conky-mail} ${color3}RSS: ${color1}${execi 30 cat /tmp/conky-rss}
${offset 1100}$color3 Uptime:$color1 $uptime
${voffset -13}${offset 1226}${color3}Load: ${color1}$loadavg
${voffset 10}${offset 40}${color1}Power
${offset 40}$color3 Status: $color1$acpiacadapter
${offset 40}$color3 Battery: $color1$battery $battery_time
${offset 89} ${if_match ${battery_percent} <= 50}${color4}${endif}${if_match ${battery_percent} <= 20}${color5}${endif} ${battery_bar BAT0}
${voffset 6}${offset 1080}${color1}Disk
${offset 1080}$color3 I/O:$color1 $diskio
${offset 1080}$color3 ${diskiograph 24,250 000000 33b0dc}
${voffset 60}${offset 120}${color1}Network (eth0)
${offset 120}$color3 IPv4: $color1${addr eth0}
${offset 120}$color3 Download: $color1${downspeed eth0}
${voffset -13}${offset 260}${color3}Total: ${color1}${totaldown eth0}
${offset 120}$color3 Upload: $color1${upspeed eth0}
${voffset -13}${offset 260}${color3}Total: ${color1}${totalup eth0}
${offset 120}$color3 ${downspeedgraph eth0 12,250 000000 33b0dc}
${offset 120}$color3 ${upspeedgraph eth0 12,250 000000 33b0dc}
${voffset -20}${offset 600}${color1}Memory
${offset 600}$color3 RAM: $color1$mem ($memperc%)
${voffset -13}${offset 726}${membar 6,130}
${offset 600}$color3 Swap: $color1$swap ($swapperc%)
${voffset -13}${offset 726}${swapbar 6,130}
${voffset -120}${offset 950}${color1}Sound
#${mixer}%
#${exec amixer get Master | grep "Mono: Playback" | cut -d [ -f 2 | cut -d % -f 1}%
${offset 950} ${color3}Volume: ${color1}${exec amixer get Master | awk -F'[]%[]' '/%/ {if ($7 == "off") { print $2"% [muted]" } else { print $2"%" }}'}
#Audacious2 info
${if_running audacious2}${offset 950} ${color3}Now playing: ${color1}${exec audtool2 --current-song}
${offset 950} ${color3}Progress: ${color1}${exec audtool2 --current-song-output-length}/${exec audtool2 --current-song-length} ${color1}${execbar expr 100 \* $(audtool2 --current-song-output-length-seconds) \/ $(audtool2 --current-song-length-seconds)}
${offset 1074}${if_match "${exec audtool2 --playback-status}" != "playing"} [${exec audtool2 --playback-status}]${endif}
${if_match "${exec audtool2 --playqueue-get-list-position 1}" != ""}${offset 950} ${color3}Queued:
${voffset -13}${offset 1034}${color1}${exec audtool2 --playlist-song $(audtool2 --playqueue-get-list-position 1)}
${if_match "${exec audtool2 --playqueue-get-list-position 2}" != ""}
${voffset -13}${offset 1034}${color2}${exec audtool2 --playlist-song $(audtool2 --playqueue-get-list-position 2)}
${if_match "${exec audtool2 --playqueue-get-list-position 3}" != ""}
${voffset -13}${offset 1034}${color3}${exec audtool2 --playlist-song $(audtool2 --playqueue-get-list-position 3)}${endif}${endif}${endif}
#DeaDBeef info #FIXME: Not finished
${else}${if_running deadbeef-main}${offset 950} ${color3}Now playing: ${color1}${exec deadbeef --nowplaying "%a - %t"}
${offset 950} ${color3}Progress: ${color1}${exec deadbeef --nowplaying "%e/%l"}
#No player running
${else}${offset 950} ${color3}Now playing: ${color1}No song playing${endif}${endif}
Конфигурация conky создана для разрешения 1366x768, так что учтите.
- Далее создаем директорию wallpapers, куда закинем обоины:
1
2
3
4mkdir wallpapers
cd wallpapers
wget http://dl.dropbox.com/u/960078/conky/1366x768-on.png
wget http://dl.dropbox.com/u/960078/conky/1366x768-off.png
- Теперь скрипты. Создаем директорию scripts, а в ней скрипт для запуска conky:
1
2
3
4
5cd ..
mkdir scripts
cd scripts
touch conky-start
gedit conky-start
Содержимое conky-start:
1
2
3
4
5#!/bin/bash
gconftool-2 -t string -s /desktop/gnome/background/picture_filename ~/.conky/wallpapers/1366x768-on.png
sleep 2
conky -c ~/.conky/1366x768.conkyrc
gconftool-2 -t string -s /desktop/gnome/background/picture_filename ~/.conky/wallpapers/1366x768-off.png
Скрипт устанавливает нужную нам обоину и запускает conky с нашим конфигом. После того, как процесс conky завершится (например, через killall conky), обоина поменяется на другую.
- Скрипт для получения количества непрочитанных сообщений в GMail (найден в сети). Вписываем свои данные вместо USERNAME и PASSWORD.
1
2touch gmail.py
gedit gmail.py
Содержимое gmail.py:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20import os
import string
#Enter your username and password below within double quotes
# eg. username="username" and password="password"
username="USERNAME"
password="PASSWORD"
com="wget -O - https://"+username+":"+password+"@mail.google.com/mail/feed/atom --no-check-certificate"
temp=os.popen(com)
msg=temp.read()
index=string.find(msg,"<fullcount>")
index2=string.find(msg,"</fullcount>")
fc=int(msg[index+11:index2])
if fc==0:
print "0"
else:
print str(fc)
- Скрипт для получения количества непрочитанных сообщений в Google Reader (взято отсюда).
1
2touch conkyGoogleReader.py
gedit conkyGoogleReader.py
Содержимое conkyGoogleReader.py:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280#!/usr/bin/python
# -*- coding: utf-8 -*-
###############################################################################
# conkyEmail.py is a simple python script to gather
# details of google reader subscriptions for use in conky.
#
# Author: Kaivalagi
# Created: 09/07/2008
#
# 18/05/2009 Updated to expand ~ based template paths
# 14/12/2009 Updated to work with new authentication requirements, old method stopped working for some reason
from datetime import datetime
from optparse import OptionParser
from xml.dom import minidom
import codecs
import socket
import sys
import traceback
import urllib
import urllib2
import os
class CommandLineParser:
parser = None
def __init__(self):
self.parser = OptionParser()
self.parser.add_option("-u","--username",dest="username", type="string", metavar="USERNAME", help=u"username to login with")
self.parser.add_option("-p","--password",dest="password", type="string", metavar="PASSWORD", help=u"Password to login with")
self.parser.add_option("-t","--template",dest="template", type="string", metavar="FILE", help=u"Template file determining the format for each rss feed summary. Use the following placeholders: [unreadcount], [name], [url]")
self.parser.add_option("-s","--summarytemplate",dest="summarytemplate", type="string", metavar="FILE", help=u"Template file determining the format for summary output. Use the following placeholders: [totalfeedscount], [unreadfeedscount], [unreadfeeditemscount]")
self.parser.add_option("-S","--summaryoutput",dest="summaryoutput", default=False, action="store_true", help=u"Request summary output rather than each feeds details")
self.parser.add_option("-c","--connectiontimeout",dest="connectiontimeout", type="int", default=10, metavar="NUMBER", help=u"[default: %default] Define the number of seconds before a connection timeout can occur.")
self.parser.add_option("-v","--verbose",dest="verbose", default=False, action="store_true", help=u"Request verbose output, no a good idea when running through conky!")
self.parser.add_option("-V", "--version", dest="version", default=False, action="store_true", help=u"Displays the version of the script.")
self.parser.add_option("--errorlogfile", dest="errorlogfile", type="string", metavar="FILE", help=u"If a filepath is set, the script appends errors to the filepath.")
self.parser.add_option("--infologfile", dest="infologfile", type="string", metavar="FILE", help=u"If a filepath is set, the script appends info to the filepath.")
def parse_args(self):
(options, args) = self.parser.parse_args()
return (options, args)
def print_help(self):
return self.parser.print_help()
class FeedData:
def __init__(self, name, url, unreadcount):
self.name = name
self.url = url
self.unreadcount = unreadcount
def __cmp__(self, other):
return cmp(int(other.unreadcount),int(self.unreadcount))
def __str__(self):
return str(self.name + " - " + self.unreadcount)
class GoogleReader:
def __init__(self,options):
try:
self.options = options
self.logInfo("Initialising google reader...")
socket.setdefaulttimeout(self.options.connectiontimeout)
except Exception,e:
self.logError("GoogleReader Initialisation:Unexpected error:" + e.__str__()+traceback.format_exc())
def writeOutput(self):
auth_header = self.getAuthorizationHeader()
if auth_header != None:
self.logInfo("Processing output...")
if self.options.template == None:
# create default template
template = "[unreadcount] [name] - [url]\n"
else:
# load the template file contents
try:
#fileinput = open(self.options.template)
fileinput = codecs.open(os.path.expanduser(self.options.template), encoding='utf-8')
template = fileinput.read()
fileinput.close()
# lose the final "\n" which should always be there...
template = template[0:len(template)-1]
except:
self.logError("Template file no found!")
sys.exit(2)
if self.options.summarytemplate == None:
# create default template
summarytemplate = "[unreadfeeditemscount] unread feed items, [unreadfeedscount]/[totalfeedscount] feeds have unread content.\n"
else:
# load the template file contents
try:
#fileinput = open(self.options.template)
fileinput = codecs.open(os.path.expanduser(self.options.summarytemplate), encoding='utf-8')
template = fileinput.read()
fileinput.close()
# lose the final "\n" which should always be there...
summarytemplate = summarytemplate[0:len(summarytemplate)-1]
except:
self.logError("Template file no found!")
sys.exit(2)
totalfeedscount, unreadfeedscount, unreadfeeditemscount, feeds = self.getUnreadItems(auth_header)
output = ""
if self.options.summaryoutput == True:
output = self.getOutputFromSummaryTemplate(summarytemplate, totalfeedscount, unreadfeedscount, unreadfeeditemscount)
else:
for feeddata in feeds:
output = output + self.getOutputFromTemplate(template, feeddata.unreadcount, feeddata.name, feeddata.url)
print output.encode("utf-8")
def getOutputFromTemplate(self, template, unreadcount, name, url):
try:
output = template
output = output.replace("[unreadcount]",unreadcount)
output = output.replace("[name]",name)
output = output.replace("[url]",url)
return output
except Exception,e:
self.logError("getOutputFromTemplate:Unexpected error:" + e.__str__())
return ""
def getOutputFromSummaryTemplate(self, summarytemplate, totalfeedscount, unreadfeedscount, unreadfeeditemscount):
try:
output = summarytemplate
output = output.replace("[totalfeedscount]",totalfeedscount)
output = output.replace("[unreadfeedscount]",unreadfeedscount)
output = output.replace("[unreadfeeditemscount]",unreadfeeditemscount)
return output
except Exception,e:
self.logError("getOutputFromSummaryTemplate:Unexpected error:" + e.__str__())
return ""
def getAuthorizationHeader(self):
# Authenticate to obtain SID
auth_url = 'https://www.google.com/accounts/ClientLogin'
auth_req_data = urllib.urlencode({'Email': self.options.username,
'Passwd': self.options.password,
'service': 'reader'})
auth_req = urllib2.Request(auth_url, data=auth_req_data)
auth_resp = urllib2.urlopen(auth_req)
auth_resp_content = auth_resp.read()
auth_resp_dict = dict(x.split('=') for x in auth_resp_content.split('\n') if x)
AUTH = auth_resp_dict["Auth"]
# Create a header using the AUTH key
header = {"Authorization" : "GoogleLogin auth=%s"%AUTH}
return header
def getUnreadItems(self, auth_header):
url = "https://www.google.com/reader/api/0/unread-count?all=true"
request = urllib2.Request(url, None, auth_header)
response = urllib2.urlopen(request)
unreadxml = response.read()
url = "https://www.google.com/reader/api/0/subscription/list"
request = urllib2.Request(url, None, auth_header)
response = urllib2.urlopen(request)
namesxml = response.read()
if '<object>' in unreadxml:
feedlist = minidom.parseString(unreadxml).getElementsByTagName('string')
namelist = minidom.parseString(namesxml).getElementsByTagName('string')
feeds = []
unreadcount = 0
unreadfeedcount = 0
unreadfeeditemscount = 0
for nodeFeed in feedlist:
feedurl = nodeFeed.firstChild.toxml()
# ignore user/ based nodes, only concerned with feed/ based nodes
if feedurl.startswith("feed/") == True:
unreadcount = nodeFeed.nextSibling.firstChild.toxml()
for nodeName in namelist:
nodeText = nodeName.firstChild.toxml()
if nodeText.startswith("feed/"):
if nodeText == feedurl:
feedname = nodeName.nextSibling.firstChild.toxml()
break
feedurl = feedurl.lstrip("feed/")
#feeds.append((unreadcount , feedurl, feedname))
feedData = FeedData(feedname, feedurl, unreadcount)
feeds.append(feedData)
unreadfeeditemscount = unreadfeeditemscount + int(unreadcount)
unreadfeedcount = unreadfeedcount + 1
else:
pass #invalid feedurl?
totalfeedcount = len(namelist)
feeds.sort()
return str(totalfeedcount), str(unreadfeedcount), str(unreadfeeditemscount), feeds
else:
return 0
def logInfo(self, text):
if self.options.verbose == True:
print >> sys.stdout, "INFO: " + text
if self.options.infologfile != None:
datetimestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
fileoutput = open(self.options.infologfile, "ab")
fileoutput.write(datetimestamp+" INFO: "+text+"\n")
fileoutput.close()
def logError(self, text):
print >> sys.stderr, "ERROR: " + text
if self.options.errorlogfile != None:
datetimestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
fileoutput = open(self.options.errorlogfile, "ab")
fileoutput.write(datetimestamp+" ERROR: "+text+"\n")
fileoutput.close()
def main():
parser = CommandLineParser()
(options, args) = parser.parse_args()
if options.version == True:
print >> sys.stdout,"conkyGoogleReader v.1.05"
else:
if options.username == None or options.password == None:
print >> sys.stdout, "A username and/or password was not given!"
sys.exit(2)
if options.verbose == True:
print >> sys.stdout, "username:",options.username
print >> sys.stdout, "password:",options.password
print >> sys.stdout, "template:",options.template
print >> sys.stdout, "summarytemplate:",options.summarytemplate
print >> sys.stdout, "summaryoutput:",options.summaryoutput
print >> sys.stdout, "verbose:",options.verbose
# create new google reader object
greader = GoogleReader(options)
greader.writeOutput()
if __name__ == '__main__':
main()
sys.exit()
- Следующий скрипт нужен для вызова предыдущих двух скриптов и получения ip-адреса.
1
2touch conky-helper
gedit conky-helper
Содержимое conky-helper:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#!/bin/bash
if [ "$(pidof conky)" ] ; then # Check if conky is running
echo "conky is running, getting information..."
cd /home/USER/.conky/scripts/
# Gmail unread messages
python ./gmail.py > /tmp/conky-mail
# Google reader feeds
python ./conkyGoogleReader.py --username=USERNAME@gmail.com --password=PASSWORD -S | head -n 1 | sed 's/\([0-9]*\).*/\1/' > /tmp/conky-rss
# IP-address
#wget --quiet -O - http://whatismyip.org/ | head -n 1
#wget --quiet -O - http://www.biranchi.com/ip.php | head -n 1
IP=$(wget --quiet -O - http://checkip.dyndns.org/ | sed -e 's/[^:]*: //' -e 's/<.*$//'); if [ -z $IP ]; then echo "Offline" > /tmp/conky-ip; else echo $IP > /tmp/conky-ip; fi;
echo "done"
else
echo "conky is not running, exiting..."
fi
Тут мы проверяем, запущен ли процесс conky, и если да, то вытягиваем нужную нам информацию из сети и записываем в /tmp, откуда conky ее будет считывать. Этот скрипт будет вызываться планировщиком заданий cron, об этом чуть ниже. Почему не вызывать эти скрипты напрямую из конфига conky? Потому что в момент загрузки этой самой информации conky может зависнуть на некоторое время, особенно если сеть загружена торрентами. Не забываем менять USER на имя своего пользователя, USERNAME и PASSWORD на соответствующие значения для аккаунта в Google.
- Теперь делаем все скрипты исполняемыми:
chmod +x *
- Добавляем новое задание в планировщик заданий cron:
crontab -e
Вписываем в самый низ новую строчку, поменяв USER на имя домашнего каталога:
*/3 * * * * /home/USER/.conky/scripts/conky-helper
Благодаря этому заданию каждые 3 минуты будет запускаться ранее созданный скрипт conky-helper.
- Также есть смысл скопировать скрипт запуска conky в /usr/bin, чтобы легко можно было запускать его по Alt-F2
sudo cp conky-start /usr/bin/
- И напоследок добавлю маленький скриптик, который может оказаться полезным.
1
2
3
4cd /usr/bin
sudo touch noconky
sudo chmod +x noconky
sudo gedit noconky
Содержимое noconky:
1
2#!/bin/bash
killall conky & $@; conky-start
Что он делает? Благодаря этому скрипту можно запустить приложение, на время работы которого отключается conky, а после закрытия приложения conky снова запускается. Пример запуска:
noconky teeworlds
А то мало ли conky будет тормозить ваши игры.
Ругайте, спрашивайте.
Тема gtk+metacity
Обоина со включенным conky
Обоина без conky
Conky (конфиг, обои, скрипты)