Commit graph

225 commits

Author SHA1 Message Date
Kristian Høgsberg
46f9745c10 connection: Always malloc closure
This lets us allocate the closure just big enough and is a first step towards
a message queue.
2012-06-13 10:45:34 -04:00
Jonas Ådahl
1432bd62df wayland-server: Add destroy signal to wl_seat
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
2012-06-12 20:18:42 -04:00
Pekka Paalanen
c29020332a server: require XDG_RUNTIME_DIR
An arbitrary fallback to the current directory is only confusing.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
2012-06-06 13:07:33 -04:00
Kristian Høgsberg
aa792ad3d6 Add a focus change signal for wl_pointer and wl_keyboard 2012-06-05 09:56:42 -04:00
Daniel Stone
872d074a43 Add key_state and button_state enums
Rather than hardcoding 0 and 1 everywhere.

Signed-off-by: Daniel Stone <daniel@fooishbar.org>
2012-05-31 14:02:20 -04:00
Daniel Stone
9a1705c5f5 wl_keyboard: Add modifier event
This event sends the current keyboard modifier/group state from the
compositor to the client, allowing all clients to have a consistent view
of the keyboard state (e.g. current layout, Caps Lock, et al).  It
should be sent after a keyboard enter event, and also immediately after
any key event which changes the modifier state.

Signed-off-by: Daniel Stone <daniel@fooishbar.org>
2012-05-31 14:01:56 -04:00
Daniel Stone
f7a39ff69b Always reset keyboard and pointer focus
If wl_pointer_set_focus or wl_keyboard_set_focus have been called before
a listener has been established for that seat and client combination,
the focus window will be set but the focus resource will be NULL.  This
changes these functions to always attempt to search for the relevant
focus resource, allowing the resource to be set by calling
wl_keyboard_set_focus and wl_pointer_set_focus again when a listener has
been established.

Signed-off-by: Daniel Stone <daniel@fooishbar.org>
2012-05-31 14:01:29 -04:00
Martin Minarik
1b6a61d3e9 Wayland: logging: replace printf by wl_log 2012-05-31 13:57:20 -04:00
Martin Minarik
8e2a786703 Wayland: logging
The core libwayland libraries should not handle logging, only passing
the error messages to subscribed functions.
An application linked to libwayland-server or libwayland-client
will be able to set own functions (one per library) to handle error
messages.

Change in this series: make the wl_log return int, because
of compatibility with printf. It will return the number of bytes logged.
2012-05-31 13:57:15 -04:00
Rob Bradford
1323b074c3 server: Initialise serial number counter for wl_display
This ends up propagating through and creating a valgrind error like:

==22573== Conditional jump or move depends on uninitialised value(s)
==22573==    at 0x409E57: pointer_attach (compositor.c:1999)
==22573==    by 0x34ECE05D63: ffi_call_unix64 (unix64.S:75)
==22573==    by 0x34ECE05784: ffi_call (ffi64.c:486)
==22573==    by 0x5674C45: wl_closure_invoke (connection.c:770)
==22573==    by 0x566ECCB: wl_client_connection_data (wayland-server.c:255)
==22573==    by 0x56722F1: wl_event_source_fd_dispatch (event-loop.c:79)
==22573==    by 0x5672C91: wl_event_loop_dispatch (event-loop.c:410)
==22573==    by 0x56705F4: wl_display_run (wayland-server.c:1003)
==22573==    by 0x40C775: main (compositor.c:2937)
2012-05-22 15:24:48 -04:00
Daniel Stone
aa0fb0f49c Convert wl_input_device to wl_seat (and friends)
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.

Signed-off-by: Daniel Stone <daniel@fooishbar.org>
2012-05-16 14:19:22 -04:00
Daniel Stone
0c20496e1a Input: Convert pointer co-ordinates to signed_24_8
This offers more precision when using devices like tablets, and also for
transformed surfaces.

Signed-off-by: Daniel Stone <daniel@fooishbar.org>
2012-05-08 14:40:46 -04:00
Daniel Stone
3f7048e0e9 Use unsigned for key/button up/down state in grabs
Since we just use it as a simple boolean flag, might as well convert it
to unsigned.

Signed-off-by: Daniel Stone <daniel@fooishbar.org>
2012-05-07 12:15:14 -04:00
Nicolas Pouillon
c1b6dbbacd server: Post new globals to current clients
Globals are bursted to client on conntect.  Now when new global
objects are added to the server state, existing clients also get
notified.
2012-05-02 09:35:39 -04:00
Kristian Høgsberg
ac73a74f43 Add wl_client_get_object() 2012-04-27 11:28:06 -04:00
Pekka Paalanen
9f91feb5d9 server: do not create wl_client if accept() failed
Spotted during wl_os_accept_cloexec() work.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
2012-04-25 09:37:42 +03:00
Pekka Paalanen
ff50f6bfc4 os: wrap accept4(SOCK_CLOEXEC)
Some system C libraries do not have SOCK_CLOEXEC, and completely miss
accept4(), too. Provide a fallback for this case.

This changes the behaviour: no error messages are printed now for
failing to set CLOEXEC but the file descriptor is closed.

The unit test for this wrapper is NOT included.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
2012-04-25 09:37:42 +03:00
Kristian Høgsberg
1901d66ffc connection: Move closure object out of wl_connection 2012-04-22 13:49:35 -04:00
Pekka Paalanen
7134a439c1 os: wrap socket(SOCK_CLOEXEC) calls
Some system C libraries do not offer SOCK_CLOEXEC flag.

Add a new header for OS compatibility wrappers. Wrap socket() calls into
wl_os_socket_cloexec() which makes sure the O_CLOEXEC flag gets set on
the file descriptor.

On systems having SOCK_CLOEXEC this uses the old socket() call, and
falls back if it fails due to the flag (kernel not supporting it).

wayland-os.h is private and not exported.

Add close-on-exec tests for both normal and forced fallback paths.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
2012-04-20 16:26:37 +03:00
Kristian Høgsberg
fa5f7b1191 server: Add client destroy signal 2012-04-13 09:53:15 -04:00
Kristian Høgsberg
6802eaa68a Introduce wl_signal
This is mostly renaming and consolidating the listener_list pattern
into something more concise and reusable.
2012-04-12 15:52:44 -04:00
Kristian Høgsberg
5535f155d8 Switch protocol to using serial numbers for ordering events and requests
The wayland protocol, as X, uses timestamps to match up certain
requests with input events.  The problem is that sometimes we need to
send out an event that doesn't have a corresponding timestamped input
event.  For example, the pointer focus surface goes away and new
surface needs to receive a pointer enter event.  These events are
normally timestamped with the evdev event timestamp, but in this case,
we don't have a evdev timestamp.  So we have to go to gettimeofday (or
clock_gettime()) and then we don't know if it's coming from the same
time source etc.

However for all these cases we don't need a real time timestamp, we
just need a serial number that encodes the order of events inside the
server.  So we introduce a serial number mechanism that we can use to
order events.  We still need real-time timestamps for actual input
device events (motion, buttons, keys, touch), to be able to reason
about double-click speed and movement speed so events that correspond to user input carry both a serial number and a timestamp.

The serial number also give us a mechanism to key together events that
are "logically the same" such as a unicode event and a keycode event,
or a motion event and a relative event from a raw device.
2012-04-11 22:27:26 -04:00
Kristian Høgsberg
3cddb3c692 Fix remaining signedness errors
We can change the data type for 'size' but we have to cast len to size_t
for the comparisons with sizeof results.
2012-03-30 11:27:02 -04:00
Pekka Paalanen
4560b6b6b4 server: fix button signedness in wl_grab_interface
wl_input_device::grab_button is unsigned but the button parameter to
wl_grab_interface::button is signed. This lead to a warning in
data-device.c.

The button number is unsigned in the protocol, so make it unsigned in
the wl_grab_interface API, too. Fixes the compiler warning "comparison
between signed and unsigned integer expressions".

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
2012-03-30 10:14:51 -04:00
Pekka Paalanen
00ea1701f2 server: fix signedness in wl_client_connection_data
The variables opcode and size were unsigned, which lead to warnings
about comparisons of signed vs. unsigned.

Change these variable to signed. Their usage never relies on being
unsigned.

This also fixes (an assumed) printf format string problem, where these
were printed with %d, not %u.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
2012-03-30 09:32:26 -04:00
Kristian Høgsberg
3891c73511 Fix formatting warning 2012-03-27 16:36:25 -04:00
Ander Conselvan de Oliveira
897a4ec62d data-device: notify the compositor about new drag icons
Let the compositor use a listener to be notified when a new drag icon
is set up.
2012-03-27 16:32:02 -04:00
Pekka Paalanen
70db367ccc server: fix event sending type mismatches
These were not bugs in practice, because the first (and only) field of
struct wl_surface is struct wl_resource.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
2012-03-02 18:09:27 +02:00
Pekka Paalanen
5ee70146c6 server: use the event sending wrappers
This exposes some type mismatches that are fixed in the next commit.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
2012-03-02 18:06:19 +02:00
Kristian Høgsberg
0d22d25b87 wayland-server: Destroy resource before sending out delete_id event
In some cases, we send out events from the resource destructor and
those need to go out before we recycle the object ID.
2012-03-01 22:46:46 -05:00
Kristian Høgsberg
b26774da5b Don't block when flushing a full protocol buffer
In case the client isn't responding, this will block the compositor.
Instead we flush with MSG_DONTWAIT, which lets us fill up the kernel buffer
as much as we can (after not returning EPOLLOUT anymore it still can take
80k more), and then disconnect the client if we get EAGAIN.
2012-02-29 11:07:48 -05:00
Kristian Høgsberg
3c6f42112d Split pointer_focus and keyboard_focus into enter and leave events 2012-02-23 09:35:24 -05:00
Scott Moreau
ab3b5cd71c server: Implement wl_keyboard_grab_interface. 2012-02-18 11:55:22 -05:00
Scott Moreau
8134e06742 server: Rename wl_grab_interface.
In order to separate pointer and keyboard grabs, we need to
introduce a keyboard grab interface but first we must rename
some generic types to denote which device is holding the grab.

Type renames:

wl_grab_interface -> wl_pointer_grab_interface
wl_grab -> wl_pointer_grab
wl_input_device_start_grab -> wl_input_device_start_pointer_grab
wl_input_device_end_grab -> wl_input_device_end_pointer_grab
2012-02-18 11:51:38 -05:00
Kristian Høgsberg
8503cd6859 Add wl_client_get_credentials() to get unix credentials for client 2012-02-18 00:29:25 -05:00
Pekka Paalanen
5536031bfb protocol: remove absolute coordinates from pointer
Remove the absolute coordinate fields from the pointer motion and
pointer_focus events. Clients are not supposed to see any global
coordinates.

Fix wayland-server code accordingly. wayland-client code is unaffected.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
2012-02-16 16:33:01 -05:00
Neil Roberts
e0b6af03ca server: In default grab, update focus resource after sending release
The default grab implementation in wayland-server was updating the
focus resource before sending the button event. This would cause the
button release to be dropped from the implicit grab if the pointer is
moved away from the focus surface. This patch just swaps the order
around.
2012-01-12 10:59:07 -05:00
Kristian Høgsberg
b6b3d07c83 Move data device implementation into wayland-server 2012-01-06 11:40:02 -05:00
Kristian Høgsberg
dbb3ba7269 Move default grab implementation to wayland-server 2012-01-06 11:40:02 -05:00
Kristian Høgsberg
5ffe9f4708 New grab API
This commit changes the way struct wl_grab works in a couple of ways:

 - The grab itself now decides when it ends instead of hardcoding button
   up as the terminating event.  We remove the end vfunc since a grab now
   always know when it ends and can just clean up at that point.

 - We add a new focus vfunc that is invoked every time the pointer enters
   a new surface, regardless of any grabs.  The callback receives the
   surface and the surface-relative pointer coordinates.  The callback lets
   a grab send enter/leave events and change the grab focus.

 - The grab has a focus surface, wich determines the coordinate space
   for the motion callback coordinates.

 - The input device always tracks the current surface, ie the surface that
   currently contains the pointer, and coordinates relative to that surface.

With these changes, we will be able to pull the core input event delivery
and the drag and drop grab into the core wayland-server library.
2012-01-06 11:30:08 -05:00
Kristian Høgsberg
44b529f2e4 server: Allocate server ID for when resource->object.id is 0 2012-01-04 09:13:27 -05:00
Pekka Paalanen
c7473897fc server: remove wl_display::callback_list as unused
Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
2012-01-03 11:23:17 -05:00
Pekka Paalanen
2755847fce server: add wl_input_device_release()
Add a clean-up function for destroying all objects created in
wl_input_device_init(). Can be used to fix memory leaks reported by
Valgrind in the demos.

The init function was also missing an explicit initialisation of the
'keys' array. Add the explicit array init, although it is redundant with
the zeroing of the whole struct.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>

krh: Edited to rename function to *_release()
2012-01-03 11:22:58 -05:00
Kristian Høgsberg
d6465c5b40 Fix WL_EVENT_WRITEABLE typo 2011-12-28 22:51:34 -05:00
Pekka Paalanen
aad1e19058 server: destroy the socket event source on display destroy
On wl_display_add_socket(), the listening socket fd is added to the
event loop. However, wl_event_source object is not stored and hence
cannot be freed, resulting in a minor leak.

Store wl_event_source pointer in struct wl_socket so we can track it,
and destroy it on wl_display_destroy(). The event loop itself must be
destroyed after destroying the event sources linked to it.

Fixes a Valgrind reported memory leak.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
2011-12-22 10:40:39 -05:00
Laszlo Agocs
34901868b8 Increase closure buffer size and fail gracefully for too big closures.
Buffer size changed from 256 to 1024 bytes. Marshalling will now stop
if the buffer is not big enough.
2011-12-17 16:02:05 -05:00
Pekka Paalanen
cf89b40c4c server: do not send delete_id to a dead client
During client tear-down, all objects are destroyed in id order.
Therefore the display object is destroyed first.

If the destroy listeners of any object destroy another object by calling
wl_resoruce_destroy(), we try to send a delete_id event to the client.
This leads to a segmentation fault without a display object.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
2011-11-29 14:46:49 +02:00
Pekka Paalanen
ab6b0738c6 server: no errors to a dead client
Do not try to send errors to an already dead client, while in the
middle of cleanup.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
2011-11-29 14:46:26 +02:00
Kristian Høgsberg
eae3bcb4cc New drag and drop / selection protocol
This commit brings a big change to the DND and copy/paste interfaces.
Most importantly the functionality is now independent of wl_shell.
The wl_shell interface is intended for desktop style UI interaction and
an optional and experimental interface.

The new interface also allows receiving the DND data multiple times or
multiple times during the drag, and the mechanism for offering and receiving
data is now shared between DND and selections.
2011-11-23 16:05:58 -05:00
Kristian Høgsberg
0b7d1e86af server: Stop special casing the compositor
wl_compositor_init() was just adding the global and providing a helper
bind function.  Not useful enough to warrent API.
2011-11-23 10:34:50 -05:00