glzr-io / zebar

Zebar is a tool for creating customizable and cross-platform taskbars, desktop widgets, and popups.
GNU General Public License v3.0
1.1k stars 51 forks source link

[Bug] Zebar doesnt show workspaces with Komorebi provider. Panic calling unwrap() on Err #89

Closed 0xjairo closed 1 month ago

0xjairo commented 3 months ago

Describe the bug

When I start zebar (Windows 11, Powershell) using komorebi running I don't get workspaces or listed in zebar

Screenshot image

Reproduction

zebar 1.8.1

$ komorebi --version
komorebi 0.1.28
tag:v0.1.28
commit_hash:0cdce8fc
build_time:2024-07-15 16:06:31 +00:00
build_env:rustc 1.79.0 (129f3b996 2024-06-10),stable-x86_64-pc-windows-msvc

Running zebar

$ zebar monitors
# copy one line and paste into
$ $monitor="<paste>"
# then run:
Start-Process -FilePath "zebar" -NoNewWindow -ArgumentList "open bar --args $monitor"

.glzr-io\zebar\config.yaml:

# Yaml is white-space sensitive (use 2 spaces to indent).

###
# Settings to apply to all windows.
#
# Docs regarding global: https://some-future-docs-link.com
global:
  # Whether to enable the browser devtools.
  enable_devtools: true

###
# Define a new window with an id of 'bar'. This window can then be opened
# via the Zebar cli by running 'zebar open bar'.
#
# Docs regarding window: https://some-future-docs-link.com
window/bar:
  providers: ['self']
  # Width of the window in physical pixels.
  width: '{{ self.args.MONITOR_WIDTH }}'
  # Height of the window in physical pixels.
  height: '40'
  # X-position of the window in physical pixels.
  position_x: '{{ self.args.MONITOR_X }}'
  # Y-position of the window in physical pixels.
  position_y: '{{ self.args.MONITOR_Y }}'
  # Whether to show the window above/below all others.
  # Allowed values: 'always_on_top', 'always_on_bottom', 'normal'.
  z_order: 'always_on_top'
  # Whether the window should be shown in the taskbar.
  show_in_taskbar: false
  # Whether the window should have resize handles.
  resizable: false
  # Styles to apply globally within the window. For example, we can use
  # this to import the Nerdfonts icon font. Ref https://www.nerdfonts.com/cheat-sheet
  # for a cheatsheet of available Nerdfonts icons.
  global_styles: |
    @import "https://www.nerdfonts.com/assets/css/webfont.css";
  # CSS/SCSS styles to apply to the root element within the window.
  styles: |
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    align-items: center;
    height: 100%;
    color: #ffffffe6;
    font-family: ui-monospace, monospace;
    font-size: 13px;
    padding: 4px 24px;
    border-bottom: 1px solid #ffffff08;
    background: linear-gradient(
      rgba(14, 14, 28, 0.95),
      rgba(26, 14, 28, 0.85),
    );
  group/left:
    styles: |
      display: flex;
      align-items: center;

    template/logo:
      styles: |
        margin-right: 20px;
      template: |
        <i class="nf nf-fa-windows"></i>

    # template/komorebi:
    #   styles: |
    #     .workspace {
    #       display: inline-block;
    #       margin: 0px !important;
    #       padding: 4px 20px 2px 20px;
    #       
    #         &.active {
    #           border: 1px solid white;
    #         }
    #     }
    #   providers: ['komorebi','self']
    #   template: |       
    #     @for (monitor of komorebi.allMonitors) {
    #       <div title="Self: {{monitor.name}}({{monitor.focusedWorkspaceIndex}})">
    #         @for (workspace of monitor.workspaces) {
    #           <div title="{{workspace.layout}}" class="workspace {{monitor.workspaces.indexOf(workspace) === monitor.focusedWorkspaceIndex && 'active'}}">
    #             {{workspace.name}}                
    #           </div>
    #         }
    #       </div>
    #     }

    template/workspaces:
      styles: |
        display: flex;
        align-items: center;

        .workspace {
          background: rgba(255, 255, 255, 0.05);
          margin-right: 4px;
          width: 30px;
          height: 30px;
          color: #ffffffe6;
          border: none;
          border-radius: 2px;

          &.active {
            background: rgba(255, 255, 255, 0.1);
          }
        }
      providers: ['komorebi']
      template: |
        @for (workspace of komorebi.currentWorkspaces) {
          <div>
            <button class="workspace {{ workspace === komorebi.focusedWorkspace && 'active' }}">
              {{ workspace.name }}
            </button>
          </div>
        }

  group/center:
    styles: |
      justify-self: center;

    template/clock:
      providers: ['date']
      # Available date tokens: https://moment.github.io/luxon/#/formatting?id=table-of-tokens
      template: |
        {{ date.toFormat(date.now, 'EEE d MMM t') }}

  group/right:
    styles: |
      justify-self: end;
      display: flex;

      .template {
        margin-left: 20px;
      }

      i {
        color: #7481b2e1;
        margin-right: 7px;
      }

    template/memory:
      providers: ['memory']
      template: |
        <i class="nf nf-fae-chip"></i>
        {{ Math.round(memory.usage) }}%

    template/cpu:
      providers: ['cpu']
      styles: |
        .high-usage {
          color: #900029;
        }
      template: |
        <i class="nf nf-oct-cpu"></i>

        <!-- Change the text color if the CPU usage is high. -->
        @if (cpu.usage > 85) {
          <span class="high-usage">{{ Math.round(cpu.usage) }}%</span>
        } @else {
          <span>{{ Math.round(cpu.usage) }}%</span>
        }

    template/battery:
      providers: ['battery']
      styles: |
        position: relative;

        .charging-icon {
          position: absolute;
          font-size: 11px;
          left: 7px;
          top: 2px;
        }
      template: |
        <!-- Show icon for whether battery is charging. -->
        @if (battery.isCharging) {<i class="nf nf-md-power_plug charging-icon"></i>}

        <!-- Show icon for how much of the battery is charged. -->
        @if (battery.chargePercent > 90) {<i class="nf nf-fa-battery_4"></i>}
        @else if (battery.chargePercent > 70) {<i class="nf nf-fa-battery_3"></i>}
        @else if (battery.chargePercent > 40) {<i class="nf nf-fa-battery_2"></i>}
        @else if (battery.chargePercent > 20) {<i class="nf nf-fa-battery_1"></i>}
        @else {<i class="nf nf-fa-battery_0"></i>}

        {{ Math.round(battery.chargePercent) }}%

    template/weather:
      providers: ['weather']
      template: |
        @switch (weather.status) {
          @case ('clear_day') {<i class="nf nf-weather-day_sunny"></i>}
          @case ('clear_night') {<i class="nf nf-weather-night_clear"></i>}
          @case ('cloudy_day') {<i class="nf nf-weather-day_cloudy"></i>}
          @case ('cloudy_night') {<i class="nf nf-weather-night_alt_cloudy"></i>}
          @case ('light_rain_day') {<i class="nf nf-weather-day_sprinkle"></i>}
          @case ('light_rain_night') {<i class="nf nf-weather-night_alt_sprinkle"></i>}
          @case ('heavy_rain_day') {<i class="nf nf-weather-day_rain"></i>}
          @case ('heavy_rain_night') {<i class="nf nf-weather-night_alt_rain"></i>}
          @case ('snow_day') {<i class="nf nf-weather-day_snow"></i>}
          @case ('snow_night') {<i class="nf nf-weather-night_alt_snow"></i>}
          @case ('thunder_day') {<i class="nf nf-weather-day_lightning"></i>}
          @case ('thunder_night') {<i class="nf nf-weather-night_alt_lightning"></i>}
        }
        {{ weather.celsiusTemp }}°

Stack trace or error logs (if applicable)

2024-08-22T14:30:40.187565Z  INFO desktop::providers::provider: Starting provider: [{"type":"memory","refresh_interval":"5000"}]
2024-08-22T14:30:40.188459Z  INFO desktop::providers::provider: Starting provider: [{"type":"cpu","refresh_interval":"5000"}]
2024-08-22T14:30:40.188631Z  INFO desktop::providers::provider: Starting provider: [{"type":"battery","refresh_interval":"5000"}]
2024-08-22T14:30:40.188911Z  INFO desktop::providers::provider: Starting provider: [{"type":"komorebi"}]
2024-08-22T14:30:40.189137Z  INFO desktop::providers::provider: Starting provider: [{"type":"ip","refresh_interval":"3600000"}]
thread 'tokio-runtime-worker' panicked at src\providers\komorebi\provider.rs:150:45:
called `Result::unwrap()` on an `Err` value: Error("missing field `remove_titlebars`", line: 1, column: 9905)
stack backtrace:
2024-08-22T14:30:40.204551Z  INFO desktop::providers::manager: Emitting for provider: [{"type":"cpu","refresh_interval":"5000"}]
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
2024-08-22T14:30:40.207997Z  INFO desktop::providers::manager: Emitting for provider: [{"type":"battery","refresh_interval":"5000"}]
2024-08-22T14:30:40.246659Z  INFO desktop::providers::manager: Emitting for provider: [{"type":"memory","refresh_interval":"5000"}]
2024-08-22T14:30:40.303462Z  INFO desktop::providers::manager: Emitting for provider: [{"type":"ip","refresh_interval":"3600000"}]
2024-08-22T14:30:40.326016Z  INFO desktop::providers::provider: Starting provider: [{"type":"weather","refresh_interval":"3600000","longitude":"-95.3633","latitude":"29.7633"}]
2024-08-22T14:30:40.864673Z  INFO desktop::providers::manager: Emitting for provider: [{"type":"weather","refresh_interval":"3600000","longitude":"-95.3633","latitude":"29.7633"}]
2024-08-22T14:30:45.201684Z  INFO desktop::providers::manager: Emitting for provider: [{"type":"memory","refresh_interval":"5000"}]
2024-08-22T14:30:45.202256Z  INFO desktop::providers::manager: Emitting for provider: [{"type":"battery","refresh_interval":"5000"}]
2024-08-22T14:30:45.204635Z  INFO desktop::providers::manager: Emitting for provider: [{"type":"cpu","refresh_interval":"5000"}]

Version number

1.8.1

lars-berger commented 1 month ago

Some more graceful error handling to the komorebi provider has been added now in v2.2.1 👍