Оптимизация окружения рабочего стола: Верхняя панель меню


Цель

  • Поставить под сомнение общепринятые методы

Верхняя панель меню

Если вы используете только экран ноутбука, вы уже ограничены в площади экрана. Каждый пиксель хочется использовать с пользой. Верхняя строка меню занимает постоянное пространство. Если задуматься, автоскрытие и полноэкранный режим не позволяют просматривать содержимое верхней строки меню. Поэтому, если вам нужно просмотреть статус сети, когда вы находитесь в полноэкранном приложении/режиме, вам нужно выйти из него.

Типичным содержимым верхней панели меню является:

  • дата и время
  • состояние сети
  • состояние батареи
  • регулятор громкости
  • некоторые приложения, управляемые с помощью значка в трее.

Подумайте, какой процент от общего времени, которое вы проводите за компьютером, вы посвящаете использованию вышеперечисленных элементов!

И наконец, оптимальны ли возможности просмотра? Вам действительно нравится (неосознанно) напрягать глаза, чтобы посмотреть на 10px текст даты/времени, расположенный в углу экрана? Или вы бы предпочли, чтобы она была напечатана более крупным шрифтом и находилась в центре экрана?

Что делать мне?

Я предпочитаю использовать клавиатуру.
Я полностью отключил верхнюю строку меню.
Я выполняю сценарий оболочки, который собирает всю информацию (например, состояние батареи, состояние сети и т.д.).
У меня есть уведомление, настроенное на отображение этой информации в центре экрана каждые 15 минут.
Кроме того, у меня есть комбинация клавиш для просмотра уведомления по требованию.
Что касается приложений, управляемых с помощью значка в трее, у меня был только safeeyes, у которого, к счастью, есть cli. Если возникнет что-то еще, я уверен, что дистрибутивы/приложения на базе linux достаточно гибкие, чтобы помочь мне справиться с этим.

Для того, чтобы все заработало, я также с удовольствием настроил демона, используя таймеры systemd, настроил dunst и узнал о командах/приложениях shell, которые связываются с аппаратным обеспечением устройств для получения информации об их состоянии. Это достаточно много unix-веселья, чтобы подтолкнуть меня к написанию поста!

Код

Я использую Arch linux, но приведенные ниже скрипты могут помочь вам начать работу, если вы используете другие дистрибутивы linux.

скрипт nodejs

Возможно, вам придется отредактировать его под свои нужды. Например, вместо nmcli вы можете использовать существующую сетевую утилиту и извлечь ее статусный вывод. То же самое для Xmonad (xprop).

const util = require("util");
const stdExec = require("child_process").exec;
const exec = util.promisify(stdExec);

const appNameForDunst = "CombinedNotification";
const executeScript = async (shellCommand) => {
  return await exec(shellCommand);
};

const notifySendCommand = async (text) =>
  await executeScript(
    `notify-send -t 5000 -a ${appNameForDunst} "Statusn" "${text}"`
  );

const commands = [
  {
    title: "Date",
    command: "date '+ %a %d %b %y'",
    process: "return output",
    color: "orange",
  },
  {
    title: "Time",
    command: "date '+ %I:%M'",
    process: "return output",
    color: "yellow",
  },
  {
    title: "Battery",
    command: "acpi -b",
    process:
      'let commaSplit = output.split(","); let chargingStatus = commaSplit[0].split(":")[1]; return `${chargingStatus} ${commaSplit[1]}`',
    color: "silver",
  },
  {
    title: "Network",
    command: "nmcli -t -f NAME connection show --active",
    process: "return output",
    color: "cyan",
  },
  {
    title: "Workspace",
    command: "xprop -root _NET_CURRENT_DESKTOP",
    process:
      'return ["view", "dev", "servers", "config", "notes", "work"][output.trim().substr(-1)]',
    color: "violet",
  },
  {
    title: "Window Count",
    command: "xprop -root _NET_CLIENT_LIST_STACKING",
    process: 'return output.split("#").join("").split(",").length',
    color: "white",
  },
];

let displayText = "";

const handler = async (command, index) => {
  const result = await executeScript(command.command);
  const processOutput = new Function("output", command.process);
  const lineEndingChar =
    ["Date", "Time"].includes(command.title) || index == commands.length
      ? ""
      : "n";
  displayText =
    displayText +
    `<span>${command.title}:</span> <span color='${
      command.color
    }'>${processOutput(result.stdout)}</span>${lineEndingChar}`;
  console.log(displayText);
};

const main = async () => {
  try {
    await Promise.allSettled(commands.map(handler));
    notifySendCommand(displayText);
  } catch (error) {
    console.log(error);
  }
};

main();
Вход в полноэкранный режим Выход из полноэкранного режима

скрипты systemd

Я поместил их в ~/.config/systemd/user

notification.service

[Unit]
Description=Show notification service
Wants=notification.timer

[Service]
Type=simple
ExecStart=/usr/bin/node /home/<username>/<path-to-nodejs-script>
Environment="DISPLAY=:0" "DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus" "XAUTHORITY=/home/<username>/.Xauthority"
Войти в полноэкранный режим Выйти из полноэкранного режима

notification.timer

[Unit]
Description=Show notification timer

[Timer]
# The Unit item is not necessary as long as the name before the .service extension is same
Unit=notification.service
OnBootSec=2m
OnUnitActiveSec=15m

[Install]
WantedBy=timers.target
Ввести полноэкранный режим Выход из полноэкранного режима

Оцените статью
devanswers.ru
Добавить комментарий