Commit Graph

5940 Commits

Author SHA1 Message Date
Uli Schlachter 873358a0b8 EWMH: Handle _NET_WM_DESKTOP in lua
We now handle all "important" EWMH messages in lua and lua can decide to do
different things than the current obvious one.

Consistency!

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-17 16:15:20 +01:00
Uli Schlachter 9e4270f2e7 ewmh: Use client_set_sticky() for making clients sticky
We can't just directly assign c->sticky directly, because we should emit the
right signals and unban the client if it is currently ban. All of that gets
handled by client_set_sticky().

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-17 15:38:20 +01:00
Uli Schlachter a9e0d258b7 EWMH: Ignore invalid _NET_WM_DESKTOP
Commit e291c0398 already made awesome ignore invalid values for _NET_WM_DESKTOP.
That commit just made it tag clients with the first tag if they used an invalid
value for this property.

This commit reverts 90% of that change. What is still left is the range
validation. Previously, awesome would untag a client completely when it got such
a _NET_WM_DESKTOP property / message. Now, such messages are just silently
ignored.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-17 15:34:44 +01:00
Uli Schlachter 61fdd8cd40 ewmh: Factor out common code into a helper function
Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-17 15:33:28 +01:00
Uli Schlachter bbe86e4e25 awful.client.movetoscreen: Don't untag clients completely (FS#1196)
If a client gets moved to a screen without any selected tags, that client
disappears and it is non-trivial to get it back. Since this is unexpected and
annoying, make movetoscreen do nothing if the target screen has no tags
selected.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-16 21:53:58 +01:00
Daniel Hahler edaca590f6 Only set client's urgent after startup
This looks at awesome.startup in the default 'request::activate' signal
handler.
2014-03-16 21:26:05 +01:00
Daniel Hahler 9a5a8dc6e8 Factor `awful.rules.apply_do` out of `apply`
This allows to apply properties and callbacks to a client like
awful.rules.apply would do, without the matching part.

This is useful with the new startup notifications, and lets you apply
the same properties and callbacks from e.g. a manage signal handler.
2014-03-16 20:20:14 +01:00
Uli Schlachter fed803a6bc client manage signal: Remove startup argument
We now have awesome.startup which does the same thing in better.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-16 20:15:02 +01:00
Uli Schlachter 4d35f430dc Add awesome.startup
This boolean describes if we are still in startup or if our main loop is already
running.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-16 20:09:43 +01:00
Uli Schlachter c1cb7883b5 root: Make sure cairo doesn't cache our temporary connection
Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-16 17:22:27 +01:00
Uli Schlachter 794318c1a0 drawable: Add pixmap member
Previously, ownership of the pixmaps that we are using for double buffering was
a little weird. The pixmap belonged to the drawin/titlebar, but the
corresponding cairo surface was owned by the drawable. Clean this up by moving
the pixmap to the drawable.

This cleans up lots of ugly code and also fixes a crash: When a drawable was
garbage collected before its drawin, drawin_wipe() would crash accessing the
drawable. This was needed to make it forget about the cairo surface we gave to
it for the pixmap that is being destroyed.

By moving the pixmap to the drawable, this whole issues goes away.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-16 17:08:36 +01:00
Uli Schlachter 1da87eca3c Fix cairo surface memory leak
Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-16 16:06:18 +01:00
Uli Schlachter 6b8bd49c0b Redraw titlebars more intelligently
Whenever a titlebar of a client needed to be refreshed, all (possibly) four
titlebars would get completely refreshed. So if someone actually added more than
one titlebar to a client, awesome would copy each titlebar's content to the
window four times. Fix this by introducing more fine-grined functions for
uploads.

This also makes awesome only update the affected area when it gets an expose
event for a titlebar instead of all four titlebars completely.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-16 15:29:11 +01:00
Uli Schlachter 1924ee9e6e drawin: Only redraw on move with translucent background
If a drawable has an opaque background, we don't need pseudo transparency and
thus its content don't change when it is moved. However, when we need pseudo
transparency, then we have to redraw the drawable to apply the new background.

Previously we just always did the redraw. This commit adds a helper function
gears.color.create_opaque_pattern() that analyzes a cairo pattern for
transparency. We use this new function to only redraw-on-move when there is
actual pseudo transparency in effect. Otherwise, this redraw can be skipped.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-16 14:58:14 +01:00
Uli Schlachter 40e28be700 awful.tooltip: Work with all gears.colors as foreground
This fixes awful.tooltip so that colors other than "#123456" can be used.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-16 13:25:01 +01:00
Uli Schlachter 346034c6b6 drawin: Don't unconditionally redraw when made visible
Before this commit, we always threw away the drawin's cairo surface whenever it
was made visible and thus forced a redraw.

This commit changes this so that we only force a redraw if the drawin was
resized why it wasn't visible. To remember when this happens, we free the
drawin's cairo surface without allocating a new one when the drawin is resized
while not being visible. Thus, we then only have to allocate a new surface if
the drawin doesn't have one when it is being made visible.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-16 09:11:00 +01:00
Uli Schlachter a82b15d805 drawin: Inline drawin_init() into its only caller
Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-16 08:56:55 +01:00
Emmanuel Lepage Vallee d6e06450d3 Add end to end support for spawning tracking using startup notifications
This allow to spawn something, then apply some properties or rules when
the client show up ("manage").

This commit add:
 * "startup_id" property for all clients object (immutable, can be nil)
 * Second return value to awful.util.spawn() with the startup_id
 * Update the documentation

Example:

  local wait_for_it = {}

  local pid,snid = awful.util.spawn("urxvtc")
  wait_for_it[snid] = {ontop=true,sticky=false,
     tag = awful.tag.gettags(mouse.screen)[1] }

  client.connect_signal("manage", function (c, startup)
     if c.startup_id and wait_for_it[c.startup_id] then
        for k,v in pairs(wait_for_it[c.startup_id]) do
           c[k] = v
        end
        if wait_for_it[c.startup_id].tag then
           c:tags({wait_for_it[c.startup_id].tag})
        end
     end
  end)

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-15 23:14:02 +01:00
Uli Schlachter ef27189ffe Client: Add (and use) visualtype member to client_t objects
Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-15 11:56:57 +01:00
Uli Schlachter 6c4668cb49 scan(): Use less iterations for scanning for windows
There isn't much of a point in doing all the GetGeometry requests in an extra
run through the list. This commit merges it into the previous loop through all
windows.

This means that we now request some information during startup that we never
actually need, but I can live with that just fine.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-15 11:48:32 +01:00
Daniel Hahler d9aed1b21e awful.rules: add does_match and matching_rules functions (FS#1224)
Signed-off-by: Daniel Hahler <git@thequod.de>
Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-15 09:00:20 +01:00
Daniel Hahler a15e53deec Minor doc fixes 2014-03-15 08:52:14 +01:00
Daniel Hahler ac45dc9f59 Add client.maximized (a shortcut for ~_horizontal and ~_vertical)
This also adds the signals `property::maximized`.

Signed-off-by: Daniel Hahler <git@thequod.de>
2014-03-15 08:49:43 +01:00
Daniel Hahler 31e3399abe Fallback to comparing layout names in awful.layout.inc
This helps in cases where you have accidentally cloned an entry from
`layouts`.

Previously, no current index would be found and the function would
silently fail.

Signed-off-by: Daniel Hahler <git@thequod.de>
2014-03-14 20:37:24 +01:00
Daniel Hahler 11f7b5aa3d Add a "deep" option to awful.util.table.clone
This allows for having clones of a table, where its entries are still
references to the original values.

This is useful for copying a "default props" table, where you want to
keep the reference to entries like `awful.layout.suit.tile`.

Signed-off-by: Daniel Hahler <git@thequod.de>
2014-03-14 20:36:26 +01:00
sirkha b1c14d5660 Added Comments
Added some comments to explain the changed code and how it functions

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-13 12:11:20 +01:00
sirkha fbba41ddaa Added Expand Modes
Added set_expand function with options of "none" "outside" or "inside" modes.
The "inside" mode is the default and will result in the original behavior. The
main benefit is being able to actually center a widget in the available space
with options of how to draw the outside widgets (expand to take the space,
or not.) Further functionality can be had by ommiting one of the outside
widgets. Set default layout mode in the constructor.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-13 12:11:04 +01:00
sirkha 601dc232db Fixed Flex Layout Fit Behavior
Modified flex:fit so that it will not return more than its sub-widgets need.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-13 12:05:50 +01:00
sirkha ceaeaedb5b Fix Align Layout Fit Behavior
This changes the align layout fit function so that align:fit will not return
more space than is actually needed by its sub-widgets. Changes to align:draw
were also required so that any widget assigned to the middle slot will expand
to fill the remaining space.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-13 12:05:50 +01:00
Daniel Hahler c855b1babb Do not raise clients in client_manage
Instead, use stack_client_push and emit the `request::activate` signal
from awful.rules.apply, if the client gets focus.

Signed-off-by: Daniel Hahler <git@thequod.de>
2014-03-12 16:01:01 +01:00
Uli Schlachter f9a1093e45 spawn: Remove useless argv[0] calculation
Since commit 3c40d6b, the passed in argument is decomposed into an array of
strings before the sn-related code runs. This means we already know argv[0] and
thus we don't need the code here that tries to figure it out again.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-12 11:15:40 +01:00
Uli Schlachter 5432e0a332 awesome.spawn(): Check table arguments better
Previously, any not-string-convertible entry in the array argument would result
in lua_tostring() returning NULL which g_strdup() would pass through. Thus, we
would end up with a NULL entry in an array whose end is marked with a NULL
entry. This mainly means that we had a memory leak.

Fix this by actually verifying that we only have strings in the table that we
are looking at.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-12 11:12:23 +01:00
Uli Schlachter 800a9a41f6 spawn: Don't try to spawn with empty argv (FS#1225)
When e.g. calling awesome.spawn({}), our argv array would be empty, so just a
pointer to a NULL pointer that marks the end of the array.

Since startup notification was enabled, this would then try to figure out the
name of the started binary. This would immediately dereference a NULL pointer
and crash.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-12 11:10:48 +01:00
Massimiliano Brocchini b965adc33f prompt: CTRL+DELETE deletes history entries
Pressing CTRL+DELETE removes the visible history entry, if any, then moves to the next history entry (like pressing DOWN would do).
If the last history entry is removed the previous one is shown in the prompt (like pressing UP would do).
CTRL+DELETE works on history entries only: i.e. it has no effect on a command entered but not executed yet.
To implement above behaviour I added saving history table to file on Escape key press.

Signed-off-by: Massimiliano Brocchini <massimiliano.brocchini@gmail.com>
Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-12 10:16:27 +01:00
Campbell Barton 620732a015 Remove raise call from mouse.client.move
This makes move consistent with 'resize' which doesn't raise either.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-11 09:41:20 +01:00
Uli Schlachter 642ab35988 xproperty: Don't limit property lengths
All that I can say is "oops, I blame copy&paste".

Thanks to Elv13 for noticing this.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-09 20:22:44 +01:00
Uli Schlachter 2ac95b4ae8 Fix handling of _NET_CURRENT_DESKTOP messages (FS#1219,FS#1217)
Instead of having the C code mess with which tags are selected, we now emit a
signal on the tag that says that something requested it to be selected. Lua can
then handle this by only switching tags on the correct monitor and by updating
the focus history correctly.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-08 15:33:34 +01:00
Uli Schlachter 1b21dce46c Revert "client: Add c.blob property"
This reverts commit a54636751b.

We now have the new xproperty API which does the same thing in a much nicer way.
Thanks to Elv13 for the idea!

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-07 16:21:11 +01:00
Uli Schlachter 62e2dee4ba Add awesome.register_xproperty (FS#1212)
This commits adds awesome.register_xproperty(). This allows lua code to register
arbitrary X11 properties with awesome which will then watch these properties.
Whenever such a property is changed on a client or drawin, we will emit the
xproperty::name signal.

This also adds window:get_xproperty(name) and window:set_xproperty(name, value)
which allows to mess with properties.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-07 16:17:40 +01:00
Uli Schlachter 2b1febeabe Make objects properly inherit signals from classes
Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-07 14:42:03 +01:00
Uli Schlachter f19912900d awful.util.spawn*: Remove obsolete screen argument
Ever since commit 6b2e4352b (from 2010!), awesome.spawn() doesn't have a screen
argument anymore and the extra argument from util.spawn was just ignored. Fix
the code and the luadoc for these functions.

Thanks to blueyed for noticing this.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-07 10:54:52 +01:00
Uli Schlachter 202567dc12 Improve fatal signal handling
First, we reset the signal handler back to the default one when a fatal signal
is received. This should make sure that we never get into an endless loop where
the signal handler causes the signal to happen again.

Then this commit also makes awesome print a backtrace on more signals than
before. Crashing with a backtrace is always better than without. ;-)

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-07 10:51:39 +01:00
Uli Schlachter 4717e89984 Update fields for capi.awesome in C comment
This should have been part of commit 2f39986, sorry!

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-07 10:44:48 +01:00
Uli Schlachter 9e9366950e Measure the time a main loop iteration takes
This commit makes awesome measure how long all the event handling takes. That
is, this measure the time between waking up from poll and going to sleep again.
If that time is above 0.1 seconds, we print a warning and increase the limit for
this warning to the last duration to avoid flooding messages.

This should help figuring out cases were people do stupid things in their
config, like synchronously contacting an IMAP server and getting the number of
unread mails.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-07 10:39:49 +01:00
Uli Schlachter b6bbae084a mouse.screen: Lie when we have no clue where the pointer is
Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-06 22:18:35 +01:00
Uli Schlachter 8cf48d1fe8 Revert "awful.ewmh: Enforce client geometry (FS#764,FS#1216)"
This reverts commit 20afb26080.

The commit caused endless loops with tracebacks like this (shortened):

        lib/awful/ewmh.lua.in:122: in function <lib/awful/ewmh.lua.in:117>
        [C]: in function 'geometry'
        lib/awful/ewmh.lua.in:122: in function <lib/awful/ewmh.lua.in:117>
        [C]: in function 'geometry'
        lib/awful/ewmh.lua.in:122: in function <lib/awful/ewmh.lua.in:117>
        [C]: in function 'geometry'
2014-03-06 22:08:00 +01:00
Uli Schlachter 069a8e84a2 root.wallpaper: Cleanup and correctness fixes
Turns out that my rant about "we can't query the pixmap's values" was wrong.
This commit makes awesome use a GetGeometry request to get the properties of the
(old) root window's back pixmap.

This also converts code to p_delete() instead of free() for consistency. Bad me
for doing multiple things in one commit...

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-06 18:35:17 +01:00
Uli Schlachter 20afb26080 awful.ewmh: Enforce client geometry (FS#764,FS#1216)
When a client's geometry changes (and I consider the border width to be part of
the geometry here) and that client is one of fullscreen or
maximized_{horizontally,vertically}, make sure that the geometry as specified by
the state is still obeyed.

This also (accidentally) fixes things when a client gets moved to another
screen!

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-06 18:08:55 +01:00
Uli Schlachter 910cbe401d client: Emit property::screen after geometry
Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-06 18:08:21 +01:00
Uli Schlachter 23e9258fb5 awful.ewmh: Correctly handle bw change for maximized clients
Due to a copy&paste error, maximized_vertical and maximized_horizontal were
handled the same. Of course, vertical and horizontal aren't the same direction.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-06 17:58:03 +01:00