On 07.08.2011 23:18, Ethan Levine wrote: > I'm trying to find information regarding writing my own custom layout for > awesome. Instead of the ones that come with it, I want one where my screen > is split into columns, and if you assign multiple windows to the same > column, they'll just stack. > > I've tried reading through the source code for the built-in layouts, but > it's hard to tell what's going on (a combination of few comments and Lua > being dynamically typed). The API documentation is also quite scant in this > regard. > > Are there any resources available to help me write my own custom layout for > awesome? Do you have any hints as to where to start? I'd also be grateful > for any nice examples of others' custom layouts, so I can see how they work > (as far as I can tell from reading the source code, I need to call > client:geometry(new_geometry), but I'm not sure if I need to do anything > else, or exactly what the parameters to "arrange" are).
A layout is a table with two entries. "name" is a string for the layout's name and "arrange" is a function which is called when there are clients which have to be, well, arranged. arrange gets a table as its argument. This table has the following entries: - screen: The screen which is being arranged, e.g. 1 - clients: A table containing all clients which should be arranged. This means that e.g. floating clients aren't in here. Basically, this are all clients that you work with. - geometry: The geometry of the screen. Basically, this is the size of the monitor. - workarea: Basically, "the available space". This is the geometry minus stuff like the wibox or space which is used by clients which are docked to the edge of the screen. With this info you know are supposed to place the clients. You place them by calling c:geometry({ x = 1, y = 2, width = 3, height = 4}). A simple example would be the "max" layout (here comes a slightly simplified version): function arrange(p) local area = p.workarea for k, v in ipairs(p.clients) do local g = { x = area.x, y = area.y, width = area.width - c.border_width * 2, height = area.height - c.border_width * 2, } c:geometry(g) end end This function just goes through all clients and resized each one to be as large as the workarea. That means they will cover all the available area. Since X11 doesn't include the borders in the client size, the code here has to substract the width of the border on each size. Basically, the above code ensures that the complete client including its border is visible. Here comes some ugly ASCII: (x,y)-------------------- | _________________ | | |<- ^ width ->| | | | | | | | | height | | | | | | | | | v | | | ----------------- | ----------------------- (x,y) is the point where the client is placed at. The client's drawing space starts at (x+border_width, y+border_width). The rest should be clear. I hope this helped, Uli -- The Angels have the phone box! -- To unsubscribe, send mail to awesome-unsubscr...@naquadah.org.