Move the input_panel interface from desktop-shell to input-method (since
it is not really tied to desktop-shell).
Add an input_panel_surface interface like wl_shell_surface to make it
easier to extend it. Also add a parameter to the set_toplevel request to
be able to specify where to show an input panel surface on the screen.
Signed-off-by: Jan Arne Petersen <jpetersen@openismus.com>
The lock hook in desktop-shell only changes the DPMS state the second
time it is called, because during the first time it launches the
screensaver and wakes the compositor again when the screensaver surface
is configured. However, if the screensaver fails to launch, the output
is left in an enabled state, even thought there's no content being
displayed on the screen.
Fix this by disabling the outputs when the screensaver dies if the
shell is still locked.
https://bugs.freedesktop.org/show_bug.cgi?id=60084
When a surface in deemed unresponsive and we trigger the busy cursor, it's
no longer possible to rotate the surface. This is clearly unacceptable.
This patch adds handling of right clicks to the busy grab so that we can
continue to rotate a surface even if the client is sleeping.
https://bugs.freedesktop.org/show_bug.cgi?id=60609
If our surface has width and height set to the same dimensions as the output
then we can bypassing the scale factor calculation and addition of the
transformation.
The use case that led to this optimisation is the playback of video using
gstreamer-vaapi with the "scale" method. The video is the same dimensions as
the output (1080p.)
We can now handle fullscreen X windows. X clients request to go fullscreen
buy sending a _NET_WM_STATE client message to the root window. When that
happens we call into the shell interface and asks the shell to make the
surface fullscreen. The shell will then resize the window, which causes
the X wm to configure the X window appropriately.
Make sure we ignore configure requests from fullscreened clients and send out
the synthetic configure notify as required in that case.
Finally, inspect _NET_WM_STATE before mapping so we can handle initial
fullscreen correctly.
Introduce several matrix transform types and track type for matrix.
Could be usefull for activating some fastpath that depends on some
transform type.
Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
The list became stale probably when the lock_layer was introduced. Now
one less (ab)user of weston_surface::link.
Also add a comment on screensaver_configure(), that it is (and has been)
broken for pre-started screensavers.
Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
To be able to have a fullscreen surface on one output, and interact with
surfaces on another output, don't lower the fullscreen layer on
activate.
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
The input region of the black surface placed under the fullscreen shell
surface did not have a specified input region. Because the initial input
region of a surface is infinity, no other surface on any other output
could get any focus.
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
This avoids calling weston_surface_set_position twice on the same surface. The
second call has no effect in many cases because sx and sy
are usually zero on this path.
This change now means that any sx/sy values passed into ::attach will be
ignored on the first attach for popup surfaces. This similar to the behaviour
for other surface types.
The wl_buffer reference counting API has been inconsistent. You would
manually increment the refcount and register a destroy listener, as
opposed to calling weston_buffer_post_release(), which internally
decremented the refcount, and then removing a list item.
Replace both cases with a single function:
weston_buffer_reference(weston_buffer_reference *ref, wl_buffer *buffer)
Buffer is assigned to ref->buffer, while taking care of all the refcounting
and release posting. You take a reference by passing a non-NULL buffer, and
release a reference by passing NULL as buffer. The function uses an
internal wl_buffer destroy listener, so the pointer gets reset on
destruction automatically.
This is inspired by the pipe_resource_reference() of Mesa, and modified
by krh's suggestion to add struct weston_buffer_reference.
Additionally, when a surface gets destroyed, the associated wl_buffer
will send a release event. Often the buffer is already destroyed on
client side, so the event will be discarded by libwayland-client.
Compositor-drm.c is converted to use weston_buffer_reference.
Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
Do not remove the input panel layer from the layer list when the
shell is locked in hide_input_panels().
https://bugs.freedesktop.org/show_bug.cgi?id=56543
Signed-off-by: Jan Arne Petersen <jpetersen@openismus.com>
Implement the wl_surface.set_buffer_transform request. This includes
tracking the double-buffered buffer transformation parameter and making
the gl renderer able to handle transformed buffers.
disable_planes should only be incremented when zoom.active actually
toggles. Otherwise the counter will be incremented too many times,
and planes will no longer get used.
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
Add the concept of debug key bindings, that are bindings that activate
debug features in the compositor. The bindings are added to a list in
the compositor, but the triggering them is left to the shell.
On the shell side, a global debug key binding is added. When the user
presses mod-shift-space, the shell will invoke the debug bindings based
on the next key press.
This also converts the debug shortcuts for repaint debugging, fan
repaint debugging and the hide overlays shortcut in compositor-drm to
use the new infrastructure.
Do not try to insert the input panel layer in the layer list when the
shell is locked in show_input_panels(). The layer will already be
insrted in resume_desktop() anyways.
https://bugs.freedesktop.org/show_bug.cgi?id=56543
Signed-off-by: Jan Arne Petersen <jpetersen@openismus.com>
Clicking outside popups closes them except in case of a shell grab
(move, resize or rotate), in which case we move the parent window away
from under the popup. Instead, just end the popup in those cases.
https://bugs.freedesktop.org/show_bug.cgi?id=55674
weston_surface_create() already inits the opaque region, so the second
init in create_black_surface() is logically wrong. Whether this was a
memory leak or not, depends on Pixman internals.
Fini before initing again.
Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
This fixes the bug where surface is above panel_layer
just after it is restored from fullscreen mode.
How to reproduce:
* move surface under panel
* set surface fullscreen
* restore surface to normal mode
When we fork a client and give one end of a socketpair, the credentials
on the socket fd comes back as ourselves. When that happens, do not kill
the process.
Also remove superfluous variables.
Signed-off-by: Tiago Vignatti <tiago.vignatti@intel.com>
Also make all the callers of weston_surface_assign_output() update the
transform instead. This makes sure that when the surface is assigned an
output its bouding box is valid.
This fixes a bug where a newly created surface would have a NULL output
assigned. This would cause weston_surface_schedule_repaint() to not
schedule a repaint, preventing the surface to be shown until something
else caused a repaint.
The workspace manager interface purpose is to provide clients with
control and knowledge about the current workspace state. Initially only
one function and one event exists; moving a surface and state updated
event. A workspace is represented as an index in a 1 dimensional array.
A client keeps track of the state by being broadcasted events when the
state changes, currently limited to current workspace or number of
workspaces available.
A client can send an asynchronous request to the manager asking to move
a surface to workspace identified by an index. It is up to the shell to
actually move it.
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
By default, Control + Shift + Up/Down will move the currently active
surface, if any, while changing to another workspace.
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
To avoid having a surface on a hidden workspace in focus always set the
focus (even to NULL) when restoring.
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
Draw the borders of all the triangles.
v1: original
v2: add keybinding to enable/disable fan debug (super-alt-space),
cycle colors to make it easier to see individual draws, and
redraw undamaged region to clean up previous frames debug
lines
Signed-off-by: Rob Clark <rob@ti.com>
This patch allows rotation and mirroring outputs for x11 and drm backends.
A new 'transform' key can be set in the [output] section. From the protocol:
"The flipped values correspond to an initial flip around a vertical axis
followed by rotation."
The transform key can be one of the following 8 strings:
normal
90
180
270
flipped
flipped-90
flipped-180
flipped-270
Replace all occurrences of workspace_damage_all_surfaces() with
weston_compositor_schedule_repaint(). This fixes a bug exposed by
982387011f where trying to switch workspaces while there are no
surfaces on the current workspace fails to start the animation.
Place the window in a random position on the output where the first seat with
a pointer is. When calculating the random position limit the range to the
area that would ensure that the whole surface is visible. If the surface is
larger than the output then the surface is placed at the origin of the
output.
This change is based on the good work of Scott Moreau <oreaus@gmail.com>
If a client sends a pong message out of the blue, we deref ping_timer
which is NULL and then crash. Unsolicited pong requests indicate that
something is wrong on the client, but the compositor should survide that.
This makes the separation between panels and input panels clearer and
prevents the (desktop) panel from removing existing input panels on
redraw.
The input panel layer is below the panel layer.
Since weston_surface_update_transform() was changed so it called
surface_damage_below() instead of surface_damage(), the trick of
clearing the surface damage did not work anymore.
Fix this by moving the repaint surface to a special plane before
calling update_transform. The move is made manually (as opposed to
calling weston_surface_move_to_plane()) to avoid the call to
weston_surface_damage_below(). The transform update causes the
damage to be added to this special plane, which is simply ignored.
After the geometry.dirty bit is clear, the surface is moved back to
the primary plane.
Input panel surfaces were kept in a list by using layer_link of
weston_surface. This was pretty hacky and resulted in the bug that
an input panel surface was not removed from the list if it was unmapped
at the time of destruction.
This patch wraps the surface in a new input_panel_surface struct and
properly handles destruction with a signal listener.
When the entire output is transformed or we're capturing the output
for screenshot or video, disable all output specific overlays
(drm planes, hw cursors etc) and move all surfaces into the primary
plane.
If the grab surface happens to be unresponsive, the busy cursor grab
will be started and that will cause the grab surface to receive focus,
which in turn leads to it being pingged again. Break the cycle by not
sending pings to it. If the shell is unresponsive it won't be able to
set the busy cursor anyway.
It does not get the correct panel height for now. The memeber of list
to read should be layer_link not link now.
Signed-off-by: Juan Zhao <juan.j.zhao@linux.intel.com>
We end up calling shell_configure_fullscreen() from activate(), where
surface->buffer may be NULL. Instead, call it on initial map and
first buffer attach after surface type change. Both code path
come from the surface->configure callback where surface->buffer is know
to be non-NULL.
https://bugs.freedesktop.org/show_bug.cgi?id=51678
With shell_surface.set_maximised the caller can provide an output to maximise
to or the default output will be used. With the corresponding configure we
should use the dimensions from the chosen output not the output the surface
was currently on.
Similarly when calculating the position for the window in the map() function
we should use the desired output again.
There is no need to assign shsurf->output to es->output since that happens in
the map() function later.
This happens when vt-switching away from the compositor (drm) or
giving keyboard focus to a different X window. Release the modifiers
so we don't get stuck modifiers. We'll update with the new keys down
when we come back.
We don't gain anything from taking a wl_shell_surface in
desktop_surface.set_background, except making wl_shell_surface
gratuitously dependent on wl_shell. In shell.c we can also handle
backgrounds in their own background_configure function which simplifies
the mapping and placement logic.
It seems we used to rely on the repaint scheduled by the cursor motion.
But if there's no cursor, there's no cursor motion, so we need to schedule
our own repaint.
When moving moving back to a workspace or resuming a locked desktop the
keyboard focus state information was lost. By pushing the state to the
workspace when navigating away from a workspace, or locking a desktop,
we can restore it when navigating back, or resuming.
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
A workspace is a list of top level surfaces visible at a time. New
toplevel surfaces are added to the current workspace. Default
keybindings (modifier - Up, modifier - Down, modifier - F1 up to F6) are
used for navigating between workspaces. By default a single workspace is
created.
Surfaces of inactive workspaces have their outputs NULL:ed so that frame
callbacks gets queued instead of emitted. When workspace gets visible
again surface's outputs are assigned.
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
$ abs_builddir=$PWD/tests gdb -args ./src/weston --module=$PWD/tests/.libs/event-test.so
(gdb) run
Starting program: /home/pq/git/wayland-demos/src/weston --module=/home/pq/git/wayland-demos/tests/.libs/event-test.so
[Thread debugging using libthread_db enabled]
Mesa: Initializing x86-64 optimizations
launching /home/pq/git/wayland-demos/tests/test-client
created output global 0x608f50
test-client: got create-surface
got surface 5 from client
got surface id 5
Program received signal SIGSEGV, Segmentation fault.
Mesa: Initializing x86-64 optimizations
0x00007fffeff72c7c in handle_pointer_focus (listener=0x74f5c0, data=0x6faa40) at shell.c:492
492 if (shsurf->unresponsive) {
(gdb) bt
#0 0x00007fffeff72c7c in handle_pointer_focus (listener=0x74f5c0, data=0x6faa40) at shell.c:492
#1 0x00007ffff5ed8b87 in wl_signal_emit (data=0x6faa40, signal=0x6faa88) at wayland-server.h:166
#2 wl_pointer_set_focus (pointer=0x6faa40, surface=<optimized out>, sx=12800, sy=12800) at wayland-server.c:752
#3 0x0000000000407d92 in weston_device_repick (seat=0x6fa930) at compositor.c:633
#4 0x0000000000407e49 in weston_compositor_repick (compositor=0x61c510) at compositor.c:656
#5 0x00000000004092e1 in weston_output_repaint (output=0x7b85b0, msecs=-1046834186) at compositor.c:1059
#6 0x00000000004094b4 in weston_output_finish_frame (output=0x7b85b0, msecs=-1046834186) at compositor.c:1092
#7 0x00007ffff211e3c1 in finish_frame_handler (data=0x7b85b0) at compositor-x11.c:284
#8 0x00007ffff5eda603 in wl_event_source_timer_dispatch (source=0x79ee50, ep=<optimized out>) at event-loop.c:173
#9 0x00007ffff5edaca0 in wl_event_loop_dispatch (loop=0x61b940, timeout=<optimized out>) at event-loop.c:410
#10 0x00007ffff5ed8dbd in wl_display_run (display=0x61b8f0) at wayland-server.c:1025
#11 0x000000000040ecb1 in main (argc=1, argv=0x7fffffffdd98) at compositor.c:3225
(gdb) print shsurf
$1 = (struct shell_surface *) 0x0
Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
Rather than using a single hardcoded seat to activate new windows within
a compositor, reset the focus for all seats.
Signed-off-by: Daniel Stone <daniel@fooishbar.org>
Instead of using a uint32_t for state everywhere (except on the wire,
where that's still the call signature), use the new
wl_keyboard_key_state enum, and explicit comparisons.
Signed-off-by: Daniel Stone <daniel@fooishbar.org>
Instead of using a uint32_t for state everywhere (except on the wire,
where that's still the call signature), use the new
wl_pointer_button_state enum, and explicit comparisons.
Signed-off-by: Daniel Stone <daniel@fooishbar.org>
This event lets the compositor inform clients of the canonical keyboard
modifier/group state. Make sure we send it at appropriate moments from
the compositor, and listen for it in clients as well.
Signed-off-by: Daniel Stone <daniel@fooishbar.org>
Here we create a new client/compositor interface in weston to allow
clients to report their x/y cursor position to the compositor. These
values are then used to center the zoom area on this point. This
is useful for everyone, especially people who are visually impaired.
Inactive surfaces doesn't set keyboard focus, so it can be used for tooltips,
toolbars and some other type of windows.
This requires protocol side changes.
Signed-off-by: Tiago Vignatti <tiago.vignatti@intel.com>
Fixes crash with a backtrace like this:
==2418== Invalid read of size 8
==2418== at 0x8AC5B70: unresponsive_fade_frame (shell.c:374)
==2418== by 0x409FE0: weston_output_finish_frame (compositor.c:1060)
==2418== by 0x567043B: wl_event_loop_dispatch (event-loop.c:389)
==2418== by 0x566E84C: wl_display_run (wayland-server.c:1003)
==2418== by 0x4055EB: main (compositor.c:2937)
==2418== Address 0x8aba650 is 80 bytes inside a block of size 656 free'd
==2418== at 0x4A0662E: free (vg_replace_malloc.c:366)
==2418== by 0x566D93B: wl_resource_destroy (wayland-server.c:408)
==2418== by 0x566D30E: destroy_resource (wayland-server.h:166)
==2418== by 0x566D93B: wl_resource_destroy (wayland-server.c:408)
==2418== by 0x34ECE05D63: ffi_call_unix64 (unix64.S:75)
==2418== by 0x34ECE05784: ffi_call (ffi64.c:486)
==2418== by 0x5671AAE: wl_closure_invoke (connection.c:770)
==2418== by 0x566DBAA: wl_client_connection_data (wayland-server.c:255)
==2418== by 0x5670497: wl_event_loop_dispatch (event-loop.c:410)
==2418== by 0x566E84C: wl_display_run (wayland-server.c:1003)
==2418== by 0x4055EB: main (compositor.c:2937)a
and
==2418== Invalid read of size 8
==2418== at 0x34F1E180E1: pixman_region32_union (pixman-region.c:1405)
==2418== by 0x407F66: weston_surface_damage (compositor.c:551)
==2418== by 0x409FE0: weston_output_finish_frame (compositor.c:1060)
==2418== by 0x567043B: wl_event_loop_dispatch (event-loop.c:389)
==2418== by 0x566E84C: wl_display_run (wayland-server.c:1003)
==2418== by 0x4055EB: main (compositor.c:2937)
==2418== Address 0x851dfe8 is 136 bytes inside a block of size 680 free'd
==2418== at 0x4A0662E: free (vg_replace_malloc.c:366)
==2418== by 0x566D93B: wl_resource_destroy (wayland-server.c:408)
==2418== by 0x34ECE05D63: ffi_call_unix64 (unix64.S:75)
==2418== by 0x34ECE05784: ffi_call (ffi64.c:486)
==2418== by 0x5671AAE: wl_closure_invoke (connection.c:770)
==2418== by 0x566DBAA: wl_client_connection_data (wayland-server.c:255)
==2418== by 0x5670497: wl_event_loop_dispatch (event-loop.c:410)
==2418== by 0x566E84C: wl_display_run (wayland-server.c:1003)
==2418== by 0x4055EB: main (compositor.c:2937)
wl_input_device has been both renamed and split. wl_seat is now a
virtual object representing a group of logically related input devices
with related focus.
It now only generates one event: to let clients know that it has new
capabilities. It takes requests which hand back objects for the
wl_pointer, wl_keyboard and wl_touch interfaces it exposes which all
provide the old input interface, just under different names.
This commit tracks these changes in weston and the clients, as well as
similar renames (e.g. weston_input_device -> weston_seat). Some other
changes were necessary, e.g. renaming the name for the visible mouse
sprite from 'pointer' to 'cursor' so as to not conflict.
For simplicity, every seat is always exposed with all three interfaces,
although this will change as time goes on.
Signed-off-by: Daniel Stone <daniel@fooishbar.org>
To add greater precision when working with transformed surfaces and/or
high-resolution input devices.
Signed-off-by: Daniel Stone <daniel@fooishbar.org>
No functional changes; it's only opening space for modifications coming along
on the next commits.
Signed-off-by: Tiago Vignatti <tiago.vignatti@intel.com>
and shut-up valgrind:
Conditional jump or move depends on uninitialised value(s)
at 0xB5AFB05: shell_surface_configure (shell.c:2162)
by 0x407B0C: surface_attach (compositor.c:1225)
by 0x621FA13: ffi_call_unix64
by 0x621F434: ffi_call
by 0x4E3D3F5: wl_closure_invoke (connection.c:758)
by 0x4E3786C: wl_client_connection_data (wayland-server.c:255)
by 0x4E3AA19: wl_event_source_fd_dispatch (event-loop.c:78)
by 0x4E3B533: wl_event_loop_dispatch (event-loop.c:460)
by 0x4E38D2C: wl_display_run (wayland-server.c:907)
by 0x40B5DD: main (compositor.c:2748)
Signed-off-by: Tiago Vignatti <tiago.vignatti@intel.com>
Going from fullscreen to toplevel will restore the surface position
immediately. This will move the fullscreen surface to where the toplevel
surface was before, which will flicker for a frame of two before the
resized, non-fullscreen buffer is attached.
Instead, only change the surface geometry when we get the new buffer.
We're able now to create shell_surfaces inside Weston. This makes possible the
glue needed between shell and xserver-launcher.
On the desktop-shell, it was split the protocol part from shell_surface
specific functions to make this possible.
Signed-off-by: Tiago Vignatti <tiago.vignatti@intel.com>
This patch makes the main modifier configurable. We used to hardcode super
(windows key) for most bindings, but now that can be changed.
The change affects two key bindings: rotation moves to mod+right click
and backlight moves to from ctrl+f9/f10 to mod+f9/f10.
Signed-off-by: Tiago Vignatti <tiago.vignatti@intel.com>
- Added ping_timer_destroy() to simplify cleanup.
- Changed timeout and fade step to more realistic values.
- Renamed ping_timeout_fade_frame() to unresponsive_fade_frame().
If a client is not responding, lower the brightness and
saturation to indicate it's stalled. The surface is restored
to it's original color values if the client later becomes
responsive.
Switching display mode may happen when:
1. The fullscreen surface is at top most in fullscreen layer and with
"driver" method. Shell will switch output mode to match the surface
size. If no matched mode found, fall back to "fill" method.
2. The top fullscreen surface is destroyed or unset. Switch back to the
origin mode.
wl_shell is more likely to be used for core protocol specific. Now it follows
pretty much the same style of what tablet-shell is using.
No functional changes.
Signed-off-by: Tiago Vignatti <tiago.vignatti@intel.com>