Schneider
5 years ago
12 changed files with 1462 additions and 0 deletions
-
8.gitmodules
-
12awesome/autorun.sh
-
1awesome/awesome-wm-widgets
-
339awesome/freedesktop/LICENSE
-
52awesome/freedesktop/README.rst
-
20awesome/freedesktop/awesome-freedesktop-scm-1.rockspec
-
254awesome/freedesktop/desktop.lua
-
15awesome/freedesktop/init.lua
-
133awesome/freedesktop/menu.lua
-
BINawesome/freedesktop/screenshot.png
-
627awesome/rc.lua
-
1awesome/volume-control
@ -0,0 +1,8 @@ |
|||
[submodule "awesome/awesome-wm-widgets"] |
|||
path = awesome/awesome-wm-widgets |
|||
url = https://github.com/streetturtle/awesome-wm-widgets |
|||
branch = master |
|||
[submodule "awesome/volume-control"] |
|||
path = awesome/volume-control |
|||
url = https://github.com/deficient/volume-control.git |
|||
branch = master |
@ -0,0 +1,12 @@ |
|||
#!/usr/bin/env bash |
|||
|
|||
function run { |
|||
if ! pgrep -f $1 ; |
|||
then |
|||
$@& |
|||
fi |
|||
} |
|||
|
|||
run setxkbmap -option caps:escape -layout us -variant altgr-intl |
|||
run pulseaudio --start |
|||
~/.dotfiles/change-wallpaper.sh |
@ -0,0 +1 @@ |
|||
Subproject commit 6fc9f668491ecdb19578a0ac6c5a1be0b8b42881 |
@ -0,0 +1,339 @@ |
|||
GNU GENERAL PUBLIC LICENSE |
|||
Version 2, June 1991 |
|||
|
|||
Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/> |
|||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|||
Everyone is permitted to copy and distribute verbatim copies |
|||
of this license document, but changing it is not allowed. |
|||
|
|||
Preamble |
|||
|
|||
The licenses for most software are designed to take away your |
|||
freedom to share and change it. By contrast, the GNU General Public |
|||
License is intended to guarantee your freedom to share and change free |
|||
software--to make sure the software is free for all its users. This |
|||
General Public License applies to most of the Free Software |
|||
Foundation's software and to any other program whose authors commit to |
|||
using it. (Some other Free Software Foundation software is covered by |
|||
the GNU Lesser General Public License instead.) You can apply it to |
|||
your programs, too. |
|||
|
|||
When we speak of free software, we are referring to freedom, not |
|||
price. Our General Public Licenses are designed to make sure that you |
|||
have the freedom to distribute copies of free software (and charge for |
|||
this service if you wish), that you receive source code or can get it |
|||
if you want it, that you can change the software or use pieces of it |
|||
in new free programs; and that you know you can do these things. |
|||
|
|||
To protect your rights, we need to make restrictions that forbid |
|||
anyone to deny you these rights or to ask you to surrender the rights. |
|||
These restrictions translate to certain responsibilities for you if you |
|||
distribute copies of the software, or if you modify it. |
|||
|
|||
For example, if you distribute copies of such a program, whether |
|||
gratis or for a fee, you must give the recipients all the rights that |
|||
you have. You must make sure that they, too, receive or can get the |
|||
source code. And you must show them these terms so they know their |
|||
rights. |
|||
|
|||
We protect your rights with two steps: (1) copyright the software, and |
|||
(2) offer you this license which gives you legal permission to copy, |
|||
distribute and/or modify the software. |
|||
|
|||
Also, for each author's protection and ours, we want to make certain |
|||
that everyone understands that there is no warranty for this free |
|||
software. If the software is modified by someone else and passed on, we |
|||
want its recipients to know that what they have is not the original, so |
|||
that any problems introduced by others will not reflect on the original |
|||
authors' reputations. |
|||
|
|||
Finally, any free program is threatened constantly by software |
|||
patents. We wish to avoid the danger that redistributors of a free |
|||
program will individually obtain patent licenses, in effect making the |
|||
program proprietary. To prevent this, we have made it clear that any |
|||
patent must be licensed for everyone's free use or not licensed at all. |
|||
|
|||
The precise terms and conditions for copying, distribution and |
|||
modification follow. |
|||
|
|||
GNU GENERAL PUBLIC LICENSE |
|||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
|||
|
|||
0. This License applies to any program or other work which contains |
|||
a notice placed by the copyright holder saying it may be distributed |
|||
under the terms of this General Public License. The "Program", below, |
|||
refers to any such program or work, and a "work based on the Program" |
|||
means either the Program or any derivative work under copyright law: |
|||
that is to say, a work containing the Program or a portion of it, |
|||
either verbatim or with modifications and/or translated into another |
|||
language. (Hereinafter, translation is included without limitation in |
|||
the term "modification".) Each licensee is addressed as "you". |
|||
|
|||
Activities other than copying, distribution and modification are not |
|||
covered by this License; they are outside its scope. The act of |
|||
running the Program is not restricted, and the output from the Program |
|||
is covered only if its contents constitute a work based on the |
|||
Program (independent of having been made by running the Program). |
|||
Whether that is true depends on what the Program does. |
|||
|
|||
1. You may copy and distribute verbatim copies of the Program's |
|||
source code as you receive it, in any medium, provided that you |
|||
conspicuously and appropriately publish on each copy an appropriate |
|||
copyright notice and disclaimer of warranty; keep intact all the |
|||
notices that refer to this License and to the absence of any warranty; |
|||
and give any other recipients of the Program a copy of this License |
|||
along with the Program. |
|||
|
|||
You may charge a fee for the physical act of transferring a copy, and |
|||
you may at your option offer warranty protection in exchange for a fee. |
|||
|
|||
2. You may modify your copy or copies of the Program or any portion |
|||
of it, thus forming a work based on the Program, and copy and |
|||
distribute such modifications or work under the terms of Section 1 |
|||
above, provided that you also meet all of these conditions: |
|||
|
|||
a) You must cause the modified files to carry prominent notices |
|||
stating that you changed the files and the date of any change. |
|||
|
|||
b) You must cause any work that you distribute or publish, that in |
|||
whole or in part contains or is derived from the Program or any |
|||
part thereof, to be licensed as a whole at no charge to all third |
|||
parties under the terms of this License. |
|||
|
|||
c) If the modified program normally reads commands interactively |
|||
when run, you must cause it, when started running for such |
|||
interactive use in the most ordinary way, to print or display an |
|||
announcement including an appropriate copyright notice and a |
|||
notice that there is no warranty (or else, saying that you provide |
|||
a warranty) and that users may redistribute the program under |
|||
these conditions, and telling the user how to view a copy of this |
|||
License. (Exception: if the Program itself is interactive but |
|||
does not normally print such an announcement, your work based on |
|||
the Program is not required to print an announcement.) |
|||
|
|||
These requirements apply to the modified work as a whole. If |
|||
identifiable sections of that work are not derived from the Program, |
|||
and can be reasonably considered independent and separate works in |
|||
themselves, then this License, and its terms, do not apply to those |
|||
sections when you distribute them as separate works. But when you |
|||
distribute the same sections as part of a whole which is a work based |
|||
on the Program, the distribution of the whole must be on the terms of |
|||
this License, whose permissions for other licensees extend to the |
|||
entire whole, and thus to each and every part regardless of who wrote it. |
|||
|
|||
Thus, it is not the intent of this section to claim rights or contest |
|||
your rights to work written entirely by you; rather, the intent is to |
|||
exercise the right to control the distribution of derivative or |
|||
collective works based on the Program. |
|||
|
|||
In addition, mere aggregation of another work not based on the Program |
|||
with the Program (or with a work based on the Program) on a volume of |
|||
a storage or distribution medium does not bring the other work under |
|||
the scope of this License. |
|||
|
|||
3. You may copy and distribute the Program (or a work based on it, |
|||
under Section 2) in object code or executable form under the terms of |
|||
Sections 1 and 2 above provided that you also do one of the following: |
|||
|
|||
a) Accompany it with the complete corresponding machine-readable |
|||
source code, which must be distributed under the terms of Sections |
|||
1 and 2 above on a medium customarily used for software interchange; or, |
|||
|
|||
b) Accompany it with a written offer, valid for at least three |
|||
years, to give any third party, for a charge no more than your |
|||
cost of physically performing source distribution, a complete |
|||
machine-readable copy of the corresponding source code, to be |
|||
distributed under the terms of Sections 1 and 2 above on a medium |
|||
customarily used for software interchange; or, |
|||
|
|||
c) Accompany it with the information you received as to the offer |
|||
to distribute corresponding source code. (This alternative is |
|||
allowed only for noncommercial distribution and only if you |
|||
received the program in object code or executable form with such |
|||
an offer, in accord with Subsection b above.) |
|||
|
|||
The source code for a work means the preferred form of the work for |
|||
making modifications to it. For an executable work, complete source |
|||
code means all the source code for all modules it contains, plus any |
|||
associated interface definition files, plus the scripts used to |
|||
control compilation and installation of the executable. However, as a |
|||
special exception, the source code distributed need not include |
|||
anything that is normally distributed (in either source or binary |
|||
form) with the major components (compiler, kernel, and so on) of the |
|||
operating system on which the executable runs, unless that component |
|||
itself accompanies the executable. |
|||
|
|||
If distribution of executable or object code is made by offering |
|||
access to copy from a designated place, then offering equivalent |
|||
access to copy the source code from the same place counts as |
|||
distribution of the source code, even though third parties are not |
|||
compelled to copy the source along with the object code. |
|||
|
|||
4. You may not copy, modify, sublicense, or distribute the Program |
|||
except as expressly provided under this License. Any attempt |
|||
otherwise to copy, modify, sublicense or distribute the Program is |
|||
void, and will automatically terminate your rights under this License. |
|||
However, parties who have received copies, or rights, from you under |
|||
this License will not have their licenses terminated so long as such |
|||
parties remain in full compliance. |
|||
|
|||
5. You are not required to accept this License, since you have not |
|||
signed it. However, nothing else grants you permission to modify or |
|||
distribute the Program or its derivative works. These actions are |
|||
prohibited by law if you do not accept this License. Therefore, by |
|||
modifying or distributing the Program (or any work based on the |
|||
Program), you indicate your acceptance of this License to do so, and |
|||
all its terms and conditions for copying, distributing or modifying |
|||
the Program or works based on it. |
|||
|
|||
6. Each time you redistribute the Program (or any work based on the |
|||
Program), the recipient automatically receives a license from the |
|||
original licensor to copy, distribute or modify the Program subject to |
|||
these terms and conditions. You may not impose any further |
|||
restrictions on the recipients' exercise of the rights granted herein. |
|||
You are not responsible for enforcing compliance by third parties to |
|||
this License. |
|||
|
|||
7. If, as a consequence of a court judgment or allegation of patent |
|||
infringement or for any other reason (not limited to patent issues), |
|||
conditions are imposed on you (whether by court order, agreement or |
|||
otherwise) that contradict the conditions of this License, they do not |
|||
excuse you from the conditions of this License. If you cannot |
|||
distribute so as to satisfy simultaneously your obligations under this |
|||
License and any other pertinent obligations, then as a consequence you |
|||
may not distribute the Program at all. For example, if a patent |
|||
license would not permit royalty-free redistribution of the Program by |
|||
all those who receive copies directly or indirectly through you, then |
|||
the only way you could satisfy both it and this License would be to |
|||
refrain entirely from distribution of the Program. |
|||
|
|||
If any portion of this section is held invalid or unenforceable under |
|||
any particular circumstance, the balance of the section is intended to |
|||
apply and the section as a whole is intended to apply in other |
|||
circumstances. |
|||
|
|||
It is not the purpose of this section to induce you to infringe any |
|||
patents or other property right claims or to contest validity of any |
|||
such claims; this section has the sole purpose of protecting the |
|||
integrity of the free software distribution system, which is |
|||
implemented by public license practices. Many people have made |
|||
generous contributions to the wide range of software distributed |
|||
through that system in reliance on consistent application of that |
|||
system; it is up to the author/donor to decide if he or she is willing |
|||
to distribute software through any other system and a licensee cannot |
|||
impose that choice. |
|||
|
|||
This section is intended to make thoroughly clear what is believed to |
|||
be a consequence of the rest of this License. |
|||
|
|||
8. If the distribution and/or use of the Program is restricted in |
|||
certain countries either by patents or by copyrighted interfaces, the |
|||
original copyright holder who places the Program under this License |
|||
may add an explicit geographical distribution limitation excluding |
|||
those countries, so that distribution is permitted only in or among |
|||
countries not thus excluded. In such case, this License incorporates |
|||
the limitation as if written in the body of this License. |
|||
|
|||
9. The Free Software Foundation may publish revised and/or new versions |
|||
of the General Public License from time to time. Such new versions will |
|||
be similar in spirit to the present version, but may differ in detail to |
|||
address new problems or concerns. |
|||
|
|||
Each version is given a distinguishing version number. If the Program |
|||
specifies a version number of this License which applies to it and "any |
|||
later version", you have the option of following the terms and conditions |
|||
either of that version or of any later version published by the Free |
|||
Software Foundation. If the Program does not specify a version number of |
|||
this License, you may choose any version ever published by the Free Software |
|||
Foundation. |
|||
|
|||
10. If you wish to incorporate parts of the Program into other free |
|||
programs whose distribution conditions are different, write to the author |
|||
to ask for permission. For software which is copyrighted by the Free |
|||
Software Foundation, write to the Free Software Foundation; we sometimes |
|||
make exceptions for this. Our decision will be guided by the two goals |
|||
of preserving the free status of all derivatives of our free software and |
|||
of promoting the sharing and reuse of software generally. |
|||
|
|||
NO WARRANTY |
|||
|
|||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY |
|||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN |
|||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES |
|||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED |
|||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
|||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS |
|||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE |
|||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, |
|||
REPAIR OR CORRECTION. |
|||
|
|||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
|||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR |
|||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, |
|||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING |
|||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED |
|||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY |
|||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER |
|||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE |
|||
POSSIBILITY OF SUCH DAMAGES. |
|||
|
|||
END OF TERMS AND CONDITIONS |
|||
|
|||
How to Apply These Terms to Your New Programs |
|||
|
|||
If you develop a new program, and you want it to be of the greatest |
|||
possible use to the public, the best way to achieve this is to make it |
|||
free software which everyone can redistribute and change under these terms. |
|||
|
|||
To do so, attach the following notices to the program. It is safest |
|||
to attach them to the start of each source file to most effectively |
|||
convey the exclusion of warranty; and each file should have at least |
|||
the "copyright" line and a pointer to where the full notice is found. |
|||
|
|||
{description} |
|||
Copyright (C) {year} {fullname} |
|||
|
|||
This program is free software; you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation; either version 2 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
This program is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License along |
|||
with this program; if not, write to the Free Software Foundation, Inc., |
|||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
|||
|
|||
Also add information on how to contact you by electronic and paper mail. |
|||
|
|||
If the program is interactive, make it output a short notice like this |
|||
when it starts in an interactive mode: |
|||
|
|||
Gnomovision version 69, Copyright (C) year name of author |
|||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
|||
This is free software, and you are welcome to redistribute it |
|||
under certain conditions; type `show c' for details. |
|||
|
|||
The hypothetical commands `show w' and `show c' should show the appropriate |
|||
parts of the General Public License. Of course, the commands you use may |
|||
be called something other than `show w' and `show c'; they could even be |
|||
mouse-clicks or menu items--whatever suits your program. |
|||
|
|||
You should also get your employer (if you work as a programmer) or your |
|||
school, if any, to sign a "copyright disclaimer" for the program, if |
|||
necessary. Here is a sample; alter the names: |
|||
|
|||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program |
|||
`Gnomovision' (which makes passes at compilers) written by James Hacker. |
|||
|
|||
{signature of Ty Coon}, 1 April 1989 |
|||
Ty Coon, President of Vice |
|||
|
|||
This General Public License does not permit incorporating your program into |
|||
proprietary programs. If your program is a subroutine library, you may |
|||
consider it more useful to permit linking proprietary applications with the |
|||
library. If this is what you want to do, use the GNU Lesser General |
|||
Public License instead of this License. |
@ -0,0 +1,52 @@ |
|||
Awesome-Freedesktop |
|||
=================== |
|||
|
|||
------------------------------------------------------------------- |
|||
Freedesktop.org menu and desktop icons support for Awesome WM 4.x |
|||
------------------------------------------------------------------- |
|||
|
|||
:Original author: Antonio Terceiro |
|||
:Maintainer: Luca CPZ |
|||
:Version: git |
|||
:License: GNU-GPL2_ |
|||
:Source: https://github.com/lcpz/awesome-freedesktop |
|||
|
|||
Description |
|||
----------- |
|||
|
|||
This is a port of awesome-freedesktop_ to Awesome_ 4.x. |
|||
|
|||
See branches_ for previous versions. |
|||
|
|||
Since the introduction of Menubar_ as core library for providing Freedesktop.org menu functionalities in Awesome, |
|||
we can now avoid all the dirty work by just exploiting ``menubar.utils`` functions. |
|||
|
|||
At the initial status of this port, the menu is pretty much complete, while the desktop icons are very basic, |
|||
so the long term objective will be to complete functionalities on this part too. |
|||
|
|||
More specifically, the todo list is: |
|||
|
|||
- A better way to handle desktop icons path |
|||
- Ability to drag and line up icons |
|||
- Event-based signals, in particular: |
|||
- Updating trash icon according to its status |
|||
- Dynamic update (no need to restart Awesome to see changes on desktop) |
|||
|
|||
Screenshot |
|||
---------- |
|||
|
|||
.. image:: screenshot.png |
|||
:align: center |
|||
:alt: Showcase of Freedesktop support in Awesome, using Adwaita icons |
|||
|
|||
Installation and usage |
|||
---------------------- |
|||
|
|||
Read the wiki_. |
|||
|
|||
.. _GNU-GPL2: http://www.gnu.org/licenses/gpl-2.0.html |
|||
.. _awesome-freedesktop: https://github.com/terceiro/awesome-freedesktop |
|||
.. _Awesome: https://github.com/awesomeWM/awesome |
|||
.. _branches: https://github.com/lcpz/awesome-freedesktop/branches |
|||
.. _Menubar: https://github.com/awesomeWM/awesome/tree/master/lib/menubar |
|||
.. _wiki: https://github.com/lcpz/awesome-freedesktop/wiki |
@ -0,0 +1,20 @@ |
|||
package = "awesome-freedesktop" |
|||
version = "scm-1" |
|||
source = { |
|||
url = "https://github.com/lcpz/awesome-freedesktop", |
|||
tag = "scm-1`" |
|||
} |
|||
description = { |
|||
summary = "Freedesktop.org menu and desktop icons support for Awesome WM", |
|||
homepage = "https://github.com/lcpz/awesome-freedesktop", |
|||
license = "GPL v2" |
|||
} |
|||
dependencies = { |
|||
"lua >= 5.3", |
|||
"awesome >= 4.0" |
|||
} |
|||
supported_platforms = { "linux" } |
|||
build = { |
|||
type = "builtin", |
|||
modules = { freedesktop = "init.lua" } |
|||
} |
@ -0,0 +1,254 @@ |
|||
--[[ |
|||
|
|||
Awesome-Freedesktop |
|||
Freedesktop.org compliant desktop entries and menu |
|||
|
|||
Desktop section |
|||
|
|||
Licensed under GNU General Public License v2 |
|||
* (c) 2016, Luke Bonham |
|||
* (c) 2009-2015, Antonio Terceiro |
|||
|
|||
--]] |
|||
|
|||
local awful = require("awful") |
|||
local theme = require("beautiful") |
|||
local utils = require("menubar.utils") |
|||
local wibox = require("wibox") |
|||
|
|||
local capi = capi |
|||
local io = io |
|||
local ipairs = ipairs |
|||
local mouse = mouse |
|||
local os = os |
|||
local string = string |
|||
local table = table |
|||
|
|||
-- Desktop icons |
|||
-- freedesktop.desktop |
|||
local desktop = { |
|||
-- Default desktop basic icons |
|||
baseicons = { |
|||
[1] = { |
|||
label = "This PC", |
|||
icon = "computer", |
|||
onclick = "computer://" |
|||
}, |
|||
[2] = { |
|||
label = "Home", |
|||
icon = "user-home", |
|||
onclick = os.getenv("HOME") |
|||
}, |
|||
[3] = { |
|||
label = "Trash", |
|||
icon = "user-trash", |
|||
onclick = "trash://" |
|||
} |
|||
}, |
|||
-- Default parameters |
|||
iconsize = { width = 48, height = 48 }, |
|||
labelsize = { width = 140, height = 20 }, |
|||
margin = { x = 20, y = 20 }, |
|||
} |
|||
|
|||
-- MIME types list |
|||
local mime_types = {} |
|||
|
|||
-- Icons positioning |
|||
local desktop_current_pos = {} |
|||
|
|||
-- @return iterator on input pipe |
|||
local function pipelines(...) |
|||
local f = assert(io.popen(...)) |
|||
return function () |
|||
local data = f:read() |
|||
if data == nil then f:close() end |
|||
return data |
|||
end |
|||
end |
|||
|
|||
-- Adds an icon to desktop |
|||
-- @param args settings from desktop.add_icons |
|||
-- @param label icon string label |
|||
-- @param icon icon string file path |
|||
-- @param onclick function to execute on click |
|||
function desktop.add_single_icon(args, label, icon, onclick) |
|||
local s = args.screen |
|||
|
|||
-- define icon dimensions and position |
|||
if not desktop_current_pos[s] then |
|||
desktop_current_pos[s] = { x = (capi.screen[s].geometry.x + args.iconsize.width + args.margin.x), y = 40 } |
|||
end |
|||
|
|||
local totheight = (icon and args.iconsize.height or 0) + (label and args.labelsize.height or 0) |
|||
if totheight == 0 then return end |
|||
|
|||
if desktop_current_pos[s].y + totheight > capi.screen[s].geometry.height - 40 then |
|||
desktop_current_pos[s].x = desktop_current_pos[s].x + args.labelsize.width + args.iconsize.width + args.margin.x |
|||
desktop_current_pos[s].y = 40 |
|||
end |
|||
|
|||
local common = { screen = s, bg = "#00000000", visible = true, type = "desktop" } |
|||
|
|||
-- create icon container |
|||
if icon then |
|||
common.width = args.iconsize.width |
|||
common.height = args.iconsize.height |
|||
common.x = desktop_current_pos[s].x |
|||
common.y = desktop_current_pos[s].y |
|||
|
|||
icon = wibox.widget { |
|||
image = icon, |
|||
resize = false, |
|||
widget = wibox.widget.imagebox |
|||
} |
|||
|
|||
icon:buttons(awful.button({ }, 1, nil, onclick)) |
|||
|
|||
icon_container = wibox(common) |
|||
icon_container:set_widget(icon) |
|||
|
|||
desktop_current_pos[s].y = desktop_current_pos[s].y + args.iconsize.height + 5 |
|||
end |
|||
|
|||
-- create label container |
|||
if label then |
|||
common.width = args.labelsize.width |
|||
common.height = args.labelsize.height |
|||
common.x = desktop_current_pos[s].x - (args.labelsize.width/2) + args.iconsize.width/2 |
|||
common.y = desktop_current_pos[s].y |
|||
|
|||
caption = wibox.widget { |
|||
text = label, |
|||
align = "center", |
|||
forced_width = common.width, |
|||
forced_height = common.height, |
|||
ellipsize = "middle", |
|||
widget = wibox.widget.textbox |
|||
} |
|||
|
|||
caption:buttons(awful.button({ }, 1, onclick)) |
|||
caption_container = wibox(common) |
|||
caption_container:set_widget(caption) |
|||
end |
|||
|
|||
desktop_current_pos[s].y = desktop_current_pos[s].y + args.labelsize.height + args.margin.y |
|||
end |
|||
|
|||
-- Adds base icons (This PC, Trash, etc) to desktop |
|||
-- @param args settings from desktop.add_icons |
|||
function desktop.add_base_icons(args) |
|||
for _,base in ipairs(args.baseicons) do |
|||
desktop.add_single_icon(args, base.label, utils.lookup_icon(base.icon), function() |
|||
awful.spawn(string.format("%s '%s'", args.open_with, base.onclick)) |
|||
end) |
|||
end |
|||
end |
|||
|
|||
-- Looks up a suitable icon for filename |
|||
-- @param filename string file name |
|||
-- @return icon file path (string) |
|||
function desktop.lookup_file_icon(filename) |
|||
-- load system MIME types |
|||
if #mime_types == 0 then |
|||
for line in io.lines("/etc/mime.types") do |
|||
if not line:find("^#") then |
|||
local parsed = {} |
|||
for w in line:gmatch("[^%s]+") do |
|||
table.insert(parsed, w) |
|||
end |
|||
if #parsed > 1 then |
|||
for i = 2, #parsed do |
|||
mime_types[parsed[i]] = parsed[1]:gsub("/", "-") |
|||
end |
|||
end |
|||
end |
|||
end |
|||
end |
|||
|
|||
-- try to search a possible icon among standards |
|||
local extension = filename:match("%a+$") |
|||
local mime = mime_types[extension] or "" |
|||
local mime_family = mime:match("^%a+") or "" |
|||
|
|||
local possible_filenames = { |
|||
mime, "gnome-mime-" .. mime, |
|||
mime_family, "gnome-mime-" .. mime_family, |
|||
extension |
|||
} |
|||
|
|||
for i, filename in ipairs(possible_filenames) do |
|||
local icon = utils.lookup_icon(filename) |
|||
if icon then return icon end |
|||
end |
|||
|
|||
-- if we don"t find ad icon, then pretend is a plain text file |
|||
return utils.lookup_icon("text-x-generic") |
|||
end |
|||
|
|||
-- Parse subdirectories and files list from input directory |
|||
-- @input dir directory to parse (string) |
|||
-- @return files table with found entries |
|||
function desktop.parse_dirs_and_files(dir) |
|||
local files = {} |
|||
local paths = pipelines('find '..dir..' -maxdepth 1 -type d | tail -1') |
|||
for path in paths do |
|||
if path:match("[^/]+$") then |
|||
local file = {} |
|||
file.filename = path:match("[^/]+$") |
|||
file.path = path |
|||
file.show = true |
|||
file.icon = utils.lookup_icon("folder") |
|||
table.insert(files, file) |
|||
end |
|||
end |
|||
local paths = pipelines('find '..dir..' -maxdepth 1 -type f') |
|||
for path in paths do |
|||
if not path:find("%.desktop$") then |
|||
local file = {} |
|||
file.filename = path:match("[^/]+$") |
|||
file.path = path |
|||
file.show = true |
|||
file.icon = desktop.lookup_file_icon(file.filename) |
|||
table.insert(files, file) |
|||
end |
|||
end |
|||
return files |
|||
end |
|||
|
|||
-- Adds subdirectories and files icons from args.dir |
|||
-- @param args settings from desktop.add_icons |
|||
function desktop.add_dirs_and_files_icons(args) |
|||
for _, file in ipairs(desktop.parse_dirs_and_files(args.dir)) do |
|||
if file.show then |
|||
local label = args.showlabels and file.filename or nil |
|||
local onclick = function () awful.spawn(string.format("%s '%s'", args.open_with, file.path)) end |
|||
desktop.add_single_icon(args, label, file.icon, onclick) |
|||
end |
|||
end |
|||
end |
|||
|
|||
-- Main function, adds base, directory and files icons |
|||
-- @param args user defined settings, with fallback on defaults |
|||
function desktop.add_icons(args) |
|||
args = args or {} |
|||
args.screen = args.screen or mouse.screen |
|||
args.dir = args.dir or os.getenv("HOME") .. "/Desktop" |
|||
args.showlabels = args.showlabel or true |
|||
args.open_with = args.open_with or "xdg_open" |
|||
args.baseicons = args.baseicons or desktop.baseicons |
|||
args.iconsize = args.iconsize or desktop.iconsize |
|||
args.labelsize = args.labelsize or desktop.labelsize |
|||
args.margin = args.margin or desktop.margin |
|||
|
|||
-- trying to fallback on Adwaita if theme.icon_theme is not defined |
|||
-- if Adwaita is missing too, no icons will be shown |
|||
if not theme.icon_theme then |
|||
theme.icon_theme = args.icon_theme or "Adwaita" |
|||
end |
|||
|
|||
desktop.add_base_icons(args) |
|||
desktop.add_dirs_and_files_icons(args) |
|||
end |
|||
|
|||
return desktop |
@ -0,0 +1,15 @@ |
|||
--[[ |
|||
|
|||
Awesome-Freedesktop |
|||
Freedesktop.org compliant desktop entries and menu |
|||
|
|||
Licensed under GNU General Public License v2 |
|||
* (c) 2016, Luke Bonham |
|||
* (c) 2009-2015, Antonio Terceiro |
|||
|
|||
--]] |
|||
|
|||
return { |
|||
desktop = require("freedesktop.desktop"), |
|||
menu = require("freedesktop.menu") |
|||
} |
@ -0,0 +1,133 @@ |
|||
--[[ |
|||
|
|||
Awesome-Freedesktop |
|||
Freedesktop.org compliant desktop entries and menu |
|||
|
|||
Menu section |
|||
|
|||
Licensed under GNU General Public License v2 |
|||
* (c) 2016, Luke Bonham |
|||
* (c) 2014, Harvey Mittens |
|||
|
|||
--]] |
|||
|
|||
local awful_menu = require("awful.menu") |
|||
local menu_gen = require("menubar.menu_gen") |
|||
local menu_utils = require("menubar.utils") |
|||
local icon_theme = require("menubar.icon_theme") |
|||
|
|||
local io, pairs, string, table, os = io, pairs, string, table, os |
|||
|
|||
-- Add support for NixOS systems too |
|||
table.insert(menu_gen.all_menu_dirs, string.format("%s/.nix-profile/share/applications", os.getenv("HOME"))) |
|||
|
|||
-- Expecting a wm_name of awesome omits too many applications and tools |
|||
menu_utils.wm_name = "" |
|||
|
|||
-- Menu |
|||
-- freedesktop.menu |
|||
local menu = {} |
|||
|
|||
-- Determines if a path points to a directory, by checking if it can be read |
|||
-- (which is `nil` also for empty files) and if its size is not 0. |
|||
-- @author blueyed |
|||
-- @param path the path to check |
|||
function menu.is_dir(path) |
|||
local f = io.open(path) |
|||
return f and not f:read(0) and f:seek("end") ~= 0 and f:close() |
|||
end |
|||
|
|||
-- Remove non existent paths in order to avoid issues |
|||
local existent_paths = {} |
|||
for k,v in pairs(menu_gen.all_menu_dirs) do |
|||
if menu.is_dir(v) then |
|||
table.insert(existent_paths, v) |
|||
end |
|||
end |
|||
menu_gen.all_menu_dirs = existent_paths |
|||
|
|||
-- Determines whether an table includes a certain element |
|||
-- @param tab a given table |
|||
-- @param val the element to search for |
|||
-- @return true if the given string is found within the search table; otherwise, false if not |
|||
function menu.has_value (tab, val) |
|||
for index, value in pairs(tab) do |
|||
if val:find(value) then |
|||
return true |
|||
end |
|||
end |
|||
return false |
|||
end |
|||
|
|||
-- Use MenuBar parsing utils to build a menu for Awesome |
|||
-- @return awful.menu |
|||
function menu.build(args) |
|||
local args = args or {} |
|||
local icon_size = args.icon_size |
|||
local before = args.before or {} |
|||
local after = args.after or {} |
|||
local skip_items = args.skip_items or {} |
|||
local sub_menu = args.sub_menu or false |
|||
|
|||
local result = {} |
|||
local _menu = awful_menu({ items = before }) |
|||
|
|||
menu_gen.generate(function(entries) |
|||
-- Add category icons |
|||
for k, v in pairs(menu_gen.all_categories) do |
|||
table.insert(result, { k, {}, v.icon }) |
|||
end |
|||
|
|||
-- Get items table |
|||
for k, v in pairs(entries) do |
|||
for _, cat in pairs(result) do |
|||
if cat[1] == v.category then |
|||
if not menu.has_value(skip_items, v.name) then |
|||
table.insert(cat[2], { v.name, v.cmdline, v.icon }) |
|||
end |
|||
break |
|||
end |
|||
end |
|||
end |
|||
|
|||
-- Cleanup things a bit |
|||
for i = #result, 1, -1 do |
|||
local v = result[i] |
|||
if #v[2] == 0 then |
|||
-- Remove unused categories |
|||
table.remove(result, i) |
|||
else |
|||
--Sort entries alphabetically (by name) |
|||
table.sort(v[2], function (a, b) return string.byte(a[1]) < string.byte(b[1]) end) |
|||
-- Replace category name with nice name |
|||
v[1] = menu_gen.all_categories[v[1]].name |
|||
end |
|||
end |
|||
|
|||
-- Sort categories alphabetically also |
|||
table.sort(result, function(a, b) return string.byte(a[1]) < string.byte(b[1]) end) |
|||
|
|||
-- Add menu item to hold the generated menu |
|||
if sub_menu then |
|||
result = {{sub_menu, result}} |
|||
end |
|||
|
|||
-- Add items to menu |
|||
for _, v in pairs(result) do _menu:add(v) end |
|||
for _, v in pairs(after) do _menu:add(v) end |
|||
end) |
|||
|
|||
-- Set icon size |
|||
if icon_size then |
|||
for _,v in pairs(menu_gen.all_categories) do |
|||
v.icon = icon_theme():find_icon_path(v.icon_name, icon_size) |
|||
end |
|||
end |
|||
|
|||
-- Hold the menu in the module |
|||
menu.menu = _menu |
|||
|
|||
return _menu |
|||
end |
|||
|
|||
return menu |
After Width: 475 | Height: 475 | Size: 24 KiB |
@ -0,0 +1,627 @@ |
|||
-- 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 |
|||
-- Enable hotkeys help widget for VIM and other apps |
|||
-- when client with a matching name is opened: |
|||
require("awful.hotkeys_popup.keys") |
|||
|
|||
-- Load Debian menu entries |
|||
local debian = require("debian.menu") |
|||
local has_fdo, freedesktop = pcall(require, "freedesktop") |
|||
-- Improve startup time of menubar |
|||
menubar.menu_gen.lookup_category_icons = function() end |
|||
|
|||
-- {{{ 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(gears.filesystem.get_themes_dir() .. "default/theme.lua") |
|||
|
|||
-- This is used later as the default terminal and editor to run. |
|||
terminal = "x-terminal-emulator" |
|||
editor = os.getenv("EDITOR") or "editor" |
|||
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.floating, |
|||
awful.layout.suit.tile, |
|||
awful.layout.suit.tile.left, |
|||
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, |
|||
} |
|||
-- }}} |
|||
|
|||
-- {{{ 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} |
|||
} |
|||
|
|||
local menu_awesome = { "awesome", myawesomemenu, beautiful.awesome_icon } |
|||
local menu_terminal = { "open terminal", terminal } |
|||
|
|||
if has_fdo then |
|||
mymainmenu = freedesktop.menu.build({ |
|||
before = { menu_awesome }, |
|||
after = { menu_terminal } |
|||
}) |
|||
else |
|||
mymainmenu = awful.menu({ |
|||
items = { |
|||
menu_awesome, |
|||
{ "Debian", debian.menu.Debian_menu.Debian }, |
|||
menu_terminal, |
|||
} |
|||
}) |
|||
end |
|||
|
|||
|
|||
mylauncher = awful.widget.launcher({ image = beautiful.awesome_icon, |
|||
menu = mymainmenu }) |
|||
|
|||
-- Menubar configuration |
|||
menubar.utils.terminal = terminal -- Set the terminal for applications that require it |
|||
menubar.cache_entries = true |
|||
-- }}} |
|||
|
|||
-- Keyboard map indicator and switcher |
|||
mykeyboardlayout = awful.widget.keyboardlayout() |
|||
|
|||
-- {{{ Wibar |
|||
-- imports |
|||
local cpu_widget = require("awesome-wm-widgets.cpu-widget.cpu-widget") |
|||
local ram_widget = require("awesome-wm-widgets.ram-widget.ram-widget") |
|||
local volume_control = require("volume-control") |
|||
volumecfg = volume_control {device="pulse"} |
|||
|
|||
-- Create a textclock widget |
|||
mytextclock = wibox.widget.textclock() |
|||
|
|||
-- Create a wibox for each screen and add it |
|||
local taglist_buttons = gears.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 = gears.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 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" }, s, awful.layout.layouts[1]) |
|||
|
|||
-- Create a promptbox for each screen |
|||
s.mypromptbox = awful.widget.prompt() |
|||
-- Create an imagebox widget which will contain an icon indicating which layout we're using. |
|||
-- We need one layoutbox per screen. |
|||
s.mylayoutbox = awful.widget.layoutbox(s) |
|||
s.mylayoutbox:buttons(gears.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 }) |
|||
|
|||
local sep = wibox.widget { |
|||
widget = wibox.widget.separator |
|||
} |
|||
|
|||
-- Add widgets to the wibox |
|||
s.mywibox:setup { |
|||
layout = wibox.layout.align.horizontal, |
|||
{ -- Left widgets |
|||
layout = wibox.layout.fixed.horizontal, |
|||
mylauncher, |
|||
s.mytaglist, |
|||
s.mypromptbox, |
|||
}, |
|||
s.mytasklist, -- Middle widget |
|||
{ -- Right widgets |
|||
layout = wibox.layout.fixed.horizontal, |
|||
cpu_widget(), |
|||
ram_widget(), |
|||
sep, |
|||
volumecfg.widget, |
|||
sep, |
|||
mykeyboardlayout, |
|||
wibox.widget.systray(), |
|||
mytextclock, |
|||
s.mylayoutbox, |
|||
}, |
|||
} |
|||
end) |
|||
-- }}} |
|||
|
|||
-- {{{ Mouse bindings |
|||
root.buttons(gears.table.join( |
|||
awful.button({ }, 3, function () mymainmenu:toggle() end), |
|||
awful.button({ }, 4, awful.tag.viewnext), |
|||
awful.button({ }, 5, awful.tag.viewprev) |
|||
)) |
|||
-- }}} |
|||
|
|||
-- {{{ Key bindings |
|||
globalkeys = gears.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() |
|||
if client.focus then |
|||
client.focus:raise() |
|||
end |
|||
end, |
|||
{description = "go back", group = "client"}), |
|||
|
|||
-- Standard program |
|||
awful.key({ modkey, }, "Return", function () awful.spawn(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"}), |
|||
|
|||
-- Volume |
|||
awful.key({}, "XF86AudioRaiseVolume", function() volumecfg:up() end), |
|||
awful.key({}, "XF86AudioLowerVolume", function() volumecfg:down() end), |
|||
awful.key({}, "XF86AudioMute", function() volumecfg:toggle() end), |
|||
|
|||
-- applications |
|||
awful.key({}, "XF86Calculator", function() awful.util.spawn("qalculate-gtk") end), |
|||
awful.key({}, "XF86Launch5", function() awful.util.spawn_with_shell("echo -e 'connect 44:EA:D8:39:BB:4B\nquit' | bluetoothctl") end), |
|||
awful.key({}, "XF86Launch6", function() awful.util.spawn_with_shell("echo -e 'disconnect 44:EA:D8:39:BB:4B\nquit' | bluetoothctl") end), |
|||
awful.key({}, "Print", function() awful.util.spawn_with_shell("spectacle") end), |
|||
awful.key({ modkey }, "Print", function() awful.util.spawn_with_shell("spectacle -r") end) |
|||
) |
|||
|
|||
clientkeys = gears.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 = "(un)maximize", group = "client"}), |
|||
awful.key({ modkey, "Control" }, "m", |
|||
function (c) |
|||
c.maximized_vertical = not c.maximized_vertical |
|||
c:raise() |
|||
end , |
|||
{description = "(un)maximize vertically", group = "client"}), |
|||
awful.key({ modkey, "Shift" }, "m", |
|||
function (c) |
|||
c.maximized_horizontal = not c.maximized_horizontal |
|||
c:raise() |
|||
end , |
|||
{description = "(un)maximize horizontally", group = "client"}) |
|||
) |
|||
|
|||
-- Bind all key numbers to tags. |
|||
-- Be careful: we use keycodes to make it work on any keyboard layout. |
|||
-- This should map on the top row of your keyboard, usually 1 to 9. |
|||
for i = 1, 9 do |
|||
globalkeys = gears.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) |
|||
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 = gears.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 = true } |
|||
}, |
|||
|
|||
-- 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 = gears.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) |
|||
-- }}} |
|||
|
|||
-- Autostart {{{ |
|||
autorun = true |
|||
autorunApps = |
|||
{ |
|||
"nextcloud", |
|||
"clementine", |
|||
"keepassxc", |
|||
} |
|||
if autorun then |
|||
for app = 1, #autorunApps do |
|||
awful.util.spawn(autorunApps[app]) |
|||
end |
|||
end |
|||
-- }}} |
|||
|
|||
-- own settings {{{ |
|||
awful.spawn.with_shell("~/.config/awesome/autorun.sh") |
|||
-- }}} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue