summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
...
* backends/native: Move relative motion filter to MetaSeatNative altogetherCarlos Garnacho2020-10-233-144/+104
| | | | | | | | And drop the relative motion filter API. The seat will handle relative motion across outputs with different scales. This accesses the MetaMonitorManager ATM. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1486
* backends/native: Make seat constrain pointer to monitors out of the boxCarlos Garnacho2020-10-232-74/+65
| | | | | | It does access the MetaMonitorManager directly ATM. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1486
* backend/native: Move barrier manager to MetaSeatNativeCarlos Garnacho2020-10-234-32/+37
| | | | https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1486
* backends: Move absolute/relative device mapping to native backendCarlos Garnacho2020-10-239-87/+55
| | | | | | | | | | This is a bit scattered around, with the setter/getter in Clutter, and it only being only directly honored in Wayland (it goes straight through device properties in X11). Make this private native API, and out of public ClutterInputDevice API. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1486
* backends: Move device mapping check into backendCarlos Garnacho2020-10-232-19/+25
| | | | | | | | Make the upper parts agnostic about the device being relative in order to apply the display mapping. Just make the low level bits resort to the identity matrix for those. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1486
* backends: Fold device mapping check into backendCarlos Garnacho2020-10-232-11/+7
| | | | | | | | Make the upper part agnostic about the device being relative in order to avoid applying keep-aspect. The X11 bits already are, so make it sure it's also the case for the native backend. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1486
* clutter: Sanitize ClutterInputDevice headerCarlos Garnacho2020-10-233-15/+16
| | | | | | | Move some exposed setters to private headers. It makes some sense to provide those for backends, not as much to the upper layers. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1486
* backends: Drop extra layer of touch info handlingCarlos Garnacho2020-10-233-69/+6
| | | | | | | | We have a hashtable in the device that does not add much on top to the seat handling. Make all the places rely on the seat accounting instead. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1486
* backends/native: Use libinput seat slot APICarlos Garnacho2020-10-234-58/+50
| | | | | | | Instead of creating a seat-wide touch slot ID ourselves, rely on libinput API doing this for us. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1486
* backends/native: Assign unique ranges of slots to virtual devicesCarlos Garnacho2020-10-233-3/+69
| | | | | | | | We are moving to seat-wide touch slot accounting, so move these virtual devices to using their own range each. The theoretical case of overflow/rollover is also handled. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1486
* clutter: Limit number of touch slots available to a virtual touch deviceCarlos Garnacho2020-10-233-2/+40
| | | | | | | | It's not worth letting these devices have an "unlimited" range of touch slots. Limiting it to 32 is more than enough to map it with real touch devices nowadays. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1486
* backends: Drop the filter for libinput eventsCarlos Garnacho2020-10-232-115/+0
| | | | | | This is now unused, and it's arguably any useful to stay. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1486
* wayland: Use Clutter event to handle touch cancelCarlos Garnacho2020-10-231-48/+4
| | | | | | | | | | The semantics for libinput events are not as expected here. Besides it's pointless, as those should arrive per-slot in a burst, and we cancel on the first event. We can simply use the Clutter event for this. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1486
* backends: Use slot from cancel eventsCarlos Garnacho2020-10-233-25/+19
| | | | | | | | | As it does seem from a read to libinput code, TOUCH_CANCEL events actually do contain slot information, and are emitted per-slot. This means we can avoid iterating over the slots ourselves, they are still expected to be sent altogether. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1486
* wayland: Simplify wl_touch.frame handlingCarlos Garnacho2020-10-232-40/+23
| | | | | | | | | | | | | We want to coalesce multiple touch events into the same wl_touch.frame event. Instead of poking internals to peek the touch events (and their slots) coming at us before we handle them, simplify things by queueing the event at a slightly lower priority than events, so we are ensured to handle all pending input events before sending the event. If there's no pending events, we can just send the frame event. As it doesn't make sense to hold any longer. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1486
* backend/dummy: Do not enforce minimum screen sizeChristian Rauch2020-10-231-4/+0
| | | | https://gitlab.gnome.org/GNOME/mutter/-/issues/1481
* backend/dummy: Warn about missing dummy mode specsChristian Rauch2020-10-231-0/+7
| | | | | | | | When malformed modes are provided and no valid mode spec is found, mutter will eventually try to access the last element of an empty list. Warn about this and exit properly. https://gitlab.gnome.org/GNOME/mutter/-/issues/1481
* core/window: Store/load window dimensions before/after fullscreenChristian Rauch2020-10-222-3/+6
| | | | | | | | We will use a dedicated variable when transitioning to/from fullscreen state and leave the previously used 'saved_rect' exclusively for transitioning between floating and maximized state. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/801
* core/window: Move size hints to dedicated functionChristian Rauch2020-10-221-12/+17
| | | | https://gitlab.gnome.org/GNOME/mutter/merge_requests/801#note_676932
* core/window: Do not apply limits if no previous size has been storedChristian Rauch2020-10-221-6/+15
| | | | | | | | | | A previously stored width and height of 0 signifies that no previous window size has been stored. This might be the case if an application starts in maximized or fullscreen mode. If no previous window size has been stored, the client needs to determine its own size. https://bugzilla.gnome.org/show_bug.cgi?id=783901 https://gitlab.gnome.org/GNOME/mutter/merge_requests/801#note_607607
* wayland/window: Provide prior floating window dimensionsChristian Rauch2020-10-221-18/+2
| | | | | | | | | | | | | Implements the "prior window window geometry dimensions" as described in the documentation of 'xdg_toplevel' request 'unset_maximized': "If available and applicable, the compositor will include the window geometry dimensions the window had prior to being maximized in the configure event." and 'unset_fullscreen': "The compositor may include the previous window geometry dimensions in the configure event, if applicable." Fixes https://gitlab.gnome.org/GNOME/mutter/issues/792.
* wayland: Set IO error exit handlerwip/carlosg/xwayland-non-fatal-io-errorsCarlos Garnacho2020-10-213-0/+28
| | | | | | | | If this call is available, we can turn libX11 IO errors (fatal by definition) into something we can recover from. Try to dispose all X11 resources and close the display instead, so the compositor can survive the event. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1447
* xwayland: Protect against MetaX11Display abruptly closingCarlos Garnacho2020-10-211-3/+5
| | | | | | | | | | | If the MetaX11Display abruptly closed when X11 windows were present, we would still try to deal with them while freezing/thawing for the "fade out" animation. At the bottom of that, the X server may be gone, just try to cope with it. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1447
* cogl: correcting the cogl trace logUday Kiran Pichika2020-10-211-2/+2
| | | | | | Remove the extra & symbol appearing in cogl debug log https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1517
* output: Move edid parse function to the right fileUday Kiran Pichika2020-10-214-69/+66
| | | | | | | Move the edid parsing function from MetaMonitorManager to MetaOutput to read the monitor manufacturer,serial,vendor,etc. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1516/
* wayland: Allow specifying Wayland display name from command lineJonas Ådahl2020-10-202-1/+17
| | | | | | | Useful to avoid warnings when starting when there is already an active Wayland compositor in the session. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1515
* clutter/actor: Reset allocation when unrealizing actorJonas Dreßler2020-10-201-2/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | Since commit eb9cd3857d we initialize the allocation of ClutterActors to an UNINITIALIZED ClutterActorBox. We do that to ensure the actor even emits notify::allocation in case it got a new valid allocation of 0,0,0,0. Now there's still the case where an actor gets removed from the scenegraph and added again to a different parent, in this case we still don't emit notify::allocation right now in case the new allocation equals the old one. There's two good reasons to do so though: 1) To Clutter, there's no difference between a newly created actor and an actor which got removed from the scenegraph, it's not consistent to always notify the allocation property in the former situation, but not always notify it in the latter situation. 2) When an allocation changes, Clutter notifies the subtree of that actor about an absolute geometry change (see the call to transform_changed() in clutter_actor_set_allocation_internal()). Now when an actor gets reparented, obviously the absolute geometry might change, so to make sure transform_changed() is always called in that case we need to make sure an allocation change happens. So simply reset the allocation property of the actor to an UNINITIALIZED ClutterActorBox as soon as it gets unrealized. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1498
* clutter/actor: Remove absolute_origin_changed flag againJonas Dreßler2020-10-201-38/+5
| | | | | | | | | | | | | | | We introduced the absolute_origin_changed flag when preparing for the removal of ClutterAllocationFlags in commit dc8e5c7f8b. Turns out in the mean-time commit df4eeff6f2 happened, which renders the whole absolute_origin_changed flag moot. That's because we now notify the whole subtree about the absolute origin change by calling transform_changed() when the allocation of an actor changes. transform_changed() traverses the subtree and calls absolute_geometry_changed() on every actor immediately, which renders the whole propagation of the absolute_origin_changed flag obsolete. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1498
* clutter/actor: Don't queue relayouts inside add/remove_child_internalJonas Dreßler2020-10-201-36/+2
| | | | | | | | | | | | | | | | | | | Since we now moved the queuing of relayouts into the mapping and unmapping functions, we no longer need to do it when adding or removing a child, that's because removing a child always unmaps the child, and adding it to a stage (if it's visible) will map it. So remove those calls to queue_relayout() since they're no longer needed. With the above we no longer queue a relayout in clutter_actor_add_child_internal(), that means there's one place where we need to explicitely queue relayouts now: That's when using the set_child_at_index/above/below() APIs, those are special because they avoid unmapping and mapping of actors and would now no longer get a relayout. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1366
* clutter/actor: Only allocate when actor is mapped, not only visibleJonas Dreßler2020-10-201-19/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | In theory there's no big difference between only handling mapped actors vs only handling visible actors in clutter_actor_allocate(): The function is called recursively starting with an actor that is attached to a stage, so it should only be called on mapped actors anyway. The behavior of skipping hidden actors was introduced as an optimization with commit 0eab73dc. Since the last commit, we handle enable_paint_unmapped a bit better and don't do unnecessary work when mapping or unmapping, so we can now be a bit stricter enforcing our invariants and only allow mapped actors in clutter_actor_allocate(). We need to exclude toplevel actors from this check since the stage has a very different mapped state than normal actors, depending on the mappedness of the x11 window. Also we need to make an exception for clones (of course...): Those need their source actor to have an allocation, which means they might try to force-allocate it, and in that case we shouldn't bail out of clutter_actor_allocate(). Also moving the clutter_actor_queue_relayout() call from clutter_actor_real_show() to clutter_actor_real_map() seems to fix a bug where we don't queue redraws/relayouts on children when a parent gets shown. Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2973 https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1366
* clutter/actor: Use separate priv pointer in clutter_actor_real_(un)mapJonas Dreßler2020-10-201-7/+8
| | | | | | | We're accessing self->priv quite often in those functions, it makes sense to use a separate variable for it. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1366
* clutter/actor: Handle getting (un-)mapped during painting differentlyJonas Dreßler2020-10-201-16/+22
| | | | | | | | | | | | | | | | | | | | | | | We currently support only one case where an actor can get mapped or unmapped during painting, that is using _clutter_actor_enable_paint_unmapped() (although we could arguably do a better job explicitely forbidding it in other cases). This function is called when painting ClutterClone or MetaWindowActors during screensharing. It temporarily (fake) realizes and maps the actor and all its children so it can get painted. Now a problem will appear when we'll start coupling layout and the mapped state of actors more closely with the next commit: Since enable_paint_unmapped() is meant to be enabled and disabled during every clone paint, we also notify the "mapped" property twice on every clone paint. That means with the next commit we would queue a relayout for the source actor on every clone paint. To avoid this unnecessary work, check whether we're being painted while unmapped using the new unmapped_paint_branch_counter. Then avoid queuing relayouts or invalidating paint volumes in that case. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1366
* tests/conform/actor-pivot-point: Show stage before allocatingJonas Dreßler2020-10-201-0/+2
| | | | | | | | | | | | We're going to enforce some invariants a bit stricter and will only allow allocating if an actor is mapped, not only visible. Since actors are only mapped if their parent is mapped and stages are hidden by default, we need to show the stage to ensure the actors are mapped before we allocate them. So do that and call clutter_actor_show() on the stage before fake-allocating the test actors. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1366
* clutter/actor: Add private API to get whether we're painting unmappedJonas Dreßler2020-10-203-1/+13
| | | | | | | | | | | | Add new private API to ClutterActor, returning TRUE in case the actor is being painted while unmapped. This is useful for implementations of the paint() vfunc or for signal handlers of the "notify::mapped" signal. Use this API in CallyActor to properly detect "notify::mapped" emissions while painting unmapped, this fixes detecting the case where painting-unmapped is used for screencasting. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1366
* clutter/actor: Introduce counter for painting in an unmapped branchJonas Dreßler2020-10-201-1/+48
| | | | | | | | | | Just like the existing in_cloned_branch counter, add a property which tracks whether the actor is part of a subtree that's being painted while unmapped. This is going to be useful for a few things, for example changing the clutter_actor_is_in_clone_paint() API to use enable_paint_unmapped instead of in_clone_paint. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1366
* clutter/actor: Alway call queue_relayout() when showing actorsJonas Dreßler2020-10-201-21/+5
| | | | | | | | | clutter_actor_queue_relayout() detects whether a parent has the NO_LAYOUT flag set by itself and then queues a shallow relayout for us. There's no need to duplicate that logic when showing actors, so simply call clutter_actor_queue_relayout() and let that handle it. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1366
* wayland-buffer: Add debug logging of pixel format in useDaniel van Vugt2020-10-201-0/+31
| | | | | | Enable it with environment `MUTTER_DEBUG=wayland`. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1387
* wayland-dma-buf: Add debug logging of pixel format in useDaniel van Vugt2020-10-201-0/+8
| | | | | | Enable it with environment `MUTTER_DEBUG=wayland`. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1387
* util: Add META_DEBUG_WAYLAND debug topicDaniel van Vugt2020-10-203-0/+5
| | | | https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1387
* cogl-winsys-egl: Log the color depth in useDaniel van Vugt2020-10-201-0/+41
| | | | | | Enable it with environment `COGL_DEBUG=winsys`. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1387
* clutter/paint-volume: Use graphene for computing union of paint volumesJonas Dreßler2020-10-191-66/+24
| | | | | | | | | | | | | Apparently clutter_paint_volume_union() has problems building the union of two paint volumes in eye coordinates, that's probably because of the negative coordinates that come into play there. Circumvent that by making even more use of Graphene and letting it take care of computing the union. We do that by creating two graphene_box_t's from the axis-aligned paint volumes and intersecting those boxes, then setting our vertices to the new min and max points of the resulting box. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1507
* constraints: Use "orig" rectangle for interactive resizeOlivier Fourdan2020-10-191-21/+13
| | | | | | | | | | | | | | Bug 448183 fixed an issue with _NET_WM_MOVERESIZE_WINDOW not moving a window by basing the resize on the current (new) rectangle instead of the original rectangle. While this fixes the issue with _NET_WM_MOVERESIZE_WINDOW, this also causes windows with a size increment to move when the resize also implies a move, such windows might drift while resizing. Make sure to use the current rectangle for non-interactive resizes only. Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/543
* window-props: Check for actual size hints changesOlivier Fourdan2020-10-191-5/+26
| | | | | | | | | | | | | | | | | | | | | | | The XSizeHints set by X11 clients give a hint to the window manager about size increment, aspect ratio, base, minimum and maximum size, etc. When an X11 client changes those values, there is a good chance that it will affect the actual window size in some way, and mutter rightfully queue a window resize in that case. However, mutter does not check if any of the hints have actually changed and unconditionally queue a window resize whenever a client changes its WM_NORMAL_HINTS property. That can be a problem when a zealous client such as xterm decides to update its WM_NORMAL_HINTS property on resize, because in return mutter will queue a non-user driven resize in the middle of user-driven events, hence defeating the purpose of the META_MOVE_RESIZE_USER_ACTION flag. To avoid that issue, make mutter a bit smarter and avoid queuing a window resize if the XSizeHints haven't actually changed. https://gitlab.gnome.org/GNOME/mutter/-/issues/543
* window: Do not go past size hints on resizeOlivier Fourdan2020-10-191-15/+20
| | | | | | | | | | | | | | | | | On interactive resize, mutter calculates the difference in size based on the pointer location and relies on window constraints to ensure the minimum size is honored. Wayland however does asynchronous window configuration, meaning that not checking for size hints early enough may lead to the window moving as the locations was initially computed on a size which will be invalidate by the client eventually. Make sure to respect the client size hint on update_resize() so that we don't end up with a window moving unexpectedly when the client eventually acked the configuration. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1495
* window/wayland: Offset position with size mismatch when finishing a resizeRobert Mader2020-10-191-30/+37
| | | | | | | Analogous to commit 8bdd2aa7dbb80594b3, calculate the size missmatch offset also when finishing a resize. Closes https://gitlab.gnome.org/GNOME/mutter/-/issues/396
* monitor-manager: Ignore tablet-mode-switch on initial config of native ↵Hans de Goede2020-10-181-0/+55
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | portrait mode panels Many tablets have a native portrait mode panel, yet come with a keyboard dock, where the device gets docked in landscape mode. To avoid the display being on its side when mutter starts while the tablet is docked, we need to take the accelerometer reported orientation into account even if there is a tablet-mode-switch which indicates that the device is NOT in tablet-mode (because it is docked). Add special handling for the first time the "orientation-changed" signal gets signalled by the orientation-manager, which happens after it has successfully claimed the accelerometer with iio-sensor-proxy. The added special handling of the initial "orientation-changed" signal does a number of checks: 1. panel_orientation_managed is false because of the tablet-mode-switch and not because of other reasons. 2. The device has a native portrait mode panel (and thus likely needs rotation to display the image the right way up when docked). If all these checks succeed then it continues with creating a new monitors-config based on the orientation ignoring the panel_orientation_managed value (for the initial/first "orientation-changed" signal only). https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1506
* monitor-manager: Update orientation based config when ↵Hans de Goede2020-10-181-0/+4
| | | | | | | | | | | | | | panel_orientation_managed changes The orientation reported by the orientation_manager may have changed while panel_orientation_managed was false. So when panel_orientation_managed changes to true we should re-check the orientation. This fixes the orientation not being correct when e.g. taking a 360 degree hinges 2-in-1 in clamshell mode (so landscape orientation) and then folding it into tablet mode while holding it in portrait orientation. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1506
* monitor-manager: Add a handle_orientation_change helper functionHans de Goede2020-10-181-5/+12
| | | | | | | | Move the bulk of orientation_changed to a new handle_orientation_change helper function. This is a preparation patch for further orientation handling related changes. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1506
* seat-native: Add support for tablet-mode-switch being hot-unpluggedHans de Goede2020-10-181-13/+15
| | | | | | | | | | Add support for the (mostly theoretical) case of an input-device offering tablet-mode-switch functionality being unplugged. This makes the has_tablet_switch handling identical to the has_touchscreen handling, leading to more consistent code. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1506
* seat-native: Check for tablet-switch devices from meta_seat_native_constructedHans de Goede2020-10-181-0/+20
| | | | | | | | | | | Detect if a tablet-mode-switch device is already present when mutter starts by checking for this from meta_seat_native_constructed. This mirrors how we also set has_touchscreen from meta_seat_native_constructed. This fixes tablet-mode-switches only being recognized when they are added at runtime. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1506