Sign in to follow this  
Followers 0

How To: Awesome WM with Debian/Ubuntu

11 posts in this topic

Posted

How to: Awesome WM 2.3.4 with Debian/Ubuntu/*buntu

First, install the awesome wm package

2 people like this

Share this post


Link to post
Share on other sites

Posted

Here is a screenshot of the above setup :

972p3d.jpg

2 people like this

Share this post


Link to post
Share on other sites

Posted

Some common Awesome commands:

(Mod key - 'Windows' key)

Mod+space = rotate open screen layout

Mod+h or l = scale focused window left or right, makes the window larger or smaller

Right-click on the empty screen to launch terminal

Mod + F1 = terminal

Mod + F2 = Awesome Menu

Mod + b = statusbar toggle

Mod + Ctrl + R = Reload Awesome

Mod + Shift + Q = Quit to login screen

Those listed above are the ones I use the most. More shortcuts can be found in the 'key' section of the .awesomerc file.

1 person likes this

Share this post


Link to post
Share on other sites

Posted

Thanks for posting this (Y) As soon as I get some time I'll try it, I've never played with tiling wm's before.

Share this post


Link to post
Share on other sites

Posted

Awesome is an awesome window manager. Personally, I prefer dwm, though. (Y)

Share this post


Link to post
Share on other sites

Posted

Love the background, but that's it. Sorry, looks a little too barebones for me! Thanks for the guide, though. A good learning experience!

Share this post


Link to post
Share on other sites

Posted

Thanks for posting this (Y) As soon as I get some time I'll try it, I've never played with tiling wm's before.

No problem :). Ive been using Awesome off and on for a while - I seem to keep coming back to it. Hopefully my rudimentary guide will help out.

Awesome is an awesome window manager. Personally, I prefer dwm, though. (Y)

I like DWM as well. It is installed by default on #!, although I never could tweak it to my likings. I may give it another shot though - I have heard good things about it. Also Xmonad as well.

Love the background, but that's it. Sorry, looks a little too barebones for me! Thanks for the guide, though. A good learning experience!

I understand completely. I kept going more minimalistic in my DE/WMs, not sure you can go more minimalistic than this. ;)

Share this post


Link to post
Share on other sites

Posted

I like minimal. I'm thinking I'll try this soon.

One question. In Ubuntu, Openbox has a feature I really like--holding down superkey brings up a little toggle where you can press the arrow keys to go through your open windows. I like avoiding the mouse as much as possible. Does Awesome do this, or at least can it be made to do this?

Share this post


Link to post
Share on other sites

Posted

I like minimal. I'm thinking I'll try this soon.

One question. In Ubuntu, Openbox has a feature I really like--holding down superkey brings up a little toggle where you can press the arrow keys to go through your open windows. I like avoiding the mouse as much as possible. Does Awesome do this, or at least can it be made to do this?

Mod+J will change focus to the open windows, one by one. Mod + arrow keys will rotate through the different desktops.

Share this post


Link to post
Share on other sites

Posted

I found some help on the interwebs about a load average/clock script that will display in the statusbar. For those that are unsure how a load average works, from our friends at wikipedia:

For example, one can interpret a load average of "1.73 0.50 7.98" on a single-CPU system as:

* during the last minute, the CPU was overloaded by 73% (1 CPU with 1.73 runnable processes, so that 0.73 processes had to wait for a turn)

* during the last 5 minutes, the CPU was underloaded 50% (no processes had to wait for a turn)

* during the last 15 minutes, the CPU was overloaded 698% (1 CPU with 7.98 runnable processes, so that 6.98 processes had to wait for a turn)

Add the following to the bottom of the 'statusbar' section in the .awesomerc

textbox uptime

        {

                style

                {

                    font = "sans 7"

                    fg = "#ffffff"

                }

                text = " 0.00 0.00 0.00 |"

                align = right

                text_align = right

                width = 0

                mouse

                {

                    button = "1"

                    command = "spawn"

                    arg = "exec x-terminal-emulator -e htop"

                }

        }

        textbox clock

        {

                style

                {

                    font = "sans 7"

                }

                text = " Day Mon 00, 00:00 "

                align = right

                text_align = left

                width = 0

        }
This will display the load average, and add a clock to the right of it. (this also adds a button that will launch htop, the process manager, when clicking on the load average) The script that will pipe the information is:
#!/bin/sh

#

while true

do

    if [ -S ~/.awesome_ctl.0 ]; then

        while true

        do

            echo "0 widget_tell mystatusbar clock text `date +\"%a %b %d, %k:%M\"` "

            echo "0 widget_tell mystatusbar uptime text `uptime | sed 's/.*://; s/,//g'` "

            echo "" # an empty line flushes data inside awesome

            sleep 10

        done | awesome-client

    else

        sleep 1

    fi

done
Save this as .awesomeclock.sh (or whatever) and save it in the .awesome directory. Make sure to make it executable by running
chmod +x .awesomeclock.sh
from the terminal in the .awesome directory. or
user@host:~/.awesome$ chmod +x .awesomeclock.sh
and add the following line to the .Xsession file
sh /home/lance/.awesome/awesomeclock.sh &

This will give the following result:

aetq9f.jpg

Hope this works...

Share this post


Link to post
Share on other sites

Posted

Since I have posted this hopefully helpful how-to, I have upgraded my Awesome setup from 2.3.4 to 3.4.1. This was a bigger chore than I had envisioned.

The config file itself went from an easy to understand text file to a config file driven by Lua. This brought some challenges, although the new config file allows for more customization and flexibility.

I had to use a user .ppa to upgrade the package itself, which once that was complete, my adventure began. After the installation was complete and I booted into my new Awesome setup, I had to start customizing. I found some very helpful tutorials on DesktopEvolution.org, posted by Darthlukan, which made the widget setup and statusbar customization fairly painless.

The .ppa is located here: http://ppa.launchpad.net/aguignard/ppa/ubuntu. Once enabled, update Synaptic and install Awesome 3.4.1.

To customize the statusbar to enable the cpu, mem, etc. widgets, follow the instructions laid out in Darthlukan's posts. He has made it very easy to follow. After all the widgets were installed and I almost achieved my customization goals, I still had one issue that bothered me. The open programs would display their icons in the status bar. I posed my question in several IRC and forum threads with no luck. I finally posted on Linuxquestions.org and was responded to by antegallya, which solved my issue. The following code had to be 'patched' into the /usr/share/awesom/lib/awful/widget/tasklist.lua file:

@@ -95,6 +95,10 @@

     local text = "<span font_desc='"..font.."'>"

     local name

     local status_image

+    local c_icon

+    if not args.hide_icon then

+        c_icon = c.icon

+    end

     if client.floating.get(c) and floating_icon then

         status_image = capi.image(floating_icon)

     end
@@ -120,7 +124,7 @@

         text = text .. name

     end

     text = text .. "</span>"

-    return text, bg, status_image, c.icon

+    return text, bg, status_image, c_icon

 end

To patch the file, add the code where there is a + symbol, and replace the code where the - symbol is. For help, here is my .rc.lua, which was copied from /etc/xdg/awesome/rc.lua -
-- Standard awesome library

require("awful")

require("awful.autofocus")

require("awful.rules")

-- Theme handling library

require("beautiful")

-- Notification library

require("naughty")

-- Widget library

require("vicious")


-- Load Debian menu entries

require("debian.menu")


-- {{{ Variable definitions

-- Themes define colours, icons, and wallpapers

beautiful.init("/home/lance/.config/awesome/theme.lua")


-- This is used later as the default terminal and editor to run.

terminal = "terminator"

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.

layouts =

{

    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.floating

}

-- }}}


-- {{{ Tags

-- Define a tag table which hold all screen tags.

tags = {}

tagnames = { "fm", "net", "irc", "editor", "term" }

taglayouts = {

        awful.layout.suit.tile.left,

        awful.layout.suit.max,

        awful.layout.suit.max,

        awful.layout.suit.floating,

        awful.layout.suit.max }

for s = 1, screen.count() do

    -- Each screen has its own tag table.

    tags[s] = {}

    for tagnumber = 1, 5 do

        -- Add tags and name them.

        tags[s][tagnumber] = tag(tagnames[tagnumber])

        -- Add tags to screen one by one, giving them their layouts at the same time.

        tags[s][tagnumber].screen = s

        awful.layout.set(taglayouts[tagnumber], tags[s][tagnumber])

    end

    -- I'm sure you want to see at least one tag.

    tags[s][1].selected = true

end


-- }}}


-- {{{ Menu

-- Create a laucher widget and a main menu

myawesomemenu = {

   { "manual", terminal .. " -e man awesome" },

   { "edit config", editor_cmd .. " " .. awful.util.getdir("config") .. "/rc.lua" },

   { "restart", awesome.restart },

   { "quit", awesome.quit }

}


mymainmenu = awful.menu({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon },

                                    { "Debian", debian.menu.Debian_menu.Debian },

                                    { "open terminal", terminal }

                                  }

                        })


mylauncher = awful.widget.launcher({ image = image(beautiful.awesome_icon),

                                     menu = mymainmenu })

-- }}}


--Separators

spacer    = widget({ type = "textbox"})

separator = widget({ type = "textbox"})

spacer.text     =" "

separator.text  ="."


-- {{{ Wibox


-- Create a cpuwidget (usage%)

cpuicon = widget({ type= "imagebox" })

cpuicon.image = image("/home/lance/.config/awesome/icons/cpu.png")

-- Initialize widget

cpuwidget = widget({ type = "textbox" })

-- Register widget

vicious.register(cpuwidget, vicious.widgets.cpu, "cpu-$1%", 2)


-- Create a memwidget (usage$ usedMB/TotalMB)

memicon = widget({ type =  "imagebox" })

memicon.image = image("/home/lance/.config/awesome/icons/mem.png")

-- Initialize widget

memwidget = widget({ type = "textbox" })

-- Register widget

vicious.register(memwidget, vicious.widgets.mem, "mem-$1% ($2MB/$3MB)", 13)


-- Create a batwidget (status chrg%)

baticon = widget({ type = "imagebox" })

baticon.image = image("/home/lance/.config/awesome/icons/bat.png")

-- Initialize widget

batwidget = widget({ type = "imagebox" })

-- Register widget

vicious.register(batwidget, vicious.widgets.bat, "$1$2%", 31, "BAT0")


-- Create a textclock widget

clockicon = widget({ type = "imagebox" })

clockicon.image = image("/home/lance/.config/awesome/icons/time.png")

mytextclock = awful.widget.textclock({ align = "right" })


--Create a netwidget (usage)

dnicon = widget({ type = "imagebox" })

upicon = widget({ type = "imagebox" })

dnicon.image = image("/home/lance/.config/awesome/icons/down.png")

upicon.image = image("/home/lance/.config/awesome/icons/up.png")

-- Initialize widget

netwidget = widget({ type = "textbox" })

-- Register widget

vicious.register(netwidget, vicious.widgets.net, "up-${eth1 up_kb}kb/s / down-${eth1 down_kb}kb/s", 1)



-- Create a fswidget (usage)

fsicon = widget({ type = "imagebox" })

fsicon.image = image("/home/lance/.config/awesome/icons/disk.png")

-- Initialize widget

fswidget = widget({ type = "textbox" })

-- Register widget

vicious.register(fswidget, vicious.widgets.fs, "root- ${/ used_gb}gb / ${/ avail_gb}gb", 37)

-- Create a systray

--mysystray = widget({ type = "systray" })


-- Create a wibox for each screen and add it

mywibox = {}

mypromptbox = {}

mylayoutbox = {}

mytaglist = {}

mytaglist.buttons = awful.util.table.join(

                    awful.button({ }, 1, awful.tag.viewonly),

                    awful.button({ modkey }, 1, awful.client.movetotag),

                    awful.button({ }, 3, awful.tag.viewtoggle),

                    awful.button({ modkey }, 3, awful.client.toggletag),

                    awful.button({ }, 4, awful.tag.viewnext),

                    awful.button({ }, 5, awful.tag.viewprev)

                    )

mytasklist = {}

mytasklist.buttons = awful.util.table.join(

                     awful.button({ }, 1, function (c)

                                              if not c:isvisible() then

                                                  awful.tag.viewonly(c:tags()[1])

                                              end

                                              client.focus = c

                                              c:raise()

                                          end),

                     awful.button({ }, 3, function ()

                                              if instance then

                                                  instance:hide()

                                                  instance = nil

                                              else

                                                  instance = awful.menu.clients({ width=250 })

                                              end

                                          end),

                     awful.button({ }, 4, function ()

                                              awful.client.focus.byidx(1)

                                              if client.focus then client.focus:raise() end

                                          end),

                     awful.button({ }, 5, function ()

                                              awful.client.focus.byidx(-1)

                                              if client.focus then client.focus:raise() end

                                          end))


for s = 1, screen.count() do

    -- Create a promptbox for each screen

    mypromptbox[s] = awful.widget.prompt({ layout = awful.widget.layout.horizontal.leftright })

    -- Create an imagebox widget which will contains an icon indicating which layout we're using.

    -- We need one layoutbox per screen.

    mylayoutbox[s] = awful.widget.layoutbox(s)

    mylayoutbox[s]:buttons(awful.util.table.join(

                           awful.button({ }, 1, function () awful.layout.inc(layouts, 1) end),

                           awful.button({ }, 3, function () awful.layout.inc(layouts, -1) end),

                           awful.button({ }, 4, function () awful.layout.inc(layouts, 1) end),

                           awful.button({ }, 5, function () awful.layout.inc(layouts, -1) end)))

    -- Create a taglist widget

    mytaglist[s] = awful.widget.taglist(s, awful.widget.taglist.label.all,mytaglist.buttons)


    -- Create a tasklist widget

    mytasklist[s] = awful.widget.tasklist(function(c)

                                              return awful.widget.tasklist.label.currenttags(c, s, { hide_icon = true })

                                          end, mytasklist.buttons)


    -- Create the wibox

    mywibox[s] = awful.wibox({ position = "top", height = "15", screen = s })

    -- Add widgets to the wibox - order matters

    mywibox[s].widgets = {

        {

            mylauncher,

            mytaglist[s],

            mypromptbox[s],

            layout = awful.widget.layout.horizontal.leftright

        },                                                                                                       

        mylayoutbox[s],

        mytextclock, spacer, clockicon,                 

        separator, spacer, cpuwidget, spacer, cpuicon, separator,

        spacer, memwidget, spacer, memicon, separator,

        spacer, netwidget, spacer, separator,

        spacer, fswidget, spacer, separator,

        s == 1 and mysystray or nil,

        mytasklist[s],

        layout = awful.widget.layout.horizontal.rightleft

    }

end

-- }}}


-- {{{ Mouse bindings

root.buttons(awful.util.table.join(

    awful.button({ }, 3, function () mymainmenu:toggle() end),

    awful.button({ }, 4, awful.tag.viewnext),

    awful.button({ }, 5, awful.tag.viewprev)

))

-- }}}


-- {{{ Key bindings

globalkeys = awful.util.table.join(

    awful.key({ modkey,           }, "Left",   awful.tag.viewprev       ),

    awful.key({ modkey,           }, "Right",  awful.tag.viewnext       ),

    awful.key({ modkey,           }, "Escape", awful.tag.history.restore),


    awful.key({ modkey,           }, "j",

        function ()

            awful.client.focus.byidx( 1)

            if client.focus then client.focus:raise() end

        end),

    awful.key({ modkey,           }, "k",

        function ()

            awful.client.focus.byidx(-1)

            if client.focus then client.focus:raise() end

        end),

    awful.key({ modkey,           }, "w", function () mymainmenu:show(true)        end),


    -- Layout manipulation

    awful.key({ modkey, "Shift"   }, "j", function () awful.client.swap.byidx(  1)    end),

    awful.key({ modkey, "Shift"   }, "k", function () awful.client.swap.byidx( -1)    end),

    awful.key({ modkey, "Control" }, "j", function () awful.screen.focus_relative( 1) end),

    awful.key({ modkey, "Control" }, "k", function () awful.screen.focus_relative(-1) end),

    awful.key({ modkey,           }, "u", awful.client.urgent.jumpto),

    awful.key({ modkey,           }, "Tab",

        function ()

            awful.client.focus.history.previous()

            if client.focus then

                client.focus:raise()

            end

        end),


    -- Standard program

    awful.key({ modkey,           }, "Return", function () awful.util.spawn(terminal) end),

    awful.key({ modkey, "Control" }, "r", awesome.restart),

    awful.key({ modkey, "Shift"   }, "q", awesome.quit),


    awful.key({ modkey,           }, "l",     function () awful.tag.incmwfact( 0.05)    end),

    awful.key({ modkey,           }, "h",     function () awful.tag.incmwfact(-0.05)    end),

    awful.key({ modkey, "Shift"   }, "h",     function () awful.tag.incnmaster( 1)      end),

    awful.key({ modkey, "Shift"   }, "l",     function () awful.tag.incnmaster(-1)      end),

    awful.key({ modkey, "Control" }, "h",     function () awful.tag.incncol( 1)         end),

    awful.key({ modkey, "Control" }, "l",     function () awful.tag.incncol(-1)         end),

    awful.key({ modkey,           }, "space", function () awful.layout.inc(layouts,  1) end),

    awful.key({ modkey, "Shift"   }, "space", function () awful.layout.inc(layouts, -1) end),


    -- Prompt

    awful.key({ modkey },            "r",     function () mypromptbox[mouse.screen]:run() end),


    awful.key({ modkey }, "x",

              function ()

                  awful.prompt.run({ prompt = "Run Lua code: " },

                  mypromptbox[mouse.screen].widget,

                  awful.util.eval, nil,

                  awful.util.getdir("cache") .. "/history_eval")

              end)

)


clientkeys = awful.util.table.join(

    awful.key({ modkey,           }, "f",      function (c) c.fullscreen = not c.fullscreen  end),

    awful.key({ modkey, "Shift"   }, "c",      function (c) c:kill()                         end),

    awful.key({ modkey, "Control" }, "space",  awful.client.floating.toggle                     ),

    awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end),

    awful.key({ modkey,           }, "o",      awful.client.movetoscreen                        ),

    awful.key({ modkey, "Shift"   }, "r",      function (c) c:redraw()                       end),

    awful.key({ modkey,           }, "n",      function (c) c.minimized = not c.minimized    end),

    awful.key({ modkey,           }, "m",

        function (c)

            c.maximized_horizontal = not c.maximized_horizontal

            c.maximized_vertical   = not c.maximized_vertical

        end)

)


-- Compute the maximum number of digit we need, limited to 9

keynumber = 0

for s = 1, screen.count() do

   keynumber = math.min(9, math.max(#tags[s], keynumber));

end


-- Bind all key numbers to tags.

-- Be careful: we use keycodes to make it works on any keyboard layout.

-- This should map on the top row of your keyboard, usually 1 to 9.

for i = 1, keynumber do

    globalkeys = awful.util.table.join(globalkeys,

        awful.key({ modkey }, "#" .. i + 9,

                  function ()

                        local screen = mouse.screen

                        if tags[screen][i] then

                            awful.tag.viewonly(tags[screen][i])

                        end

                  end),

        awful.key({ modkey, "Control" }, "#" .. i + 9,

                  function ()

                      local screen = mouse.screen

                      if tags[screen][i] then

                          awful.tag.viewtoggle(tags[screen][i])

                      end

                  end),

        awful.key({ modkey, "Shift" }, "#" .. i + 9,

                  function ()

                      if client.focus and tags[client.focus.screen][i] then

                          awful.client.movetotag(tags[client.focus.screen][i])

                      end

                  end),

        awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9,

                  function ()

                      if client.focus and tags[client.focus.screen][i] then

                          awful.client.toggletag(tags[client.focus.screen][i])

                      end

                  end))

end


clientbuttons = awful.util.table.join(

    awful.button({ }, 1, function (c) client.focus = c; c:raise() end),

    awful.button({ modkey }, 1, awful.mouse.client.move),

    awful.button({ modkey }, 3, awful.mouse.client.resize))


-- Set keys

root.keys(globalkeys)

-- }}}


-- {{{ Rules

awful.rules.rules = {

    -- All clients will match this rule.

    { rule = { },

      properties = { border_width = beautiful.border_width,

                     border_color = beautiful.border_normal,

                     focus = true,

                     keys = clientkeys,

                     buttons = clientbuttons } },

    { rule = { class = "MPlayer" },

      properties = { floating = true } },

    { rule = { class = "pinentry" },

      properties = { floating = true } },

    { rule = { class = "gimp" },

      properties = { floating = true } },

    -- Set Firefox to always map on tags number 2 of screen 1.

    -- { rule = { class = "Firefox" },

    --   properties = { tag = tags[1][2] } },

}

-- }}}


-- {{{ Signals

-- Signal function to execute when a new client appears.

client.add_signal("manage", function (c, startup)

    -- Add a titlebar

    -- awful.titlebar.add(c, { modkey = modkey })


    -- Enable sloppy focus

    c:add_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)


    if not startup then

        -- Set the windows at the slave,

        -- i.e. put it at the end of others instead of setting it master.

        -- awful.client.setslave(c)


        -- Put windows in a smart way, only if they does not set an initial position.

        if not c.size_hints.user_position and not c.size_hints.program_position then

            awful.placement.no_overlap(c)

            awful.placement.no_offscreen(c)

        end

    end

end)


client.add_signal("focus", function(c) c.border_color = beautiful.border_focus end)

client.add_signal("unfocus", function(c) c.border_color = beautiful.border_normal end)

-- }}}

Hopefully, some will make the attempt to try a tiling WM, as I've never felt that I've had more control over my system. If there are any questions, feel free to post here again, and I will try to help to the best of my (limited) abilities.

BTW, here is a screenie of my statusbar with the widgets and icons disabled:

5xq2c5.jpg

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.