From 0801659f6c27ba2bd91ff117575bc57c932ca3f4 Mon Sep 17 00:00:00 2001 From: Thomas Forgione Date: Wed, 28 Nov 2018 14:49:10 +0100 Subject: [PATCH] Initial commit --- background_widget.lua | 94 +++++ battery.lua | 74 ++++ calendar.lua | 8 + command_launcher.lua | 43 +++ icons/chromium.png | Bin 0 -> 3634 bytes icons/firefox.png | Bin 0 -> 5168 bytes icons/mendeleydesktop.png | Bin 0 -> 3982 bytes icons/shutdown.png | Bin 0 -> 2005 bytes icons/steam.png | Bin 0 -> 2697 bytes icons/telegram.png | Bin 0 -> 18650 bytes icons/thunderbird.png | Bin 0 -> 75786 bytes jsonutils.lua | 199 +++++++++++ launchbar.lua | 68 ++++ music.lua | 103 ++++++ options.lua | 5 + rc.lua | 715 ++++++++++++++++++++++++++++++++++++++ su.lua | 30 ++ themes/default/theme.lua | 102 ++++++ volume.lua | 29 ++ 19 files changed, 1470 insertions(+) create mode 100644 background_widget.lua create mode 100644 battery.lua create mode 100644 calendar.lua create mode 100644 command_launcher.lua create mode 100644 icons/chromium.png create mode 100644 icons/firefox.png create mode 100644 icons/mendeleydesktop.png create mode 100644 icons/shutdown.png create mode 100644 icons/steam.png create mode 100644 icons/telegram.png create mode 100644 icons/thunderbird.png create mode 100644 jsonutils.lua create mode 100644 launchbar.lua create mode 100644 music.lua create mode 100644 options.lua create mode 100644 rc.lua create mode 100644 su.lua create mode 100644 themes/default/theme.lua create mode 100644 volume.lua diff --git a/background_widget.lua b/background_widget.lua new file mode 100644 index 0000000..10302c6 --- /dev/null +++ b/background_widget.lua @@ -0,0 +1,94 @@ +local os = require('os') +naughty = require('naughty') +local wibox = require('wibox') +local awful = require('awful') +local gears = require('gears') +local json = require('jsonutils') + +local home = os.getenv('HOME') +local todo_path = home .. '/.config/todo/todo.json' + +local widget = nil + +function todo_list_widget(index, todo) + + local text = '\n ' .. index .. '. ' .. todo.title .. ' \n' + + for key, item in pairs(todo.items) do + text = text .. ' ' .. key .. '. ' .. item .. ' \n' + end + + local text = wibox.widget { + markup = text, + align = 'left', + valign = 'top', + font = "Ubuntu 18", + widget = wibox.widget.textbox + } + + local widget = wibox.widget.background(text, todo.color, function(cr, width, height) + gears.shape.rounded_rect(cr, width, height, 20) + end) + + widget.shape_border_width = 1 + widget.shape_border_color = "#ffffff" + + return widget + +end + +function update_background_widget(s) + + local margin = 25 + + awful.spawn.easy_async_with_shell(":", function() + + if s.widget ~= nil then + s.widget:remove() + end + + local f = io.open(todo_path, "rb") + + if f ~= nil then + + local content = f:read("*all") + f:close() + + todo = json.parse(content) + + local l = wibox.layout { + homogeneous = false, + spacing = margin, + forced_num_cols = 3, + layout = wibox.layout.grid, + } + + -- l:set_orientation('horizontal') + + local widgets = {} + + for key, val in pairs(todo) do + l:add(todo_list_widget(key, val)) + end + + background_widget = awful.wibar({ + screen = s, + height = s.geometry.height, + bg = "#00000000", + }) + + background_widget:setup { + wibox.container.margin(l, margin, margin, margin, margin), + layout = wibox.layout.manual + } + + background_widget:struts({left=0, right=0, top=0, bottom=0}) + + s.widget = background_widget + + end + + end) + +end + diff --git a/battery.lua b/battery.lua new file mode 100644 index 0000000..b3cea08 --- /dev/null +++ b/battery.lua @@ -0,0 +1,74 @@ +-- This function returns a formatted string with the current battery status. It +-- can be used to populate a text widget in the awesome window manager. Based +-- on the "Gigamo Battery Widget" found in the wiki at awesome.naquadah.org + +local wibox = require("wibox") +local naughty = require("naughty") +local beautiful = require("beautiful") +local awful = require('awful') +local su = require('su') + +local previous_percent = 0 + +function batteryInfo(callback) + awful.spawn.easy_async('acpi', function(stdout) + -- Consider only the first line + local line = su.split(stdout, '\n')[1] + + local split = su.split(line, ':') + + -- Extract the percentage from the string + local percent = tonumber(su.split(split[2],',')[2]:sub(1, -2)) + + -- callback(percent, isCharging) + callback(tonumber(percent), not string.find(line, 'Discharging')) + end) +end + +function update_battery() + + batteryInfo(function(percent, isCharging) + + local color + local symbol + + if percent < 15 then + color="red" + elseif percent < 30 then + color="orange" + elseif percent > 90 then + color="green" + else + color="white" + end + + if isCharging then + color = 'green' + symbol = '⚡' + else + symbol = '%' + end + + if previous_percent >= 15 and percent < 15 then + naughty.notify({ + title = "Low battery...", + text = "Battery level is lower than 15% !", + fg="#000000", + bg="#ff0000", + timeout=5 + }) + end + + battery_widget:set_markup('' .. percent .. ' ' .. symbol .. '') + + previous_percent = percent + + end) + +end + +battery_widget = wibox.widget.textbox() +battery_widget.timer = timer({timeout=5}) +battery_widget.timer:connect_signal("timeout", update_battery) +battery_widget.timer:start() +update_battery() diff --git a/calendar.lua b/calendar.lua new file mode 100644 index 0000000..0533bdf --- /dev/null +++ b/calendar.lua @@ -0,0 +1,8 @@ +local awful = require("awful") + +textclock_widget = awful.widget.textclock(" %a %d %b %H:%M ") + +calendar_widget = awful.tooltip({objects={textclock_widget}}) +awful.spawn.easy_async('gcal -i- -s1 .+', function(stdout) + calendar_widget:set_text(stdout) +end) diff --git a/command_launcher.lua b/command_launcher.lua new file mode 100644 index 0000000..7618d7e --- /dev/null +++ b/command_launcher.lua @@ -0,0 +1,43 @@ +-- INSPIRED FROM +--------------------------------------------------------------------------- +-- @author Julien Danjou <julien@danjou.info> +-- @copyright 2008-2009 Julien Danjou +-- @classmod awful.widget.launcher +--------------------------------------------------------------------------- +-- MODIFIED BY +-- thomas forgione + +local setmetatable = setmetatable +local naughty = require('naughty') +local gtable = require("gears.table") +local spawn = require("awful.spawn") +local wbutton = require("awful.widget.button") +local button = require("awful.button") + +local launcher = { mt = {} } + +--- Create a button widget which will launch a command. +-- @param args Standard widget table arguments, plus image for the image path +-- and command for the command to run on click, or either menu to create menu. +-- @return A launcher widget. +function launcher.new(args) + if not args.callback and not args.menu then return end + local w = wbutton(args) + if not w then return end + + local b + if args.callback then + b = gtable.join(w:buttons(), button({}, 1, nil, function () args.callback() end)) + elseif args.menu then + b = gtable.join(w:buttons(), button({}, 1, nil, function () args.menu:toggle() end)) + end + + w:buttons(b) + return w +end + +function launcher.mt:__call(...) + return launcher.new(...) +end + +return setmetatable(launcher, launcher.mt) diff --git a/icons/chromium.png b/icons/chromium.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9c190c8e974767d4905a7edf79230ffd817d8 GIT binary patch literal 3634 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 Eg4PWPTmS$7 literal 0 HcmV?d00001 diff --git a/icons/firefox.png b/icons/firefox.png new file mode 100644 index 0000000000000000000000000000000000000000..bc68d51b3f9572d9216db0987baaca7e56772357 GIT binary patch literal 5168 zcmV-06wm94P)))% zlKDghY-~6<(KdSTp#u$_J^HK#x5(7~}^JPb(fUY&GO?-o|lv8DejecNBNU2J|5elghWe#k3o}fIb zZiU5B3#9kVrmBW5Y<>CFZM~E{8A+Vv-%hvvcm?QC%QDqRI}~3KgpBFy&y3yU_Xjmj zyW}ku_|K9!`%6NJLWhh&42T36w1~#!demgQ0n*o1Pbv~Xa#m_c!-TnXD;$pmsFxN$ zE-$%{Q@{(Un!2PTXRGj#lpK0#!z^kC-)72fqb6^6^1~qR6Ch-oBm}+CSm1ubTO2>^ zaR7)y#)Hce)<^DShweLLBI;d`B=%$Xym-P#7hnb4%5kog1X)f2fb4ZjmHQp@-AbjweI`t6JmE${oyR0dtqCL* z(2R69;fHmXW7(Klc(mb*xNPWkI4S!Gp3UzC5X6uXdR(7q(ZQLbkJRywAT_{tyMhc& zkH}W@8$X%=J;VFE>3sxbO%xvROGr8>4Xie-hQ~~350nH}A z9==WX`KTR097h}!LLyN309-KCd7YS&URQl#<|%wR^D4ej{fcVqKjYTAU*NS--@&_M zzKGv6T!taZHo%Q`_O+rB2dsSz&2l(E`u#748f)NQK=x zCPN`&p8@SH^(MUeff0ZmJVFat(mftM#f%oPAzBJ{xQfB;&o$lzC!MMJozC-*b-?1P zs;@Otzri6A1QDS9P^mKn!O`7s;2`g1Kz%~V?W!SvNQnSZ#Am;MEC~fq4LN>GPsN?tGx7P;wZej^}cY00JtTADM%7+#bLN-#nD=TB3uOU z)_z)ERH_k)QFVpq=k3aYDgty3;@FV=LKM9oCt{;k;ksy zJ4lnf4j#kH;H$6Sgf_ocOAtWtuBsh6*Z>elf`e4epht8U^xFZX3OL`Ib^WPT`-7UX zeZ`Y{VD0vr^{fuvVa8elmH?RqcWbcc6Ay!NM@wKp@hyNi_ZL{#*x0Kd-ul?mY~KQu zooD%knGWPkE0h*t^z=(~P)k^vMWN&O^NJps#$ogBi1q@r3{3b?<76?vYbPA`%pKN# zzyW^_z}ChB$CiRHW1+_`2G@~?`s)Ca2K@>l_FcU>q;=B24EsA$69A5Y-2pkIa97VE zm@wxrXev$xxKP9;IK2{*gYeYGgK+Q@v%!SZyBvxOfnX6Jxejc?+T#zNlVtV2u$O@? z;Ctc7qzfEw-=0-GOn2CF`Z`<*)ECR)J7@;i=TE}W`A_0Y%Wl9HjElmsQgE&i8tCv& zM4(6x!PCu0VCo}(Kt7)WxZYEObwK`IKoly>x*~o~v)=OAYinWxqV_+O4c(JLEKZaaQA^}{% zx*`dzQwNQO7Z#FWY+cWJ6+3_t6e&mp`aK9BHP&bS`br4=pyLQIQUjMJKsg6OjSjEJ zaTyvDlmOl!{BiyMc&2SP;I9A}bQc9cz6l7nSb@2&HXOupj*6B+Oh6BKvkNl8ex{fG zg_Hw8AJsHhzTUemfExy&EHn}n3}A67aZG1Oz)R!o`RA$%ph*!xcY^@(OMqarwFmGR z0&u)h`JXPCfw+LI^mdkdh9wlzjCB^-KkZ#rSi5d0)-E58mCHur$(2*Fp=YSdoI5GZT{j-{8YTlBh&mzE5`+Zu%YmRpcTXG+LTEY_ z;C9mmMgZ|7-Bz0LQs>g0U_ZRXDFzV!6hFd`(7TWLZ^m1{&fwu`s`NIF)4LP%;!pgO#k zAU?>JuF}jxhiAxu>sJ9Bo)G1>_c%jBh-lUoZi(LTib8qp20lm->cG1CI&>TXtZN+_ z?E?*pw4z1fD};vmKw*;(ZtVw*0WM*20br7B5jwD{3Ib^X2~DqnVm^Ut!XpsXt=)D^ zOl?v@Lq!ltQ0NYb!ZW)AbPWnfD7>Hu#}7b!OM)NjstG09+S7mpP^U;KJiQ#aMX?oN zftH|QiVQ?tfGmK#Tn?_0r3zKc*d2g!6`Uf$_3VR}Ym#y}35FkR{|IWGPPn`*L5KHM zHQ|eJ%b_C@CBmpG5xp`LZb?YsD=DR=qVWsme+vRYwZhc`iu$U+tt*4yt}0XTs1_Af zoFFcs6Z|zH9B{=4BuJvL1n{T|Mq!6{9RYX|W3z4e^#MOXo!6>6!M*}Scx9sCo{*e9y$I>>_7VL@-nbD!J$qY4juakG8s~{St;hHee%Yd2n&$;AHaRInDwJOhq)6Qko z1-fbxmIVFg#sQEZLcalmLPWR{ss@8cqJ~~>kh?jxc7uh@y55mik}^M zJ-#*VQ5?73)A+`;M{wuy7vcG@e-YacTBw(VB|wio72YkhmzTvJ6X)xo@%uDefJR9N z)62kRj$rJaN>76_kaVpTKI#CWFqR0GwO$YQ9rwE4APWk; zIqFWJ`Boe`8o@ohY32&>uO zsye)qQ0#^mw&Co)fSVaMAo!rw*cx3@LqJ-HL&DDTW zg_fW?PhdS8@$LPe#l*TTy{(^%&3=CZ6uF$Z4FD<%I6u?0 zrYM~Ej0CP>*2WlhLj3hrB!eibybffmHlw*Gi$$v^qh-xxw5i&@auPaLPeAADaagrv z5*~hO7LNYu7x3dJ_Jv!lLoHIMK>``!ST{)~d=bhX{;y#k&OP#(D7+yT3orW;5P}8# z?V+db`lep;F#*wsyg=B)jC&{%+9IT05+y**K47hP2S$n`7{=Ev#hn|I`0VQwaK>BX zaP`~casDgY;-uftzzL7;j$2-uf_z6E2Fnx@JnX$W(%2G+--X7SdARfB`=ZzAwt)QK zYk%lx0f|C^UI{?<_f}ZWaog_-gjbBhTj&nxrwc3`(2(H9nXh2RuugR524hKU9oDuC zgHz04gseiHNFmLoc|t7X>H7pbyj0=0ZG00CoOurhCkwIgy7nhPntdkucFh@k{6$Z6 z-vVx^TG*V2d?4frgxo8`xLcOM%jhnUx(mXXgrHYKMhe`##}hbyyE({EiWFQV6{T5p z%D2g(b-V0GSYskv@Rb7|$Lv!ciiOv7+q0}Oo1^`CNPrcYpXoF7EkG}WzdD`Q1w0Xy zB?wQE0OR&@Fqg$Bs6F#Wf)U|zf^Tj=2R}XHJ{+`d6SB#o^?p@=a#j*y5g?mr#u2+d zfk)5(3BJAGJ8-xJf>`*1J^L}@_ZV}Bz};Bgt@HIQKp*n*%)C|IkasEx(47#8P*rb` z_ELz=zSB#f@S{3X&ETn1U&no)y&X3l`vAVa_tQ9V$~)L~`+1nP-8}5K^IQ1hfq%yJ zU%w5HUGP(!aqw%XOXqtpb$0a?xk}gj3bVf{1+15p^wF;XZHc|*wp~@^$&P?0 zp+)F!_*)5J_U!k8@06ixyj^V@j@fzO1 zZ02?Nya^w_r_gXs&VhJr9OTqZUFjd~{K|j?=tJIIwQzGQ2`?yxwKnHa` zh;LU5UsE)=(RoO$nT`?Y@WohYZV~j3rBC7iX&aDZS4iQA_W;O&3(#Hg#q1k*c5v_a zkpR0Bj0A9l!PuSU`L~IJNrS zmz0DfdU&c(>I9$bZcv2WUJhCUuOz{Z2exNB7A`)cHv0Qg__h@6@1*Y(HgqM9s=aOM z6#%&Y{U1SqwI6&h^Ztu(OMlM}p4wcNpfJlJ-U-}Z4zbx+)e3CSzNt2G5ne=(qBUjB zx&z;Lp1AVehK9xmcKj0nVZwi80d^;xpI-3(NIl`ea+ zwI7MF0`()J+XLErXTGC5y=qQ#W=iV*osPVG-iS{1TkY^4T|j(K_*rt*`pQy;E9PrrFvct^Fak zH!y0?e!tE({IYwragn^Q+6n}kAJ{-CM^q-U*5=4KWgRa z=i7LCS%IfIi#);1Gli0&D$R$Xv!+;dU+>9#_io80&V9EtH7m8Wp|O71h%ZcCQ9mcX z-v4a`*djFM`7D1X%dOa@n7?^vthZ}jx8abMiJFHIh;=Ab`3>h zb1yfg9B~qI+?Aw~QX%9nxBJdHr}O##a6aFE;QM|&uIv4Ny&uo#^L2auaHSn`-75z{ zLI41eb9N%Ti+0fMqZv5+AsQ!N*22MQi}rwL6v>7#vPxqk?Fm^eAieOyhkticYmg zAKBqTaADfh!st%%(KL^ESI^-1@L&rndbbT~SFEK-AdwDW1@wH#g>MN2~LE- zvEriGfw8zKmhLwNGL01+O=q&{j40HWVqg&C1lt-diuA7(BANflMzQ`blc-?Ev4Kou zBA&37(l?-s%l{3HjQj`9V!PA+6YswYvpnONG-G!fi*X`4Sk$->-7Qy4OZ#YAAe#~G z$zVi$tKy+B2AjbOV=z(n9y?Gjfx+~sE&ETri;Jam6pI}g6-;v`Tcbq^csiYGX=X~; zNpdhF*zF+@h(xlZ1&Ls1x5Jb~bRd~J+S{3a~CD^f4Ic|%H0};NT$d$ znHEitp-~;98Ih5(uza{tIowd7Y_zhnQXs1*P{w6TY4LcxXchgk(CDR! zk41YAS0L~?7EZY!RGAX?j?(r*sNQV_gUZb7ca*SP8T7jkABv!u`opvvGU#HTkd6~c z?MK4$l(7ZUsBB5Cnp4RF1nzlO;p6s>9BEW8fT%>^OVJhs@u|ZFcfPEytZZ&psTjA0 zocK8ZC09)CU32S0-CdO`_}dz$4Y%)49 z#5HP>CPgwjHzc)q%0`t6qI57bt&j6TI;D!+%i%@>xZzOhuO(pgT@AA`rR~|0+9RD^ z0yUE|kWQ|&_Uhc+Xi3GoP*`o{Du5dmLG|Vq<~N1HDpliZ1iseZD_dNnufLxQC{One zY^$gUPi&(XU~$*>BJt5qcwKy=%`|6wpWgRg9u4@UFAs4OY1YBfTQ8lg~Jqe#?ZNzJ~* zpDGc!wdvWlwY3{Ey5%sVuBT5c5XMdB2R1e~ii(ORW@k#3w)3I-jg5`D;_7#l40&Se zwQ44voJ&nw<|Qh|cNDRkYwI;;PI(HLI9(!N8CMS0}#u>_?3dF0hiIsH;a?CAL0`+GcdK{`A@WuWJ2Z)hy{Xy{Bw&)U** zOL1wH3Z4(g=7CZ9(x@CMt@np6b*kxlEDiA5Chomt{x)u|MLPomO&T*0DW>M@9~TsF1&jBsK=06yRn|WUiwif z^9WR$-Z^d(I&FZ!9VXA#lGSaCY}0{cisRwpCUDR|Qm$7udNC4l?2y|>pN59wq8i`n zH(T>^`Fhr*N-kNU4MwdE3H)@w!Pro%@*mS+A3_DdXK% zIWv-igsF_16}rFaj$Y~X!ag`s_~Z>~b~sZ3U1-plM5*fxU3HGB9t*K^oQ`fPa?2$})0U8gt+IRkf_c)YRQ zFTRKmSAEBLahQN-C)VoGDzbQDpEA4zxF#n~&&iIASw%v~J zaQ>88et1QNd~WgcPuyD^c(wFPLpy2dX@n6lXuL7@BTIhin9oyfZQt72$>gTTL2qy2 z>KFRYPPiUD0DAZ;ojY(r?E@6ssHDwt>~kZ=opzLvs64I23Vt)>Nh4m32n+A{I^`qw zo^W_N*)%{A5X4n=2h>$v1IEvcnfl7w_h%^1KbX@_`e`UvovZ&oDYAR~zU6C$@B#l* zD2Zagg7awD4Hg_s#*7>RoqOw7kuMohYpT7oj3RC9nJ8|v`ApFEd2v&GOw+gX41AV` zH%cvAd!OBKcQPsBNYt;HcIAs&wZaiWoM{~FjimpH{yya1__h(+0l^@~B`@KaFgc*F z{?Wy4=ik$v9z>B;p}TBLQY8J^)rg1)Rk5(&Kg{%~1_mOP8hxB0$1(Dp-XAEMi#d;a z-xz(+k_pgqbva#6E8IR8+ReUGko8XN5V;6B3Y>5K*z_!x@a$y5Sb?8k^2@h-sZS55 z4}FSNloxZbZP}|`Q+KdMh4Ys`k` zW=$ZOJ2f@+aH$V=+sb-A36k!!47k0t+H+99beWK12PG>b#8KHDl3j&EtQpBGO^uH8 z8crU4F_?h$7^hbwIgwaBH^~49qE7d9yr37Rc3oRd?PJ{g`Ib}6OS(TjUk5nvLo!D_ zy}e6@CJh%yM3BVNb8`NBwW77(A1U60X^r~LT%{k{$Uc}&czE)HrAf*&dc$%9AA!2 z!O_;PV&pIrjDuRk*XClc7pX>!WC@pOa?33xVE`ETxha0>*H!DZPJQo(D~pf&&t3a6 zKK`ZfoSNaO;;!b(Q{I=_k2R3IQ_-CDgkmpx+#lCXCqaiX%j0JQ49~<$WD-M9uU97; z_OM>tUSeFy>!Iv^ci@kR9_O)4c@FdGQf3ir0{SF}9$dNpnd#s9)yMo9-V`@~v2NbH z?u=F+f%U$ny4F2aTtXhad_X9-0kKJ#zAVnkHb{_aUr#EVSilBFP)OOUbDYdp7(JnL ze_Gp{C{pch8B+53Gq95M>o2BX?fglo7sLEqXV3yQLG&o(cvuv?h_IoW%aeYOF6UlM}CdQ>}pA^TqnoA z6b2F9ryH?9oXfXiN#a5lU=f$k9{ai1NzCDq?ry)X%$^X0;zhR#k{8q8$0wP?>5w2pnKx}LPGK*v}(PF*?>nIgmUEdLxNxaSYFv~CZ3u(>i50w%?xf_PQ5IUMpoL3(eX>V(CQeWG`w>9 z_(hn8o)V-Uq-cwzuiHLaHFLIJFgspy>mGe^J?W%tt2Bq;Pao5BQSJL0N1-$a9DM6{ zP7dgxRtgAHfhJ8IWc`)^Y=PmJ!_4}nDL316J6heO>wW>C5U&#W3!!nc)<97~b5(P- zTdo1b`4DCzyVLRPZ?uJJ9UIk(^Q$eL6S@Eo-emXtH8e6nvso5;5B}Td3rj^PtKsuD z{c=EG`xLU(5F@3IMS@nwdN&f?q CkV?`3 literal 0 HcmV?d00001 diff --git a/icons/shutdown.png b/icons/shutdown.png new file mode 100644 index 0000000000000000000000000000000000000000..b9da903268507e697156323a065f0a8ce8cf6e67 GIT binary patch literal 2005 zcmV;`2P*i9P)X>3$g6vuxZTb4!^SzHJO5rRgrh{ULfYfvNsjHn;fM80VZ z8rP_a(HIQI821$G|NRxXQBl9tG5}aaxCYw+)EchkD*#o%2O+Pq z6gW*);}kIk*n_Uo9xzK03eCP>yC9=ru1pe zTnCXI$f7D6q6|QhJCKoD+xp#V={GdPfIlt89R{v<@Eu10K%Q;3K{x;mcJN&i+uO7Q zxWUnPTmb;M7D*6n>iUeM??A?2pE2C)!GD|q0O?L_>e@!>xeY7Aj_Y@~mpu88I{*Mr zTlmcbZ+P})ju1<#_^Pw82>xpJzY|;S${g}}q%qu-gF3h?bI6*1$1)^yH(|oZ@Sq(2M%hv)| zxj0;iF5=BZH%qitp<_!#8u}u2)U?S0(*?ua0UF*0T9yA3mUk3omqeuDF#1u?3vHd% zq3?I6+ByrtP~fK!8X74*yXL~o5E{B#2hiWf(R8Jwzwwm!8kh_;88kHE@Qn*eAK)K@ zhU3{4K^HT1L7LerkV%?0<^O0|gS=fYe^q8T5fE0K*gxK(drLX+_>nlR$e1j0pO`)CCPy zI@zu)pJnzb%hv^cU>q0*-iKh) z995PNoRl&(vc^eIJDsFMSw1k?F$JJq;UH&nQif=^*ao(5PWma!XBlmV7 z14ju=0r*Tj{Hzo=TUkDfOjnj~ zL59n%co$uywcS?Ms3F|6Xje1NA(tBOS*{c~9=JsLKUrcX`n_NcE)IvGUlqOB#bL@> zfxiED-Yc+9>98Fb>*_RxOh(`MUM8s?v~a9h!;=+k&cb-uhvQSw@0aQXF81L(CCotI z_($+~lKWd00=AQ)6Ga^8kEG<<`a7?T?ut$Smj|BnDIy_W#jft&k2%vmjPpna6~$hG zxVQzo#$OwSn9D51w2;jqigVGO*xuD5TO<3SrJy|+R)?jK(a319O#d%^Buot^Jb`Zm`{EL?2@`Z|N*PO=5c3C1*1*F8P={t4ik4h=dQao7V7SVuO01YA;Yy%oE*5jaP7@VV0I#_ z_PQ^StwKg0ha>yj&PTQp)#HEX{(fZR-7e49b>d9)^QA7<1bkocc>wz(#XNPSb7;z(9}f6e-onTtL!|=EFLXlMuCsmZXB~@Sh>YX?t-z z?IaBhL|%Ga5BiSV76T_m&>o2~4Ouytbi$M`y0Wi@I2}BOLQw|pX n9=IR3LWK$yDpaUY;TZk})ZhD~Hy(Bm00000NkvXXu0mjf|A?X} literal 0 HcmV?d00001 diff --git a/icons/steam.png b/icons/steam.png new file mode 100644 index 0000000000000000000000000000000000000000..23cbc5bcab0f3f39a25f55e2fdf1488d79d44a69 GIT binary patch literal 2697 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 D<^LTo literal 0 HcmV?d00001 diff --git a/icons/telegram.png b/icons/telegram.png new file mode 100644 index 0000000000000000000000000000000000000000..2dd07438ca09b2aa85a8e921f5c96e1a1ad24da7 GIT binary patch literal 18650 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�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 AqW}N^ literal 0 HcmV?d00001 diff --git a/jsonutils.lua b/jsonutils.lua new file mode 100644 index 0000000..e27abf1 --- /dev/null +++ b/jsonutils.lua @@ -0,0 +1,199 @@ +--[[ json.lua + +Downloaded from: https://gist.github.com/tylerneylon/59f4bcf316be525b30ab +Owner said: +> Oh hey @Shujito and @S0lll0s, sorry for the delayed response. +> Yes, please use it. I put this in the public domain. + +A compact pure-Lua JSON library. +The main functions are: json.stringify, json.parse. + +## json.stringify: + +This expects the following to be true of any tables being encoded: + * They only have string or number keys. Number keys must be represented as + strings in json; this is part of the json spec. + * They are not recursive. Such a structure cannot be specified in json. + +A Lua table is considered to be an array if and only if its set of keys is a +consecutive sequence of positive integers starting at 1. Arrays are encoded like +so: `[2, 3, false, "hi"]`. Any other type of Lua table is encoded as a json +object, encoded like so: `{"key1": 2, "key2": false}`. + +Because the Lua nil value cannot be a key, and as a table value is considerd +equivalent to a missing key, there is no way to express the json "null" value in +a Lua table. The only way this will output "null" is if your entire input obj is +nil itself. + +An empty Lua table, {}, could be considered either a json object or array - +it's an ambiguous edge case. We choose to treat this as an object as it is the +more general type. + +To be clear, none of the above considerations is a limitation of this code. +Rather, it is what we get when we completely observe the json specification for +as arbitrary a Lua object as json is capable of expressing. + +## json.parse: + +This function parses json, with the exception that it does not pay attention to +\u-escaped unicode code points in strings. + +It is difficult for Lua to return null as a value. In order to prevent the loss +of keys with a null value in a json string, this function uses the one-off +table value json.null (which is just an empty table) to indicate null values. +This way you can check if a value is null with the conditional +`val == json.null`. + +If you have control over the data and are using Lua, I would recommend just +avoiding null values in your data to begin with. + +--]] + + +local json = {} + + +-- Internal functions. + +local function kind_of(obj) + if type(obj) ~= 'table' then return type(obj) end + local i = 1 + for _ in pairs(obj) do + if obj[i] ~= nil then i = i + 1 else return 'table' end + end + if i == 1 then return 'table' else return 'array' end +end + +local function escape_str(s) + local in_char = {'\\', '"', '/', '\b', '\f', '\n', '\r', '\t'} + local out_char = {'\\', '"', '/', 'b', 'f', 'n', 'r', 't'} + for i, c in ipairs(in_char) do + s = s:gsub(c, '\\' .. out_char[i]) + end + return s +end + +-- Returns pos, did_find; there are two cases: +-- 1. Delimiter found: pos = pos after leading space + delim; did_find = true. +-- 2. Delimiter not found: pos = pos after leading space; did_find = false. +-- This throws an error if err_if_missing is true and the delim is not found. +local function skip_delim(str, pos, delim, err_if_missing) + pos = pos + #str:match('^%s*', pos) + if str:sub(pos, pos) ~= delim then + if err_if_missing then + error('Expected ' .. delim .. ' near position ' .. pos) + end + return pos, false + end + return pos + 1, true +end + +-- Expects the given pos to be the first character after the opening quote. +-- Returns val, pos; the returned pos is after the closing quote character. +local function parse_str_val(str, pos, val) + val = val or '' + local early_end_error = 'End of input found while parsing string.' + if pos > #str then error(early_end_error) end + local c = str:sub(pos, pos) + if c == '"' then return val, pos + 1 end + if c ~= '\\' then return parse_str_val(str, pos + 1, val .. c) end + -- We must have a \ character. + local esc_map = {b = '\b', f = '\f', n = '\n', r = '\r', t = '\t'} + local nextc = str:sub(pos + 1, pos + 1) + if not nextc then error(early_end_error) end + return parse_str_val(str, pos + 2, val .. (esc_map[nextc] or nextc)) +end + +-- Returns val, pos; the returned pos is after the number's final character. +local function parse_num_val(str, pos) + local num_str = str:match('^-?%d+%.?%d*[eE]?[+-]?%d*', pos) + local val = tonumber(num_str) + if not val then error('Error parsing number at position ' .. pos .. '.') end + return val, pos + #num_str +end + + +-- Public values and functions. + +function json.stringify(obj, as_key) + local s = {} -- We'll build the string as an array of strings to be concatenated. + local kind = kind_of(obj) -- This is 'array' if it's an array or type(obj) otherwise. + if kind == 'array' then + if as_key then error('Can\'t encode array as key.') end + s[#s + 1] = '[' + for i, val in ipairs(obj) do + if i > 1 then s[#s + 1] = ', ' end + s[#s + 1] = json.stringify(val) + end + s[#s + 1] = ']' + elseif kind == 'table' then + if as_key then error('Can\'t encode table as key.') end + s[#s + 1] = '{' + for k, v in pairs(obj) do + if #s > 1 then s[#s + 1] = ', ' end + s[#s + 1] = json.stringify(k, true) + s[#s + 1] = ':' + s[#s + 1] = json.stringify(v) + end + s[#s + 1] = '}' + elseif kind == 'string' then + return '"' .. escape_str(obj) .. '"' + elseif kind == 'number' then + if as_key then return '"' .. tostring(obj) .. '"' end + return tostring(obj) + elseif kind == 'boolean' then + return tostring(obj) + elseif kind == 'nil' then + return 'null' + else + error('Unjsonifiable type: ' .. kind .. '.') + end + return table.concat(s) +end + +json.null = {} -- This is a one-off table to represent the null value. + +function json.parse(str, pos, end_delim) + pos = pos or 1 + if pos > #str then error('Reached unexpected end of input.') end + local pos = pos + #str:match('^%s*', pos) -- Skip whitespace. + local first = str:sub(pos, pos) + if first == '{' then -- Parse an object. + local obj, key, delim_found = {}, true, true + pos = pos + 1 + while true do + key, pos = json.parse(str, pos, '}') + if key == nil then return obj, pos end + if not delim_found then error('Comma missing between object items.') end + pos = skip_delim(str, pos, ':', true) -- true -> error if missing. + obj[key], pos = json.parse(str, pos) + pos, delim_found = skip_delim(str, pos, ',') + end + elseif first == '[' then -- Parse an array. + local arr, val, delim_found = {}, true, true + pos = pos + 1 + while true do + val, pos = json.parse(str, pos, ']') + if val == nil then return arr, pos end + if not delim_found then error('Comma missing between array items.') end + arr[#arr + 1] = val + pos, delim_found = skip_delim(str, pos, ',') + end + elseif first == '"' then -- Parse a string. + return parse_str_val(str, pos + 1) + elseif first == '-' or first:match('%d') then -- Parse a number. + return parse_num_val(str, pos) + elseif first == end_delim then -- End of an object or array. + return nil, pos + 1 + else -- Parse true, false, or null. + local literals = {['true'] = true, ['false'] = false, ['null'] = json.null} + for lit_str, lit_val in pairs(literals) do + local lit_end = pos + #lit_str - 1 + if str:sub(pos, lit_end) == lit_str then return lit_val, lit_end + 1 end + end + local pos_info_str = 'position ' .. pos .. ': ' .. str:sub(pos, pos + 10) + error('Invalid json syntax starting at ' .. pos_info_str) + end +end + +return json diff --git a/launchbar.lua b/launchbar.lua new file mode 100644 index 0000000..89e9b29 --- /dev/null +++ b/launchbar.lua @@ -0,0 +1,68 @@ +-- Quick launchbar widget for Awesome WM +-- http://awesome.naquadah.org/wiki/Quick_launch_bar_widget/3.5 +-- Put into your awesome/ folder and add the following to rc.lua: +-- local launchbar = require('launchbar') +-- local mylb = launchbar("/path/to/directory/with/shortcuts/") +-- Then add mylb to the wibox. + +local naughty = require('naughty') +local layout = require("wibox.layout") +local util = require("awful.util") +local spawn = require('awful.spawn') +local launcher = require("command_launcher") + +local launchbar = {} + +local function getValue(t, key) + local _, _, res = string.find(t, key .. " *= *([^%c]+)%c") + return res +end + +local function find_icon(icon_name) + if string.sub(icon_name, 1, 1) == '/' then + if util.file_readable(icon_name) then + return icon_name + else + return nil + end + end + + if launchbar.icon_dirs then + for _, v in ipairs(launchbar.icon_dirs) do + if util.file_readable(v .. "/" .. icon_name) then + return v .. '/' .. icon_name + end + end + end + return nil +end + +function launchbar.new(filedir) + if not filedir then + error("Launchbar: filedir was not specified") + end + local items = {} + local widget = layout.fixed.horizontal() + local files = io.popen("ls " .. filedir .. "*.desktop") + for f in files:lines() do + local t = io.open(f):read("*all") + table.insert(items, { image = find_icon(getValue(t,"Icon")), + callback = function () + naughty.notify({ + title = "Starting " .. getValue(t, "Name"), + text = "" + }) + spawn(getValue(t,"Exec")) + end, + position = tonumber(getValue(t,"Position")) or 255 }) + end + table.sort(items, function(a,b) return a.position < b.position end) + for _, v in ipairs(items) do + if v.image then + widget:add(launcher(v)) + end + end + return widget +end + +return setmetatable(launchbar, { __call = function(_, ...) return launchbar.new(...) end }) diff --git a/music.lua b/music.lua new file mode 100644 index 0000000..5bbe8f1 --- /dev/null +++ b/music.lua @@ -0,0 +1,103 @@ +local naughty = require("naughty") +local wibox = require("wibox") +local awful = require("awful") +local su = require('su') + +local ret = {} +ret.text_widget = wibox.widget.textbox() +ret.text_widget:set_align("right") +ret.text_widget.font = "Ubuntu Mono" + +ret.icon_widget = wibox.widget.textbox() +ret.icon_widget:set_align("right") +ret.icon_widget.font = "Ubuntu Mono" + + +local icon = "" +local total_text = "" +local position = 1 +local width = 30 +local dots = 3 + +local function set_text(text) + total_text = text + + if string.len(total_text) >= width then + position = math.floor((width - string.len(total_text)) / 2) + end +end + +local function try_noop() + + awful.spawn.easy_async_with_shell('sleep 2s && music-client noop', function(stdout, stderr, reason, code) + + if code == 1 then + try_noop() + elseif code == 0 then + ret.execute_command('noop') + end + end); + +end + +ret.execute_command = function(command, arg) + + awful.spawn.easy_async({'music-client', command, arg}, function(stdout, stderr, reason, code) + + local text = su.split(stdout, '\n') + local active_command = + su.starts_with(command, 'file') or + su.starts_with(command, 'next') or + su.starts_with(command, 'previous') + + local start_server_command = active_command or + su.starts_with(command, 'play') or + su.starts_with(command, 'pause') + + if code == 0 then + + if active_command then + set_text(text[1]) + elseif su.starts_with(command, 'noop') then + total_text = text[1] + position = math.floor((width - string.len(total_text)) / 2) + end + + elseif start_server_command then + -- Start the server and re-exec the command + awful.spawn.easy_async({'music-server', 'command', command, arg}, function(stdout, stderr, reason, code) + end) + else + set_text('music-server not running') + end + + if text[2] ~= nil then + icon = text[2] + end + + end) + +end + +function update_widget() + ret.icon_widget:set_text(' ' .. icon .. ' ') + if string.len(total_text) < width then + ret.text_widget:set_text(' ' .. su.pad(total_text, width + 1, ' ')) + else + local pos = math.min(position, string.len(total_text) - width) + pos = math.max(1, pos) + ret.text_widget:set_text(' ' .. string.sub(total_text, pos, pos + width)) + position = position + 1 + if position > string.len(total_text) then + position = math.floor((width - string.len(total_text)) / 2) + end + end +end + +ret.execute_command('noop') + +ret.timer = timer({timeout=0.2}) +ret.timer:connect_signal("timeout", update_widget) +ret.timer:start() + +return ret diff --git a/options.lua b/options.lua new file mode 100644 index 0000000..69fdf4c --- /dev/null +++ b/options.lua @@ -0,0 +1,5 @@ +return { + browser="firefox", + terminal="terminator", + email="thomas@forgione.fr", +} diff --git a/rc.lua b/rc.lua new file mode 100644 index 0000000..2a7ae86 --- /dev/null +++ b/rc.lua @@ -0,0 +1,715 @@ +local os = require('os') +local math = require('math') + +-- Standard awesome library +local gears = require("gears") +local awful = require("awful") +require("awful.autofocus") +-- Widget and layout library +local wibox = require("wibox") +-- Theme handling library +local beautiful = require("beautiful") +-- Notification library +local naughty = require("naughty") +local menubar = require("menubar") +local hotkeys_popup = require("awful.hotkeys_popup").widget + +-- Custom imports +local options = require("options") +home = os.getenv('HOME') + +os.execute('xset m 16/1 0') +os.setlocale("fr_FR.UTF-8") + +-- Run xsession if exists +function file_exists(name) + local f=io.open(name,"r") + if f~=nil then io.close(f) return true else return false end +end + +if file_exists(home..'/.xsession') then + os.execute(home .. '/.xsession &') +end + + +naughty.config.notify_callback = function(args) + -- Set maximum size for notifactions + if args.icon_size == nil or args.icon_size > 128 then + args.icon_size = 128 + end + return args +end +-- awful.util.spawn_with_shell("xcompmgr -cF &") + +naughty.config.presets.normal.bg = "#000000" +-- naughty.config.presets.normal.width = 300 +-- naughty.config.presets.normal.height = 100 +naughty.config.presets.normal.font = "Ubuntu 12pt" +naughty.config.presets.normal.opacity = 0.7 + +naughty.config.presets.low.opacity = 0.7 +naughty.config.presets.critical.opacity = 0.7 +naughty.config.presets.critical.font = "Ubuntu 12pt" +naughty.config.presets.critical.timeout = 5 +naughty.config.presets.critical.bg = "#111111" +naughty.config.presets.critical.fg = "#aaaaaa" + +-- {{{ Error handling +-- Check if awesome encountered an error during startup and fell back to +-- another config (This code will only ever execute for the fallback config) +if awesome.startup_errors then + naughty.notify({ preset = naughty.config.presets.critical, + title = "Oops, there were errors during startup!", + text = awesome.startup_errors }) +end + +-- Handle runtime errors after startup +do + local in_error = false + awesome.connect_signal("debug::error", function (err) + -- Make sure we don't go into an endless error loop + if in_error then return end + in_error = true + + naughty.notify({ preset = naughty.config.presets.critical, + title = "Oops, an error happened!", + text = tostring(err) }) + in_error = false + end) +end +-- }}} + +-- {{{ Variable definitions +-- Themes define colours, icons, font and wallpapers. +beautiful.init("~/.config/awesome/themes/default/theme.lua") + +-- This is used later as the default terminal and editor to run. +terminal = options.terminal +editor = os.getenv("EDITOR") or "nano" +editor_cmd = terminal .. " -e " .. editor + +-- Default modkey. +-- Usually, Mod4 is the key with a logo between Control and Alt. +-- If you do not like this or do not have such a key, +-- I suggest you to remap Mod4 to another key using xmodmap or other tools. +-- However, you can use another modifier like Mod1, but it may interact with others. +modkey = "Mod4" + +-- Table of layouts to cover with awful.layout.inc, order matters. +awful.layout.layouts = { + awful.layout.suit.tile.left, + awful.layout.suit.tile, + awful.layout.suit.tile.bottom, + awful.layout.suit.tile.top, + awful.layout.suit.fair, + awful.layout.suit.fair.horizontal, + awful.layout.suit.spiral, + awful.layout.suit.spiral.dwindle, + awful.layout.suit.max, + awful.layout.suit.max.fullscreen, + awful.layout.suit.magnifier, + awful.layout.suit.corner.nw, + awful.layout.suit.corner.ne, + awful.layout.suit.corner.sw, + awful.layout.suit.corner.se, + awful.layout.suit.floating, +} +-- }}} + +-- {{{ Helper functions +local function client_menu_toggle_fn() + local instance = nil + + return function () + if instance and instance.wibox.visible then + instance:hide() + instance = nil + else + instance = awful.menu.clients({ theme = { width = 250 } }) + end + end +end +-- }}} + +-- {{{ Menu +-- Create a launcher widget and a main menu +myawesomemenu = { + { "hotkeys", function() return false, hotkeys_popup.show_help end}, + { "manual", terminal .. " -e man awesome" }, + { "edit config", editor_cmd .. " " .. awesome.conffile }, + { "restart", awesome.restart }, + { "quit", function() awesome.quit() end} +} + +mymainmenu = awful.menu({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon }, + { "open terminal", terminal } + } + }) + +mylauncher = awful.widget.launcher({ image = beautiful.awesome_icon, + menu = mymainmenu }) + +-- Menubar configuration +menubar.utils.terminal = terminal -- Set the terminal for applications that require it +-- }}} + +-- Keyboard map indicator and switcher +mykeyboardlayout = awful.widget.keyboardlayout() + +-- {{{ Wibar + +-- Create a wibox for each screen and add it +local taglist_buttons = awful.util.table.join( + awful.button({ }, 1, function(t) t:view_only() end), + awful.button({ modkey }, 1, function(t) + if client.focus then + client.focus:move_to_tag(t) + end + end), + awful.button({ }, 3, awful.tag.viewtoggle), + awful.button({ modkey }, 3, function(t) + if client.focus then + client.focus:toggle_tag(t) + end + end), + awful.button({ }, 4, function(t) awful.tag.viewnext(t.screen) end), + awful.button({ }, 5, function(t) awful.tag.viewprev(t.screen) end) + ) + +local tasklist_buttons = awful.util.table.join( + awful.button({ }, 1, function (c) + if c == client.focus then + c.minimized = true + else + -- Without this, the following + -- :isvisible() makes no sense + c.minimized = false + if not c:isvisible() and c.first_tag then + c.first_tag:view_only() + end + -- This will also un-minimize + -- the client, if needed + client.focus = c + c:raise() + end + end), + awful.button({ }, 3, client_menu_toggle_fn()), + awful.button({ }, 4, function () + awful.client.focus.byidx(1) + end), + awful.button({ }, 5, function () + awful.client.focus.byidx(-1) + end)) + +local battery = require('battery') +local volume = require('volume') +local calendar = require('calendar') +local launchbar = require('launchbar') +local music = require('music') +-- local background = require('background_widget') +local delimiter = wibox.widget.textbox(" | ") + +local function set_wallpaper(s) + -- Wallpaper + if beautiful.wallpaper then + local wallpaper = beautiful.wallpaper + -- If wallpaper is a function, call it with the screen + if type(wallpaper) == "function" then + wallpaper = wallpaper(s) + end + gears.wallpaper.maximized(wallpaper, s, true) + end +end + +-- Re-set wallpaper when a screen's geometry changes (e.g. different resolution) +screen.connect_signal("property::geometry", set_wallpaper) + +awful.screen.connect_for_each_screen(function(s) + -- Wallpaper + set_wallpaper(s) + + -- Each screen has its own tag table. + awful.tag({ "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" }, s, awful.layout.layouts[1]) + + -- Create a promptbox for each screen + s.mypromptbox = awful.widget.prompt() + -- Create an imagebox widget which will contains an icon indicating which layout we're using. + -- We need one layoutbox per screen. + s.mylayoutbox = awful.widget.layoutbox(s) + s.mylayoutbox:buttons(awful.util.table.join( + awful.button({ }, 1, function () awful.layout.inc( 1) end), + awful.button({ }, 3, function () awful.layout.inc(-1) end), + awful.button({ }, 4, function () awful.layout.inc( 1) end), + awful.button({ }, 5, function () awful.layout.inc(-1) end))) + -- Create a taglist widget + s.mytaglist = awful.widget.taglist(s, awful.widget.taglist.filter.all, taglist_buttons) + + -- Create a tasklist widget + s.mytasklist = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, tasklist_buttons) + + -- Create the wibox + s.mywibox = awful.wibar({ position = "top", screen = s }) + + -- Add widgets to the wibox + s.mywibox:setup { + layout = wibox.layout.align.horizontal, + { -- Left widgets + layout = wibox.layout.fixed.horizontal, + mylauncher, + s.mytaglist, + launchbar("~/Desktop/"), + delimiter, + s.mypromptbox, + }, + s.mytasklist, -- Middle widget + { -- Right widgets + layout = wibox.layout.fixed.horizontal, + delimiter, + music.icon_widget, + music.text_widget, + delimiter, + volume_widget, + delimiter, + battery_widget, + delimiter, + mykeyboardlayout, + wibox.widget.systray(), + textclock_widget, + s.mylayoutbox, + }, + } + + -- update_background_widget(s) + +end) +-- }}} + +-- {{{ Mouse bindings +root.buttons(awful.util.table.join( + awful.button({ }, 3, function () mymainmenu:toggle() end), + awful.button({ }, 4, awful.tag.viewnext), + awful.button({ }, 5, awful.tag.viewprev) +)) +-- }}} + +-- {{{ Key bindings +globalkeys = awful.util.table.join( + awful.key({ modkey, }, "s", hotkeys_popup.show_help, + {description="show help", group="awesome"}), + awful.key({ modkey, }, "Left", awful.tag.viewprev, + {description = "view previous", group = "tag"}), + awful.key({ modkey, }, "Right", awful.tag.viewnext, + {description = "view next", group = "tag"}), + awful.key({ modkey, }, "Escape", awful.tag.history.restore, + {description = "go back", group = "tag"}), + + awful.key({ modkey, }, "j", + function () + awful.client.focus.byidx( 1) + end, + {description = "focus next by index", group = "client"} + ), + awful.key({ modkey, }, "k", + function () + awful.client.focus.byidx(-1) + end, + {description = "focus previous by index", group = "client"} + ), + awful.key({ modkey, }, "w", function () mymainmenu:show() end, + {description = "show main menu", group = "awesome"}), + + -- Layout manipulation + awful.key({ modkey, "Shift" }, "j", function () awful.client.swap.byidx( 1) end, + {description = "swap with next client by index", group = "client"}), + awful.key({ modkey, "Shift" }, "k", function () awful.client.swap.byidx( -1) end, + {description = "swap with previous client by index", group = "client"}), + awful.key({ modkey, "Control" }, "j", function () awful.screen.focus_relative( 1) end, + {description = "focus the next screen", group = "screen"}), + awful.key({ modkey, "Control" }, "k", function () awful.screen.focus_relative(-1) end, + {description = "focus the previous screen", group = "screen"}), + awful.key({ modkey, }, "u", awful.client.urgent.jumpto, + {description = "jump to urgent client", group = "client"}), + awful.key({ modkey, }, "Tab", + function () + -- awful.client.focus.history.previous() + awful.client.focus.byidx(-1) + if client.focus then + client.focus:raise() + end + end, + {description = "go back", group = "client"}), + -- Standard program + awful.key({ modkey, }, "Return", function () + awful.spawn(terminal) + naughty.notify({title = "Starting " .. options.terminal}) + end, + {description = "open a terminal", group = "launcher"}), + awful.key({ modkey, "Control" }, "r", awesome.restart, + {description = "reload awesome", group = "awesome"}), + awful.key({ modkey, "Shift" }, "q", awesome.quit, + {description = "quit awesome", group = "awesome"}), + + -- awful.key({ modkey, }, "l", function () awful.tag.incmwfact( 0.05) end, + -- {description = "increase master width factor", group = "layout"}), + -- awful.key({ modkey, }, "h", function () awful.tag.incmwfact(-0.05) end, + -- {description = "decrease master width factor", group = "layout"}), + -- awful.key({ modkey, "Shift" }, "h", function () awful.tag.incnmaster( 1, nil, true) end, + -- {description = "increase the number of master clients", group = "layout"}), + -- awful.key({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1, nil, true) end, + -- {description = "decrease the number of master clients", group = "layout"}), + -- awful.key({ modkey, "Control" }, "h", function () awful.tag.incncol( 1, nil, true) end, + -- {description = "increase the number of columns", group = "layout"}), + -- awful.key({ modkey, "Control" }, "l", function () awful.tag.incncol(-1, nil, true) end, + -- {description = "decrease the number of columns", group = "layout"}), + -- awful.key({ modkey, }, "space", function () awful.layout.inc( 1) end, + -- {description = "select next", group = "layout"}), + -- awful.key({ modkey, "Shift" }, "space", function () awful.layout.inc(-1) end, + -- {description = "select previous", group = "layout"}), + + awful.key({ modkey, "Control" }, "n", + function () + local c = awful.client.restore() + -- Focus restored client + if c then + client.focus = c + c:raise() + end + end, + {description = "restore minimized", group = "client"}), + + -- Prompt + awful.key({ modkey }, "r", function () awful.screen.focused().mypromptbox:run() end, + {description = "run prompt", group = "launcher"}), + + awful.key({ modkey }, "x", + function () + awful.prompt.run { + prompt = "Run Lua code: ", + textbox = awful.screen.focused().mypromptbox.widget, + exe_callback = awful.util.eval, + history_path = awful.util.get_cache_dir() .. "/history_eval" + } + end, + {description = "lua execute prompt", group = "awesome"}), + -- Menubar + awful.key({ modkey }, "p", function() menubar.show() end, + {description = "show the menubar", group = "launcher"}), + + -- Custom shortcuts + awful.key({ }, "XF86AudioRaiseVolume", function() + awful.util.spawn("amixer set Master 3%+", false) + update_volume() + end, {description = "increase the volume by 3%", group="custom"}), + + awful.key({ }, "XF86AudioLowerVolume", function() + awful.util.spawn("amixer set Master 3%-", false) + update_volume() + end, {description = "decrease the volume by 3%", group="custom"}), + + awful.key({ }, "XF86AudioMute", function() + awful.util.spawn("amixer set Master toggle", false) + update_volume() + end, {description = "mute sound", group="custom"}), + + awful.key({ }, "XF86MonBrightnessDown", function () + awful.util.spawn("xbacklight -dec 5") + end, {description = "decrease brightness", group="custom"}), + + awful.key({ }, "XF86MonBrightnessUp", function () + awful.util.spawn("xbacklight -inc 5") + end, {description = "increase brightness", group="custom"}), + + awful.key({ }, "XF86PowerOff", function () + awful.util.spawn("gksudo shutdown now") + end, {description = "Shutdown", group="custom"}), + + awful.key({ }, "XF86AudioPlay", function() + music.execute_command('play') + end, {description = "play or pause the current music", group="custom"}), + + awful.key({ }, "XF86AudioStop", function() + music.execute_command('stop') + end, {description = "stop the current music", group="custom"}), + + awful.key({ }, "XF86AudioNext", function() + music.execute_command('next') + end, {description = "skip to the next music", group="custom"}), + + awful.key({ }, "XF86AudioPrev", function() + music.execute_command('previous') + end, {description = "skip to the previous music", group="custom"}), + + awful.key({ }, "Print", function () + awful.spawn.easy_async_with_shell('gnome-screenshot -fp "`echo -n ' .. home .. '"/Pictures/Captures/Capture du " && date "+%Y-%m-%d %H:%M:%S"`.png"', function() end) + end, {description = "capture the screen", group="custom"}), + + awful.key({modkey}, "a", function () + awful.spawn.easy_async(options.browser, function() end) + naughty.notify({title = "Starting " .. options.browser}) + end, {description="start the web browser", group="custom"}), + + awful.key({modkey}, "l", function() + awful.spawn.easy_async_with_shell('sleep 1 && xset dpms force off && slock', function() end) + end, { description="Locks the screen", group="custom"}), + + awful.key({modkey, "Shift"}, "l", function() + awful.spawn.easy_async_with_shell('sleep 1 && xset dpms force off', function() end) + end, { description="Locks the screen", group="custom"}), + + awful.key({modkey, "Shift"}, "Tab", function() + awful.spawn.easy_async('xdotool key Caps_Lock', function() end) + end, {description="switch the caps lock", group="custom"}), + + awful.key({modkey}, "#83", function() + awful.spawn.easy_async("tvrs enable left", function() end) + end, {description="lol", group="custom"}), + + awful.key({modkey}, "#84", function() + awful.spawn.easy_async("tvrs duplicate", function() end) + end, {description="lol", group="custom"}), + + awful.key({modkey}, "#85", function() + awful.spawn.easy_async("tvrs enable right", function() end) + end, {description="lol", group="custom"}), + + awful.key({modkey}, "#80", function() + awful.spawn.easy_async("tvrs enable above", function() end) + end, {description="lol", group="custom"}), + + awful.key({modkey}, "#88", function() + awful.spawn.easy_async("tvrs enable below", function() end) + end, {description="lol", group="custom"}), + + awful.key({modkey}, "#90", function() + awful.spawn.easy_async("tvrs disable", function() end) + end, {description="lol", group="custom"}), + + awful.key({modkey}, "z", function() + awful.spawn.easy_async("firefox https://hangouts.google.com https://messenger.com https://web.telegram.org https://gitter.im https://vortex-n7.slack.com/ https://nextcloud.tforgione.fr/apps/calendar", function() end) + naughty.notify({title = "Starting social media"}) + end, {description="Open social media", group="custom"}), + + awful.key({modkey, "Shift"}, "m", function() + awful.spawn.easy_async('sleep 0.5', function() + for i = 1, #options.email do + os.execute('xdotool type --clearmodifiers ' .. options.email:sub(i,i)) + end + end) + end, {description="lol", group="autoinput"}) + +) + +clientkeys = awful.util.table.join( + awful.key({ modkey, }, "f", + function (c) + c.fullscreen = not c.fullscreen + c:raise() + end, + {description = "toggle fullscreen", group = "client"}), + awful.key({ modkey, "Shift" }, "c", function (c) c:kill() end, + {description = "close", group = "client"}), + awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle , + {description = "toggle floating", group = "client"}), + awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end, + {description = "move to master", group = "client"}), + awful.key({ modkey, }, "o", function (c) c:move_to_screen() end, + {description = "move to screen", group = "client"}), + awful.key({ modkey, }, "t", function (c) c.ontop = not c.ontop end, + {description = "toggle keep on top", group = "client"}), + awful.key({ modkey, }, "n", + function (c) + -- The client currently has the input focus, so it cannot be + -- minimized, since minimized clients can't have the focus. + c.minimized = true + end , + {description = "minimize", group = "client"}), + awful.key({ modkey, }, "m", + function (c) + c.maximized = not c.maximized + c:raise() + end , + {description = "maximize", group = "client"}) +) + +-- Bind all key numbers to tags. +-- Be careful: we use keycodes to make it works on any keyboard layout. +-- This should map on the top row of your keyboard, usually 1 to 9. +for i = 1, 10 do + globalkeys = awful.util.table.join(globalkeys, + -- View tag only. + awful.key({ modkey }, "#" .. i + 9, + function () + local screen = awful.screen.focused() + local tag = screen.tags[i] + if tag then + tag:view_only() + end + end, + {description = "view tag #"..i, group = "tag"}), + -- Toggle tag display. + awful.key({ modkey, "Control" }, "#" .. i + 9, + function () + local screen = awful.screen.focused() + local tag = screen.tags[i] + if tag then + awful.tag.viewtoggle(tag) + end + end, + {description = "toggle tag #" .. i, group = "tag"}), + -- Move client to tag. + awful.key({ modkey, "Shift" }, "#" .. i + 9, + function () + if client.focus then + local tag = client.focus.screen.tags[i] + if tag then + client.focus:move_to_tag(tag) + tag:view_only() + end + end + end, + {description = "move focused client to tag #"..i, group = "tag"}), + -- Toggle tag on focused client. + awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9, + function () + if client.focus then + local tag = client.focus.screen.tags[i] + if tag then + client.focus:toggle_tag(tag) + end + end + end, + {description = "toggle focused client on tag #" .. i, group = "tag"}) + ) +end + +clientbuttons = awful.util.table.join( + awful.button({ }, 1, function (c) client.focus = c; c:raise() end), + awful.button({ modkey }, 1, awful.mouse.client.move), + awful.button({ modkey }, 3, awful.mouse.client.resize)) + +-- Set keys +root.keys(globalkeys) +-- }}} + +-- {{{ Rules +-- Rules to apply to new clients (through the "manage" signal). +awful.rules.rules = { + -- All clients will match this rule. + { rule = { }, + properties = { border_width = beautiful.border_width, + border_color = beautiful.border_normal, + focus = awful.client.focus.filter, + raise = true, + keys = clientkeys, + buttons = clientbuttons, + screen = awful.screen.preferred, + placement = awful.placement.no_overlap+awful.placement.no_offscreen + } + }, + + -- Floating clients. + { rule_any = { + instance = { + "DTA", -- Firefox addon DownThemAll. + "copyq", -- Includes session name in class. + }, + class = { + "Arandr", + "Gpick", + "Kruler", + "MessageWin", -- kalarm. + "Sxiv", + "Wpa_gui", + "pinentry", + "veromix", + "xtightvncviewer"}, + + name = { + "Event Tester", -- xev. + }, + role = { + "AlarmWindow", -- Thunderbird's calendar. + "pop-up", -- e.g. Google Chrome's (detached) Developer Tools. + } + }, properties = { floating = true }}, + + -- Add titlebars to normal clients and dialogs + { rule_any = {type = { "normal", "dialog" } + }, properties = { titlebars_enabled = false } + }, + + -- Set Firefox to always map on the tag named "2" on screen 1. + -- { rule = { class = "Firefox" }, + -- properties = { screen = 1, tag = "2" } }, +} +-- }}} + +-- {{{ Signals +-- Signal function to execute when a new client appears. +client.connect_signal("manage", function (c) + -- Set the windows at the slave, + -- i.e. put it at the end of others instead of setting it master. + -- if not awesome.startup then awful.client.setslave(c) end + + if awesome.startup and + not c.size_hints.user_position + and not c.size_hints.program_position then + -- Prevent clients from being unreachable after screen count changes. + awful.placement.no_offscreen(c) + end +end) + +-- Add a titlebar if titlebars_enabled is set to true in the rules. +client.connect_signal("request::titlebars", function(c) + -- buttons for the titlebar + local buttons = awful.util.table.join( + awful.button({ }, 1, function() + client.focus = c + c:raise() + awful.mouse.client.move(c) + end), + awful.button({ }, 3, function() + client.focus = c + c:raise() + awful.mouse.client.resize(c) + end) + ) + + awful.titlebar(c) : setup { + { -- Left + awful.titlebar.widget.iconwidget(c), + buttons = buttons, + layout = wibox.layout.fixed.horizontal + }, + { -- Middle + { -- Title + align = "center", + widget = awful.titlebar.widget.titlewidget(c) + }, + buttons = buttons, + layout = wibox.layout.flex.horizontal + }, + { -- Right + awful.titlebar.widget.floatingbutton (c), + awful.titlebar.widget.maximizedbutton(c), + awful.titlebar.widget.stickybutton (c), + awful.titlebar.widget.ontopbutton (c), + awful.titlebar.widget.closebutton (c), + layout = wibox.layout.fixed.horizontal() + }, + layout = wibox.layout.align.horizontal + } +end) + +-- Enable sloppy focus, so that focus follows mouse. +client.connect_signal("mouse::enter", function(c) + if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier + and awful.client.focus.filter(c) then + client.focus = c + end +end) + +client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end) +client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end) + +-- }}} diff --git a/su.lua b/su.lua new file mode 100644 index 0000000..319d704 --- /dev/null +++ b/su.lua @@ -0,0 +1,30 @@ +local module = {} + +module.starts_with = function(String,Start) + return string.sub(String,1,string.len(Start))==Start +end + +module.split = function(str, delimiter) + if str == nil then + return {} + end + local ret = {''} + count = 1 + for i = 1, string.len(str) do + local c = str:sub(i,i) + if c == delimiter then + count = count + 1 + ret[count] = '' + else + ret[count] = ret[count] .. c + end + end + return ret +end + +module.pad = function(str, len, char) + if char == nil then char = ' ' end + return str .. string.rep(char, len - #str) +end + +return module diff --git a/themes/default/theme.lua b/themes/default/theme.lua new file mode 100644 index 0000000..ee252e9 --- /dev/null +++ b/themes/default/theme.lua @@ -0,0 +1,102 @@ +--------------------------- +-- Default awesome theme -- +--------------------------- + +local theme = {} + +theme.font = "sans 8" + +theme.bg_normal = "#22222200" +theme.bg_focus = "#535d6c00" +theme.bg_urgent = "#ff000000" +theme.bg_minimize = "#44444400" +theme.bg_systray = theme.bg_normal + +theme.fg_normal = "#cccccc" +theme.fg_focus = "#ffffff" +theme.fg_urgent = "#ffffff" +theme.fg_minimize = "#ffffff" + +theme.useless_gap = 0 +theme.border_width = 1 +theme.border_normal = "#39404b" +theme.border_focus = "#6d7a8d" +theme.border_marked = "#91231c" + +-- There are other variable sets +-- overriding the default one when +-- defined, the sets are: +-- taglist_[bg|fg]_[focus|urgent|occupied|empty] +-- tasklist_[bg|fg]_[focus|urgent] +-- titlebar_[bg|fg]_[normal|focus] +-- tooltip_[font|opacity|fg_color|bg_color|border_width|border_color] +-- mouse_finder_[color|timeout|animate_timeout|radius|factor] +-- Example: +--theme.taglist_bg_focus = "#ff0000" + +theme.tooltip_font = "Inconsolata 12" + +-- Display the taglist squares +theme.taglist_squares_sel = "/usr/share/awesome/themes/default/taglist/squarefw.png" +theme.taglist_squares_unsel = "/usr/share/awesome/themes/default/taglist/squarew.png" + +-- Variables set for theming the menu: +-- menu_[bg|fg]_[normal|focus] +-- menu_[border_color|border_width] +theme.menu_submenu_icon = "/usr/share/awesome/themes/default/submenu.png" +theme.menu_height = 15 +theme.menu_width = 100 + +-- You can add as many variables as +-- you wish and access them by using +-- beautiful.variable in your rc.lua +--theme.bg_widget = "#cc0000" + +-- Define the image to load +theme.titlebar_close_button_normal = "/usr/share/awesome/themes/default/titlebar/close_normal.png" +theme.titlebar_close_button_focus = "/usr/share/awesome/themes/default/titlebar/close_focus.png" + +theme.titlebar_ontop_button_normal_inactive = "/usr/share/awesome/themes/default/titlebar/ontop_normal_inactive.png" +theme.titlebar_ontop_button_focus_inactive = "/usr/share/awesome/themes/default/titlebar/ontop_focus_inactive.png" +theme.titlebar_ontop_button_normal_active = "/usr/share/awesome/themes/default/titlebar/ontop_normal_active.png" +theme.titlebar_ontop_button_focus_active = "/usr/share/awesome/themes/default/titlebar/ontop_focus_active.png" + +theme.titlebar_sticky_button_normal_inactive = "/usr/share/awesome/themes/default/titlebar/sticky_normal_inactive.png" +theme.titlebar_sticky_button_focus_inactive = "/usr/share/awesome/themes/default/titlebar/sticky_focus_inactive.png" +theme.titlebar_sticky_button_normal_active = "/usr/share/awesome/themes/default/titlebar/sticky_normal_active.png" +theme.titlebar_sticky_button_focus_active = "/usr/share/awesome/themes/default/titlebar/sticky_focus_active.png" + +theme.titlebar_floating_button_normal_inactive = "/usr/share/awesome/themes/default/titlebar/floating_normal_inactive.png" +theme.titlebar_floating_button_focus_inactive = "/usr/share/awesome/themes/default/titlebar/floating_focus_inactive.png" +theme.titlebar_floating_button_normal_active = "/usr/share/awesome/themes/default/titlebar/floating_normal_active.png" +theme.titlebar_floating_button_focus_active = "/usr/share/awesome/themes/default/titlebar/floating_focus_active.png" + +theme.titlebar_maximized_button_normal_inactive = "/usr/share/awesome/themes/default/titlebar/maximized_normal_inactive.png" +theme.titlebar_maximized_button_focus_inactive = "/usr/share/awesome/themes/default/titlebar/maximized_focus_inactive.png" +theme.titlebar_maximized_button_normal_active = "/usr/share/awesome/themes/default/titlebar/maximized_normal_active.png" +theme.titlebar_maximized_button_focus_active = "/usr/share/awesome/themes/default/titlebar/maximized_focus_active.png" + +theme.wallpaper = "/home/thomas/Pictures/Wallpapers/terminal.jpg" + +-- You can use your own layout icons like this: +theme.layout_fairh = "/usr/share/awesome/themes/default/layouts/fairhw.png" +theme.layout_fairv = "/usr/share/awesome/themes/default/layouts/fairvw.png" +theme.layout_floating = "/usr/share/awesome/themes/default/layouts/floatingw.png" +theme.layout_magnifier = "/usr/share/awesome/themes/default/layouts/magnifierw.png" +theme.layout_max = "/usr/share/awesome/themes/default/layouts/maxw.png" +theme.layout_fullscreen = "/usr/share/awesome/themes/default/layouts/fullscreenw.png" +theme.layout_tilebottom = "/usr/share/awesome/themes/default/layouts/tilebottomw.png" +theme.layout_tileleft = "/usr/share/awesome/themes/default/layouts/tileleftw.png" +theme.layout_tile = "/usr/share/awesome/themes/default/layouts/tilew.png" +theme.layout_tiletop = "/usr/share/awesome/themes/default/layouts/tiletopw.png" +theme.layout_spiral = "/usr/share/awesome/themes/default/layouts/spiralw.png" +theme.layout_dwindle = "/usr/share/awesome/themes/default/layouts/dwindlew.png" + +theme.awesome_icon = "/usr/share/awesome/icons/awesome16.png" + +-- Define the icon theme for application icons. If not set then the icons +-- from /usr/share/icons and /usr/share/icons/hicolor will be used. +theme.icon_theme = nil + +return theme +-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80 diff --git a/volume.lua b/volume.lua new file mode 100644 index 0000000..5cabf58 --- /dev/null +++ b/volume.lua @@ -0,0 +1,29 @@ +local wibox = require("wibox") +local awful = require("awful") + +volume_widget = wibox.widget.textbox() +volume_widget:set_align("right") + +function update_volume() + + awful.spawn.easy_async('amixer sget Master', function(stdout, stderr) + local status = stdout + local widget = volume_widget + + -- local volume = tonumber(string.match(status, "(%d?%d?%d)%%")) / 100 + local volume = string.match(status, "(%d?%d?%d)%%") + volume = string.format("% 3d", volume) + status = string.match(status, "%[(o[^%]]*)%]") + + if string.find(status, "on", 1, true) then + -- For the volume numbers + volume = volume .. "%" + else + -- For the mute button + volume = volume .. "M" + end + widget:set_markup("V :" .. volume) + end) +end + +update_volume()