| Summary: | Taskbar does not show a normal window from a specific app (UTAU through Wine) | ||
|---|---|---|---|
| Product: | [Plasma] plasmashell | Reporter: | Kisaragi Hiu <mail> |
| Component: | Task Manager and Icons-Only Task Manager widgets | Assignee: | Plasma Bugs List <plasma-bugs-null> |
| Status: | CONFIRMED --- | ||
| Severity: | normal | CC: | kde, kdedev, qydwhotmail |
| Priority: | NOR | ||
| Version First Reported In: | 6.5.5 | ||
| Target Milestone: | 1.0 | ||
| Platform: | Arch Linux | ||
| OS: | Linux | ||
| Latest Commit: | Version Fixed/Implemented In: | ||
| Sentry Crash Report: | |||
|
Description
Kisaragi Hiu
2026-01-17 19:49:47 UTC
Ah, I'm guessing this is the same issue as BUG 240517, which despite the NOT A BUG was actually closed because "Closing for lack of feedback" and with "Please feel free to reopen this report if you can still reproduce this with KDE 4.8.3 or later." For some reason some Windows apps on Wine (including UTAU and various examples in BUG 240517) produce a setup where there is a parent invisible skipTaskbar window, then the actual main window is a child of that, and libtaskmanager's handling of this since apparently 16 years+ ago has been to skip the child window together with the parent window. The child window has this xprop output: _NET_WM_ALLOWED_ACTIONS(ATOM) = _NET_WM_ACTION_MOVE, _NET_WM_ACTION_RESIZE, _NET_WM_ACTION_MINIMIZE, _NET_WM_ACTION_MAXIMIZE_VERT, _NET_WM_ACTION_MAXIMIZE_HORZ, _NET_WM_ACTION_FULLSCREEN, _NET_WM_ACTION_CHANGE_DESKTOP, _NET_WM_ACTION_CLOSE _KDE_NET_WM_FRAME_STRUT(CARDINAL) = 0, 0, 30, 0 _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 30, 0 _NET_WM_DESKTOP(CARDINAL) = 0 _KDE_NET_WM_ACTIVITIES(STRING) = "dc93f33b-acc6-40f7-8b04-734b0da0e781" WM_STATE(WM_STATE): window state: Normal icon window: 0x0 _NET_WM_STATE(ATOM) = _NET_WM_STATE_FOCUSED _KDE_NET_WM_USER_CREATION_TIME(CARDINAL) = 16542606 _NET_WM_NAME(UTF8_STRING) = "新規プロジェクト - This is UTAU, NOT VOCALOID!" WM_ICON_NAME(COMPOUND_TEXT) = "新規プロジェクト - This is UTAU, NOT VOCALOID!" WM_NAME(COMPOUND_TEXT) = "新規プロジェクト - This is UTAU, NOT VOCALOID!" WM_HINTS(WM_HINTS): Client accepts input or input focus: False Initial state is Normal State. bitmap id # to use for icon: 0x1a00097 bitmap id # of mask for icon: 0x1a00099 window id # of group leader: 0x1c00003 _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL WM_TRANSIENT_FOR(WINDOW): window id # 0x1c00003 _MOTIF_WM_HINTS(_MOTIF_WM_HINTS) = 0x3, 0x3e, 0x7a, 0x0, 0x0 WM_NORMAL_HINTS(WM_SIZE_HINTS): program specified location: 379, 174 window gravity: Static XdndAware(ATOM) = BITMAP _NET_WM_PID(CARDINAL) = 123567 WM_LOCALE_NAME(STRING) = "ja_JP.UTF-8" WM_CLIENT_MACHINE(STRING) = "MF-PC" WM_CLASS(STRING) = "utau.exe", "utau.exe" WM_PROTOCOLS(ATOM): protocols WM_DELETE_WINDOW, _NET_WM_PING, WM_TAKE_FOCUS The parent window has this xprop output: _NET_WM_ALLOWED_ACTIONS(ATOM) = _NET_WM_ACTION_MOVE, _NET_WM_ACTION_MINIMIZE, _NET_WM_ACTION_FULLSCREEN, _NET_WM_ACTION_CHANGE_DESKTOP, _NET_WM_ACTION_CLOSE _NET_WM_DESKTOP(CARDINAL) = 0 WM_STATE(WM_STATE): window state: Normal icon window: 0x0 _NET_WM_USER_TIME(CARDINAL) = 0 _NET_WM_STATE(ATOM) = _NET_WM_STATE_DEMANDS_ATTENTION, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_SKIP_PAGER, _KDE_NET_WM_STATE_SKIP_SWITCHER _NET_WM_NAME(UTF8_STRING) = "歌声合成ツール - UTAU" WM_ICON_NAME(COMPOUND_TEXT) = "歌声合成ツール - UTAU" WM_NAME(COMPOUND_TEXT) = "歌声合成ツール - UTAU" WM_HINTS(WM_HINTS): Client accepts input or input focus: False Initial state is Normal State. bitmap id # to use for icon: 0x1a0001c bitmap id # of mask for icon: 0x1a0001e window id # of group leader: 0x1c00003 _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL _MOTIF_WM_HINTS(_MOTIF_WM_HINTS) = 0x3, 0x34, 0x0, 0x0, 0x0 WM_NORMAL_HINTS(WM_SIZE_HINTS): program specified location: 960, 540 program specified minimum size: 1 by 1 program specified maximum size: 1 by 1 window gravity: Static XdndAware(ATOM) = BITMAP _NET_WM_PID(CARDINAL) = 123567 WM_LOCALE_NAME(STRING) = "ja_JP.UTF-8" _KDE_NET_WM_USER_CREATION_TIME(CARDINAL) = 16542588 WM_CLIENT_MACHINE(STRING) = "MF-PC" WM_CLASS(STRING) = "utau.exe", "utau.exe" WM_PROTOCOLS(ATOM): protocols WM_DELETE_WINDOW, _NET_WM_PING, WM_TAKE_FOCUS This doesn't seem to be a wine issue, since Wine seems to simply map Windows's API function for removing an item from the taskbar directly to setting that window's skipTaskbar to true on X https://gitlab.winehq.org/wine/wine/-/blob/905be521d322c85bb63b34ab9230b4bab791fb0b/dlls/winex11.drv/window.c#L3508 https://gitlab.winehq.org/search?search=DELETE_TAB&nav_source=navbar&project_id=5&group_id=10&search_code=true https://learn.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-itaskbarlist-deletetab Note how the parent window has a minimum and maximum size of 1x1. I tried the first app from BUG 240517 and it does have the same issue (even now, 16 years later). (If anyone else wants to decide whether to keep this bug, or close this one in favor of reopening that one, I'm fine either way; but I'll keep investigating here for now.) That app has the same behavior: parent window is skipTaskbar, 1x1 in size, isn't actually visible; child window is visible but is hidden in taskbar because it's treated as a transient window. Seeing how there are several Win32 apps that are like this, this seems to be a bit of a convention, and it'd be nice if this is worked around. I tried out a workaround patch that only excludes a window with a parent from the taskbar if that parent is not 1x1 in size, and it does help put the apps in the taskbar, but then the taskbar doesn't highlight them as active even when they appear to be. The change to waylandtasksmodel.cpp (in WaylandTasksModel::data): } else if (role == SkipTaskbar) { // before: // return window->windowState.testFlag(PlasmaWindow::state::state_skiptaskbar) // || d->transients.contains(window); return window->windowState.testFlag(PlasmaWindow::state::state_skiptaskbar) || (d->transients.contains(window) // and not a 1x1 window && !(d->transients.value(window)->geometry.height() == 1 && d->transients.value(window)->geometry.width() == 1)); |