lxqt / lxqt-panel

The LXQt desktop panel
https://lxqt-project.org
GNU Lesser General Public License v2.1
180 stars 135 forks source link

WIP Qt6 port #2024

Closed gfgit closed 6 months ago

gfgit commented 7 months ago

Depends on:

AzumaHazuki commented 7 months ago

This is amazing! Where did you learn all this coding?

gfgit commented 7 months ago

Hi! Thanks. Well it does not work yet, I need more time to properly fix compile errors. Anyway it's not that difficult, I've just read Qt online documentation and made some experiments on small test programs until I get the results I want. The key for me is having fun while coding, otherwise is not worth it.

stefonarch commented 7 months ago

Looks like only fancymenu and few other plugins build atm. Made a list here.

gfgit commented 7 months ago

Hi, thanks for testing. I've worked on a second version of the patch plus some code style fixes detected by Clazy. I will force push soon. All plugin are working except sysstat because library is not ported yet.

gfgit commented 7 months ago

XCB not found it's because CMake components are uppercase and without xcb- prefix. I wonder why it worked until now...

Also there are some issues: Ldd does not find liblxqt.so.2 so it refuses to launch panel. I had to LD_PRELOAD it. I don't yet understand how this works, library is in correct path just like Qt6Xdg.so and also listed in ldconfig -p. Running sudo ldconfig seems to rebuild the cache and fix the issue.

Another issue is panel configuration not getting installed, resulting in an empty transparent panel. Need to investigate. For now I've manually copied it from repository to home folder

stefonarch commented 7 months ago

All plugin are working except sysstat because library is not ported yet.

That's nice to hear :)

gfgit commented 7 months ago

I didn't need QTextCodec from Qt5Compat module. When I'll push, plaese check again if it's needed

tsujan commented 7 months ago

I didn't need QTextCodec from Qt5Compat module.

Just as a general note, and not a review:

Forget about Qt5Compat everywhere. Legacy encodings aren't supported by Qt6, and so, we don't have a reason to support them by force.

gfgit commented 7 months ago

NOTE: it needs recent changes from lxqt-globalkeys#278 branch which I've just pushed.

stefonarch commented 7 months ago

I needed first https://github.com/lxqt/libsysstat/pull/47 and change dbusmenu-qt6 → dbusmenu-lxqt to start compilation ~but I'm stuck atm at fatal error: lxqt-globalkeys.h: No such file or directory for several plugins. When I change it to #include <lxqt-globalkeys/lxqt-globalkeys.h> it goes to LXQtGlobalKeys: no such file or... and when I include that again not found, but it's all present in /usr/local/include.~

EDIT: Turns out this was caused by my removing of lxqt2 everywhere somehow, plain PR builds fine.

Systat-plugin has to be disabled as it needs porting to QRegularExpression and I ran into the same ldconfig issue but it prevented installing (sudo ldconfig didn't help):


[ 99%] Linking CXX executable lxqt-panel
/usr/bin/ld: CMakeFiles/lxqt-panel.dir/lxqt-panel_autogen/mocs_compilation.cpp.o: in function `QtPrivate::QDebugStreamOperatorForType<LXQt::PluginInfo, true>::debugStream(QtPrivate::QMetaTypeInterface const*, QDebug&, void const*)':
mocs_compilation.cpp:(.text._ZN9QtPrivate27QDebugStreamOperatorForTypeIN4LXQt10PluginInfoELb1EE11debugStreamEPKNS_18QMetaTypeInterfaceER6QDebugPKv[_ZN9QtPrivate27QDebugStreamOperatorForTypeIN4LXQt10PluginInfoELb1EE11debugStreamEPKNS_18QMetaTypeInterfaceER6QDebugPKv]+0x36): undefined reference to `operator<<(QDebug, LXQt::PluginInfo const&)'
collect2: error: ld returned 1 exit status
gfgit commented 7 months ago

Ah yes, this is because QDebug operators are not exported. I've fixed it but forgot to push

gfgit commented 7 months ago

@stefonarch I've pushed fix in liblxqt#337

gfgit commented 7 months ago

Ah yes, this is because QDebug operators are not exported. I've fixed it but forgot to push

Another issue is panel configuration not getting installed, resulting in an empty transparent panel. Need to investigate. For now I've manually copied it from repository to home folder

I think this is because I'm installing to /usr/local The file is there but panel does not consider this path

stefonarch commented 7 months ago

Compiles perfectly fine now without any warning, except that I had to disable statusnotifier plugin as I didn't manage to include dbusmenu-lxqt anymore, not sure if I changed something as I hit a git stash by mistake.

Panel conf is installed but not loaded at first run, don't remember how this is supposed to wirk

-- Installing: /usr/local/bin/lxqt-panel
-- Set non-toolchain portion of runtime path of "/usr/local/bin/lxqt-panel" to ""
-- Installing: /usr/local/share/lxqt/panel.conf
-- Installing: /usr/local/include/lxqt/lxqtpanelglobals.h
gfgit commented 7 months ago

What's the difference between dbusmenu-qt and dbusmenu-lxqt?

I can build it with neon package for dbusmenu qt6 dev

tsujan commented 7 months ago

First, libdbusmenu-qt6 couldn't be compiled anymore. Second, it didn't exist in all distros (Arch used a self-made patch). So, we got rid of all problems by forking it (as KDE did years ago). In this way, we could fix its probable bugs too.

The Qt6 brannch of lxqt-qtplugin already depends on libdbusmenu-lxqt.

stefonarch commented 7 months ago

Found my error, forgot the second part here #include <dbusmenu-lxqt/dbusmenuimporter.h>.

So only sysstat plugin is missing.

stefonarch commented 7 months ago

Just found out in a nested labwc window that the qt6-panel won't work on wayland: screen_area_gio_13:53:45_

gfgit commented 7 months ago

Just found out in a nested labwc window that the qt6-panel won't work on wayland: screen_area_gio_13:53:45_

Well of course KX11Extras does not work on wayland and we use this library. As a workaround force it to use xwayland. Taskbar will be empty

tsujan commented 7 months ago

Haven't we already disabled X11-dependent plugins under Wayland? If not, we should do it.

stefonarch commented 7 months ago

Well of course KX11Extras does not work on wayland and we use this library. As a workaround force it to use xwayland. Taskbar will be empty

Haven't we already disabled X11-dependent plugins under Wayland? If not, we should do it.

Only the desktopswitch is disabled as it will crash the panel, the others can be added but do nothing. Now it's about the panel itself too.

I use without issues the qt5 version natively, so something has changed there in KF6 now.

stefonarch commented 7 months ago

screen_area_gio_14:23:53_

all files which use it, at least lxqtpanel.cpp and plugin.cpp would be needed for now.

tsujan commented 7 months ago

If KF6 doesn't exclude them, we could do it. Not a theoretical hassle; just a boring job.

gfgit commented 7 months ago

Well I have added some assert on X11 connection somwhere. It was just for testing but it's also correct because we should exclude X11 specific parts on Wayland

tsujan commented 7 months ago

I may be wrong (being busy with other codes), but I think KF5 did it for its methods.

stefonarch commented 7 months ago

Looking at KX11Extras it looks (for the panel) some functions on wayland should use foreing-toplevel-protocol, like static QList<WId> windows(); and others, if I got it right. Other functions (number of desktops and related) are just not available as protocol yet.

Running the panel in xwayland mode is nice to see and working fine now on labwc, but all apps launched by the menu inherit xwayland too.

stefonarch commented 7 months ago

Rechecked for good and saw that the panel opens, so those are just warnings not blockers. Looks like I had to stop the panel in the openbox session first.

stefonarch commented 7 months ago

After recent updates of KF6 I had to recompile it. I see (also before) this:

$ lxqt-panel
starting
WinIdChange 1600009 handle QWidgetWindow(0x56007fda3e90, name="LXQtPanel panel1Window") QScreen(0x56007fa91b30, name="Virtual1")
StatusNotifierProxy, services: QList()
Manager selection claimed
trying to dock window  18874385
adding damage watch for  18874385
Error on DBus request(:1.71,/StatusNotifierItem): QDBusError(org.freedesktop.DBus.Error.UnknownProperty, Property org.kde.StatusNotifierItem.Menu was not found in object /StatusNotifierItem)
Error on DBus request(:1.71,/StatusNotifierItem): QDBusError(org.freedesktop.DBus.Error.UnknownProperty, Property org.kde.StatusNotifierItem.IconThemePath was not found in object /StatusNotifierItem)
Error on DBus request(:1.71,/StatusNotifierItem): QDBusError(org.freedesktop.DBus.Error.UnknownProperty, Property org.kde.StatusNotifierItem.ToolTip was not found in object /StatusNotifierItem)
Error on DBus request(:1.71,/StatusNotifierItem): QDBusError(org.freedesktop.DBus.Error.UnknownProperty, Property org.kde.StatusNotifierItem.OverlayIconName was not found in object /StatusNotifierItem)
Error on DBus request(:1.71,/StatusNotifierItem): QDBusError(org.freedesktop.DBus.Error.UnknownProperty, Property org.kde.StatusNotifierItem.IconName was not found in object /StatusNotifierItem)
Error on DBus request(:1.71,/StatusNotifierItem): QDBusError(org.freedesktop.DBus.Error.UnknownProperty, Property org.kde.StatusNotifierItem.AttentionIconName was not found in object /StatusNotifierItem)
Error on DBus request(:1.71,/StatusNotifierItem): QDBusError(org.freedesktop.DBus.Error.UnknownProperty, Property org.kde.StatusNotifierItem.IconThemePath was not found in object /StatusNotifierItem)
Error on DBus request(:1.71,/StatusNotifierItem): QDBusError(org.freedesktop.DBus.Error.UnknownProperty, Property org.kde.StatusNotifierItem.ToolTip was not found in object /StatusNotifierItem)
Error on DBus request(:1.71,/StatusNotifierItem): QDBusError(org.freedesktop.DBus.Error.UnknownProperty, Property org.kde.StatusNotifierItem.OverlayIconPixmap was not found in object /StatusNotifierItem)
Error on DBus request(:1.71,/StatusNotifierItem): QDBusError(org.freedesktop.DBus.Error.UnknownProperty, Property org.kde.StatusNotifierItem.AttentionIconPixmap was not found in object /StatusNotifierItem)
Error on DBus request(:1.71,/StatusNotifierItem): QDBusError(org.freedesktop.DBus.Error.UnknownProperty, Property org.kde.StatusNotifierItem.IconName was not found in object /StatusNotifierItem)
Error on DBus request(:1.71,/StatusNotifierItem): QDBusError(org.freedesktop.DBus.Error.UnknownProperty, Property org.kde.StatusNotifierItem.IconThemePath was not found in object /StatusNotifierItem)
Error on DBus request(:1.71,/StatusNotifierItem): QDBusError(org.freedesktop.DBus.Error.UnknownProperty, Property org.kde.StatusNotifierItem.ToolTip was not found in object /StatusNotifierItem)
Error on DBus request(:1.71,/StatusNotifierItem): QDBusError(org.freedesktop.DBus.Error.UnknownProperty, Property org.kde.StatusNotifierItem.IconName was not found in object /StatusNotifierItem)

damage watch looks interesting: https://wayland-book.com/surfaces-in-depth/damaging-surfaces.html

gfgit commented 7 months ago

Ops, sorry I edited your post instead of replying. I had those same DBus errors in Qt5 branch

stefonarch commented 7 months ago

I had those same DBus errors in Qt5 branch

Strange, here I've only some things about icons from one app:

$ lxqt-panel
WinIdChange 1 handle QWidgetWindow(0x64309003bd20, name="LXQtPanel panel1Window") QScreen(0x64308fe9fd60, name="eDP-1")
WinIdChange 2 handle QWidgetWindow(0x6430904091b0, name="LXQtPanel panel_{2aaae4ef-94e6-450c-a8d6-7f862d156da2}Window") QScreen(0x64308fe9fd60, name="eDP-1")
StatusNotifierProxy, services: ()
Error on DBus request(:1.132,/StatusNotifierItem): QDBusError(org.freedesktop.DBus.Error.Failed, error occurred in Get)
Error on DBus request(:1.132,/StatusNotifierItem): QDBusError(org.freedesktop.DBus.Error.Failed, error occurred in Get)
Error on DBus request(:1.94,/org/ayatana/NotificationItem:gammastep): QDBusError(org.freedesktop.DBus.Error.InvalidArgs, Proprietà «ToolTip» inesistente)
Error on DBus request(:1.94,/org/ayatana/NotificationItem/gammastep): QDBusError(org.freedesktop.DBus.Error.InvalidArgs, Proprietà «OverlayIconName» inesistente)
Error on DBus request(:1.94,/org/ayatana/NotificationItem/gammastep): QDBusError(org.freedesktop.DBus.Error.InvalidArgs, Proprietà «OverlayIconPixmap» inesistente)
Error on DBus request(:1.94,/org/ayatana/NotificationItem/gammastep): QDBusError(org.freedesktop.DBus.Error.InvalidArgs, Proprietà «AttentionIconPixmap» inesistente)

EDIT: it was all about qlipper I see, removing it all errors gone.

gfgit commented 7 months ago

In the meantime I went ahead a bit :)

Rullo di tamburi...

So this is LXQt Panel running natively on KDE Plasma Wayland session!

lxqt-panel-kde-plasma-wayland

How to achieve this:

As you can see LXQt panel (on bottom) is not yet reserving screen area while Plasma panel (on top) does reserve it.

tsujan commented 7 months ago

Some black magic of course

I like it so much when you do your black magic. Well done!

stefonarch commented 7 months ago

Wow, senza parole :)

LayerShellQt integration for placing panel on bottom part of screen

Which version? No fullscreen popups ?

gfgit commented 7 months ago

My long term idea is:

On Wayland there isn't yet a standard, so the backend would have sub-backends which are using some specific protocol or even using DBus (example for Sway). Waybar is a good example: it supports various compositors and chooses the correct communication protocol by probing at start.

For now I've added support for KWin using KDE's in-house protocol. I think this is the first non-KDE software using their window managment protocol. I've copied and slightly adapted some code from libtaskmanager/waylandtasksmodel.cpp from Plasma Workspace repository

tsujan commented 7 months ago

At some point, you'll set up a LabWC environment and see how comfortably you could work there.

Anyway, with your works, I'm not worried about the future of LXQt+Wayland anymore :)

gfgit commented 7 months ago

Quick update: Now reserving screen area works and also placing panel on top/bottom. Right/Left is a bit awkward because it does not count Plasma panel occupied area so the panel is too tall and gets cut. But this would not happen in a LXQt session without other programs claiming screen edges with layer shell. Still it could be improved if possible.

LayerShellQt is at version 6.0.80 which allows popups to be normal XDG Popup windows, if that was your question.

lxqt-panel-kde-plasma-wayland2

You can see LXQt Panel and Plasma panels both at top edge and maximized Qt Creator window correctly spanning up until panel bottom border. Plus you can see TaskBar plugin's context menu

stefonarch commented 7 months ago

LayerShellQt is at version 6.0.80 which allows popups to be normal XDG Popup windows, if that was your question.

Thanks, I don't have it yet in Neon.

stefonarch commented 7 months ago

FYI: start scripts for kwin_wayland, labwc ecc: https://github.com/stefonarch/LXQt-Wayland-files/tree/main/start_scripts

gfgit commented 7 months ago

Now also plugin-sysstat is ported to Qt6!

gfgit commented 7 months ago
lxqt-panel: error while loading shared libraries: libdbusmenu-lxqt.so.0: cannot open shared object file: No such file or directory

Similar LDD issue fixed by running sudo ldconfig

tsujan commented 7 months ago

Not a review yet (no stable KF6 here), but, in general:

When porting components to Qt6, it's preferable to change QVector to QList everywhere because the former is just an alias for the latter.

I think I've done so in my Qt6 branches; if not, please tell me.

gfgit commented 7 months ago

@tsujan I've ported away from QVector and QScopedPointer, commit about chrono is removed, will put it in a future PR

stefonarch commented 7 months ago

Basically here can be seen 2 issues:

stefonarch commented 6 months ago

Worldclock issue: beside the non localized month/day names in the widget I noticed also that timezones can't be set anymore. screen_area_ven_17:05:30_

tsujan commented 6 months ago

Worldclock issue: beside the non localized month/day names in the widget I noticed also that timezones can't be set anymore.

Found the cause of the first, which is most probably the cause of the second. It isn't about a bug in the PR but a change of behavior in Qt6. Will make a PR after merging Qt6 PRs because it deserves a separate PR.

@gfgit, if you make the requested changes, I could do the merging today.

gfgit commented 6 months ago

I suggest this time to NOT squash the commit before merging. It would result in an commit too big too be read. I've carefully divided commits to make changes easily understandable and this could be useful as a reference for other people wanting to port their software to Qt 6. Some commits have "TODO" in their messages, this of course will be removed if changes. Too reduce the number of commits some of them can be grouped based on topic.

gfgit commented 6 months ago

CI doesn't find Qt6 dependencies

tsujan commented 6 months ago

I suggest this time to NOT squash the commit before merging.

OK.

CI doesn't find Qt6 dependencies

No worries; we've got used to CI's temporary issues and tolerate them.

Will merge all Qt6-related PRs in the proper order tomorrow.

gfgit commented 6 months ago

@tsujan It's quite difficult to understand changes from the squashed single commit

tsujan commented 6 months ago

PRs should be squashed before being merged. A clean history is a must. I just agreed that you don't do it yourself.

As for code readers, it's impossible to make everything straightforward for them; they need to delve into codes.