131 Commits

Author SHA1 Message Date
matclab
3c33f4559f No compositor if no _NET_WM_CM_Si atom
close #734
2020-07-12 14:44:47 +02:00
Nikos Tsipinakis
8afb7fcd1a Clear window before redrawing (again!)
The timeline of this issue is as follows:
In 7a094bc a call to XClearWindow/XFlush was added as part of RGBA
support.
Afterwards, I noticed that there is some noticeable flicker while
redrawing for large notifications, so I foolishly removed both of these
calls without considering the full effects.

As a result when redrawing notifications 'stack up' with each-other.
After a testing it seems that the XFlush call that was causing
the flicker is not necessary and XClearWindow works without it.

Fixes #728
2020-07-02 19:27:44 +02:00
Nikos Tsipinakis
ed3db5048c Revert "Clear window to prevent accumulations"
This reverts commit 7a094bc702149104cd4049281a7dd9ed0ab76c89.

This commit caused a flicker effect every time the window was redrawn,
reverting it for now.
2020-06-09 12:13:29 +02:00
Nikita Zlobin
2e2b3e549f RGBA color support 2020-05-23 14:14:50 +05:00
Nikita Zlobin
2de1603cd2 style fix 2020-05-20 21:19:04 +05:00
Nikita Zlobin
10c82ed7fe Rename x_win_round_corners() to x_win_corners_shape()
It's all job is to feel proper X11 shape.
2020-05-20 21:16:31 +05:00
Nikita Zlobin
73b7176e0b Reuse draw_rounded_rect() for xshape drawing 2020-05-20 21:15:01 +05:00
Nikita Zlobin
85ea8b8aa8 Separate some functions 2020-05-20 21:10:45 +05:00
Nikita Zlobin
6b6b63da17 code style fix 2020-05-09 02:10:15 +05:00
Nikita Zlobin
296cea499c Compositor detection 2020-05-08 06:23:10 +05:00
Nikita Zlobin
0e35c6acb0 Use cairo to form xshape mask 2020-05-07 02:47:11 +05:00
Nikita Zlobin
dcf060effa Fix xshape mask rounding 2020-05-05 11:55:50 +05:00
Nikita Zlobin
d964455d36 oops: Keep ready for possible 32bit color lack 2020-05-05 00:56:19 +05:00
Nikita Zlobin
d3f6c05590 True transparency support 2020-05-04 19:45:02 +05:00
Nikita Zlobin
7a094bc702 Clear window to prevent accumulations 2020-05-04 19:06:53 +05:00
Nikita Zlobin
c09f0f029f style fix 2020-05-04 02:42:18 +05:00
Nikita Zlobin
dbbaecfd1d Fix indentation 2020-05-04 02:35:34 +05:00
Nikita Zlobin
4c4dc9aa95 Fix ugly rounded corners 2020-05-03 22:03:47 +05:00
Chris Down
e8fc45da63 follow=keyboard: Fall back to follow=mouse instead of XDefaultScreen()
In dwm and similar window managers, it's common to often have empty
tags, and navigate to them with the intent to create clients there. If I
navigate to one of those empty tags with a dunst notification visible
and follow=keyboard set, the notification warps over to the default
screen.  If I then open a client, it then warps back, which is pretty
jarring.

This is mostly an artefact of the implementation of follow=keyboard --
if we fail to get a focused window, we use the default screen. However
this case isn't necessarily really a "failure" on window managers like
dwm where it's a common occurrence to end up with no clients on the
screen, whereas that would be significantly rarer on (say) GNOME or KDE.

A guess that's more likely to fit user expectations is falling back to
where the mouse pointer currently is, since this indicates the currently
focused monitor that the window manager would create a client on. This
avoids warping back to that monitor again when a client is created.
2020-04-27 16:34:53 +01:00
Michael Krasnitski
506b4f2cfa Allow a mouse button to perform 1 or more actions in series.
The user provides a comma-separated list of valid mouse actions
that will be performed one after another when a notification is
clicked. If any one of the provided actions is invalid, the value
reverts to its default state.
2020-04-05 15:29:24 -04:00
Nikos Tsipinakis
ac94eca79e Recheck fullscreen status on ConfigureNotify
IceWM does not send PropertyNotify when exiting fullscreen. As a
band-aid solution also re-check the fullscreen status on ConfigureNotify
events. We're receiving them already so a few extra checks should not be
noticeable in any case.

Fixes #613
2019-06-20 15:25:54 +03:00
Nikos Tsipinakis
69a682ce34 Fix call to draw when no notifications are available
Draw should not be called when there are no notifications in the queue.
This for unknown reasons causes a crash the next time we attempt to get
the currently active window with a BadValue error from
XGetWindowProperty.

Fixes #630.
2019-06-19 11:02:46 +03:00
Nikos Tsipinakis
264df67a63 Fix negative width being ignored
In `x_parse_geometry` we modified the global settings struct for
negative width instead of updating it in the struct that is currently
being constructed.

As a result the negative_width field was always false as it was being
overwritten by the struct assignment after the functions return.

Fixes #628
2019-05-02 12:34:25 +03:00
Nikos Tsipinakis
1bc3237a35 Subscribe to PropertyChangeMask regardless of follow_mode
PropertyNotify events are used primarily to detect active screen changes
when follow mode is used but now we also need them to receive resource
manager events in order to update the dpi value.
2019-03-23 20:01:27 +02:00
Benedikt Heine
812d5a3b84 Replace the xresources DB on PropertyNotify
When changing values with xrdb on the command line, an XEvent is
triggered on the "RESOURCE_MANAGER" atom.

But xlib just doesn't care. XResourceManagerString() will still report
the old values. Also XrmGetDatabase() won't help out.

So, when we receive a PropertyNotify for the resource manager atom, we
have to manually query its contents, convert it to a DB and replace it
in the display object.

This allows, that any method just can call XrmGetDatabase() and get the
latest values.
2019-03-23 20:01:27 +02:00
Benedikt Heine
4b06d67605 Initialize xrm during init
Initializing xrm is required only once. Everything else would be
overhead.
2019-03-23 20:01:27 +02:00
Benedikt Heine
9961efd10c Copy the database from the display connection
This allows to update the DB on the xctx.dpy object. Crawling the string
from xctx.dpy will always return the xdefaults string, which represents
the defaults from the initialisation, but not with any other updates.
2019-03-23 20:01:27 +02:00
Benedikt Heine
e9e199c4ec Pass pointer to check_screen_event 2019-03-23 20:01:27 +02:00
Benedikt Heine
ca7234b1c8 Cache the Xft.dpi value outside
The Xft.dpi value is one way to set the dpi of the X11 display. Querying
this value requires much overhead. Therefore we have to cache this.

Previously we did just query it at the beginning and ignored further
changes.

As there is no native signal to catch a change in its xrdb value, we
have to rely on the root window's PropertyNotify event and filter there
the RESOURCE_MANAGER atom.

This will get hooked up later.
2019-03-23 20:01:27 +02:00
Benedikt Heine
37e580e857 (style) swap conditional blocks 2019-03-23 20:01:27 +02:00
Benedikt Heine
4f510e1703 Query the X11 screen's DPI instead of monitor
When changing the DPI via xrandr --dpi <DPI>, xrandr will send a
RRScreenChangeEvent and the DPI value should get adjusted.

Falsely, we thought randr_update() would catch up and query the right
monitor values. But nothing changes, because we query the
XRRMonitorInfo. The monitor info contains the real physical width and
height of the monitor's screen.

But xrandr --dpi only changes the - let's say - virtual screen size of
the virtual overall screen (and therefore changing the DPI to the
matching value).

Important commands to understand:

- Changes dpi of the virtual screen

    xrandr --dpi

- Gives info about the "virtual" screen size (used by DisplayWidth)

    xdpyinfo | grep -B1 resolution

- Gives info about the "physical" screen size (used by XRRMonitorInfo)

    xrandr -q

I know, that I'm probably not right and might not understand the topic
in its full size yet[0]. But I'm 100% sure, that the terms "monitor",
"screen", "screens", "output" and "display" do not have a consistent
naming scheme.
[0] https://twitter.com/dechampsgu/status/857924498280124416

Fixes #382
2019-03-23 20:01:27 +02:00
Benedikt Heine
121ddd2b94 Always throw out the whole screen array
If n < screens_len, screens_len did not get updated. So boundary
checks wouldn't catch, if screens between n and screens_len are
accessed. This will prevent such an error type in the future.
2019-03-23 20:01:27 +02:00
Benedikt Heine
9bcb27f2e8 Pass the RRScreenChangeNotify event to libxrandr
From Xrandr(3):

> Clients must call back into Xlib using XRRUpdateConfiguration when
> screen configuration change notify events are generated [...].
2019-03-23 20:01:27 +02:00
Benedikt Heine
16fcbc9db9 Use @retval in codedocs 2019-03-06 21:14:52 +01:00
Benedikt Heine
19c9a8e296 Harden against undefined X Atoms
Fixes #589
2019-01-23 17:56:59 +01:00
Benedikt Heine
8579b3ed6b Add assertion macro to return values
Just recently, I started using g_return_val_if_fail as a brief assertion
checker. It'll also exit the function with a specified return value.

But actually this introduces some weird behavior. It's configurable by
environment variables and it'll print out a log message, if the
expression didn't validate properly. But some of these assertions are
actually ment to be silent.

Using a simple macro makes it simple to structure the assertions and its
return values in a block at the start of a function or anywhere else.
2019-01-07 15:30:42 +01:00
Benedikt Heine
7e81506226 Remove colors field from xctx
The xctx color field is a full duplicate of the settings logic.
Only logic included in xctx color fields, are the frame colors, which
fall back to the global frame setting. So, this required to handle it
directly in settings.c
2018-11-26 19:54:07 +01:00
Benedikt Heine
3e205ff159 Use notification_colors struct in settings 2018-11-26 18:17:00 +01:00
Benedikt Heine
9b45a111f1 Sort includes alphabetically 2018-11-15 15:17:48 +01:00
Benedikt Heine
a6abfdf7c5 Include all local files relatively 2018-11-15 15:17:48 +01:00
Benedikt Heine
08019dc268 Move context_menu into right header 2018-10-31 15:19:24 +01:00
Benedikt Heine
c0e2a2a7e3 Move all strcmp operations to STR*EQ macros 2018-10-09 10:08:17 +02:00
Benedikt Heine
bb02897bc8 Introduce STR_EQ and STRN_EQ macros 2018-10-09 10:08:17 +02:00
Benedikt Heine
516161e765 Typo 2018-10-08 17:38:00 +02:00
Nikos Tsipinakis
740ebdd5a3
Merge pull request #545 from tsipinakis/bugfix/x11-opt
Draw event optimizations
2018-09-24 20:25:17 +03:00
Nikos Tsipinakis
7ac054b3cc Simplify window showing and hiding
As suggested by @bebehei make x_win_{show,hide} callable at any time and
avoid double checking the queue length.
2018-09-20 10:49:40 +03:00
Nikos Tsipinakis
69100790a1 Do not wake up on focus events
Focus events do not mark any change in state of the notifications so
calling wake_up as a response is a wake of CPU cycles. Instead treat
them like PropertyNotify and only redraw if we need to change monitors.
2018-09-20 10:40:05 +03:00
Benedikt Heine
bbbddad3a7 Use structs for notifications 2018-09-16 02:58:31 +02:00
Benedikt Heine
c944949e36 Pack types from x.c into structs 2018-09-16 02:58:13 +02:00
Benedikt Heine
f14b0b2b4a Show xmore layout only when needed
For the case, that there is a single notification waiting in queue, the
xmore layout is an annoying setting.
2018-09-13 12:08:41 +02:00