summaryrefslogtreecommitdiff
path: root/accounts/gkleen@sif/shell/quickshell/ActiveWindowDisplay.qml
blob: 57ade488f21dba0f712a0029faebf54958ff4a20 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import QtQuick
import qs.Services
import Quickshell
import Quickshell.Widgets

Item {
  id: activeWindowDisplay

  required property int maxWidth
  required property var screen

  property var activeWindow: {
    let currWindowId = Array.from(NiriService.workspaces).find(ws => {
      return ws.output === screen.name && ws.is_active;
    })?.active_window_id;

    return currWindowId ? Array.from(NiriService.windows).find(win => win.id == currWindowId) : null;
  }
  property var windowEntry: activeWindow ? DesktopEntries.heuristicLookup(activeWindow.app_id) : null

  anchors.verticalCenter: parent.verticalCenter
  width: activeWindowDisplayContent.width
  height: parent.height

  Row {
    id: activeWindowDisplayContent

    width: childrenRect.width
    height: parent.height
    anchors.verticalCenter: parent.verticalCenter
    spacing: 8

    IconImage {
      id: activeWindowIcon

      height: 14
      width: 14

      anchors.verticalCenter: parent.verticalCenter

      source: {
	let icon = activeWindowDisplay.windowEntry?.icon
	if (typeof icon === 'string' || icon instanceof String) {
	  if (icon.includes("?path=")) {
	    const split = icon.split("?path=")
	    if (split.length !== 2)
	      return icon
	    const name = split[0]
	    const path = split[1]
	    const fileName = name.substring(
			     name.lastIndexOf("/") + 1)
	    return `file://${path}/${fileName}`
	  } else
	    icon = Quickshell.iconPath(icon);
	  return icon
	}
	return ""
      }
      asynchronous: true
      smooth: true
      mipmap: true
    }

    Text {
      id: windowTitle

      width: Math.min(implicitWidth, activeWindowDisplay.maxWidth - activeWindowIcon.width - activeWindowDisplayContent.spacing)

      property var appAliases: { "Firefox": "Mozilla Firefox", "mpv Media Player": "mpv", "Thunderbird": "Mozilla Thunderbird", "Thunderbird (LMU)": "Mozilla Thunderbird" }

      elide: Text.ElideRight
      maximumLineCount: 1
      color: "white"
      anchors.verticalCenter: parent.verticalCenter
      text: {
	if (!activeWindowDisplay.activeWindow)
	  return "";

	var title = activeWindowDisplay.activeWindow.title;
	var appName = activeWindowDisplay.windowEntry?.name;
	if (appAliases[appName])
	  appName = appAliases[appName];
	if (appName && title.endsWith(appName)) {
	  const oldTitle = title;
	  title = title.substring(0, title.length - appName.length);
	  title = title.replace(/\s*(—|-)\s*$/, "");
	  if (!title)
	    title = oldTitle;
	}
	return title;
      }
    }
  }
}