1. 01 Sep, 2020 4 commits
    • Roman Gilg's avatar
      xwayland: Replace need_rotate boolean with simple check on xdg-output · 727df0a7
      Roman Gilg authored
      
      
      The need_rotate variable is only used once anymore and had semantics which lead
      to errors in the past. In particular when negated we are dealing with a double
      negation.
      
      The variable gets replaced with a simple check on the xdg-output directly.
      Signed-off-by: Roman Gilg's avatarRoman Gilg <subdiff@gmail.com>
      727df0a7
    • Roman Gilg's avatar
      Revert "xserver: Fix a typo" · da791ed9
      Roman Gilg authored
      This reverts commit 427f8bc0.
      
      When receiving an output update for the mode size we need to rotate the stored
      width and height values if and only if we have an xdg-output for this output
      since in this case the stored values describe the output's size in logical
      space, i.e. rotated.
      
      The here reverted commit made a code change with which we would not rotate though
      when an xdg-output was available since in this case the need_rotate variable was
      set to False what caused in the check afterwards the first branch to execute.
      da791ed9
    • Roman Gilg's avatar
      xwayland: Switch width and height argument order · 92f4a9ad
      Roman Gilg authored
      
      
      That is just a small style-change to the output_get_new_size function. The
      function before did take first the height and then the width argument, what
      is unusual since resolutions are normally named the other way around, for
      example 1920x1080. Also compare the update_screen_size function.
      
      Therefore change the order of arguments for output_get_new_size.
      Signed-off-by: Roman Gilg's avatarRoman Gilg <subdiff@gmail.com>
      92f4a9ad
    • Roman Gilg's avatar
      xwayland: simplify output_get_new_size function · 1805383d
      Roman Gilg authored
      
      
      We can just read out the xdg_output field of the provided xwl_output to check
      if a rotation is necessary or not.
      
      This makes the function easier to understand. Additionally some documentation
      is added.
      Signed-off-by: Roman Gilg's avatarRoman Gilg <subdiff@gmail.com>
      1805383d
  2. 31 Aug, 2020 1 commit
  3. 25 Aug, 2020 8 commits
  4. 24 Aug, 2020 1 commit
  5. 18 Aug, 2020 1 commit
  6. 04 Aug, 2020 1 commit
  7. 31 Jul, 2020 2 commits
  8. 30 Jul, 2020 1 commit
  9. 29 Jul, 2020 2 commits
  10. 28 Jul, 2020 1 commit
    • Huacai Chen's avatar
      linux: Fix platform device probe for DT-based PCI · 9fbd3e43
      Huacai Chen authored
      
      
      On a DT-base PCI platform, the sysfs path of vga device is like this:
      /sys/devices/platform/bus@10000000/1a000000.pci/pci0000:00/0000:00:11.0/0000:04:00.0.
      
      Then the ID_PATH from udev is platform-1a000000.pci-pci-0000:04:00.0 and
      the BusID will be pci-0000:04:00.0, which causes Xorg start fail. This
      is because config_udev_odev_setup_attribs() use strstr() to search the
      first "pci-" in ID_PATH. To fix this, we implement a strrstr() function
      and use it to search the last "pci-" in ID_PATH, which can get a correct
      BusID.
      Signed-off-by: default avatarHuacai Chen <chenhc@lemote.com>
      9fbd3e43
  11. 24 Jul, 2020 1 commit
    • Roman Gilg's avatar
      present: Check valid region in window mode flips · 591916ea
      Roman Gilg authored
      
      
      For Pixmap flips to have well defined outcomes the window must be contained by
      the valid region if such region was specified.
      
      The valid region is inserted as an argument to the check in window mode.
      Setting this argument is missing in screen mode as well but we ignore it for now
      and only add it to window mode.
      
      It seems there are none or only very few clients actually making use of valid
      regions at the moment. For simplicity we therefore just check if a valid region
      was set by the client and in this case do never flip, independently of the
      window being contained by the region or not.
      Signed-off-by: Roman Gilg's avatarRoman Gilg <subdiff@gmail.com>
      591916ea
  12. 22 Jul, 2020 5 commits
    • Roman Gilg's avatar
      present: Remove superfluous set abort flip function in window mode · bf794bd7
      Roman Gilg authored
      
      
      The function is never called from present_screen.c in contrast to the behavior
      in screen mode.
      
      In present_wnmd.c we can simply remove the function which does an unnecessary
      check of the property before setting it and directly set the property at the
      two locations the function was called previously.
      Signed-off-by: Roman Gilg's avatarRoman Gilg <subdiff@gmail.com>
      bf794bd7
    • Roman Gilg's avatar
      present: Idle vblanks any time in window mode · ab880b8b
      Roman Gilg authored
      
      
      With the newly introduced separate API method for idling a presented Pixmap in
      window mode we can simplify the logic by allowing calls to it at any point in
      time.
      
      This is done by setting the flip_idler flag if the Pixmap was idled before
      being presented.
      Signed-off-by: Roman Gilg's avatarRoman Gilg <subdiff@gmail.com>
      ab880b8b
    • Roman Gilg's avatar
      present: Notify via distinct API functions in window mode · 932c6bac
      Roman Gilg authored
      
      
      Notifying Present about events' states was done prior with the single function
      present_wnmd_event_notify just like in screen mode. But it is more intelligible
      if at least in window mode we make use of three different functions with names
      that directly indicate what their purpose is:
      
      * present_wnmd_event_notify only for queued events feedback.
      * present_wnmd_flip_notify for when a presentation occured (flip).
      * present_wnmd_idle_notify for when the Pixmap of the event can be reused.
      
      This is an API-breaking change in regards to window mode. DDX written against
      the previous version won't work anymore. It is assumed that there only exists
      the XWayland DDX at the moment using the window mode such that this is not an
      issue for the overall ecosystem.
      Signed-off-by: Roman Gilg's avatarRoman Gilg <subdiff@gmail.com>
      932c6bac
    • Roman Gilg's avatar
      xwayland: Rename present event lists · f8211095
      Roman Gilg authored
      
      
      Rename the lists release_queue to release_list and event_list to
      wait_list.
      
      The prior names release_queue and event_list were ambiguous: in both are event-
      like vblanks which can be removed from the lists in random order. In the
      release_queue can be flips that are already released but still wait for the
      sync or frame callback but normally the release comes later. In the event_list
      are queued events waiting for a later msc.
      Signed-off-by: Roman Gilg's avatarRoman Gilg <subdiff@gmail.com>
      f8211095
    • Roman Gilg's avatar
      xwayland: Remove unused xwl_screen entry · 0db326e5
      Roman Gilg authored
      
      
      In xwl_present_window an xwl_screen entry was declared but never actually used.
      Signed-off-by: Roman Gilg's avatarRoman Gilg <subdiff@gmail.com>
      0db326e5
  13. 21 Jul, 2020 4 commits
    • Alex Goins's avatar
      randr: Re-add removed NULL checks to xf86RandR12.c · 495bf63a
      Alex Goins authored
      Commit 1e3f9ea1
      
       removed some NULL checks from xf86RandR12.c, on the premise that
      they can't be reached unless RandR has already been initialized. For threesuch
      calls, that's not true:
      
      xf86Crtc.c::xf86CrtcScreenInit():
      
          if (c == config->num_crtc) {
              xf86RandR12SetRotations(screen, RR_Rotate_0 | RR_Rotate_90 |
                                      RR_Rotate_180 | RR_Rotate_270 |
                                      RR_Reflect_X | RR_Reflect_Y);
              xf86RandR12SetTransformSupport(screen, TRUE);
          }
          else {
              xf86RandR12SetRotations(screen, RR_Rotate_0);
              xf86RandR12SetTransformSupport(screen, FALSE);
          }
      
      xf86Crtc.c::xf86CrtcCloseScreen():
      
          xf86RandR12CloseScreen(screen);
      
      This change adds checks back to xf86RandR12Set{Rotations,TransformSupport}() and
      xf86RandR12CloseScreen(), checking that xf86RandR12KeyRec has been registered.
      Without this, X will hit an assert that causes it to abort.
      Signed-off-by: Alex Goins's avatarAlex Goins <agoins@nvidia.com>
      495bf63a
    • Alex Goins's avatar
      randr: Check rrPrivKey in RRHasScanoutPixmap() · 8eeff5d7
      Alex Goins authored
      RRHasScanoutPixmap() is called from xf86CheckHWCursor(), regardless of whether
      or not RandR has been initialized.
      
      As mentioned in commit 4226c6d0, it's possible that RandR has not been
      initialized if the server is configured with Xinerama and there is more than one
      X screen. Calling rrGetScrPriv when RandR isn't initialized causes an assertion
      failure that aborts the server:
      
            Xorg: ../include/privates.h:121: dixGetPrivateAddr: Assertion
            key->initialized' failed.
      
      Just as in commit 4226c6d0
      
      , fix the problem by checking
      dixPrivateKeyRegistered(rrPrivKey) before calling rrGetScrPriv.
      Signed-off-by: Alex Goins's avatarAlex Goins <agoins@nvidia.com>
      8eeff5d7
    • Alex Goins's avatar
      randr: Check rrPrivKey before autobinding GPU screens · 6172bd2b
      Alex Goins authored
      RRProviderAutoConfigGpuScreen() is called from outside RandR, so there is no
      guarantee that RandR has been initialized when it is called.
      
      As mentioned in commit 4226c6d0, it's possible that RandR has not been
      initialized if the server is configured with Xinerama and there is more than one
      X screen. Calling rrGetScrPriv when RandR isn't initialized causes an assertion
      failure that aborts the server:
      
        Xorg: ../include/privates.h:121: dixGetPrivateAddr: Assertion
        key->initialized' failed.
      
      Just as in commit 4226c6d0
      
      , fix the problem by checking
      dixPrivateKeyRegistered(rrPrivKey) before calling rrGetScrPriv.
      Signed-off-by: Alex Goins's avatarAlex Goins <agoins@nvidia.com>
      6172bd2b
    • Michel Dänzer's avatar
      xwayland: Handle NULL xwl_seat in xwl_seat_can_emulate_pointer_warp · e33453f9
      Michel Dänzer authored
      
      
      This can happen e.g. with weston's headless backend.
      Reviewed-by: default avatarOlivier Fourdan <ofourdan@redhat.com>
      e33453f9
  14. 20 Jul, 2020 2 commits
  15. 16 Jul, 2020 1 commit
    • Lyude Paul's avatar
      xwayland: Store xwl_tablet_pad in its own private key · ba0e789b
      Lyude Paul authored
      
      
      When a slave device causes the master virtual pointer device to change
      device types, the device's private data pointer
      (device->public.devicePrivate) is also changed to match the type of the
      slave device. This can be a problem though, as tablet pad devices will
      set the device's private data pointer to their own xwl_tablet_pad
      struct. This can cause us to dereference the pointer as the wrong type,
      and result in a segfault:
      
      Thread 1 "Xwayland" received signal SIGSEGV, Segmentation fault.
      wl_proxy_marshal (proxy=0x51, opcode=opcode@entry=0) at src/wayland-client.c:792
      792             va_start(ap, opcode);
      (gdb) bt
      0  wl_proxy_marshal (proxy=0x51, opcode=opcode@entry=0) at
        src/wayland-client.c:792
      1  0x00005610b27b6c55 in wl_pointer_set_cursor (hotspot_y=0,
        hotspot_x=0, surface=0x0, serial=<optimized out>, wl_pointer=<optimized
        out>) at /usr/include/wayland-client-protocol.h:4610
      2  xwl_seat_set_cursor (xwl_seat=xwl_seat@entry=0x5610b46d5d10) at
        xwayland-cursor.c:137
      3  0x00005610b27b6ecd in xwl_set_cursor (device=<optimized out>,
        screen=<optimized out>, cursor=<optimized out>, x=<optimized out>,
        y=<optimized out>) at xwayland-cursor.c:249
      4  0x00005610b2800b46 in miPointerUpdateSprite (pDev=0x5610b4501a30) at
        mipointer.c:468
      5  miPointerUpdateSprite (pDev=0x5610b4501a30) at mipointer.c:410
      6  0x00005610b2800e56 in miPointerDisplayCursor (pCursor=0x5610b4b35740,
        pScreen=0x5610b3d54410, pDev=0x5610b4501a30) at mipointer.c:206
      7  miPointerDisplayCursor (pDev=0x5610b4501a30, pScreen=0x5610b3d54410,
        pCursor=0x5610b4b35740) at mipointer.c:194
      8  0x00005610b27ed62b in CursorDisplayCursor (pDev=<optimized out>,
        pScreen=0x5610b3d54410, pCursor=0x5610b4b35740) at cursor.c:168
      9  0x00005610b28773ee in AnimCurDisplayCursor (pDev=0x5610b4501a30,
        pScreen=0x5610b3d54410, pCursor=0x5610b4b35740) at animcur.c:197
      10 0x00005610b28eb4ca in ChangeToCursor (pDev=0x5610b4501a30,
        cursor=0x5610b4b35740) at events.c:938
      11 0x00005610b28ec99f in WindowHasNewCursor
        (pWin=pWin@entry=0x5610b4b2e0c0) at events.c:3362
      12 0x00005610b291102d in ChangeWindowAttributes (pWin=0x5610b4b2e0c0,
        vmask=<optimized out>, vlist=vlist@entry=0x5610b4c41dcc,
        client=client@entry=0x5610b4b2c900) at window.c:1561
      13 0x00005610b28db8e3 in ProcChangeWindowAttributes (client=0x5610b4b2c900)
        at dispatch.c:746
      14 0x00005610b28e1e5b in Dispatch () at dispatch.c:497
      15 0x00005610b28e5f34 in dix_main (argc=16, argv=0x7ffc7a601b68,
        envp=<optimized out>) at main.c:276
      16 0x00007f8828cde042 in __libc_start_main (main=0x5610b27ae930 <main>,
        argc=16, argv=0x7ffc7a601b68, init=<optimized out>, fini=<optimized
        out>, rtld_fini=<optimized out>, stack_end=0x7ffc7a601b58) at
        ../csu/libc-start.c:308
      17 0x00005610b27ae96e in _start () at cursor.c:1064
      
      Simple reproducer in gnome-shell: open up an Xwayland window, press some
      tablet buttons, lock and unlock the screen. Repeat if it doesn't crash
      the first time.
      
      So, let's fix this by registering our own device-specific private key
      for storing a backpointer to xwl_tablet_pad, so that all input devices
      have their private data pointers set to their respective xwl_seat.
      Reviewed-by: Peter Hutterer's avatarPeter Hutterer <peter.hutterer@who-t.net>
      Signed-off-by: Lyude Paul's avatarLyude Paul <lyude@redhat.com>
      ba0e789b
  16. 14 Jul, 2020 1 commit
  17. 12 Jul, 2020 1 commit
  18. 09 Jul, 2020 2 commits
  19. 08 Jul, 2020 1 commit
    • Olivier Fourdan's avatar
      xwayland: Add a pkg-config file for Xwayland · 5188603f
      Olivier Fourdan authored
      
      
      Xwayland is usually spawned by the Wayland compositor which sets the
      command line options.
      
      If a command line option is not supported, Xwayland will fail to start.
      
      That somehow makes the Xwayland command line option sort of ABI, the
      Wayland compositor need to know if a particular option is supported by
      Xwayland at build time.
      
      Also, currently, Xwayland is being installed along with the rest of the
      common executable programs that users may run, which is sub-optimal
      because, well, Xwayland is not a common executable program, it's meant
      to be a proxy between the Wayland compositor and the legacy X11 clients
      which wouldn't be able to run on Wayland otherwise.
      
      Xwayland would be better installed in `libexec` but that directory is
      (purposedly) not in the user `PATH` and therefore the Wayland compositor
      may not be able to find Xwayland in that case.
      
      To solve both problems (which options are supported by Xwayland and
      where to look for it), add a `pkg-config` file specifically for Xwayland
      which gives the full path to Xwayland (`xwayland`) and which options it
      supports (using `pkg-config` variables).
      
      The `pkg-config` file also provides the `Version` so the build scripts
      can check for a particular version if necessary.
      
      Obviously, Wayland compositors are not required to use the `pkg-config`
      file and can continue to use whatever mechanism they deem preferable.
      Signed-off-by: default avatarOlivier Fourdan <ofourdan@redhat.com>
      Reviewed-by: Michel Dänzer's avatarMichel Dänzer <mdaenzer@redhat.com>
      5188603f