I3: Difference between revisions

imported>Kjuvi
mNo edit summary
m link to home-manager-options.extranix.com which is foss
 
(29 intermediate revisions by 16 users not shown)
Line 1: Line 1:
{{Expansion|there are a lot more [https://nixos.org/nixos/options.html#i3 options]}}
{{Lowercase_title}}
{{Expansion|there are a lot more [https://search.nixos.org/options/?query=i3 options]}}
[https://i3wm.org/ i3] is a tiling window manager for X.
[https://i3wm.org/ i3] is a tiling window manager for X.


== Enabling ==
== Enabling ==
To use i3 set <code>service.xserver.windowManager.i3.enable</code> to <code>true</code>. For example:
 
To use i3 set <code>services.xserver.windowManager.i3.enable</code> to <code>true</code>. For example:
{{file|/etc/nixos/configuration.nix|nix|
{{file|/etc/nixos/configuration.nix|nix|
<nowiki>
<nowiki>
{ config, pkgs, callPackage, ... }: {
{ config, pkgs, callPackage, ... }:  
 
{
  ...
  environment.pathsToLink = [ "/libexec" ]; # links /libexec from derivations to /run/current-system/sw
   ...
   ...
   services.xserver = {
   services.xserver = {
     enable = true;
     enable = true;
     desktopManager = {
     desktopManager = {
      default = "none";
       xterm.enable = false;
       xterm.enable = false;
     };
     };
     windowManager.i3.enable = true;
 
    displayManager = {
        defaultSession = "none+i3";
    };
 
     windowManager.i3 = {
      enable = true;
      extraPackages = with pkgs; [
        dmenu #application launcher most people use
        i3status # gives you the default i3 status bar
        i3lock #default i3 screen locker
        i3blocks #if you are planning on using i3blocks over i3status
    ];
    };
   };
   };
   ...
   ...
Line 21: Line 40:
}}
}}
{{Evaluate}}
{{Evaluate}}
=== Using home-manager ===
{{file|~/.config/nixpkg/home.nix|nix|
<nowiki>
#in configuration.nix
services.xserver = {
  enable = true;
  windowManager.i3.enable = true;
  };
  services.displayManager = {
    defaultSession = "none+i3";
  };
#in home.nix
  xsession.windowManager.i3 = {
    enable = true;
    package = pkgs.i3-gaps;
    config = {
      modifier = "Mod4";
      gaps = {
        inner = 10;
        outer = 5;
      };
    };
  };
</nowiki>
}}
See also: [https://github.com/srid/nix-config/blob/705a70c094da53aa50cf560179b973529617eb31/nix/home/i3.nix srid/nix-config/nix/home/i3.nix]
=== With a desktop manager ===
=== With a desktop manager ===
i3 is a window manager and does not provide "cosmetic" services like managing multiple monitor configuration or media
i3 is a window manager and does not provide "cosmetic" services like managing multiple monitor configuration or media
Line 26: Line 75:
[[Xfce#Using_as_a_desktop_manager_and_not_a_window_manager]].
[[Xfce#Using_as_a_desktop_manager_and_not_a_window_manager]].


===I3-gaps frok===
===I3-gaps fork===


To use i3-gaps fork, the following line should be added to the configuration.nix:   
To use i3-gaps fork, the following line should be added to the configuration.nix:   


<code>service.xserver.windowManager.i3.package = pkgs.i3-gaps</code>.
<syntaxhighlight lang="nix" inline>services.xserver.windowManager.i3.package = pkgs.i3-gaps;</syntaxhighlight>
 
== Tips & tricks ==
===i3blocks===
After installing and enabling i3blocks, you may notice that i3block won't work. why?
 
It seems that i3blocks read it's contents from a hardcoded path in /etc by default.
Since in nixos, this path look something like:
 
{{file|Path of i3blocks in nixos|nix|
<nowiki>
  /nix/store/k78nc1bplhy4yjblqwlc14h6rdisix3w-i3blocks-1.4/libexec/i3blocks/[BLOCKS]
</nowiki>
}}
 
And it can't find this path, so we have to create a link to this path by adding this line to configuration.nix file:
{{file|/etc/nixos/configuration.nix|nix|
<nowiki>
  environment.pathsToLink = [ "/libexec" ];
</nowiki>
}}
 
Finally, your block may looks like:
{{file|~/.config/i3/i3blocks.conf|nix|
<nowiki>
[battery]                                                                                                       
label=⚡                                                                                                       
command=/run/current-system/sw/libexec/i3blocks/battery                                                         
interval=10                                                                                                     
instance=1
</nowiki>
}}


===DConf===
===DConf===
Line 38: Line 118:
<nowiki>
<nowiki>
   programs.dconf.enable = true;
   programs.dconf.enable = true;
  services.dbus.packages = [ pkgs.gnome3.dconf ];
</nowiki>
</nowiki>
}}
}}
===Lxappearance===
To change the icon and themes you can install lxappearance:
{{file|/etc/nixos/configuration.nix|nix|
<nowiki>
environment.systemPackages = with pkgs; [
    #---- i3
    lxappearance
    ...
]
</nowiki>
}}
=== Solve inconsistency between gtk2 and gtk3 themes ===
If enabling '''dconf''' or installing '''Lxappearance''' but still see inconsistency between themes, you have to manually edit their configurations. In fact, It is possible to install some gtk3 themes but when you start another gtk2 application, your theme not effected properly. It's because there is no .gtkrc-2.0 in your home directory. First create it and paste these lines to it:
{{file|~/.gtkrc-2.0|nix|
<nowiki>
gtk-theme-name="Sierra-compact-light"
gtk-icon-theme-name="ePapirus"
gtk-font-name="Ubuntu 11"
gtk-cursor-theme-name="Deepin"
gtk-cursor-theme-size=0
gtk-toolbar-style=GTK_TOOLBAR_BOTH
gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR
gtk-button-images=1
gtk-menu-images=1
gtk-enable-event-sounds=1
gtk-enable-input-feedback-sounds=1
gtk-xft-antialias=1
gtk-xft-hinting=1
gtk-xft-hintstyle="hintfull"
gtk-xft-rgba="rgb"
gtk-modules="gail:atk-bridge"
</nowiki>
}}
Change the options based on your installed themes and icon packs.


=== Wallpaper ===
=== Wallpaper ===
If <code>~/.background-image</code> exists then it will be displayed as a wallpaper. Options <code>services.xserver.desktopManager.wallpaper.combineScreens</code> and <code>.mode</code> control exactly how it is displayed.
If <code>~/.background-image</code> exists then it will be displayed as a wallpaper. Options <code>services.xserver.desktopManager.wallpaper.combineScreens</code> and <code>.mode</code> control exactly how it is displayed.
[[Category:Window managers]]
[[Category:Applications]]
=== i3status-rust with home-manager ===
i3status-rust can be configured through home-manager, but that configuration does not autoamatically update i3 to invoke i3status-rust. Instead <code>xsession.windowManager.i3.config.bars</code> needs to be updated to reference i3status-rust and the config files that the home-manager config produces. Consider the following setup:
{{file|~/.config/nixpkg/home.nix|nix|
<nowiki>
  xsession.windowManager.i3 = {
    enable = true;
    config = {
      bars = [
        {
          position = "top";
          statusCommand = "${pkgs.i3status-rust}/bin/i3status-rs ~/.config/i3status-rust/config-top.toml";
        }
      ];
    };
  };
  programs.i3status-rust = {
    enable = true;
    bars = {
      top = {
        blocks = [
        {
          block = "time";
          interval = 60;
          format = "%a %d/%m %k:%M %p";
        }
      ];
      };
    };
  };
}
</nowiki>
}}
=== i3status with home-manager ===
Same as in i3status-rust. Notice: home-manager will not override your existing config, i.e. if the file/folder  <code>~/.config/i3status/config</code>  is present on your system, there won't be any changes after rebuilding.
External resources that can help you with your setup: https://home-manager-options.extranix.com/?query=xsession.windowManager.i3.config
===== To enable i3status in home-manager and change some basic options: =====
<syntaxhighlight lang="nix" line="1" start="1">
programs.i3status = {
  enable = true;
  general = {
    colors = true;
    color_good = "#98971a";
    color_bad  = "#9d0006";
    interval = 1;
  };
};
</syntaxhighlight>
===== Adding various modules: =====
<syntaxhighlight lang="nix" line="1" start="1">
modules = {
  "disk /" = {
    enable = true;
    position = 1;
    settings = {
      format = "FREE: %free";
    };
  /* Put some of the modules below after this comment */
  };
</syntaxhighlight>
===== Current wireless connection (ethernet is pretty much the same) =====
<syntaxhighlight lang="nix" line="1" start="1">
"wireless <replace-with-interface-name>" = {
  enable = true;
  position = 2;
  settings = {
    format_up = "W: (%quality at %essid) %ip";
    format_down = "W: down";
  };
};
</syntaxhighlight>
===== Battery status =====
<syntaxhighlight lang="nix" line="1" start="1">
"battery 0" = {
  enable = true;
  position = 4;
  settings = {
    format = "BAT: %status %percentage %remaining %emptytime";
    format_down = "No battery";
    status_chr = "CHR";
    status_bat = "";
    status_unk = "?";
    status_full = "FULL";
    path = "/sys/class/power_supply/BAT1/uevent";
    low_threshold = 10;
  };
};
</syntaxhighlight>
=== Disabling default i3status modules: ===
After setting up my config, i3status showed two eth- and wifi's. To disable <code>ethernet _first_</code>  and <code>wireless _first_</code>  just add:<syntaxhighlight lang="nix" line="1" start="1">
"wireless _first_" = {
  enable = false;
};
"ethernet _first_" = {
  enable = false;
};
</syntaxhighlight>