layout: move layout code to Lua

Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
Julien Danjou 2008-11-25 17:01:06 +01:00
parent bf7bae8082
commit 2037a053a9
49 changed files with 666 additions and 1213 deletions

View File

@ -71,12 +71,6 @@ set(AWE_SRCS
${SOURCE_DIR}/common/xembed.c
${SOURCE_DIR}/common/xutil.c
${SOURCE_DIR}/common/xcursor.c
${SOURCE_DIR}/layouts/fibonacci.c
${SOURCE_DIR}/layouts/floating.c
${SOURCE_DIR}/layouts/magnifier.c
${SOURCE_DIR}/layouts/fair.c
${SOURCE_DIR}/layouts/max.c
${SOURCE_DIR}/layouts/tile.c
${SOURCE_DIR}/widgets/graph.c
${SOURCE_DIR}/widgets/progressbar.c
${SOURCE_DIR}/widgets/textbox.c
@ -117,16 +111,6 @@ target_link_libraries(${PROJECT_AWECLIENT_NAME}
${AWESOMECLIENT_LIBRARIES})
# {{{ Generated sources
file(GLOB LAYOUTGEN_DEPS ${SOURCE_DIR}/layouts/*.h)
add_custom_command(
COMMAND ${SOURCE_DIR}/build-utils/layoutgen.sh
ARGS > ${BUILD_DIR}/layoutgen.h
OUTPUT ${BUILD_DIR}/layoutgen.h
WORKING_DIRECTORY ${SOURCE_DIR}
DEPENDS ${LAYOUTGEN_DEPS}
COMMENT "Generating layoutgen.h"
VERBATIM)
add_custom_command(
COMMAND ${SOURCE_DIR}/build-utils/widgetgen.sh
ARGS > ${BUILD_DIR}/widgetgen.h
@ -177,7 +161,6 @@ add_custom_command(
add_custom_target(generated_sources
DEPENDS ${BUILD_DIR}/widgetgen.h
${BUILD_DIR}/layoutgen.h
${BUILD_DIR}/common/atoms-intern.h
${BUILD_DIR}/common/atoms-extern.h
${BUILD_DIR}/common/tokenize.c

View File

@ -95,8 +95,6 @@ FILE_PATTERNS = *.c \
common/*.h \
widgets/*.c \
widgets/*.h \
layouts/*.c \
layouts/*.h
RECURSIVE = YES
EXCLUDE =
EXCLUDE_SYMLINKS = NO

View File

@ -30,18 +30,16 @@ modkey = "Mod4"
-- Table of layouts to cover with awful.layout.inc, order matters.
layouts =
{
"tile",
"tileleft",
"tilebottom",
"tiletop",
"fairh",
"fairv",
"magnifier",
"max",
"fullscreen",
"spiral",
"dwindle",
"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.max,
awful.layout.suit.max.fullscreen,
awful.layout.suit.magnifier,
awful.layout.suit.floating
}
-- Table of clients that should be set floating. The index may be either
@ -78,7 +76,7 @@ for s = 1, screen.count() do
tags[s] = {}
-- Create 9 tags per screen.
for tagnumber = 1, 9 do
tags[s][tagnumber] = tag({ name = tagnumber, layout = layouts[1] })
tags[s][tagnumber] = tag(tagnumber)
-- Add tags to screen one by one
tags[s][tagnumber].screen = s
end
@ -320,7 +318,7 @@ end)
-- Hook function to execute when the mouse enters a client.
awful.hooks.mouse_enter.register(function (c)
-- Sloppy focus, but disabled for magnifier layout
if awful.layout.get(c.screen) ~= "magnifier"
if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier
and awful.client.focus.filter(c) then
client.focus = c
end
@ -378,8 +376,8 @@ end)
-- Hook function to execute when arranging the screen.
-- (tag switch, new client, etc)
awful.hooks.arrange.register(function (screen)
local layout = awful.layout.get(screen)
if layout then
local layout = awful.layout.getname(awful.layout.get(screen))
if layout and beautiful["layout_" ..layout] then
mylayoutbox[screen].image = image(beautiful["layout_" .. layout])
else
mylayoutbox[screen].image = nil

View File

@ -1,24 +0,0 @@
#!/bin/sh
top_srcdir="${1-.}"
echo "/* This file is autogenerated by" `basename $0` "*/"
echo
for file in ${top_srcdir}/layouts/*.h
do
shortname=`echo $file | cut -f2- -d/`
echo "#include \"${shortname}\""
done
echo
echo "const name_func_link_t LayoutList[] ="
echo "{"
for file in ${top_srcdir}/layouts/*.h
do
echo " /* $file */"
grep '^layout_t layout_' $file | cut -d' ' -f2 | cut -d\; -f1 | while read layout
do
shortname=`echo $layout | cut -d _ -f2-`
echo " {\"$shortname\", sizeof(\"$shortname\") - 1, $layout},"
done
done
echo " {NULL, 0, NULL}"
echo "};"

View File

@ -29,7 +29,7 @@
#include "titlebar.h"
#include "systray.h"
#include "property.h"
#include "layouts/floating.h"
#include "wibox.h"
#include "common/markup.h"
#include "common/atoms.h"
@ -625,10 +625,6 @@ client_resize(client_t *c, area_t geometry, bool hints)
{
int new_screen;
area_t area;
layout_t *layout = layout_get_current(c->screen);
if(c->titlebar && c->titlebar->isvisible && !client_isfloating(c) && layout != layout_floating)
geometry = titlebar_geometry_remove(c->titlebar, c->border, geometry);
if(hints)
geometry = client_geometry_hints(c, geometry);
@ -668,12 +664,10 @@ client_resize(client_t *c, area_t geometry, bool hints)
/* save the floating geometry if the window is floating but not
* maximized */
if(client_isfloating(c)
|| layout_get_current(new_screen) == layout_floating
|| layout_get_current(c->screen) == layout_floating)
if(!c->isfullscreen && !c->ismaxvert && !c->ismaxhoriz)
c->geometries.floating = geometry;
&& !(c->isfullscreen || c->ismaxvert || c->ismaxhoriz))
c->geometries.floating = geometry;
titlebar_update_geometry_floating(c);
titlebar_update_geometry(c);
/* The idea is to give a client a resize even when banned. */
/* We just have to move the (x,y) to keep it out of the viewport. */
@ -1171,13 +1165,7 @@ client_setborder(client_t *c, int width)
xcb_configure_window(globalconf.connection, c->win,
XCB_CONFIG_WINDOW_BORDER_WIDTH, &w);
if(client_isvisible(c, c->screen))
{
if(client_isfloating(c) || layout_get_current(c->screen) == layout_floating)
titlebar_update_geometry_floating(c);
else
globalconf.screens[c->screen].need_arrange = true;
}
client_need_arrange(c);
hooks_property(c, "border_width");
}
@ -1339,30 +1327,30 @@ luaA_client_handlegeom(lua_State *L, bool full)
client_t **c = luaA_checkudata(L, 1, "client");
if(lua_gettop(L) == 2)
if(client_isfloating(*c)
|| layout_get_current((*c)->screen) == layout_floating)
{
area_t geometry;
{
area_t geometry;
luaA_checktable(L, 2);
geometry.x = luaA_getopt_number(L, 2, "x", (*c)->geometry.x);
geometry.y = luaA_getopt_number(L, 2, "y", (*c)->geometry.y);
if(client_isfixed(*c))
{
geometry.width = (*c)->geometry.width;
geometry.height = (*c)->geometry.height;
}
else
{
geometry.width = luaA_getopt_number(L, 2, "width", (*c)->geometry.width);
geometry.height = luaA_getopt_number(L, 2, "height", (*c)->geometry.height);
}
if(full)
geometry = titlebar_geometry_remove((*c)->titlebar,
(*c)->border,
geometry);
client_resize(*c, geometry, (*c)->honorsizehints);
luaA_checktable(L, 2);
geometry.x = luaA_getopt_number(L, 2, "x", (*c)->geometry.x);
geometry.y = luaA_getopt_number(L, 2, "y", (*c)->geometry.y);
if(client_isfixed(*c))
{
geometry.width = (*c)->geometry.width;
geometry.height = (*c)->geometry.height;
}
else
{
geometry.width = luaA_getopt_number(L, 2, "width", (*c)->geometry.width);
geometry.height = luaA_getopt_number(L, 2, "height", (*c)->geometry.height);
}
if(full)
geometry = titlebar_geometry_remove((*c)->titlebar,
(*c)->border,
geometry);
client_resize(*c, geometry, (*c)->honorsizehints);
}
if(full)
return luaA_pusharea(L, titlebar_geometry_add((*c)->titlebar,

View File

@ -7,8 +7,6 @@ border_color
border_padding
border_width
bottom
bottomleft
bottomright
button
center
char
@ -16,7 +14,6 @@ class
client
color
Control
coords
conffile
Ctrl
cursor
@ -39,9 +36,6 @@ icon
icon_name
image
instance
invert
label
layout
left
len
line
@ -59,10 +53,7 @@ Mod4
Mod5
mouse_enter
mouse_leave
mwfact
name
ncol
nmaster
on
ontop
opacity
@ -81,7 +72,6 @@ selected
shadow
shadow_offset
Shift
show_icons
size_hints
skip_taskbar
south
@ -92,8 +82,6 @@ ticks_count
ticks_gap
titlebar
top
topleft
topright
transient_for
true
type

View File

@ -39,7 +39,6 @@
#include "luaa.h"
#include "systray.h"
#include "screen.h"
#include "layouts/floating.h"
#include "common/atoms.h"
extern awesome_t globalconf;
@ -267,7 +266,7 @@ event_handle_configurerequest(void *data __attribute__ ((unused)),
if(geometry.x != c->geometry.x || geometry.y != c->geometry.y
|| geometry.width != c->geometry.width || geometry.height != c->geometry.height)
{
if(client_isfloating(c) || layout_get_current(c->screen) == layout_floating)
if(client_isfloating(c))
{
client_resize(c, geometry, false);
if(client_hasstrut(c))

View File

@ -19,7 +19,7 @@
*
*/
#include "client.h"
#include "layout.h"
#include "tag.h"
#include "window.h"
#include "screen.h"
@ -33,7 +33,6 @@ static void
arrange(int screen)
{
client_t *c;
layout_t *curlay = layout_get_current(screen);
int phys_screen = screen_virttophys(screen);
xcb_query_pointer_cookie_t qp_c;
xcb_query_pointer_reply_t *qp_r;
@ -47,8 +46,12 @@ arrange(int screen)
client_ban(c);
}
if(curlay)
curlay(screen);
/* call hook */
if(globalconf.hooks.arrange != LUA_REFNIL)
{
lua_pushnumber(globalconf.L, screen + 1);
luaA_dofunction(globalconf.L, globalconf.hooks.arrange, 1, 0);
}
qp_c = xcb_query_pointer_unchecked(globalconf.connection,
xutil_screen_get(globalconf.connection,
@ -70,13 +73,6 @@ arrange(int screen)
/* reset status */
globalconf.screens[screen].need_arrange = false;
/* call hook */
if(globalconf.hooks.arrange != LUA_REFNIL)
{
lua_pushnumber(globalconf.L, screen + 1);
luaA_dofunction(globalconf.L, globalconf.hooks.arrange, 1, 0);
}
}
/** Refresh the screen disposition
@ -92,21 +88,4 @@ layout_refresh(void)
arrange(screen);
}
/** Get current layout used on screen.
* \param screen Virtual screen number.
* \return layout used on that screen
*/
layout_t *
layout_get_current(int screen)
{
layout_t *l = NULL;
tag_t **curtags = tags_get_current(screen);
if(curtags[0])
l = curtags[0]->layout;
p_delete(&curtags);
return l;
}
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80

View File

@ -22,12 +22,6 @@
#ifndef AWESOME_LAYOUT_H
#define AWESOME_LAYOUT_H
#include "common/list.h"
#include "common/util.h"
typedef void (layout_t)(int);
layout_t * layout_get_current(int);
void layout_refresh(void);
#endif

View File

@ -1,101 +0,0 @@
/*
* fair.c - fair layout
*
* Copyright © 2008 Alex Cornejo <acornejo@gmail.com>
*
* 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.
*
*/
#include "screen.h"
#include "tag.h"
#include "client.h"
#include "layouts/fair.h"
#include "common/util.h"
extern awesome_t globalconf;
static void
layout_fair(int screen, const orientation_t orientation)
{
int strips=1, cells = 1,
strip = 0, cell = 0, n = 0,
full_strips;
client_t *c;
area_t geometry, area;
area = screen_area_get(screen,
&globalconf.screens[screen].wiboxes,
&globalconf.screens[screen].padding,
true);
for(c = globalconf.clients ; c; c = c->next)
if(IS_TILED(c, screen))
++n;
if(n > 0)
{
while(cells * cells < n)
++cells;
strips = (cells * (cells - 1) >= n) ? cells - 1 : cells;
full_strips = n - strips * (cells - 1);
for(c = globalconf.clients; c; c = c->next)
if(IS_TILED(c, screen))
{
if (((orientation == East) && (n > 2))
|| ((orientation == South) && (n <= 2)))
{
geometry.width = area.width / cells;
geometry.height = area.height / strips;
geometry.x = area.x + cell * geometry.width;
geometry.y = area.y + strip * geometry.height;
}
else
{
geometry.width = area.width / strips;
geometry.height = area.height / cells;
geometry.x = area.x + strip * geometry.width;
geometry.y = area.y + cell * geometry.height;
}
geometry.width -= 2 * c->border;
geometry.height -= 2 * c->border;
client_resize(c, geometry, c->honorsizehints);
if(++cell == cells)
{
cell = 0;
if(++strip == full_strips)
cells--;
}
}
}
}
void
layout_fairh(int screen)
{
layout_fair(screen, East);
}
void
layout_fairv(int screen)
{
layout_fair(screen, South);
}
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80

View File

@ -1,31 +0,0 @@
/*
* fair.h - fair layout header
*
* Copyright © 2008 Alex Cornejo <acornejo@gmail.com>
*
* 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.
*
*/
#ifndef AWESOME_FAIR_H
#define AWESOME_FAIR_H
#include "layout.h"
layout_t layout_fairh;
layout_t layout_fairv;
#endif
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80

View File

@ -1,102 +0,0 @@
/*
* fibonacci.c - fibonacci layout
*
* Copyright © 2007-2008 Julien Danjou <julien@danjou.info>
*
* 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.
*
*/
#include "screen.h"
#include "tag.h"
#include "client.h"
#include "layouts/fibonacci.h"
extern awesome_t globalconf;
static void
layout_fibonacci(int screen, int shape)
{
int n = 0, i = 0;
client_t *c;
area_t geometry, area;
geometry = area = screen_area_get(screen,
&globalconf.screens[screen].wiboxes,
&globalconf.screens[screen].padding,
true);
for(c = globalconf.clients; c; c = c->next)
if(IS_TILED(c, screen))
n++;
for(c = globalconf.clients; c; c = c->next)
if(IS_TILED(c, screen))
{
if((i % 2 && geometry.height / 2 > 2 * c->border)
|| (!(i % 2) && geometry.width / 2 > 2 * c->border))
{
if(i < n - 1)
{
if(i % 2)
geometry.height /= 2;
else
geometry.width /= 2;
if((i % 4) == 2 && !shape)
geometry.x += geometry.width;
else if((i % 4) == 3 && !shape)
geometry.y += geometry.height;
}
if((i % 4) == 0)
{
if(shape)
geometry.y += geometry.height;
else
geometry.y -= geometry.height;
}
else if((i % 4) == 1)
geometry.x += geometry.width;
else if((i % 4) == 2)
geometry.y += geometry.height;
else if((i % 4) == 3)
{
if(shape)
geometry.x += geometry.width;
else
geometry.x -= geometry.width;
}
if(i == 0)
geometry.y = area.y;
i++;
}
geometry.width -= 2 * c->border;
geometry.height -= 2 * c->border;
client_resize(c, geometry, c->honorsizehints);
geometry.width += 2 * c->border;
geometry.height += 2 * c->border;
}
}
void
layout_spiral(int screen)
{
layout_fibonacci(screen, 0);
}
void
layout_dwindle(int screen)
{
layout_fibonacci(screen, 1);
}
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80

View File

@ -1,31 +0,0 @@
/*
* fibonacci.h - fibonacci layout header
*
* Copyright © 2007-2008 Julien Danjou <julien@danjou.info>
*
* 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.
*
*/
#ifndef AWESOME_FIBONACCI_H
#define AWESOME_FIBONACCI_H
#include "layout.h"
layout_t layout_spiral;
layout_t layout_dwindle;
#endif
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80

View File

@ -1,37 +0,0 @@
/*
* floating.c - floating layout
*
* Copyright © 2007-2008 Julien Danjou <julien@danjou.info>
*
* 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.
*
*/
#include "client.h"
#include "tag.h"
#include "layouts/floating.h"
extern awesome_t globalconf;
void
layout_floating(int screen)
{
client_t *c;
for(c = globalconf.clients; c; c = c->next)
if(client_isvisible(c, screen) && !c->isfullscreen)
client_resize(c, c->geometries.floating, false);
}
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80

View File

@ -1,31 +0,0 @@
/*
* floating.h - floating layout header
*
* Copyright © 2007-2008 Julien Danjou <julien@danjou.info>
* Copyright © 2007 Alexandru E. Ungur <grid@rb.no-ip.biz>
*
* 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.
*
*/
#ifndef AWESOME_FLOATING_H
#define AWESOME_FLOATING_H
#include "layout.h"
layout_t layout_floating;
#endif
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80

View File

@ -1,106 +0,0 @@
/*
* magnifier.c - magnifier layout
*
* Copyright © 2008 Julien Danjou <julien@danjou.info>
*
* 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.
*
*/
#include <math.h>
#include "client.h"
#include "tag.h"
#include "screen.h"
#include "layouts/magnifier.h"
extern awesome_t globalconf;
void
layout_magnifier(int screen)
{
int n = 0;
client_t *c, *focus;
tag_t **curtags = tags_get_current(screen);
area_t geometry, area = screen_area_get(screen,
&globalconf.screens[screen].wiboxes,
&globalconf.screens[screen].padding,
true);
focus = globalconf.screens[screen].client_focus;
/* Find parent of this window, if it has one. */
if (!IS_TILED(focus, screen) && focus && focus->transient_for)
do {
focus = focus->transient_for;
} while (focus->transient_for != NULL);
/* If focused window is not tiled, take the first one which is tiled. */
if(!IS_TILED(focus, screen))
for(focus = globalconf.clients; focus && !IS_TILED(focus, screen); focus = focus->next);
/* No windows is tiled, nothing to do. */
if(!focus)
goto bailout;
for(c = client_list_prev_cycle(&globalconf.clients, focus);
c && c != focus;
c = client_list_prev_cycle(&globalconf.clients, c))
if(IS_TILED(c, screen) && c != focus)
n++;
if(n)
{
geometry.width = area.width * sqrt(curtags[0]->mwfact);
geometry.height = area.height * sqrt(curtags[0]->mwfact);
geometry.x = area.x + (area.width - geometry.width) / 2;
geometry.y = area.y + (area.height - geometry.height) / 2;
}
else
{
/* No other clients. */
geometry = area;
geometry.width -= 2 * focus->border;
geometry.height -= 2 * focus->border;
}
client_resize(focus, geometry, focus->honorsizehints);
client_raise(focus);
/* bailout when there is only one window */
if (!n)
goto bailout;
geometry.x = area.x;
geometry.y = area.y;
geometry.height = area.height / n;
geometry.width = area.width;
for(c = client_list_prev_cycle(&globalconf.clients, focus);
c && c != focus;
c = client_list_prev_cycle(&globalconf.clients, c))
if(IS_TILED(c, screen) && c != focus)
{
geometry.height -= 2 * c->border;
geometry.width -= 2 * c->border;
client_resize(c, geometry, c->honorsizehints);
geometry.height += 2 * c->border;
geometry.width += 2 * c->border;
geometry.y += geometry.height;
}
bailout:
p_delete(&curtags);
}
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80

View File

@ -1,30 +0,0 @@
/*
* magnifier.h - magnifier layout header
*
* Copyright © 2008 Julien Danjou <julien@danjou.info>
*
* 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.
*
*/
#ifndef AWESOME_LAYOUTS_MAGNIFIER_H
#define AWESOME_LAYOUTS_MAGNIFIER_H
#include "layout.h"
layout_t layout_magnifier;
#endif
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80

View File

@ -1,65 +0,0 @@
/*
* max.c - max layout
*
* Copyright © 2007-2008 Julien Danjou <julien@danjou.info>
*
* 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.
*
*/
#include "tag.h"
#include "screen.h"
#include "client.h"
#include "layouts/max.h"
extern awesome_t globalconf;
static void
layout_fmax(int screen, bool fs)
{
client_t *c;
int phys_screen = screen_virttophys(screen);
area_t area = screen_area_get(screen,
fs ? NULL : &globalconf.screens[screen].wiboxes,
fs ? NULL : &globalconf.screens[screen].padding,
true);
for(c = globalconf.clients; c; c = c->next)
if(IS_TILED(c, screen))
{
area.width -= 2 * c->border;
area.height -= 2 * c->border;
client_resize(c, area, false);
area.width += 2 * c->border;
area.height += 2 * c->border;
}
if(IS_TILED(globalconf.screens[phys_screen].client_focus, screen))
client_raise(globalconf.screens[phys_screen].client_focus);
}
void
layout_max(int screen)
{
return layout_fmax(screen, false);
}
void
layout_fullscreen(int screen)
{
return layout_fmax(screen, true);
}
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80

View File

@ -1,31 +0,0 @@
/*
* max.h - max layout header
*
* Copyright © 2007-2008 Julien Danjou <julien@danjou.info>
*
* 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.
*
*/
#ifndef AWESOME_MAX_H
#define AWESOME_MAX_H
#include "layout.h"
layout_t layout_max;
layout_t layout_fullscreen;
#endif
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80

View File

@ -1,214 +0,0 @@
/*
* tile.c - tile layout
*
* Copyright © 2007-2008 Julien Danjou <julien@danjou.info>
*
* 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.
*
*/
#include <stdio.h>
#include "screen.h"
#include "tag.h"
#include "client.h"
#include "layouts/tile.h"
#include "common/util.h"
extern awesome_t globalconf;
static void
_tile(int screen, const position_t position)
{
/* windows area geometry */
int wah = 0, waw = 0, wax = 0, way = 0;
/* master size */
unsigned int mw = 0, mh = 0;
int n, i, masterwin = 0, otherwin = 0;
int real_ncol = 1, win_by_col = 1, current_col = 0;
int small_ncol, adj_win_by_col;
area_t area, geometry = { 0, 0, 0, 0 };
client_t *c;
tag_t **curtags = tags_get_current(screen);
area = screen_area_get(screen,
&globalconf.screens[screen].wiboxes,
&globalconf.screens[screen].padding,
true);
for(n = 0, c = globalconf.clients; c; c = c->next)
if(IS_TILED(c, screen))
n++;
wah = area.height;
waw = area.width;
wax = area.x;
way = area.y;
masterwin = MIN(n, curtags[0]->nmaster);
otherwin = MAX(n - masterwin, 0);
if(curtags[0]->nmaster)
switch(position)
{
case Right:
case Left:
mh = masterwin ? wah / masterwin : wah;
mw = otherwin ? waw * curtags[0]->mwfact : waw;
break;
default:
mh = otherwin ? wah * curtags[0]->mwfact : wah;
mw = masterwin ? waw / masterwin : waw;
break;
}
else
mh = mw = 0;
real_ncol = curtags[0]->ncol > 0 ? MIN(otherwin, curtags[0]->ncol) : MIN(otherwin, 1);
for(i = 0, c = globalconf.clients; c; c = c->next)
{
if(!IS_TILED(c, screen))
continue;
if(i < curtags[0]->nmaster)
{
switch(position)
{
case Right:
geometry.y = way + i * mh;
geometry.x = wax;
break;
case Left:
geometry.y = way + i * mh;
geometry.x = wax + (waw - mw);
break;
case Top:
geometry.x = wax + i * mw;
geometry.y = way + (wah - mh);
break;
case Bottom:
default:
geometry.x = wax + i * mw;
geometry.y = way;
break;
break;
}
geometry.width = mw - 2 * c->border;
geometry.height = mh - 2 * c->border;
client_resize(c, geometry, c->honorsizehints);
}
else
{
win_by_col = otherwin / real_ncol;
small_ncol = (win_by_col + 1) * real_ncol - otherwin;
adj_win_by_col = current_col < small_ncol ? 0 : 1;
if((i - curtags[0]->nmaster) &&
(i - curtags[0]->nmaster + small_ncol * adj_win_by_col)
% (win_by_col + adj_win_by_col) == 0 &&
current_col < real_ncol - 1)
current_col++;
adj_win_by_col = current_col < small_ncol ? 0 : 1;
if(position == Right || position == Left)
{
if(otherwin <= real_ncol)
geometry.height = wah - 2 * c->border;
else
geometry.height = (wah / (win_by_col + adj_win_by_col)) -
2 * c->border;
geometry.width = (waw - mw) / real_ncol - 2 * c->border;
if(otherwin <= real_ncol ||
(i - curtags[0]->nmaster + small_ncol * adj_win_by_col)
% (win_by_col + adj_win_by_col) == 0)
geometry.y = way;
else
geometry.y = way +
((i - curtags[0]->nmaster +
small_ncol * adj_win_by_col) %
(win_by_col + adj_win_by_col)) *
(geometry.height + 2 * c->border);
geometry.x = wax + current_col * (geometry.width + 2 * c->border);
if(position == Right)
geometry.x += mw;
}
else
{
if(otherwin <= real_ncol)
geometry.width = waw - 2 * c->border;
else
geometry.width = (waw / (win_by_col + adj_win_by_col)) -
2 * c->border;
geometry.height = (wah - mh) / real_ncol - 2 * c->border;
if(otherwin <= real_ncol ||
(i - curtags[0]->nmaster + small_ncol * adj_win_by_col)
% (win_by_col + adj_win_by_col) == 0)
geometry.x = wax;
else
geometry.x = wax +
((i - curtags[0]->nmaster +
small_ncol * adj_win_by_col) %
(win_by_col + adj_win_by_col)) *
(geometry.width + 2 * c->border);
geometry.y = way + current_col * (geometry.height + 2 * c->border);
if(position == Bottom)
geometry.y += mh;
}
client_resize(c, geometry, c->honorsizehints);
}
i++;
}
p_delete(&curtags);
}
void
layout_tile(int screen)
{
_tile(screen, Right);
}
void
layout_tileleft(int screen)
{
_tile(screen, Left);
}
void
layout_tilebottom(int screen)
{
_tile(screen, Bottom);
}
void
layout_tiletop(int screen)
{
_tile(screen, Top);
}
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80

View File

@ -1,34 +0,0 @@
/*
* tile.h - tile layout
*
* Copyright © 2007-2008 Julien Danjou <julien@danjou.info>
* Copyright © 2007 Ross Mohn <rpmohn@waxandwane.org>
*
* 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.
*
*/
#ifndef AWESOME_TILE_H
#define AWESOME_TILE_H
#include "layout.h"
layout_t layout_tile;
layout_t layout_tileleft;
layout_t layout_tilebottom;
layout_t layout_tiletop;
#endif
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80

View File

@ -1,53 +0,0 @@
---------------------------------------------------------------------------
-- @author Julien Danjou &lt;julien@danjou.info&gt;
-- @copyright 2008 Julien Danjou
-- @release @AWESOME_VERSION@
---------------------------------------------------------------------------
-- Grab environment we need
local ipairs = ipairs
local tag = require("awful.tag")
--- Layout module for awful
module("awful.layout")
--- Get the current layout name.
-- @param screen The screen number.
function get(screen)
local t = tag.selected(screen)
if t then
return t.layout
end
end
--- Change the layout of the current tag.
-- @param layouts A table of layouts.
-- @param i Relative index.
function inc(layouts, i)
local t = tag.selected()
local number_of_layouts = 0
local rev_layouts = {}
for i, v in ipairs(layouts) do
rev_layouts[v] = i
number_of_layouts = number_of_layouts + 1
end
if t then
local cur_layout = get()
local new_layout_index = (rev_layouts[cur_layout] + i) % number_of_layouts
if new_layout_index == 0 then
new_layout_index = number_of_layouts
end
t.layout = layouts[new_layout_index]
end
end
--- Set the layout of the current tag by name.
-- @param layout Layout name.
function set(layout)
local t = tag.selected()
if t then
t.layout = layout
end
end
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80

View File

@ -0,0 +1,90 @@
---------------------------------------------------------------------------
-- @author Julien Danjou &lt;julien@danjou.info&gt;
-- @copyright 2008 Julien Danjou
-- @release @AWESOME_VERSION@
---------------------------------------------------------------------------
-- Grab environment we need
local ipairs = ipairs
local tag = require("awful.tag")
local util = require("awful.util")
local suit = require("awful.layout.suit")
local capi =
{
hooks = hooks,
screen = screen
}
local hooks = require("awful.hooks")
--- Layout module for awful
module("awful.layout")
--- Get the current layout.
-- @param screen The screen number.
-- @return The layout function.
function get(screen)
local t = tag.selected(screen)
return tag.getproperty(t, "layout") or suit.tile
end
--- Change the layout of the current tag.
-- @param layouts A table of layouts.
-- @param i Relative index.
function inc(layouts, i)
local t = tag.selected()
if t then
local curlayout = get()
local curindex
local rev_layouts = {}
for k, v in ipairs(layouts) do
if v == curlayout then
curindex = k
break
end
end
if curindex then
local newindex = util.cycle(#layouts, curindex + i)
set(layouts[newindex])
end
end
end
--- Set the layout function of the current tag.
-- @param layout Layout name.
function set(layout)
local t = tag.selected()
tag.setproperty(t, "layout", layout)
capi.hooks.arrange()(t.screen)
end
-- Register an arrange hook.
local function on_arrange (screen)
local t = tag.selected(screen)
local l = tag.getproperty(t, "layout") or suit.tile
l(screen)
end
local layouts_name =
{
[suit.tile] = "tile",
[suit.tile.left] = "tileleft",
[suit.tile.bottom] = "tilebottom",
[suit.tile.top] = "tiletop",
[suit.fair] = "fairv",
[suit.fair.horizontal] = "fairh",
[suit.max] = "max",
[suit.max.fullscreen] = "fullscreen",
[suit.magnifier] = "magnifier",
[suit.floating] = "floating"
}
--- Get the current layout name.
-- @param layout the layout name.
-- @return The layout name.
function getname(layout)
return layouts_name[layout]
end
hooks.arrange.register(on_arrange)
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80

View File

@ -0,0 +1,80 @@
---------------------------------------------------------------------------
-- @author Julien Danjou &lt;julien@danjou.info&gt;
-- @copyright 2008 Julien Danjou
-- @release @AWESOME_VERSION@
---------------------------------------------------------------------------
-- Grab environment we need
local setmetatable = setmetatable
local ipairs = ipairs
local math = math
local client = require("awful.client")
local capi =
{
screen = screen
}
--- Fair layouts module for awful
module("awful.layout.suit.fair")
local function fair(screen, orientation)
local wa = capi.screen[screen].workarea
local cls = client.tiled(screen)
if #cls > 0 then
local cells = math.floor(math.sqrt(#cls))
local strips = math.ceil(#cls / cells)
local cell = 0
local strip = 0
for k, c in ipairs(cls) do
local g = {}
if orientation == "east" then
if #cls < (strips * cells) and strip == strips - 1 then
g.width = wa.width / (cells - ((strips * cells) - #cls))
else
g.width = wa.width / cells
end
g.height = wa.height / strips
g.x = wa.x + cell * g.width
g.y = wa.y + strip * g.height
else
if #cls < (strips * cells) and strip == strips - 1 then
g.height = wa.height / (cells - ((strips * cells) - #cls))
else
g.height = wa.height / cells
end
g.width = wa.width / strips
g.x = wa.x + strip * g.width
g.y = wa.y + cell * g.height
end
g.width = g.width - 2 * c.border_width
g.height = g.height - 2 * c.border_width
c:fullgeometry(g)
cell = cell + 1
if cell == cells then
cell = 0
strip = strip + 1
end
end
end
end
--- Horizontal fair layout.
-- @param screen The screen to arrange.
function horizontal(screen)
return fair(screen, "east")
end
-- Vertical fair layout.
-- @param screen The screen to arrange.
local function fairv(_, screen)
return fair(screen, "south")
end
setmetatable(_M, { __call = fairv })

View File

@ -0,0 +1,17 @@
---------------------------------------------------------------------------
-- @author Gregor Best
-- @copyright 2008 Gregor Best
-- @release @AWESOME_VERSION@
---------------------------------------------------------------------------
-- Grab environment we need
local setmetatable = setmetatable
--- Dummy function for floating layout
module("awful.layout.suit.floating")
local function floating(_, screen)
return nil
end
setmetatable(_M, { __call = floating })

View File

@ -0,0 +1,8 @@
require("awful.layout.suit.max")
require("awful.layout.suit.tile")
require("awful.layout.suit.fair")
require("awful.layout.suit.floating")
require("awful.layout.suit.magnifier")
--- Suits for awful
module("awful.layout.suit")

View File

@ -0,0 +1,83 @@
---------------------------------------------------------------------------
-- @author Julien Danjou &lt;julien@danjou.info&gt;
-- @copyright 2008 Julien Danjou
-- @release @AWESOME_VERSION@
---------------------------------------------------------------------------
-- Grab environment we need
local setmetatable = setmetatable
local ipairs = ipairs
local math = math
local tag = require("awful.tag")
local capi =
{
client = client,
screen = screen
}
local client = require("awful.client")
--- Magnifier layout module for awful
module("awful.layout.suit.magnifier")
local function magnifier(_, screen)
-- Fullscreen?
local area = capi.screen[screen].workarea
local cls = client.tiled(screen)
local focus = capi.client.focus
local t = tag.selected()
local mwfact = tag.getmwfact(t)
if not focus and #cls > 0 then
focus = cls[1]
end
-- Abort if no clients are present
if not focus then
return
end
-- Find parent of this window, if it has one.
while focus.transient_for do
focus = focus.transient_for
end
-- If focused window is not tiled, take the first one which is tiled.
if client.floating.get(focus) then
focus = cls[1]
end
local geometry = {}
if #cls - 1 > 0 then
geometry.width = area.width * math.sqrt(mwfact)
geometry.height = area.height * math.sqrt(mwfact)
geometry.x = area.x + (area.width - geometry.width) / 2
geometry.y = area.y + (area.height - geometry.height) /2
else
geometry.x = area.x
geometry.y = area.y
geometry.width = area.width - 2 * focus.border_width
geometry.height = area.height - 2 * focus.border_width
end
focus:fullgeometry(geometry)
focus:raise()
if #cls - 1 > 0 then
geometry.x = area.x
geometry.y = area.y
geometry.height = area.height / (#cls - 1)
geometry.width = area.width
for k, c in ipairs(cls) do
if c ~= focus then
geometry.height = geometry.height - 2 * c.border_width
geometry.width = geometry.width - 2 * c.border_width
c:fullgeometry(geometry)
geometry.height = geometry.height + 2 * c.border_width
geometry.width = geometry.width + 2 * c.border_width
geometry.y = geometry.y + geometry.height
end
end
end
end
setmetatable(_M, { __call = magnifier })

View File

@ -0,0 +1,51 @@
---------------------------------------------------------------------------
-- @author Julien Danjou &lt;julien@danjou.info&gt;
-- @copyright 2008 Julien Danjou
-- @release @AWESOME_VERSION@
---------------------------------------------------------------------------
-- Grab environment we need
local setmetatable = setmetatable
local pairs = pairs
local client = require("awful.client")
local capi =
{
screen = screen
}
--- Maximized and fullscreen layouts module for awful
module("awful.layout.suit.max")
local function fmax(screen, fs)
-- Fullscreen?
local area
if fs then
area = capi.screen[screen].geometry
else
area = capi.screen[screen].workarea
end
for k, c in pairs(client.visible(screen)) do
if not c.floating then
area.width = area.width - 2 * c.border_width
area.height = area.height - 2 * c.border_width
c:fullgeometry(area)
area.width = area.width + 2 * c.border_width
area.height = area.height + 2 * c.border_width
end
end
end
--- Maximized layout.
-- @param screen The screen to arrange.
local function max(_, screen)
return fmax(screen, false)
end
--- Fullscreen layout.
-- @param screen The screen to arrange.
function fullscreen(screen)
return fmax(screen, true)
end
setmetatable(_M, { __call = max })

View File

@ -0,0 +1,168 @@
---------------------------------------------------------------------------
-- @author Julien Danjou &lt;julien@danjou.info&gt;
-- @copyright 2008 Julien Danjou
-- @release @AWESOME_VERSION@
---------------------------------------------------------------------------
-- Grab environment we need
local setmetatable = setmetatable
local ipairs = ipairs
local math = math
local client = require("awful.client")
local tag = require("awful.tag")
local capi =
{
screen = screen
}
--- Tiled layouts module for awful
module("awful.layout.suit.tile")
local function tile(_, screen, position)
if not position then position = "right" end
local t = tag.selected()
local nmaster = tag.getnmaster(t)
local mwfact = tag.getmwfact(t)
local ncol = tag.getncol(t)
local wa = capi.screen[screen].workarea
local cls = client.tiled(screen)
local masterwin = math.min(#cls, nmaster)
local otherwin = math.max(#cls - masterwin, 0);
local mh, mw
if nmaster > 0 then
if position == "right" or position == "left" then
if masterwin > 0 then
mh = wa.height / masterwin
else
mh = wa.height
end
if otherwin > 0 then
mw = wa.width * mwfact
else
mw = wa.width
end
else
if otherwin > 0 then
mh = wa.height * mwfact
else
mh = wa.height
end
if masterwin > 0 then
mw = wa.width / masterwin
else
mw = wa.width
end
end
else
mh = 0
mw = 0
end
local real_ncol
if ncol > 0 then
real_ncol = math.min(otherwin, ncol)
else
real_ncol = math.min(otherwin, 1)
end
for i, c in ipairs(cls) do
local geometry = {}
-- Master windows
if i <= nmaster then
if position == "right" then
geometry.y = wa.y + (i - 1) * mh
geometry.x = wa.x
elseif position == "left" then
geometry.y = wa.y + (i - 1) * mh
geometry.x = wa.x + (wa.width - mw)
elseif position == "top" then
geometry.x = wa.x + (i - 1) * mw
geometry.y = wa.y + (wa.height - mh)
else
geometry.x = wa.x + (i - 1) * mw
geometry.y = wa.y
end
geometry.width = mw - 2 * c.border_width
geometry.height = mh - 2 * c.border_width
-- Slave windows
else
local win_by_col = math.ceil(otherwin / real_ncol)
real_ncol = math.ceil(otherwin / win_by_col)
local current_col = math.floor((i - 1 - nmaster) / win_by_col)
if position == "right" or position == "left" then
if otherwin <= real_ncol then
geometry.height = wa.height - 2 * c.border_width
elseif (otherwin % win_by_col) ~= 0 and (current_col == real_ncol - 1) then
geometry.height = math.floor(wa.height / (otherwin % win_by_col)) - 2 * c.border_width
else
geometry.height = math.floor(wa.height / win_by_col) - 2 * c.border_width
end
geometry.width = math.floor((wa.width - mw) / real_ncol) - 2 * c.border_width
if otherwin <= real_ncol then
geometry.y = wa.y
else
geometry.y = wa.y + ((i - 1 - nmaster) % win_by_col) *
(geometry.height + 2 * c.border_width)
end
geometry.x = wa.x + current_col * (geometry.width + 2 * c.border_width)
if position == "right" then
geometry.x = geometry.x + mw
end
else
if otherwin <= real_ncol then
geometry.width = wa.width - 2 * c.border_width
elseif (otherwin % win_by_col) ~= 0 and (current_col == real_ncol - 1) then
geometry.width = math.floor(wa.width / (otherwin % win_by_col)) - 2 * c.border_width
else
geometry.width = math.floor(wa.width / win_by_col) - 2 * c.border_width
end
geometry.height = math.floor((wa.height - mh) / real_ncol) - 2 * c.border_width
if otherwin <= real_ncol then
geometry.x = wa.x
else
geometry.x = wa.x + ((i - 1 - nmaster) % win_by_col) *
(geometry.width + 2 * c.border_width)
end
geometry.y = wa.y + current_col * (geometry.height + 2 * c.border_width)
if position == "bottom" then
geometry.y = geometry.y + mh
end
end
end
c:fullgeometry(geometry)
end
end
--- The main tile algo, on left.
-- @param screen The screen number to tile.
function left(screen)
return tile(nil, screen, "left")
end
--- The main tile algo, on bottom.
-- @param screen The screen number to tile.
function bottom(screen)
return tile(nil, screen, "bottom")
end
--- The main tile algo, on top.
-- @param screen The screen number to tile.
function top(screen)
return tile(nil, screen, "top")
end
setmetatable(_M, { __call = tile })

View File

@ -109,16 +109,16 @@ function client.move(c, snap)
for k, v in ipairs(mouse.buttons) do
if v then
local lay = layout.get(c.screen)
if lay == "floating" or c.floating then
if lay == layout.suit.floating or c.floating then
local x = mouse.x - dist_x
local y = mouse.y - dist_y
c:fullgeometry(client.snap(c, snap, x, y))
if layout.get(c.screen) ~= "floating" and not c.floating then
if layout.get(c.screen) ~= layout.suit.floating and not c.floating then
hooks.property.register(ug)
end
elseif lay ~= "magnifier" then
elseif lay ~= layout.suit.magnifier then
c.screen = capi.mouse.screen
if layout.get(c.screen) ~= "floating" then
if layout.get(c.screen) ~= layout.suit.floating then
local c_u_m = capi.mouse.client_under_pointer()
if c_u_m and not c_u_m.floating then
if c_u_m ~= c then
@ -200,7 +200,7 @@ local function client_resize_magnifier(c, corner)
-- New master width factor
local mwfact = dist / maxdist_pow
tag.setmwfact(math.min(math.max(0.01, mwfact), 0.99), c.screen)
tag.setmwfact(math.min(math.max(0.01, mwfact), 0.99), tag.selected(c.screen))
return true
end
end
@ -210,15 +210,15 @@ end
local function client_resize_tiled(c, lay)
local wa = capi.screen[c.screen].workarea
local mwfact = tag.selected(c.screen).mwfact
local mwfact = tag.getmwfact()
local cursor
if lay == "tile" then
if lay == layout.suit.tile then
capi.mouse.coords({ x = wa.x + wa.width * mwfact })
cursor = "sb_h_double_arrow"
elseif lay == "tileleft" then
elseif lay == layout.suit.tile.left then
capi.mouse.coords({ x = wa.x + wa.width * (1 - mwfact) })
cursor = "sb_h_double_arrow"
elseif lay == "tilebottom" then
elseif lay == layout.suit.tile.bottom then
capi.mouse.coords({ y = wa.y + wa.height * mwfact })
cursor = "sb_v_double_arrow"
else
@ -233,17 +233,17 @@ local function client_resize_tiled(c, lay)
local fact_y = (mouse.y - wa.y) / wa.height
local mwfact
if lay == "tile" then
if lay == layout.suit.tile then
mwfact = fact_x
elseif lay == "tileleft" then
elseif lay == layout.suit.tile.left then
mwfact = 1 - fact_x
elseif lay == "tilebottom" then
elseif lay == layout.suit.tile.bottom then
mwfact = fact_y
else
mwfact = 1 - fact_y
end
tag.setmwfact(math.min(math.max(mwfact, 0.01), 0.99), c.screen)
tag.setmwfact(math.min(math.max(mwfact, 0.01), 0.99), tag.selected(c.screen))
return true
end
end
@ -332,14 +332,14 @@ function client.resize(c, corner)
local lay = layout.get(c.screen)
if lay == "floating" or c.floating then
if lay == layout.suit.floating or c.floating then
return client_resize_floating(c, corner)
elseif lay == "tile"
or lay == "tileleft"
or lay == "tilebottom"
or lay == "tiletop" then
elseif lay == layout.suit.tile
or lay == layout.suit.tile.left
or lay == layout.suit.tile.top
or lay == layout.suit.tile.bottom then
return client_resize_tiled(c, lay)
elseif lay == "magnifier" then
elseif lay == layout.suit.magnifier then
return client_resize_magnifier(c, corner)
end
end

View File

@ -128,7 +128,7 @@ function no_overlap(c)
local geometry = c:geometry()
local fullgeometry = c:fullgeometry()
for i, cl in pairs(cls) do
if cl ~= c and (cl.floating or layout == "floating") then
if cl ~= c and (cl.floating or layout == layout.suit.floating) then
areas = area_remove(areas, cl:fullgeometry())
end
end

View File

@ -5,15 +5,17 @@
---------------------------------------------------------------------------
-- Grab environment we need
local hooks = require("awful.hooks")
local util = require("awful.util")
local pairs = pairs
local ipairs = ipairs
local otable = otable
local capi =
{
hooks = hooks,
screen = screen,
mouse = mouse
}
local hooks = require("awful.hooks")
--- Tag module for awful
module("awful.tag")
@ -23,6 +25,7 @@ local data = {}
data.history = {}
data.history.past = {}
data.history.current = {}
data.tags = otable()
-- History functions
history = {}
@ -98,57 +101,66 @@ end
--- Set master width factor.
-- @param mwfact Master width factor.
-- @param screen Optional screen number.
function setmwfact(mwfact, screen)
local t = selected(screen)
if t then
t.mwfact = mwfact
end
function setmwfact(mwfact, t)
local t = t or selected()
setproperty(t, "mwfact", mwfact)
capi.hooks.arrange()(t.screen)
end
--- Increase master width factor.
-- @param add Value to add to master width factor.
function incmwfact(add)
local t = selected()
if t then
t.mwfact = t.mwfact + add
end
function incmwfact(add, t)
setmwfact(getmwfact(t) + add)
end
--- Get master width factor.
-- @param t Optional tag.
function getmwfact(t)
local t = t or selected()
return getproperty(t, "mwfact") or 0.5
end
--- Set the number of master windows.
-- @param nmaster The number of master windows.
function setnmaster(nmaster)
local t = selected()
if t then
t.nmaster = nmaster
end
-- @param t Optional tag.
function setnmaster(nmaster, t)
local t = t or selected()
setproperty(t, "nmaster", nmaster)
capi.hooks.arrange()(t.screen)
end
--- Get the number of master windows.
-- @param t Optional tag.
function getnmaster(t)
local t = t or selected()
return getproperty(t, "nmaster") or 1
end
--- Increase the number of master windows.
-- @param add Value to add to number of master windows.
function incnmaster(add)
local t = selected()
if t then
t.nmaster = t.nmaster + add
end
function incnmaster(add, t)
setnmaster(getnmaster(t) + add)
end
--- Set number of column windows.
-- @param ncol The number of column.
function setncol(ncol)
local t = selected()
if t then
t.ncol = ncol
end
function setncol(ncol, t)
local t = t or selected()
setproperty(t, "ncol", ncol)
capi.hooks.arrange()(t.screen)
end
--- Get number of column windows.
-- @param t Optional tag.
function getncol(t)
local t = t or selected()
return getproperty(t, "ncol") or 1
end
--- Increase number of column windows.
-- @param add Value to add to number of column windows.
function incncol(add)
local t = selected()
if t then
t.ncol = t.ncol + add
end
function incncol(add, t)
setncol(getncol(t) + add)
end
--- View no tag.
@ -201,7 +213,41 @@ function viewmore(tags, screen)
end
end
local function hook_tags(screen, tag, action)
if action == "remove" then
data.tags[tag] = nil
elseif action == "add" then
data.tags[tag] = {}
end
end
--- Get a tag property.
-- @param tag The tag.
-- @param prop The property name.
-- @return The property.
function getproperty(tag, prop)
if data.tags[tag] then
return data.tags[tag][prop]
end
end
--- Set a tag property.
-- This properties are internal to awful. Some are used to draw taglist, or to
-- handle layout, etc.
-- @param tag The tag.
-- @param prop The property name.
-- @param value The value.
-- @return True if the value has been set, false otherwise.
function setproperty(tag, prop, value)
if data.tags[tag] then
data.tags[tag][prop] = value
return true
end
return false
end
-- Register standards hooks
hooks.arrange.register(history.update)
hooks.tags.register(hook_tags)
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80

3
luaa.c
View File

@ -48,7 +48,6 @@
#include "screen.h"
#include "event.h"
#include "mouse.h"
#include "layouts/tile.h"
#include "common/socket.h"
#include "common/buffer.h"
@ -979,7 +978,7 @@ bailout:
/* Assure there's at least one tag */
for(screen = 0; screen < globalconf.nscreen; screen++)
if(!globalconf.screens[screen].tags.len)
tag_append_to_screen(tag_new("default", sizeof("default") - 1, layout_tile, 0.5, 1, 0),
tag_append_to_screen(tag_new("default", sizeof("default") - 1),
&globalconf.screens[screen]);
return ret;
}

View File

@ -24,10 +24,6 @@
#include "common/tokenize.h"
#include "screen.h"
#include "tag.h"
#include "titlebar.h"
#include "layouts/floating.h"
#include "layouts/tile.h"
#include "layouts/magnifier.h"
#include "common/xcursor.h"
extern awesome_t globalconf;

View File

@ -30,7 +30,6 @@
#include "client.h"
#include "widget.h"
#include "wibox.h"
#include "layouts/tile.h"
extern awesome_t globalconf;
@ -462,7 +461,7 @@ luaA_screen_tags(lua_State *L)
{
luaA_warn(L, "screen %d has no tag, taking last resort action and adding default tag\n",
s->index);
tag_append_to_screen(tag_new("default", sizeof("default") - 1, layout_tile, 0.5, 1, 0), s);
tag_append_to_screen(tag_new("default", sizeof("default") - 1), s);
return 1;
}
}

View File

@ -27,7 +27,6 @@
#include "config.h"
#include "luaa.h"
#include "layout.h"
#include "swindow.h"
#include "keybinding.h"
#include "common/xutil.h"
@ -240,14 +239,6 @@ struct tag
int screen;
/** true if selected */
bool selected;
/** Current tag layout */
layout_t *layout;
/** Master width factor */
double mwfact;
/** Number of master windows */
int nmaster;
/** Number of columns in tile layout */
int ncol;
/** clients in this tag */
client_array_t clients;
};

121
tag.c
View File

@ -25,8 +25,6 @@
#include "ewmh.h"
#include "widget.h"
#include "layoutgen.h"
extern awesome_t globalconf;
DO_LUA_NEW(extern, tag_t, tag, "tag", tag_ref)
@ -48,34 +46,19 @@ tag_view(tag_t *tag, bool view)
/** Create a new tag. Parameters values are checked.
* \param name Tag name.
* \param len Tag name length.
* \param layout Layout to use.
* \param mwfact Master width factor.
* \param nmaster Number of master windows.
* \param ncol Number of columns for slaves windows.
* \return A new tag with all these parameters.
*/
tag_t *
tag_new(const char *name, ssize_t len, layout_t *layout, double mwfact, int nmaster, int ncol)
tag_new(const char *name, ssize_t len)
{
tag_t *tag;
tag = p_new(tag_t, 1);
a_iso2utf8(&tag->name, name, len);
tag->layout = layout;
/* to avoid error */
tag->screen = SCREEN_UNDEF;
tag->mwfact = mwfact;
if(tag->mwfact <= 0 || tag->mwfact >= 1)
tag->mwfact = 0.5;
if((tag->nmaster = nmaster) < 0)
tag->nmaster = 1;
if((tag->ncol = ncol) < 1)
tag->ncol = 1;
return tag;
}
@ -262,39 +245,16 @@ tag_view_only_byindex(int screen, int dindex)
/** Create a new tag.
* \param L The Lua VM state.
*
* \luastack
* \lparam A table with at least a name attribute.
* Optional attributes are: mwfact, ncol, nmaster and layout.
* \lparam A name.
* \lreturn A new tag object.
*/
static int
luaA_tag_new(lua_State *L)
{
size_t len, laylen;
tag_t *tag;
int ncol, nmaster;
const char *name, *lay;
double mwfact;
layout_t *layout;
luaA_checktable(L, 2);
if(!(name = luaA_getopt_lstring(L, 2, "name", NULL, &len)))
luaL_error(L, "object tag must have a name");
mwfact = luaA_getopt_number(L, 2, "mwfact", 0.5);
ncol = luaA_getopt_number(L, 2, "ncol", 1);
nmaster = luaA_getopt_number(L, 2, "nmaster", 1);
lay = luaA_getopt_lstring(L, 2, "layout", "tile", &laylen);
layout = name_func_lookup(lay, laylen, LayoutList);
tag = tag_new(name, len,
layout,
mwfact, nmaster, ncol);
return luaA_tag_userdata_new(L, tag);
size_t len;
const char *name = luaL_checklstring(L, 2, &len);
return luaA_tag_userdata_new(L, tag_new(name, len));
}
/** Get or set the clients attached to this tag.
@ -345,9 +305,6 @@ luaA_tag_clients(lua_State *L)
* \lfield screen Screen number of the tag.
* \lfield layout Tag layout.
* \lfield selected True if the client is selected to be viewed.
* \lfield mwfact Master width factor.
* \lfield nmaster Number of master windows.
* \lfield ncol Number of column for slave windows.
*/
static int
luaA_tag_index(lua_State *L)
@ -371,21 +328,9 @@ luaA_tag_index(lua_State *L)
return 0;
lua_pushnumber(L, (*tag)->screen + 1);
break;
case A_TK_LAYOUT:
lua_pushstring(L, name_func_rlookup((*tag)->layout, LayoutList));
break;
case A_TK_SELECTED:
lua_pushboolean(L, (*tag)->selected);
break;
case A_TK_MWFACT:
lua_pushnumber(L, (*tag)->mwfact);
break;
case A_TK_NMASTER:
lua_pushnumber(L, (*tag)->nmaster);
break;
case A_TK_NCOL:
lua_pushnumber(L, (*tag)->ncol);
break;
default:
return 0;
}
@ -402,17 +347,18 @@ luaA_tag_newindex(lua_State *L)
{
size_t len;
tag_t **tag = luaA_checkudata(L, 1, "tag");
const char *buf, *attr = luaL_checklstring(L, 2, &len);
double d;
int i, screen;
layout_t *l;
const char *attr = luaL_checklstring(L, 2, &len);
switch(a_tokenize(attr, len))
{
int screen;
case A_TK_NAME:
buf = luaL_checklstring(L, 3, &len);
p_delete(&(*tag)->name);
a_iso2utf8(&(*tag)->name, buf, len);
{
const char *buf = luaL_checklstring(L, 3, &len);
p_delete(&(*tag)->name);
a_iso2utf8(&(*tag)->name, buf, len);
}
break;
case A_TK_SCREEN:
if(!lua_isnil(L, 3))
@ -429,51 +375,10 @@ luaA_tag_newindex(lua_State *L)
if(screen != SCREEN_UNDEF)
tag_append_to_screen(*tag, &globalconf.screens[screen]);
break;
case A_TK_LAYOUT:
buf = luaL_checklstring(L, 3, &len);
l = name_func_lookup(buf, len, LayoutList);
if(l)
(*tag)->layout = l;
else
{
luaA_warn(L, "unknown layout: %s", buf);
return 0;
}
break;
case A_TK_SELECTED:
if((*tag)->screen != SCREEN_UNDEF)
tag_view(*tag, luaA_checkboolean(L, 3));
return 0;
case A_TK_MWFACT:
d = luaL_checknumber(L, 3);
if(d > 0 && d < 1)
(*tag)->mwfact = d;
else
{
luaA_warn(L, "bad value, must be between 0 and 1");
return 0;
}
break;
case A_TK_NMASTER:
i = luaL_checknumber(L, 3);
if(i >= 0)
(*tag)->nmaster = i;
else
{
luaA_warn(L, "bad value, must be greater than 0");
return 0;
}
break;
case A_TK_NCOL:
i = luaL_checknumber(L, 3);
if(i >= 1)
(*tag)->ncol = i;
else
{
luaA_warn(L, "bad value, must be greater than 1");
return 0;
}
break;
default:
return 0;
}

5
tag.h
View File

@ -26,11 +26,8 @@
#include "client.h"
#include "common/refcount.h"
/** Check if a client is tiled */
#define IS_TILED(client, screen) (client && !client_isfloating(client) && client_isvisible(client, screen))
/* Contructor, destructor and referencors */
tag_t *tag_new(const char *, ssize_t, layout_t *, double, int, int);
tag_t *tag_new(const char *, ssize_t);
static inline void
tag_delete(tag_t **tag)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 967 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 997 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -51,13 +51,11 @@ titlebar_close_button_focus = @AWESOME_THEMES_PATH@/default/titlebar/closer.png
wallpaper_cmd = awsetbg @AWESOME_THEMES_PATH@/default/background.png
# You can use your own layout icons like this:
layout_dwindle = @AWESOME_THEMES_PATH@/default/layouts/dwindlew.png
layout_fairh = @AWESOME_THEMES_PATH@/default/layouts/fairhw.png
layout_fairv = @AWESOME_THEMES_PATH@/default/layouts/fairvw.png
layout_floating = @AWESOME_THEMES_PATH@/default/layouts/floatingw.png
layout_magnifier = @AWESOME_THEMES_PATH@/default/layouts/magnifierw.png
layout_max = @AWESOME_THEMES_PATH@/default/layouts/maxw.png
layout_spiral = @AWESOME_THEMES_PATH@/default/layouts/spiralw.png
layout_tilebottom = @AWESOME_THEMES_PATH@/default/layouts/tilebottomw.png
layout_tileleft = @AWESOME_THEMES_PATH@/default/layouts/tileleftw.png
layout_tile = @AWESOME_THEMES_PATH@/default/layouts/tilew.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 977 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -21,14 +21,12 @@ border_focus = #729fcf
border_marked = #eeeeec
# IMAGES
layout_dwindle = @AWESOME_THEMES_PATH@/sky/layouts/dwindle.png
layout_fairh = @AWESOME_THEMES_PATH@/sky/layouts/fairh.png
layout_fairv = @AWESOME_THEMES_PATH@/sky/layouts/fairv.png
layout_floating = @AWESOME_THEMES_PATH@/sky/layouts/floating.png
layout_magnifier = @AWESOME_THEMES_PATH@/sky/layouts/magnifier.png
layout_max = @AWESOME_THEMES_PATH@/sky/layouts/max.png
layout_fullscreen = @AWESOME_THEMES_PATH@/sky/layouts/fullscreen.png
layout_spiral = @AWESOME_THEMES_PATH@/sky/layouts/spiral.png
layout_tilebottom = @AWESOME_THEMES_PATH@/sky/layouts/tilebottom.png
layout_tileleft = @AWESOME_THEMES_PATH@/sky/layouts/tileleft.png
layout_tile = @AWESOME_THEMES_PATH@/sky/layouts/tile.png

View File

@ -210,7 +210,7 @@ titlebar_client_attach(client_t *c, wibox_t *t)
t->need_update = true;
/* This may seem useless, but it's the cleanest way to avoid seeing titlebars for banned clients. */
titlebar_update_geometry_floating(c);
titlebar_update_geometry(c);
if(t->isvisible)
xcb_map_window(globalconf.connection, t->sw.window);
@ -342,7 +342,7 @@ luaA_titlebar_newindex(lua_State *L, wibox_t *titlebar, awesome_token_t tok)
titlebar->position = position;
if((c = client_getbytitlebar(titlebar)))
{
titlebar_update_geometry_floating(c);
titlebar_update_geometry(c);
/* call geometry hook for client because some like to
* set titlebar width in that hook, which make sense */
hooks_property(c, "geometry");

View File

@ -118,19 +118,18 @@ titlebar_geometry_remove(wibox_t *t, int border, area_t geometry)
return geometry;
}
/** Update the titlebar geometry for a tiled client.
/** Update the titlebar geometry for a client.
* \param c The client.
* \param geometry The geometry the client will receive.
*/
static inline void
titlebar_update_geometry_tiled(client_t *c, area_t geometry)
titlebar_update_geometry(client_t *c)
{
area_t geom;
if(!c->titlebar)
return;
titlebar_geometry_compute(c, geometry, &geom);
titlebar_geometry_compute(c, c->geometry, &geom);
/* Can't actually move titlebar right now, but we will resize it. */
if(c->isbanned)
{
@ -149,14 +148,5 @@ titlebar_update_geometry_tiled(client_t *c, area_t geometry)
wibox_moveresize(c->titlebar, geom);
}
/** Update the titlebar geometry for a floating client.
* \param c The client.
*/
static inline void
titlebar_update_geometry_floating(client_t *c)
{
return titlebar_update_geometry_tiled(c, c->geometry);
}
#endif
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80

View File

@ -919,7 +919,7 @@ luaA_wibox_newindex(lua_State *L)
wibox_position_update(*wibox);
break;
case WIBOX_TYPE_TITLEBAR:
titlebar_update_geometry_floating(client_getbytitlebar(*wibox));
titlebar_update_geometry(client_getbytitlebar(*wibox));
break;
}
break;