I used to use xmonad as my gnome window manager. Since gnome3, I switched to gnome-shell. In this article I'll try to describe how I configured gnome-shell to fit my needs.

I updated this for 3.14, and I'm pleased to realize that most of the behaviours I whish can now be configured graphically.

What I want

I don't really need advanced tiling, as I'm anyway using a small laptop screen.

Configuration

Static Workspaces

Disable dynamic workspaces, so I have my 10 task oriented workspaces. This is now configurable in Tweaks. In Workspaces set Workspace Creation to Static.

In Control CenterKeyboardShortcuts set Switch Windows to Super+Tab.

Custom keybindings

I bind evenything to Win+:

Win activities mode
Win+1...0 go to desktop N
Win+Maj+1-0 put window on desktop N
Win+Tab per-desktop alt-tab
Win+[above tab] last used desktop
Win+F2 command prompt

Extensions

Hibernate Status Button

Adds a Hibernate button in Status menu. Using Alt modifier, you can also select Hybrid Sleep instead.

hibernate-status@dromi

system-monitor

A nice panel system monitor similar to legacy panel's one. Now easy to install.

system-monitor@paradoxxx.zero.gmail.com

Switch to last used desktop

Custom extension to switch to the last active desktop.

It is actually quite simple. Here is extension.js:

const Main = imports.ui.main;
const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell;

/* Switch to the last used other desktop */
function _doSwitchDesktop(display, screen, window, binding) {
    let activeWorkspace = screen.get_active_workspace();
    let appSys = Shell.AppSystem.get_default();
    let apps = appSys.get_running();
    let lastWindow = null;
    let lastWindowTime = 0;
    for (let i = 0; i < apps.length; i++) {
        let windows = apps[i].get_windows();
        for(let j = 0; j < windows.length; j++) {
            let win = windows[j];
            if (win.get_workspace() != activeWorkspace) {
                if (win.get_user_time() > lastWindowTime) {
                    lastWindow = win;
                    lastWindowTime = lastWindow.get_user_time();
                }
            }
        }
    }
    if (lastWindow) {
        Main.activateWindow(lastWindow);
    }
}

function init() {
}

function enable() {
    Meta.keybindings_set_custom_handler('switch-group', _doSwitchDesktop);
    Meta.keybindings_set_custom_handler('switch-group-backward', _doSwitchDesktop);
}

function disable() {
    Meta.keybindings_set_custom_handler('switch-group', Lang.bind(Main.wm, Main.wm._startAppSwitcher));
    Meta.keybindings_set_custom_handler('switch-group-backward', Lang.bind(Main.wm, Main.wm._startAppSwitcher));
}

Pidgin Conversation Integration

Use pidgin insetad of empathy (which lacks OTR).

pidgin-conversation-integration@kagesenshi.org

Themes

I modified Adwaita metacity theme to remove window titlebar on fullscreen window, and smaller those of normal windows.

diff -Naur /usr/share/themes/Adwaita/metacity-1/metacity-theme-3.xml /usr/share/themes/Adwaita-local/metacity-1/metacity-theme-3.xml
--- /usr/share/themes/Adwaita/metacity-1/metacity-theme-3.xml
+++ /usr/share/themes/Adwaita-local/metacity-1/metacity-theme-3.xml
@@ -36,7 +36,7 @@
    <distance name="bottom_height" value="1" />
    <distance name="left_titlebar_edge" value="0"/>
    <distance name="right_titlebar_edge" value="0"/>
-   <distance name="title_vertical_pad" value="9"/>
+   <distance name="title_vertical_pad" value="1"/>
    <border name="title_border" left="10" right="10" top="0" bottom="2"/>
    <border name="button_border" left="0" right="0" top="0" bottom="2"/>
    <aspect_ratio name="button" value="1"/>
@@ -47,17 +47,17 @@
    <distance name="right_titlebar_edge" value="1"/>
 </frame_geometry>

-<frame_geometry name="max" title_scale="medium" parent="normal" rounded_top_left="false" rounded_top_right="false">
+<frame_geometry name="max" has_title="false" title_scale="medium" parent="normal" rounded_top_left="false" rounded_top_right="false">
    <distance name="left_width" value="0" />
    <distance name="right_width" value="0" />
    <distance name="left_titlebar_edge" value="0"/>
    <distance name="right_titlebar_edge" value="0"/>
-   <distance name="title_vertical_pad" value="8"/> <!-- 
+   <distance name="title_vertical_pad" value="0"/> <!-- 
                            This needs to be 1 less then the
                            title_vertical_pad on normal state
                            or you'll have bigger buttons                               -->
-   <border name="title_border" left="10" right="10" top="1" bottom="2"/>
-   <border name="button_border" left="0" right="0" top="0" bottom="2"/>
+   <border name="title_border" left="0" right="0" top="0" bottom="0"/>
+   <border name="button_border" left="0" right="0" top="0" bottom="0"/>
    <distance name="bottom_height" value="0" />
 </frame_geometry>

@@ -70,7 +70,7 @@
 </frame_geometry>

 <frame_geometry name="small" title_scale="small" parent="normal" rounded_top_left="false" rounded_top_right="false">
-   <distance name="title_vertical_pad" value="7"/>
+   <distance name="title_vertical_pad" value="1"/>
    <border name="title_border" left="10" right="10" top="0" bottom="1"/>
    <border name="button_border" left="0" right="0" top="0" bottom="2"/>
 </frame_geometry>
@@ -102,7 +102,7 @@
 </frame_geometry>

 <frame_geometry name="modal" title_scale="small" hide_buttons="true" rounded_top_left="false" rounded_top_right="false" parent="small">
-   <distance name="title_vertical_pad" value="5"/>
+   <distance name="title_vertical_pad" value="1"/>
 </frame_geometry>

 <frame_geometry name="attached" title_scale="small" hide_buttons="true" rounded_top_left="false" rounded_top_right="false" parent="small">

Window matching

That'a must-be for me. I use devilspie2:

Description-en: LUA-based window matching utility
 Devilspie2 is a window matching utility, allowing the user to perform
 scripted actions on windows as they are created. For example you can
 script a terminal program to always be positioned at a specific screen
 position, or position a window on a specific workspace.
 .
 It is a continuation of Ross Burtons project Devilspie, with the most
 significant change that the symbolic expressions of that project are
 replaced with a LUA interpreter.
Homepage: http://www.gusnan.se/devilspie2

There is a Native Window Placement gnome-shell extension, but I don't like its conf.