#+TITLE: Aweomsome WM Config
#+PROPERTY: header-args :tangle rc.lua

execute this command for lain library
git clone https://github.com/lcpz/lain.git ~/.config/awesome/lain

* Loading
  #+begin_src lua
    -- If LuaRocks is installed, make sure that packages installed through it are
    -- found (e.g. lgi). If LuaRocks is not installed, do nothing.
    pcall(require, "luarocks.loader")

    -- 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")
    -- 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")
  #+end_src
* Error handling
  #+begin_src lua
    -- {{{ 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
    -- }}}
  #+end_src
* Variable definitions
  It's nice to assign values to stuff that you will use more than once
  in the config. Setting values for things like font, terminal and editor
  means you only have to change the value here to make changes globally.
  #+BEGIN_SRC lua
    -- {{{ 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          = "kitty"
    editor            = os.getenv("EDITOR") or "nvim"
    editor_cmd        = terminal .. " -e " .. editor
    editorgui         = "emacsclient -a '' -c"
    browser1          = "palemoon"
    browser2          = "luakit"
    filemanager       = "rox"
    mailclient        = "kitty -e aerc"
    mediaplayer       = "mpv"
    scrlocker         = "slock"

    -- 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"
    altkey = "Mod1"

    -- 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,
    }
    -- }}}
  #+END_SRC
* Menu
  #+begin_src lua
    -- {{{ Menu
    -- Create a launcher widget and a main menu
    myawesomemenu = {
       { "hotkeys", function() hotkeys_popup.show_help(nil, awful.screen.focused()) 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
    -- }}}

    -- Keyboard map indicator and switcher
    mykeyboardlayout = awful.widget.keyboardlayout()
  #+end_src
* Wibar
  #+begin_src lua
    -- {{{ Wibar
    -- 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
		c:emit_signal(
		   "request::activate",
		   "tasklist",
		   {raise = true}
		)
	     end
       end),
       awful.button({ }, 3, function()
	     awful.menu.client_list({ theme = { width = 250 } })
       end),
       awful.button({ }, 4, function ()
	     awful.client.focus.byidx(1)
       end),
       awful.button({ }, 5, function ()
	     awful.client.focus.byidx(-1)
    end))

    awful.screen.connect_for_each_screen(function(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 {
	     screen  = s,
	     filter  = awful.widget.taglist.filter.all,
	     buttons = taglist_buttons
	  }

	  -- Create a tasklist widget
	  s.mytasklist = awful.widget.tasklist {
	     screen  = s,
	     filter  = awful.widget.tasklist.filter.currenttags,
	     buttons = 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,
		s.mypromptbox,
	     },
	     s.mytasklist, -- Middle widget
	     { -- Right widgets
		layout = wibox.layout.fixed.horizontal,
		mykeyboardlayout,
		wibox.widget.systray(),
		mytextclock,
		s.mylayoutbox,
	     },
	  }
    end)
    -- }}}
  #+end_src
* Mouse bindings
  #+begin_src lua
    -- {{{ 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)
    ))
    -- }}}
  #+end_src
* Keybindings
** all
   #+begin_src lua
     -- -- {{{ 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
     --                     c:emit_signal(
     --                         "request::activate", "key.unminimize", {raise = true}
     --                     )
     --                   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"})
     -- )

     -- 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)
     --         c:emit_signal("request::activate", "mouse_click", {raise = true})
     --     end),
     --     awful.button({ modkey }, 1, function (c)
     --         c:emit_signal("request::activate", "mouse_click", {raise = true})
     --         awful.mouse.client.move(c)
     --     end),
     --     awful.button({ modkey }, 3, function (c)
     --         c:emit_signal("request::activate", "mouse_click", {raise = true})
     --         awful.mouse.client.resize(c)
     --     end)
     -- )

     -- -- Set keys
     -- root.keys(globalkeys)
     -- -- }}}
   #+end_src

** Start
   #+BEGIN_SRC lua
     globalkeys = gears.table.join(
	awful.key({ modkey,           }, "/",      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"}),
   #+END_SRC

** Layout manipulation
   #+BEGIN_SRC lua
     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"}),
   #+END_SRC
** Standard programs
   #+begin_src lua
     awful.key({ modkey, "Shift" }, "Return", function () awful.spawn(terminal) end,
	{description = "open a terminal", group = "launcher"}),
	awful.key({ modkey, "Shift" }, "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"}),
   #+end_src
** MINE KEYBINDINGS
*** Terminal programs (Alt+Ctrl+Key)
    | Keybinding | Action       |
    |------------+--------------|
    | a          | pulsemixer   |
    | d          | stig         |
    | t          | tmux session |
    #+BEGIN_SRC lua
      awful.key({ altkey, "Control" }, "a", function () awful.util.spawn( terminal.." -e pulsemixer" ) end,
	 {description = "ncpamixer" , group = "terminal apps" }),
	 awful.key({ altkey, "Control" }, "d", function () awful.util.spawn( terminal.." -e stig" ) end,
	    {description = "torrents" , group = "terminal apps" }),
	 awful.key({ altkey, "Control" }, "t", function () awful.util.spawn( terminal.." -e tmux-session.sh" ) end,
	    {description = "tmux session" , group = "terminal apps" }),
    #+END_SRC
*** Screenshot (Super + CTRL)
    #+begin_src lua
	 awful.key({ }, "Print", function () os.execute("screenshot.sh fullscreen") end,
	    {description = "screenshot" , group = "terminal apps" }),
	 -- awful.key({ modkey, "Control" }, "m", function () os.execute("screenshot.sh fullscreen") end,
	 --    {description = "screenshot" , group = "terminal apps" }),
	 awful.key({ modkey, "Control" }, "f", function () os.execute("screenshot.sh focused") end,
	    {description = "screenshot" , group = "terminal apps" }),
	 awful.key({ modkey, "Control" }, "s", function () os.execute("screenshot.sh selection") end,
	    {description = "screenshot" , group = "terminal apps" }),
	 awful.key({ modkey, "Control" }, "u", function () os.execute("screenshot.sh selection upload") end,
	    {description = "screenshot" , group = "terminal apps" }),
	 awful.key({ modkey, "Control" }, "c", function () os.execute("screenshot.sh clipboard") end,
	    {description = "screenshot" , group = "terminal apps" }),
	 awful.key({ modkey, "Control" }, "1", function () os.execute("screenshot.sh 16x9") end,
	    {description = "screenshot" , group = "terminal apps" }),
	 awful.key({ modkey, "Control" }, "4", function () os.execute("screenshot.sh 4x3") end,
	    {description = "screenshot" , group = "terminal apps" }),
    #+end_src
*** Gui programs (Alt+Shift+Key)
    | Keybinding | Action      |
    |------------+-------------|
    | e          | emacs       |
    | b          | palemoon    |
    | v          | luaki       |
    | f          | rox         |
    | g          | steam       |
    | y          | freetube    |
    | a          | pavucontrol |
    #+BEGIN_SRC lua
      awful.key({ altkey, "Shift" }, "e", function () awful.util.spawn( editorgui ) end,
	 {description = "gui text editor" , group = "gui apps" }),
	 awful.key({ altkey, "Shift" }, "t", function () awful.util.spawn( "./Documents/ts3/ts3client_runscript.sh" ) end,
	    {description = "gui text editor" , group = "gui apps" }),
	 awful.key({ altkey, "Shift"  }, "f", function () awful.util.spawn( filemanager ) end,
	    {description = "file manager" , group = "gui apps" }),
	 awful.key({ altkey, "Shift" }, "b", function () awful.util.spawn( browser1 ) end,
	    {description = "palemoon web browser" , group = "gui apps" }),
	 awful.key({ altkey, "Shift" }, "v", function () awful.util.spawn( browser2 ) end,
	    {description = "luakit web browser" , group = "gui apps" }),
	 awful.key({ altkey, "Shift" }, "g", function () awful.util.spawn( "steam" ) end,
	    {description = "games" , group = "gui apps" }),
	 awful.key({ altkey, "Shift" }, "y", function () awful.util.spawn( "freetube" ) end,
	    {description = "youtube client" , group = "gui apps" }),
	 awful.key({ altkey, "Shift" }, "a", function () awful.util.spawn( "pavucontrol" ) end,
	    {description = "audio settings" , group = "gui apps" }),
    #+END_SRC

*** Send signals (Alt + key)
    | Key | Action                  |
    |-----+-------------------------|
    | n   | nitrogen next wallpaper |
    | s   | redshift set night mode |
    | r   | redshift reset          |
    | F2  | cmus decreace volume    |
    | F3  | cmus increace volume    |
    
    #+BEGIN_SRC lua
      awful.key({ altkey, }, "n", function () awful.util.spawn( "nitrogen --set-zoom-fill --random" ) end,
	 {description = "ncpamixer" , group = "signal" }),
	 awful.key({ altkey, }, "s", function () awful.util.spawn( "redshift -b 0.95 -O 5000K" ) end,
	    {description = "set night mode" , group = "signal" }),
	 awful.key({ altkey, }, "r", function () awful.util.spawn( "redshift -x" ) end,
	    {description = "reset night mode" , group = "signal" }),
	 awful.key({ altkey, }, "p", function () awful.util.spawn( "rofi -show drun -show-icons -sidebar-mode" ) end,
	    {description = "reset night mode" , group = "signal" }),
	 awful.key({ altkey, }, "F2", function () awful.util.spawn( "cmus-remote -v -2%" ) end,
	    {description = "decrease song volume" , group = "music control" }),
	 awful.key({ altkey, }, "F3", function () awful.util.spawn( "cmus-remote -v +2%" ) end,
	    {description = "increase song volume" , group = "music control" }),
    #+END_SRC
*** Function keys
    | Keybinding     | Action                 |
    |----------------+------------------------|
    | XF86Tools      | dunst show cover       |
    | XF86AudioStop  | cmus stop song         |
    | XF86AudioPlay  | cmus toggle play/pause |
    | XF86AudioPrev  | cmus prev song         |
    | XF86AudioNext  | cmus next song         |
    | XF86Calculator | rofi calculator        |
    #+BEGIN_SRC lua
      awful.key({ }, "XF86AudioLowerVolume", function () os.execute("pactl set-sink-volume @DEFAULT_SINK@ -5%") end,
	 {description = "audio", group = "function keys"}),
	 awful.key({ }, "XF86AudioRaiseVolume", function () os.execute("pactl set-sink-volume @DEFAULT_SINK@ +1%") end,
	    {description = "audio", group = "function keys"}),
	 awful.key({ }, "XF86AudioMute", function () os.execute("pactl set-sink-mute @DEFAULT_SINK@ toggle") end,
	    {description = "audio", group = "function keys"}),
	 awful.key({ }, "XF86AudioMicMute", function () os.execute("pactl set-source-mute @DEFAULT_SINK@ toggle") end,
	    {description = "audio", group = "function keys"}),
	 awful.key({ }, "XF86Tools", function () os.execute("cmus-notify.sh") end,
	    {description = "show coverart of song" , group = "music control" }),
	 awful.key({ }, "XF86AudioStop", function () os.execute("cmus-remote -s") end,
	    {description = "stop cmus" , group = "music control" }),
	 awful.key({ }, "XF86AudioPrev", function () os.execute("cmus-remote -s") end,
	    {description = "prev song" , group = "music control" }),
	 awful.key({ }, "XF86AudioPlay", function () os.execute("cmus-remote -u") end,
	    {description = "play/pause song" , group = "music control" }),
	 awful.key({ }, "XF86AudioNext", function () os.execute("cmus-remote -n") end,
	    {description = "next song" , group = "music control" }),
	 awful.key({ }, "XF86MonBrightnessUp", function () os.execute("xbacklight -inc 1") end,
	    {description = "+1%", group = "function keys"}),
	 awful.key({ }, "XF86MonBrightnessDown", function () os.execute("xbacklight -dec 2") end,
	    {description = "-2%", group = "function keys"}),
	 awful.key({ }, "XF86Mail", function () awful.util.spawn(terminal .. " -e aerc") end,
	    {description = "mail", group = "function keys"}),
	 awful.key({ }, "XF86HomePage", function () awful.util.spawn("rox") end,
	    {description = "file manager", group = "function keys"}),
	 awful.key({ }, "XF86Explorer", function () awful.util.spawn(terminal .. " -e btop") end,
	    {description = "process manager", group = "function keys"}),
	 awful.key({ }, "XF86Calculator", function () awful.util.spawn("rofi -show calc -modi 'calc:qalc +u8 -nocurrencies'") end,
	    {description = "rofi calculator", group = "function keys"}),
    #+END_SRC

** End
   #+BEGIN_SRC lua
     awful.key({ modkey, "Control" }, "n",
	function ()
	   local c = awful.client.restore()
	   -- Focus restored client
	   if c then
	      c:emit_signal(
		 "request::activate", "key.unminimize", {raise = true}
	      )
	   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"})
     )

     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,           }, "q",      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)
	      c:emit_signal("request::activate", "mouse_click", {raise = true})
	end),
	awful.button({ modkey }, 1, function (c)
	      c:emit_signal("request::activate", "mouse_click", {raise = true})
	      awful.mouse.client.move(c)
	end),
	awful.button({ modkey }, 3, function (c)
	      c:emit_signal("request::activate", "mouse_click", {raise = true})
	      awful.mouse.client.resize(c)
	end)
     )
     -- Set keys
     root.keys(globalkeys)
   #+END_SRC

* Rules
  Rules to apply to new clients (through the "manage" signal).
  #+BEGIN_SRC lua
    -- {{{ 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.
	       "pinentry",
	    },
	    class = {
	       "Arandr",
	       "Blueman-manager",
	       "Gpick",
	       "Kruler",
	       "MessageWin",  -- kalarm.
	       "Sxiv",
	       "Tor Browser", -- Needs a fixed window size to avoid fingerprinting by screen size.
	       "Wpa_gui",
	       "veromix",
	       "xtightvncviewer",
	       "Rox",
	       "Rox-Filer",
	       "Qalculate-gtk",
	       "Lxappearance",
	       "Pavucontrol",
	       "Quodlibet",
	       "Leafpad",
	       "Xarchiver",
	       "Steam",
	       "SimpleScreenrecorder"},

	    -- Note that the name property shown in xprop might be set slightly after creation of the client
	    -- and the name shown there might not match defined rules here.
	    name = {
	       "Event Tester",  -- xev.
	       "ImageMagick",
	       -- "Steam - News",
	       -- "Friends List",
	    },
	    role = {
	       "AlarmWindow",  -- Thunderbird's calendar.
	       "ConfigManager",  -- Thunderbird's about:config.
	       "pop-up",       -- e.g. Google Chrome's (detached) Developer Tools.
	       "task_dialog",
	       "About",
	    }
       }, 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" } },

       -- TAG 2
       { rule = { class = "Microsoft*" },
	 properties = { screen = 1, tag = "2" } },

       -- TAG 4
       { rule = { class = "Pale moon" },
	 properties = { screen = 1, tag = "4" } },
       { rule = { class = "Luakit" },
	 properties = { screen = 1, tag = "4" } },
       { rule = { class = "LibreWolf" },
	 properties = { screen = 1, tag = "4" } },
       -- { rule = { class = "qutebrowser" },
       -- 	 properties = { screen = 1, tag = "4" } },

       -- TAG 7
       { rule = { class = "Steam" },
	 properties = { screen = 1, tag = "7" } },
       { rule = { class = "Lutris" },
	 properties = { screen = 1, tag = "7" } },

       -- TAG 8
       { rule = { class = "TeamSpeak 3" },
	 properties = { screen = 1, tag = "8" } },
       { rule = { class = "discord" },
	 properties = { screen = 1, tag = "8" } },



       -- -- Set applications to be maximized at startup.
       -- -- find class or role via xprop command
       -- { rule = { class = editorgui },
       -- 	 properties = { maximized = true } },

       { rule = { class = "Gimp*", role = "gimp-image-window" },
	 properties = { maximized = true } },

       -- { rule = { class = "inkscape" },
       -- 	 properties = { maximized = true } },

       -- { rule = { class = mediaplayer },
       -- 	 properties = { maximized = true } },



    }
    -- }}}
  #+END_SRC

* Signals
  #+begin_src lua
    -- {{{ 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()
				      c:emit_signal("request::activate", "titlebar", {raise = true})
				      awful.mouse.client.move(c)
				end),
				awful.button({ }, 3, function()
				      c:emit_signal("request::activate", "titlebar", {raise = true})
				      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)
			     c:emit_signal("request::activate", "mouse_enter", {raise = false})
    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)
    -- }}}
  #+end_src
* Autostart
  #+BEGIN_SRC lua
    awful.spawn.with_shell("autostart.sh")
    awful.spawn.with_shell("tmux-session.sh")
    awful.spawn.with_shell("downloader.sh")
  #+END_SRC
