Commit Graph

1248 Commits

Author SHA1 Message Date
Uli Schlachter 85ffd0fc9a wibox.drawable: Assert that no cairo error occurred
Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-04-01 16:21:37 +02:00
Uli Schlachter afdc14c931 awful.tooltip: Add (and use) :set_markup() function
Since commit 5b4666432f, we use set_text() instead of set_markup()
on the tooltip's textbox. This means it is no longer possible to use pango
markup in the tooltip which was not intended.

Fix this (properly) by introducing a :set_markup() function on tooltips (and use
it in the timer function to restore the old behavior).

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-30 23:39:38 +02:00
Uli Schlachter ab182dacc1 awful.tooltip: Small reorganization
This inlines the set_defaults() function into its only caller and makes us less
stupid with the font property.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-30 23:39:36 +02:00
Uli Schlachter 9967ae6533 gears.color: Add a pattern cache
This makes gears.color() cache patterns in a weak table and returns that cached
pattern when we get called with the same argument again.

To benchmark this change, the following code was used:

local time = require("socket").gettime

function benchmark(func)
   local begin = time()
   local iter = 0
   while time() - begin < 1 do
      func()
      iter = iter + 1
   end
   return iter
end

for _, arg in pairs({
   "#00aa00",
   "solid:#00aa00",
   "radial:50,50,10:55,55,30:0,#ff0000:0.5,#00ff00:1,#0000ff",
   "linear:1,2:3,4:0,#000000:1,#ffffff",
   "png:/home/psychon/Wallpaper/Bars.png",
   { type = "solid", color = "#00aa00" },
   { type = "radial", from = { 50, 50, 10 }, to = { 55, 55, 30 }, stops = { { 0, "#ff0000" }, { 0.5, "#00ff00" }, { 1, "#0000ff" } } },
   { type = "linear", from = { 1, 2 }, to = { 3, 4 }, stops = { { 0, "#000000" }, { 1, "#ffffff" } } },
   { type = "png", file = "/home/psychon/Wallpaper/Bars.png" },
}) do
   collectgarbage("collect")
   print(benchmark(function() gears.color.create_pattern(arg) end), arg)
end

Before this change (larger numbers are better, this measures how many times we
can create the given pattern per second):

29525   #00aa00
29344   solid:#00aa00
3446    radial:50,50,10:55,55,30:0,#ff0000:0.5,#00ff00:1,#0000ff
4845    linear:1,2:3,4:0,#000000:1,#ffffff
32855   png:/home/psychon/Wallpaper/Bars.png
29883   table: 0x1bb67e0
3868    table: 0x1bb6830
5339    table: 0x1bb6c60
32772   table: 0x1bb6fe0

After this change:

126188  #00aa00
125962  solid:#00aa00
125125  radial:50,50,10:55,55,30:0,#ff0000:0.5,#00ff00:1,#0000ff
125213  linear:1,2:3,4:0,#000000:1,#ffffff
113659  png:/home/psychon/Wallpaper/Bars.png
125586  table: 0x1232680
125249  table: 0x12326d0
125468  table: 0x1232b00
113711  table: 0x1232e80

As you see, this makes some cases about 35 times faster (although I have to
admit that something like this can be expected from such a synthetic benchmark).

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-29 23:01:17 +01:00
Uli Schlachter 2d8c21af85 gears.surface: Cache files from disk
Instead of loading files from disk every time we need them, add a cache to
gears.surface as a weak table that maps strings to cairo surfaces.

If this cache should be avoided, there is a new gears.surface.load_uncached()
function which works just like gears.surface.load() worked before.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-29 23:01:08 +01:00
Daniel Hahler cea6b92aea Fix the call to tag.history.restore from tag.delete
By default, tag.history.restore switches between the previous history
states, which is not what should get done when deleting a tag.

Without this, deleting multiple tags in a row, will jump back to the
first/fallback tag, instead of the older history entries.
2014-03-29 18:13:06 +01:00
Emmanuel Lepage Vallee 9c69e857ed Fix tag screen switching
The bugs this fix are:

 * Invalid request using nil as screen
 * Stop messing indexes in the old screen
 * Prevent c.screen <-> t.screen mismatch
 * Prevent no tags being selected in the old screen
2014-03-26 23:14:23 +01:00
Uli Schlachter 7852bfb22d awful.tag.withcurrent: Try harder at finding a tag (FS#1196)
When a screen doesn't have any tags selected, then just tag the new client with
all of the screen's tags. That way, we don't lose clients.

Also, if we failed at coming up with tags for a client, don't completely untag
it. This means that it can keep its old tags if it had any.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-26 14:30:31 +01:00
Uli Schlachter 0b5fa183d1 Revert "awful.client.movetoscreen: Don't untag clients completely (FS#1196)"
This reverts commit bbe86e4e25. That commit caused
unintuitive, special behavior. Instead, when someone wants us to set a screen,
we really should do so.
2014-03-26 14:30:30 +01:00
Daniel Hahler b5d6c4eb0d Set c.screen in ewmh.tag and before tags in rules.execute
The current premise is that c.screen should be the same as
awful.tag.getscreen(t).

The addition in `ewmh.tag` appears to be the important part here,
changing the order in awful.rules.execute is (maybe) only for
consistency across the codebase.
2014-03-24 22:24:14 +01:00
Daniel Hahler a39a38bf5f Drop focus:raise() in magnifier.arrange
This is a useful fix in general, but especially after commit 620732a
(Remove raise call from mouse.client.move).

Ref: https://github.com/awesomeWM/awesome/pull/9#issuecomment-37736135
2014-03-24 22:23:26 +01:00
Uli Schlachter d8909a947c Revert "Set c.screen in ewmh.tag and before tags in rules.execute"
This reverts commit 6280998306.
2014-03-24 09:49:44 +01:00
Daniel Hahler 812683e48c Expand '~' in the path for beautiful.init
This expands the tilde in the path to beautiful.init and changes the
expansion in theme values to only match '^~/': tilde expansion is only
meant to be expanded at the beginning.

The latter is not really tested.
2014-03-24 09:40:11 +01:00
Daniel Hahler 6280998306 Set c.screen in ewmh.tag and before tags in rules.execute
The current premise is that c.screen should be the same as
awful.tag.getscreen(t).

The addition in `ewmh.tag` appears to be the important part here,
changing the order in awful.rules.execute is (maybe) only for
consistency across the codebase.
2014-03-24 09:40:04 +01:00
Uli Schlachter 482efb8314 gears.color.create_opaque_pattern: Fix for SurfacePatterns (FS#1236)
Sorry!

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-23 22:44:12 +01:00
Uli Schlachter 8affa3bc02 beautiful: Don't use non-existant API
Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-23 19:31:10 +01:00
Uli Schlachter 7e21f85c3c wibox.layout.base.fit_widget: Enforce sane width and height
Previously, odd things could happen if a widget was getting fitted into a
negative width or, even worse, width being NaN (not a number)!

This can e.g. happen due to a margin layout which doesn't get enough space to
even draw the margin that it is supposed to add.

Fix this by enforcing a minimum value of 0 for the width and height that a
widget gets fitted into.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-23 17:50:15 +01:00
Uli Schlachter 8003156e62 imagebox: Avoid division by zero
Given an imagebox i with i.resize_forbidden = false and a valid image set, the
call t:fit(0, 0) would return two times "not a number".

This is because the code first does some calculations to get the input image
into the available space and then tried to do some calculations needed for
scaling images up.

The first calculation already gave us h == 0 == w, the second calculation would
then calculate 0/0. This results in NaNs.

This was only noticed because NaN is not a valid table index in lua.

Fix this by returning 0,0 if we have an image of width or height 0 after the
first calculation. Since 0x0 images are valid in cairo, this also fixes the same
bug with such images.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-23 17:50:10 +01:00
Uli Schlachter 23432cfaeb awful.client: Add marked and unmarked signals (FS#1227)
Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-23 16:37:48 +01:00
Uli Schlachter b693f1186c awful.rules: Emit request::activate on the client
There is a strong hint that you are doing something wrong: You call
client.emit_signal(some_signal, c). Chances are high that this signal is
supposed to be emitted on the client object 'c' instead of the underlying client
class.

This applies to awful.rules' usage of this signal.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-18 16:02:47 +01:00
Uli Schlachter 0dcbde2018 Bump minimum lgi dependency to 0.7.0
Before commit 1b2826 in lgi, the get_rgba() function on cairo SolidPatterns was
specified like this:

    get_rgba = { ret = cairo.Status,
                 { ti.double, dir = 'out' },
                 { ti.double, dir = 'out' },
                 { ti.double, dir = 'out' } },

The above commit fixed this (without saying so) and the code became:

    get_rgba = { ret = cairo.Status,
                 { ti.double, dir = 'out' },
                 { ti.double, dir = 'out' },
                 { ti.double, dir = 'out' },
                 { ti.double, dir = 'out' } },

The prototype for the corresponding cairo function is:

cairo_public cairo_status_t
cairo_pattern_get_rgba (cairo_pattern_t *pattern,
                        double *red, double *green,
                        double *blue, double *alpha);

As you see, this functions gets four double* as arguments and it will save its
result via those pointers. Old versions of lgi call this function with too few
arguments and this will cause a segmentation fault when cairo dereferences an
invalid pointer.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-17 17:59:58 +01:00
Uli Schlachter 3e1f4ff02f 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:19:51 +01:00
Uli Schlachter b61fa0ac15 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:56:19 +01:00
Daniel Hahler e5dcb14f3d Only set client's urgent after startup
This looks at awesome.startup in the default 'request::activate' signal
handler.
2014-03-16 21:26:01 +01:00
Daniel Hahler 166cedc936 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:00 +01:00
Uli Schlachter 9770986b6f 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 15:38:39 +01:00
Uli Schlachter 5b4666432f 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 15:38:35 +01:00
Emmanuel Lepage Vallee 061751dd9d 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:41 +01:00
Daniel Hahler adbc7ac0c3 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:31 +01:00
Daniel Hahler ed69ed9529 Minor doc fixes 2014-03-15 08:51:59 +01:00
Daniel Hahler c07b662042 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:40:56 +01:00
Daniel Hahler 926dd348e4 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:40:54 +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
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 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 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 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 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 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 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
Uli Schlachter 04dee81d13 client: Add request::activate signal (FS#848)
When we receive a _NET_ACTIVE_WINDOW request on the root window, we used to just
focus and raise the window. This didn't do much for clients which are on
non-selected tags.

Thus, this commit makes awesome emit request::activate on the client instead.
This is used in awful.ewmh to implement the old behavior again, but with
additionally marking the client as urgent if it isn't visible.

People who don't like this behavior can use client.disconnect_signal to disable
this behavior again. To make this really possible, awful.ewmh becomes a
"non-nil" module.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-03-06 17:47:55 +01:00
Uli Schlachter 91cc8519b5 wibox.drawable: Cache the wallpaper
Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-02-23 12:19:26 +01:00
Björn Åström c6365fa2f6 drawable: Support for true transparency (FS#1210)
This makes the drawable paint the wallpaper in the background
(i.e. pseudo transparency) only if there is not a composite manager running,
as reported by the value of awesome.composite_manager_running.

In other words: drawables can now make use of true transparency.

Signed-off-by: Björn Åström <bjoast@gmail.com>
Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-02-23 12:16:00 +01:00
Uli Schlachter 019f55a1da naughty: fix ldoc
lib/naughty.lua:65: ?: 'class' cannot have multiple values; {table,table}

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-02-22 16:35:17 +01:00
Massimiliano Brocchini b8c172a2dc prompt: search in prompt history using exact string match
The default value for the second argument to :find() is 1, so nothing is changed
here. The third arguments disables pattern matching and instead gets us literal
interpretation of strings. This means that pattern characters like e.g. [, ] and
. don't get interpreted.

Signed-off-by: Massimiliano Brocchini <massimiliano.brocchini@gmail.com>
Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-02-22 16:32:34 +01:00
Massimiliano Brocchini 77a2b27426 prompt: fix search term ctrl+up/ctrl+down when starting from existing entries
Signed-off-by: Massimiliano Brocchini <massimiliano.brocchini@gmail.com>
Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-02-22 16:32:34 +01:00
Fabienne Ducroquet 94a8c72596 layouts: spiral: Avoid gaps between windows
When an area is split in two, for example horizontally, one of the windows
should have height math.floor(previous height / 2) and the other
math.ceil(previous height / 2), to be certain that no gaps are left between the
windows.

For instance, if the first window has height h and the second window has height
math.floor(h / 2), the height of the third window should be math.ceil(h / 2)
instead of the same as for the second window.

So to compute the size of window n + 1 it’s necessary to remember the size of
window n - 1 as well as that of window n.

Signed-off-by: Fabienne Ducroquet <fabiduc@gmail.com>
Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-01-23 18:39:52 +01:00
Rocco Aliberti 7adc21e2ca wibox.layout.margin: Add margins color parameter
This adds a :set_color() method so that the margin layout can color the margins,
drawing a bordered widget.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-01-20 17:28:04 +01:00
Rocco Aliberti 64dc578efc awful.menu.clients: Remove useless line (FS#1200)
Signed-off-by: Uli Schlachter <psychon@znc.in>
2014-01-20 16:30:24 +01:00