This commit is contained in:
2026-01-29 17:55:26 -06:00
parent 13c920fd32
commit 9d18d477d5
24 changed files with 501 additions and 166 deletions

View File

@@ -9,7 +9,7 @@ import qs.Modules.Bar.Extras
import qs.Services.UI
import qs.Widgets
Rectangle {
Item {
id: root
property var pluginApi: null
@@ -18,8 +18,13 @@ Rectangle {
property string widgetId: ""
property string section: ""
readonly property string barPosition: Settings.data.bar.position
// Bar positioning properties
readonly property string screenName: screen ? screen.name : ""
readonly property string barPosition: Settings.getBarPositionForScreen(screenName)
readonly property bool isVertical: barPosition === "left" || barPosition === "right"
readonly property real barHeight: Style.getBarHeightForScreen(screenName)
readonly property real capsuleHeight: Style.getCapsuleHeightForScreen(screenName)
readonly property real barFontSize: Style.getBarFontSizeForScreen(screenName)
property bool micActive: false
property bool camActive: false
@@ -44,12 +49,14 @@ Rectangle {
readonly property bool isVisible: !hideInactive || micActive || camActive || scrActive
property real margins: removeMargins ? 0 : Style.marginM * 2
implicitWidth: isVertical ? Style.capsuleHeight : Math.round(layout.implicitWidth + margins)
implicitHeight: isVertical ? Math.round(layout.implicitHeight + margins) : Style.capsuleHeight
readonly property real contentWidth: isVertical ? Style.capsuleHeight : Math.round(layout.implicitWidth + margins)
readonly property real contentHeight: isVertical ? Math.round(layout.implicitHeight + margins) : Style.capsuleHeight
implicitWidth: contentWidth
implicitHeight: contentHeight
Layout.alignment: Qt.AlignVCenter
radius: Style.radiusM
color: Style.capsuleColor
visible: root.isVisible
opacity: root.isVisible ? 1.0 : 0.0
@@ -221,6 +228,54 @@ Rectangle {
return parts.length > 0 ? parts.join("\n") : "";
}
Rectangle {
id: visualCapsule
x: Style.pixelAlignCenter(parent.width, width)
y: Style.pixelAlignCenter(parent.height, height)
width: root.contentWidth
height: root.contentHeight
radius: Style.radiusM
color: Style.capsuleColor
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth
Item {
id: layout
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
implicitWidth: iconsLayout.implicitWidth
implicitHeight: iconsLayout.implicitHeight
GridLayout {
id: iconsLayout
columns: root.isVertical ? 1 : 3
rows: root.isVertical ? 3 : 1
rowSpacing: root.iconSpacing
columnSpacing: root.iconSpacing
NIcon {
visible: micActive || !root.hideInactive
icon: micActive ? "microphone" : "microphone-off"
color: root.micColor
}
NIcon {
visible: camActive || !root.hideInactive
icon: camActive ? "camera" : "camera-off"
color: root.camColor
}
NIcon {
visible: scrActive || !root.hideInactive
icon: scrActive ? "screen-share" : "screen-share-off"
color: root.scrColor
}
}
}
}
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.RightButton
@@ -234,40 +289,4 @@ Rectangle {
}
onExited: TooltipService.hide()
}
Item {
id: layout
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
implicitWidth: iconsLayout.implicitWidth
implicitHeight: iconsLayout.implicitHeight
GridLayout {
id: iconsLayout
columns: root.isVertical ? 1 : 3
rows: root.isVertical ? 3 : 1
rowSpacing: root.iconSpacing
columnSpacing: root.iconSpacing
NIcon {
visible: micActive || !root.hideInactive
icon: micActive ? "microphone" : "microphone-off"
color: root.micColor
}
NIcon {
visible: camActive || !root.hideInactive
icon: camActive ? "camera" : "camera-off"
color: root.camColor
}
NIcon {
visible: scrActive || !root.hideInactive
icon: scrActive ? "screen-share" : "screen-share-off"
color: root.scrColor
}
}
}
}

View File

@@ -0,0 +1,21 @@
{
"settings": {
"hideInactive": {
"desc": "Mikrofon, kamera és képernyő ikonok elrejtése, ha éppen nincsenek használatban.",
"label": "Inaktív állapotok elrejtése"
},
"iconSpacing": {
"desc": "Állítsa be az ikonok közötti távolságot.",
"label": "Ikon távolság"
},
"removeMargins": {
"desc": "Távolítsd el a widget összes külső margóját.",
"label": "Margók eltávolítása"
}
},
"tooltip": {
"cam-on": "Kamera: {apps}",
"mic-on": "Mikrofon: {apps}",
"screen-on": "Képernyőmegosztás: {apps}"
}
}

View File

@@ -0,0 +1,21 @@
{
"settings": {
"hideInactive": {
"desc": "Îkonên mîkrofon, kamera û ekranê dema ku neçalak bin veşêre.",
"label": "Rewşa neçalak veşêre"
},
"iconSpacing": {
"desc": "Cihê di navbera îkonan de diyar bike.",
"label": "Dûrahiya îkonan"
},
"removeMargins": {
"desc": "Hemû marjînalên derveyî yên widgetê rake.",
"label": "Derdestên derxînin"
}
},
"tooltip": {
"cam-on": "Kamera: {apps}",
"mic-on": "Mîkrofon: {apps}",
"screen-on": "Parvekirina ekranê: {apps}"
}
}

View File

@@ -0,0 +1,21 @@
{
"settings": {
"hideInactive": {
"desc": "Ukryj ikony mikrofonu, kamery i ekranu, gdy są nieaktywne.",
"label": "Ukryj nieaktywne stany"
},
"iconSpacing": {
"desc": "Ustaw odstęp między ikonami.",
"label": "Odstępy ikon"
},
"removeMargins": {
"desc": "Usuń wszystkie zewnętrzne marginesy widżetu.",
"label": "Usuń marginesy"
}
},
"tooltip": {
"cam-on": "Kamera: {apps}",
"mic-on": "Mikrofon: {apps}",
"screen-on": "Udostępnianie ekranu: {apps}"
}
}

View File

@@ -0,0 +1,21 @@
{
"settings": {
"hideInactive": {
"desc": "當麥克風, 攝影機及螢幕分享沒有啟動時就直接隱藏",
"label": "隱藏未啟動的狀態"
},
"iconSpacing": {
"desc": "設定圖示之間的留空",
"label": "圖示間距"
},
"removeMargins": {
"desc": "移除小工具外面的所有邊距",
"label": "移除邊距"
}
},
"tooltip": {
"cam-on": "攝影機: {apps}",
"mic-on": "麥克風: {apps}",
"screen-on": "螢幕分享: {apps}"
}
}

View File

@@ -1,12 +1,14 @@
{
"id": "privacy-indicator",
"name": "Privacy Indicator",
"version": "1.0.10",
"version": "1.0.13",
"minNoctaliaVersion": "3.6.0",
"author": "Noctalia Team <team@noctalia.dev>",
"author": "Noctalia Team",
"official": true,
"license": "MIT",
"repository": "https://github.com/noctalia-dev/noctalia-plugins",
"description": "A privacy indicator widget that shows when microphone, camera or screen sharing is active.",
"tags": ["Bar", "Privacy", "Indicator"],
"entryPoints": {
"barWidget": "BarWidget.qml",
"settings": "Settings.qml"

View File

@@ -15,6 +15,29 @@ NIconButton {
property string section: ""
readonly property var mainInstance: pluginApi?.mainInstance
readonly property bool hideInactive:
pluginApi?.pluginSettings?.hideInactive ??
pluginApi?.manifest?.metadata?.defaultSettings?.hideInactive ??
false
readonly property bool shouldShow: !hideInactive || (mainInstance?.isRecording ?? false) || (mainInstance?.isPending ?? false)
visible: true
opacity: shouldShow ? 1.0 : 0.0
implicitWidth: shouldShow ? baseSize : 0
implicitHeight: shouldShow ? baseSize : 0
Behavior on opacity {
NumberAnimation { duration: Style.animationNormal }
}
Behavior on implicitWidth {
NumberAnimation { duration: Style.animationNormal }
}
Behavior on implicitHeight {
NumberAnimation { duration: Style.animationNormal }
}
enabled: mainInstance?.isAvailable ?? false
icon: "camera-video"
@@ -49,11 +72,7 @@ NIconButton {
}
onRightClicked: {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.showContextMenu(contextMenu);
contextMenu.openAtItem(root, screen);
}
PanelService.showContextMenu(contextMenu, root, screen);
}
@@ -69,10 +88,8 @@ NIconButton {
]
onTriggered: action => {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.close();
}
contextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "widget-settings") {
BarService.openPluginSettings(screen, pluginApi.manifest);

View File

@@ -54,6 +54,7 @@ Item {
}
// Settings shortcuts
readonly property bool hideInactive: pluginApi?.pluginSettings?.hideInactive ?? false
readonly property string directory: pluginApi?.pluginSettings?.directory || ""
readonly property string filenamePattern: pluginApi?.pluginSettings?.filenamePattern || "recording_yyyyMMdd_HHmmss"
readonly property string frameRate: pluginApi?.pluginSettings?.frameRate || "60"

View File

@@ -11,6 +11,11 @@ ColumnLayout {
property var pluginApi: null
property bool editHideInactive:
pluginApi?.pluginSettings?.hideInactive ??
pluginApi?.manifest?.metadata?.defaultSettings?.hideInactive ??
false
property string editDirectory:
pluginApi?.pluginSettings?.directory ||
pluginApi?.manifest?.metadata?.defaultSettings?.directory ||
@@ -77,6 +82,7 @@ ColumnLayout {
return
}
pluginApi.pluginSettings.hideInactive = root.editHideInactive
pluginApi.pluginSettings.directory = root.editDirectory
pluginApi.pluginSettings.filenamePattern = root.editFilenamePattern
pluginApi.pluginSettings.frameRate = root.editFrameRate
@@ -137,6 +143,15 @@ ColumnLayout {
defaultValue: pluginApi?.manifest?.metadata?.defaultSettings?.copyToClipboard ?? false
}
// Hide When Inactive Toggle
NToggle {
label: pluginApi.tr("settings.general.hide-when-inactive")
description: pluginApi.tr("settings.general.hide-when-inactive-description")
checked: root.editHideInactive
onToggled: root.editHideInactive = checked
defaultValue: pluginApi?.manifest?.metadata?.defaultSettings?.hideInactive ?? false
}
NDivider {
Layout.fillWidth: true
}

View File

@@ -34,6 +34,8 @@
"general": {
"copy-to-clipboard": "In die Zwischenablage kopieren",
"copy-to-clipboard-description": "Kopiere die Datei nach Abschluss der Aufnahme in die Zwischenablage.",
"hide-when-inactive": "Bei Inaktivität ausblenden",
"hide-when-inactive-description": "Widget in Statusleiste ausblenden, wenn keine Aufnahme stattfindet",
"output-folder": "Ausgabeordner",
"output-folder-description": "Ordner, in dem Bildschirmaufnahmen gespeichert werden",
"show-cursor": "Cursor anzeigen",

View File

@@ -35,6 +35,8 @@
"general": {
"copy-to-clipboard": "Copy to clipboard",
"copy-to-clipboard-description": "Copy the file to clipboard after recording finishes.",
"hide-when-inactive": "Hide when inactive",
"hide-when-inactive-description": "Hide the bar indicator when not recording",
"output-folder": "Output folder",
"output-folder-description": "Folder where screen recordings will be saved",
"show-cursor": "Show cursor",

View File

@@ -1,9 +1,10 @@
{
"id": "screen-recorder",
"name": "Screen Recorder",
"version": "1.0.8",
"version": "1.1.2",
"minNoctaliaVersion": "3.6.0",
"author": "Noctalia Team",
"official": true,
"license": "MIT",
"repository": "https://github.com/noctalia-dev/noctalia-plugins",
"description": "Hardware-accelerated screen recording using gpu-screen-recorder with customizable video and audio settings",
@@ -22,6 +23,7 @@
},
"metadata": {
"defaultSettings": {
"hideInactive": false,
"directory": "",
"filenamePattern": "recording_yyyyMMdd_HHmmss",
"frameRate": "60",

View File

@@ -6,7 +6,7 @@ import qs.Commons
import qs.Widgets
import qs.Services.UI
Rectangle {
Item {
id: root
property var pluginApi: null
@@ -18,14 +18,6 @@ Rectangle {
readonly property string barPosition: Settings.data.bar.position
readonly property bool isVertical: barPosition === "left" || barPosition === "right"
implicitWidth: isVertical ? Style.capsuleHeight : layout.implicitWidth + Style.marginS * 2
implicitHeight: isVertical ? layout.implicitHeight + Style.marginS * 2 : Style.capsuleHeight
color: root.hovered ? Color.mHover : Style.capsuleColor
radius: Style.radiusM
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth
property string currentIconName: pluginApi?.pluginSettings?.currentIconName || pluginApi?.manifest?.metadata?.defaultSettings?.currentIconName
property bool hideOnZero: pluginApi?.pluginSettings.hideOnZero || pluginApi?.manifest?.metadata.defaultSettings?.hideOnZero
readonly property bool isVisible: (root.pluginApi?.mainInstance?.updateCount > 0) || !root.hideOnZero
@@ -33,57 +25,73 @@ Rectangle {
// also set opacity to zero when invisible as we use opacity to hide the barWidgetLoader
opacity: root.isVisible ? 1.0 : 0.0
readonly property real contentWidth: isVertical ? Style.capsuleHeight : layout.implicitWidth + Style.marginS * 2
readonly property real contentHeight: isVertical ? layout.implicitHeight + Style.marginS * 2 : Style.capsuleHeight
implicitWidth: contentWidth
implicitHeight: contentHeight
//
// ------ Widget ------
//
Item {
id: layout
anchors.centerIn: parent
Rectangle {
id: visualCapsule
x: Style.pixelAlignCenter(parent.width, width)
y: Style.pixelAlignCenter(parent.height, height)
width: root.contentWidth
height: root.contentHeight
color: root.hovered ? Color.mHover : Style.capsuleColor
radius: Style.radiusM
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth
implicitWidth: grid.implicitWidth
implicitHeight: grid.implicitHeight
Item {
id: layout
anchors.centerIn: parent
GridLayout {
id: grid
columns: root.isVertical ? 1 : 2
rowSpacing: Style.marginS
columnSpacing: Style.marginS
implicitWidth: grid.implicitWidth
implicitHeight: grid.implicitHeight
NIcon {
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
icon: root.currentIconName
color: root.hovered ? Color.mOnHover : Color.mOnSurface
}
GridLayout {
id: grid
columns: root.isVertical ? 1 : 2
rowSpacing: Style.marginS
columnSpacing: Style.marginS
NText {
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
text: root.pluginApi?.mainInstance?.updateCount.toString()
color: root.hovered ? Color.mOnHover : Color.mOnSurface
pointSize: Style.barFontSize
NIcon {
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
icon: root.currentIconName
color: root.hovered ? Color.mOnHover : Color.mOnSurface
}
NText {
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
text: root.pluginApi?.mainInstance?.updateCount.toString()
color: root.hovered ? Color.mOnHover : Color.mOnSurface
pointSize: Style.barFontSize
}
}
}
}
MouseArea {
anchors.fill: parent
hoverEnabled: true
cursorShape: root.pluginApi?.mainInstance?.updateCount > 0 ? Qt.PointingHandCursor : Qt.ArrowCursor
MouseArea {
anchors.fill: parent
hoverEnabled: true
cursorShape: root.pluginApi?.mainInstance?.updateCount > 0 ? Qt.PointingHandCursor : Qt.ArrowCursor
onClicked: {
if (root.pluginApi?.mainInstance?.updateCount > 0)
root.pluginApi?.mainInstance?.startDoSystemUpdate();
}
onClicked: {
if (root.pluginApi?.mainInstance?.updateCount > 0)
root.pluginApi?.mainInstance?.startDoSystemUpdate();
}
onEntered: {
root.hovered = true;
buildTooltip();
}
onEntered: {
root.hovered = true;
buildTooltip();
}
onExited: {
root.hovered = false;
TooltipService.hide();
}
onExited: {
root.hovered = false;
TooltipService.hide();
}
}

View File

@@ -36,6 +36,7 @@ Configure the plugin in Noctalia settings:
- **Noctalia Shell**: 3.6.0 or later.
- **Update backend**: one of the supported package managers defined in `updaterConfigs.json` (recommended, but not required).
- **Paru/Yay**: Default `updaterConfigs.json` requires `checkupdates`
## Technical Details

View File

@@ -70,16 +70,26 @@ ColumnLayout {
}
}
RowLayout {
Layout.fillWidth: true
spacing: Style.marginL
ColumnLayout {
spacing: Style.marginM
NLabel {
label: pluginApi?.tr("settings.updateInterval.label")
description: pluginApi?.tr("settings.updateInterval.desc")
RowLayout {
Layout.fillWidth: true
spacing: Style.marginM
NLabel {
label: pluginApi?.tr("settings.updateInterval.label")
description: pluginApi?.tr("settings.updateInterval.desc")
}
NText {
text: root.updateIntervalMinutes.toString().padStart(3, " ") + " minutes"
color: Settings.data.colorSchemes.darkMode ? Color.mOnSurface : Color.mOnPrimary
}
}
NSlider {
Layout.fillWidth: true
from: 5
to: 300
value: root.updateIntervalMinutes
@@ -88,11 +98,6 @@ ColumnLayout {
root.updateIntervalMinutes = value;
}
}
NText {
text: root.updateIntervalMinutes.toString().padStart(3, " ") + " minutes"
color: Settings.data.colorSchemes.darkMode ? Color.mOnSurface : Color.mOnPrimary
}
}
NDivider {
@@ -145,28 +150,23 @@ ColumnLayout {
}
ColumnLayout {
RowLayout {
NText {
Layout.fillWidth: true
text: pluginApi?.tr("settings.currentNumUpdatesCmd.label")
color: Settings.data.colorSchemes.darkMode ? Color.mSecondary : Color.mOnSecondary
}
NText {
text: root.customCmdGetNumUpdates || pluginApi?.mainInstance?.updater.cmdGetNumUpdates || "NA"
color: Settings.data.colorSchemes.darkMode ? Color.mTertiary : Color.mOnTertiary
}
NText {
text: pluginApi?.tr("settings.currentNumUpdatesCmd.label")
color: Settings.data.colorSchemes.darkMode ? Color.mSecondary : Color.mOnSecondary
}
NLabel {
description: `> ${root.customCmdGetNumUpdates || pluginApi?.mainInstance?.updater.cmdGetNumUpdates || "NA"}`
}
}
ColumnLayout {
NText {
text: pluginApi?.tr("settings.currentUpdateCmd.label")
color: Settings.data.colorSchemes.darkMode ? Color.mSecondary : Color.mOnSecondary
}
RowLayout {
NText {
Layout.fillWidth: true
text: pluginApi?.tr("settings.currentUpdateCmd.label")
color: Settings.data.colorSchemes.darkMode ? Color.mSecondary : Color.mOnSecondary
}
NText {
text: root.customCmdDoSystemUpdate || pluginApi?.mainInstance?.updater.cmdDoSystemUpdate || "NA"
color: Settings.data.colorSchemes.darkMode ? Color.mTertiary : Color.mOnTertiary
}
NLabel {
description: `> ${root.customCmdDoSystemUpdate || pluginApi?.mainInstance?.updater.cmdDoSystemUpdate || "NA"}`
}
}

View File

@@ -0,0 +1,47 @@
{
"settings": {
"changeIcon": {
"label": "Ikon kiválasztása"
},
"currentCommands": {
"label": "Jelenleg beállított parancsok"
},
"currentIconName": {
"desc": "Jelenleg beállított ikon neve.",
"label": "Ikonazonosító"
},
"currentNumUpdatesCmd": {
"label": "Frissítések száma"
},
"currentUpdateCmd": {
"label": "Rendszerfrissítés"
},
"customCmdDoSystemUpdate": {
"desc": "A rendszerfrissítés végrehajtásához használt shell parancs.",
"label": "Egyedi rendszerfrissítési parancs",
"placeholder": "e.g., yay -Syu"
},
"customCmdGetNumUpdates": {
"desc": "Shell parancs, amelynek egyetlen egész számot kell kiírnia, ami a rendelkezésre álló frissítések számát jelöli.",
"label": "Egyéni frissítésszám parancs",
"placeholder": "e.g., yay -Quq 2>/dev/null | wc -l"
},
"hideWidget": {
"desc": "Akkor rejtse el a widgetet, ha a rendelkezésre álló frissítések száma 0.",
"label": "Elrejtés nulla frissítés esetén"
},
"terminal": {
"desc": "A rendszerfrissítés végrehajtásához használt terminálparancs. Opcionális: {} a frissítési parancshoz.",
"label": "Terminálemulátor",
"placeholder": "pl.: foot -e, hyprctl dispatch exec '[float] kitty -e {}'-plural"
},
"updateInterval": {
"desc": "Lekérdezési időtartam a frissítések ellenőrzéséhez",
"label": "Frissítések ellenőrzésének gyakorisága"
}
},
"tooltip": {
"noUpdatesAvailable": "Nincsenek észlelt frissítések",
"updatesAvailable": "Kattintson a beállított rendszerfrissítési parancs futtatásához"
}
}

View File

@@ -0,0 +1,47 @@
{
"settings": {
"changeIcon": {
"label": "Îkon Hilbijêre"
},
"currentCommands": {
"label": "Niha emrên hatine sazkirin"
},
"currentIconName": {
"desc": "Navê îkona ku niha hatiye vesazkirin.",
"label": "Nasnameya Îkonê"
},
"currentNumUpdatesCmd": {
"label": "Hejmara nûvekirinê"
},
"currentUpdateCmd": {
"label": "Nûkirina sîstemê"
},
"customCmdDoSystemUpdate": {
"desc": "Fermana şêlê ya ku ji bo pêkanîna nûvekirina pergalê tê bikaranîn.",
"label": "Fermana Nûvekirina Sîstemê ya Xweser",
"placeholder": "mînak, yay -Syu"
},
"customCmdGetNumUpdates": {
"desc": "Fermana shellê ya ku divê yek hejmarek temam derxe ku hejmara nûvekirinên berdest nîşan dide.",
"label": "Fermana Jimartinê ya Hejmara Nûvekirinê ya Xweser",
"placeholder": "mînak, yay -Quq 2>/dev/null | wc -l"
},
"hideWidget": {
"desc": "Demaşê widgetê gava jimara nûkirinên berdest 0 be.",
"label": "Veşartin li ser Nûkirinên Sifir"
},
"terminal": {
"desc": "Fermana termînalê ya ku ji bo pêkanîna fermana nûvekirina pergalê tê bikaranîn. Vebijêrkî: {} ji bo fermana nûvekirinê.",
"label": "Emulatorê Termînalê",
"placeholder": "mînak, foot -e, hyprctl dispatch exec '[float] kitty -e {}'"
},
"updateInterval": {
"desc": "Demê dûrî ji bo kontrolên nûvekirinê",
"label": "Demê Kontrolkirina Nûvekirinê"
}
},
"tooltip": {
"noUpdatesAvailable": "Tu nûvekirin hatin dîtin",
"updatesAvailable": "Bitikîne da fermana nûkirina pergalê ya hatî vesazkirin bimeşîne"
}
}

View File

@@ -0,0 +1,47 @@
{
"settings": {
"changeIcon": {
"label": "Wybierz ikonę"
},
"currentCommands": {
"label": "Obecnie skonfigurowane polecenia"
},
"currentIconName": {
"desc": "Aktualnie skonfigurowana nazwa ikony.",
"label": "Identyfikator ikony"
},
"currentNumUpdatesCmd": {
"label": "Liczba aktualizacji"
},
"currentUpdateCmd": {
"label": "Aktualizacja systemu"
},
"customCmdDoSystemUpdate": {
"desc": "Polecenie powłoki używane do przeprowadzania aktualizacji systemu.",
"label": "Niestandardowe polecenie aktualizacji systemu",
"placeholder": "np. yay -Syu"
},
"customCmdGetNumUpdates": {
"desc": "Polecenie powłoki, które musi zwrócić pojedynczą liczbę całkowitą reprezentującą liczbę dostępnych aktualizacji.",
"label": "Własna komenda aktualizująca liczbę",
"placeholder": "np. yay -Quq 2>/dev/null | wc -l"
},
"hideWidget": {
"desc": "Ukryj widżet, gdy liczba dostępnych aktualizacji wynosi 0.",
"label": "Ukryj przy braku aktualizacji"
},
"terminal": {
"desc": "Polecenie terminala używane do wykonywania polecenia aktualizacji systemu. Opcjonalne: {} dla polecenia aktualizacji.",
"label": "Emulator terminala",
"placeholder": "np. foot -e, hyprctl dispatch exec '[float] kitty -e {}'"
},
"updateInterval": {
"desc": "Interwał odpytywania dla sprawdzania aktualizacji",
"label": "Interwał sprawdzania aktualizacji"
}
},
"tooltip": {
"noUpdatesAvailable": "Nie wykryto aktualizacji",
"updatesAvailable": "Kliknij, aby uruchomić skonfigurowane polecenie aktualizacji systemu"
}
}

View File

@@ -0,0 +1,47 @@
{
"settings": {
"changeIcon": {
"label": "選取圖示"
},
"currentCommands": {
"label": "現在所設定的指令"
},
"currentIconName": {
"desc": "現在所設定的圖示名稱",
"label": "圖示識別"
},
"currentNumUpdatesCmd": {
"label": "更新數量"
},
"currentUpdateCmd": {
"label": "系統更新"
},
"customCmdDoSystemUpdate": {
"desc": "用來執行系統更新的 shell 指令",
"label": "自訂系統更新指令",
"placeholder": "例如: yay -Syu"
},
"customCmdGetNumUpdates": {
"desc": "所使用的 shell 指令必須要輸出用來表示數量的整數值 (int)",
"label": "自訂更新數量指令",
"placeholder": "例如: yay -Quq 2>/dev/null | wc -l"
},
"hideWidget": {
"desc": "當可以更新的套件數量是0時隱藏小工具",
"label": "零更新時隱藏"
},
"terminal": {
"desc": "用來執行系統更新指令用的終端機指令; 可選用: 以 {} 作為更新指令",
"label": "終端機",
"placeholder": "例如 foot -e, hyprctl dispatch exec '[float] kitty -e {}'"
},
"updateInterval": {
"desc": "確認更新的時間間格",
"label": "更新檢查間格"
}
},
"tooltip": {
"noUpdatesAvailable": "沒有偵測到更新",
"updatesAvailable": "點擊以執行設定好的系統更新指令"
}
}

View File

@@ -1,7 +1,7 @@
{
"id": "update-count",
"name": "Update Count",
"version": "1.0.9",
"version": "1.0.11",
"minNoctaliaVersion": "3.6.0",
"author": "BukoMoon",
"license": "GPLv3",

View File

@@ -1,14 +1,14 @@
[
{
"name": "yay",
"cmdCheck": "command -v yay >/dev/null 2>&1",
"cmdGetNumUpdates": "yay -Qu 2>/dev/null | wc -l",
"cmdCheck": "command -v checkupdates >/dev/null 2>&1 && command -v yay >/dev/null 2>&1",
"cmdGetNumUpdates": "(checkupdates 2>/dev/null; yay -Qua 2>/dev/null) | wc -l",
"cmdDoSystemUpdate": "yay -Syu"
},
{
"name": "paru",
"cmdCheck": "command -v paru >/dev/null 2>&1",
"cmdGetNumUpdates": "paru -Qu 2>/dev/null | wc -l",
"cmdCheck": "command -v checkupdates >/dev/null 2>&1 && command -v paru >/dev/null 2>&1",
"cmdGetNumUpdates": "(checkupdates 2>/dev/null; paru -Qua 2>/dev/null) | wc -l",
"cmdDoSystemUpdate": "paru -Syu"
},
{