dukeglukem 18.11.2010 20:22

Мой рабочий стол.Минимализм, загубленный коньками

Решил поделиться своим рабочим столом, может кому что-то пригодится. Ранее частично выкладывал на русском форуме 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):
без коньков

Тайлинг:
тайлинг


Как этого всего добиться? Если вам лень читать, то вконце есть ссылка на архив с нужным барахлом.
Все по порядку:

Создаем в домашнем каталоге директорию .conky с файлом конфигурации conky:
1
2
3
4
5
cd ~
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
164
165
# -*- conf -*-
#
# ~/.conkyrc - Conky configuration file
#
# Author: Roman Krylov <dukeglukem@gmail.com>
# 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}</muted>


Конфигурация conky создана для разрешения 1366x768, так что учтите.
Далее создаем директорию wallpapers, куда закинем обоины:
1
2
3
4
mkdir 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
5
cd ..
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
2
touch 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
20
import 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>)

if fc==0:
print "0"
else:
print str(fc)</index>


Скрипт для получения количества непрочитанных сообщений в Google Reader (взято отсюда).
1
2
touch 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
281
#!/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:> 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 = "</default:></unreadfeeditemscount></unreadfeedscount></totalfeedscount></url></name></unreadcount><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("</totalfeedscount></unreadfeedscount></unreadfeeditemscount></url></name></unreadcount><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 &gt;&gt; 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 &gt;&gt; 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 &gt;&gt; sys.stdout,"conkyGoogleReader v.1.05"

else:

if options.username == None or options.password == None:
print &gt;&gt; sys.stdout, "A username and/or password was not given!"
sys.exit(2)

if options.verbose == True:
print &gt;&gt; sys.stdout, "username:",options.username
print &gt;&gt; sys.stdout, "password:",options.password
print &gt;&gt; sys.stdout, "template:",options.template
print &gt;&gt; sys.stdout, "summarytemplate:",options.summarytemplate
print &gt;&gt; sys.stdout, "summaryoutput:",options.summaryoutput
print &gt;&gt; sys.stdout, "verbose:",options.verbose

# create new google reader object
greader = GoogleReader(options)
greader.writeOutput()

if __name__ == '__main__':
main()
sys.exit()</unreadfeeditemscount></unreadfeedscount></totalfeedscount></url></name></unreadcount>


Следующий скрипт нужен для вызова предыдущих двух скриптов и получения ip-адреса.
1
2
touch 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.
Теперь делаем все скрипты исполняемыми:
1
chmod +x *


Добавляем новое задание в планировщик заданий cron:
1
crontab -e


Вписываем в самый низ новую строчку, поменяв USER на имя домашнего каталога:
1
*/3 * * * * /home/USER/.conky/scripts/conky-helper


Благодаря этому заданию каждые 3 минуты будет запускаться ранее созданный скрипт conky-helper.
Также есть смысл скопировать скрипт запуска conky в /usr/bin, чтобы легко можно было запускать его по Alt-F2
1
sudo cp conky-start /usr/bin/


И напоследок добавлю маленький скриптик, который может оказаться полезным.
1
2
3
4
cd /usr/bin
sudo touch noconky
sudo chmod +x noconky
sudo gedit noconky


Содержимое noconky:
1
2
#!/bin/bash
killall conky & $@; conky-start


Что он делает? Благодаря этому скрипту можно запустить приложение, на время работы которого отключается conky, а после закрытия приложения conky снова запускается. Пример запуска:
1
noconky teeworlds


А то мало ли conky будет тормозить ваши игры.
Ругайте, спрашивайте.

Тема gtk+metacity
Обоина со включенным conky
Обоина без conky
Conky (конфиг, обои, скрипты)


Тэги: conky gnome gtk metacity scripts ubuntu wallpapers
+ 11 -
Похожие Поделиться

Daria 18.11.2010 20:31 #
уважение тебе, за то, что нашёл в себе силу заняться коньками, но, если честно, я не хотела бы себе подобного десктопа.
dukeglukem 18.11.2010 20:33 #
Я тоже пару лет хорошо обходился без коньков и прочих приблуд, потом решил сотворить что-то красивое.
dlis 18.11.2010 21:41 #
Приятно видеть, что ты свою цель достиг, а не бросил на пол-пути! Молодец!
dlis 18.11.2010 21:47 #
Хотелось бы озвучить свою мысль по поводу оформления статьи. Думаю, что последовательность действий лучше разделять на шаги при помощи нумерованного списка — будет легче читаться (ведь когда переключаешь окошки, теряешь зрительно позицию в тексте).

P.S. Но это лишь мое мнение. Причем, сказанное лишь из лучших побуждений =)
dukeglukem 18.11.2010 23:16 #
Спасибо за замечание. Поправил.
dr_magnus 18.11.2010 20:40 #
а этот странный красно-оранжевый цвет тебе на глаза не давит?
dukeglukem 18.11.2010 20:54 #
Он для того и сделан красным, чтобы на глаза давить. Чтобы сразу было видно, какое окно активно.
dr_magnus 18.11.2010 20:44 #
"голый рабочий стол" конечно прикольный получился, но, имхо, не рациональный. сворачивать все окна, что бы глянуть на показания датчиков как-то грустно.
подкидываю идейку - сделай миниатюру этого ноута, и настрой коньки таким образом, что бы они показывали данные при наведении мыши на соответствующие места. правда я не знаю, позволяют это коньки или нет - не работал с ними всерьез.
dukeglukem 18.11.2010 20:56 #
Идея интересная, но пропадает смысл самих коньков, когда все нужное перед глазами.
mwChief 18.11.2010 22:20 #
А разве в коньках есть смысл?
dlis 18.11.2010 21:38 #
Кстати, необязательно все сворачивать. Вместо этого я просто перехожу на пустой рабочий стол (ctrl + alt + »).
strk 19.11.2010 09:43 #
+F2
sakal 18.11.2010 22:35 #
сворачивать все окна, как и приводить к прежнему состоянию, можно сочетанием клавиш, например как это принято в Windows. У себя в KDE для KWin действия Show Desktop установил сочетание win+d - при первом нажатии наблюдаем рабочий стол, при повторном - прежнее состояние окон.
dlis 18.11.2010 22:45 #
Согласен. Как вариант — ctrl + alt + D (в Gnome)
Uzix 18.11.2010 21:00 #
Коньки, скринлеты, плазмоиды, сайдбары... Мне одному достаточно функционала апплетов панели? :)
strk 19.11.2010 09:44 #
многим достаточно функционала консоли.
Я тож не нашёл для себя применения коньков.
ZED 18.11.2010 21:44 #
В данном случае я наблюдаю сильный занос в минимализм и стилистику в ущерб эргономике. У меня схема примерно такая:
1) на панели гнома, которая всегда наверху и перед глазами только то что надо контролировать/видеть постоянно, у меня это загрузка проца, сетевая активность и активность дисков, плюс погода
2) в коньках более подробные данные по процу, памяти, видео, упсу, дискам и погоде. идея именно в том, чтобы к конькам обращаться время от времени, быстро и легко. через компиз настроил сворачивание окон на границе экрана. таким образом я трачу минимум времени на доступ к информации не прибегая к терминалу
3) ну и для детального разбора возникающих вопросов и проблем есть терминал Guake и руки

Плюсы такого распределения инфы в том, что
1) чем важнее для меня инфа, тем быстрее я могу ее увидеть
2) нужные индикаторы занимают примерно 20% длины панели гнома, коньки - примерно 15% рабочего стола (колонка у правой границы)
3) коньки сгруппированы в колонку, что позволяет использовать окна нужных приложений с максимальным размером и на максимальной области рабочего стола и при этом видеть коньки постоянно (при возникновении такой необходимости)
4) группирует взгляд в одной области, что упрощает оценку данных вместо того чтобы обходить взглядом весь экран

Конкретные минусы ваших решений:
1) красный цвет в оформлении активного окна привлекает внимание, что одновременно рассеивает его от содержимого окна. в компизе для этого есть плагин, который затеняет неактивные окна
2) неэргономичный стиль коньков, где информация представлена красиво, но на всей площади экрана. также низкий контраст надписей и рабочего стола, усложняющий чтение информации

Вывод:
1) компизом пренебрегают, считая его свисто-перделкой, забывая о том, что он сильно поднимает и эргономику/юзабилити
2) все считают, что знают что такое здоровый минимализм, но никто его до сих пор не достиг
3) минимализм, убивающий юзабилити, это путь в УГ, ШГ и П

Рекомендации:
1) поставьте хакинтош, узнаете много нового
2) поставьте компиз хотя бы посмотреть эффект от отдельных, наиболее полезных плагинов, некоторый функционал компиза в отдельных легких DE говорят можно и руками доделать
3) освойте теорию цвета, почитать примерно на эту тему можно тут: http://www.aquarun.ru/psih/ct/ctpril2.html
4) гляньте тайловые DE, может вам понравится
exelens 18.11.2010 22:19 #
Покажи скрин своего десктопа и коньки
dukeglukem 18.11.2010 22:58 #
Считаю затемнение неактивных окон злой фичей. Иногда надо работать сразу с несколькими окнами.
Насчет низкой эргономики коньков не спорю, раньше обходился апплетами на панели. Как говорится, красота требует жертв.
С компизом особо не знаком, может как-нибудь посмотрю его функционал.
А за теорию цвета спасибо, почитаю.
На тайловые DE иногда заглядываюсь, но постоянно пользоваться тайлингом с таким разрешением экрана сложновато, и времени на освоение пока не найти. Прикупил себе монитор 24" недавно, специально чтобы подключать к лаптопу, может в ближайшем будущем приживется какой-нибудь xmonad.
Shtsh 19.11.2010 00:17 #
Попробуй awesome — он динамический, то есть можно использовать как тайлинг, так и плавающие окна. К тому же есть такая штука, как теги — тебе же не нужно, как правило, чтобы все окна одновременно на экране показывались.
razum2um 19.11.2010 15:05 #
а я с начала и подумал, что у него эйвсом.
заталено, одна узкая панелька сверху, шрифты в панельки (у меня) также точно.
...еще подумал, нафига только 4 тега...
ZED 19.11.2010 07:47 #
Считаю затемнение неактивных окон злой фичей. Иногда надо работать сразу с несколькими окнами

Вот поэтому у меня затеняется только 5-е по счету окно. Там много настроек.
strk 19.11.2010 09:46 #
Затемнение же с лёгкостью можон в<ы>ключать по хоткею. Плюс какие-то отдельные приложения (Гимп, например) можно прописать в исключения.
thoughtful_fox 18.11.2010 22:48 #
Неплохо)

Почти оффтоп: мне вот guake нравится гораздо больше тильды
vkotovv 18.11.2010 23:28 #

1 touch
2 gedit

А зачем здесь нужна первая команда?
dukeglukem 18.11.2010 23:34 #
Согласен, не обязательна. Но пусть новички знают, как файлы создаются. А не новички сразу скачают архив с нужными скриптами, кому что надо.
doraneko 19.11.2010 00:04 #
разве ж это минимализм... :3
dukeglukem 19.11.2010 00:55 #
Я верю, что при отключенных коньках мой рабочей стол будет намного минималистичнее основной массы скринов рабочих столов, выкладываемых другими пользователями. Одна панель, никаких доков и скринлетов, которые многие так любят.
ZogG 19.11.2010 01:32 #
меньше других != минимализм, ты просто убрал нижнюю панель от стандартной бубунты.
saver 19.11.2010 06:10 #
И не пахнет тут минимализмом, +1