Project

General

Profile

unexist.dev

/

subtle

Assorted tidbits and projects

Snippets » History » Version 29

Anonymous, 01/18/2011 09:51 PM

1 29
h1. Snippets\015\012\015\012This page shows small snippets that might be useful. Without further instructions they just need to be copied into the config of [[subtle]].\015\012\015\012{{>toc}}\015\012\015\012h2. Alt-Tab\015\012\015\012This cycles through windows of view\015\012\015\012<pre>{{hide}}<code class="ruby">\015\012grab "A-Tab" do |c|\015\012   sel     = 0\015\012   clients = Subtlext::Client.visible\015\012\015\012   clients.each_index do |idx|\015\012     if(clients[idx].id == c.id)\015\012       sel = idx + 1 if(idx < clients.size - 1)\015\012     end\015\012   end\015\012\015\012  clients[sel].focus\015\012end\015\012</code></pre>\015\012\015\012h2. Gravity tiling\015\012\015\012Tiles windows vertically that share a gravity.\015\012\015\012<pre>{{hide}}<code class="ruby">\015\012on :tile do\015\012  clients = Subtlext::View.current.clients\015\012  screen  = Subtlext::Screen.current\015\012\015\012  assoc = {}\015\012\015\012  clients.each do |c|\015\012    begin\015\012      assoc[c.gravity.id] << c rescue assoc[c.gravity.id] = [ c ]\015\012    rescue StandardError\015\012      # Startup errors\015\012    end\015\012  end\015\012\015\012  assoc.each do |k, v|\015\012    g      = Subtlext::Gravity[k]\015\012    border = 2 #< Currently hardcoded\015\012\015\012    # Calculate gravity\015\012    x, y, w, h = g.geometry_for(screen)\015\012    width      = w / v.size\015\012    pos        = x\015\012\015\012    v.each do |c|\015\012      c.resize   = false\015\012      c.geometry = [ pos, y, width - 2 * border, h - 2 * border ]\015\012      pos += width\015\012    end\015\012  end\015\012end\015\012</code></pre>\015\012\015\012h2. Extend view\015\012\015\012<pre>{{hide}}<code class="ruby">\015\012require "subtle/subtlext"\015\012\015\012STORE ||= {}\015\012\015\012module Subtlext\015\012  class View\015\012    def method_missing(meth, *args)\015\012      STORE[self.name] = { } unless(STORE.has_key?(self.name))\015\012\015\012      if(meth.to_s.end_with?("="))\015\012        meth = meth.to_s.chop.to_sym\015\012\015\012        STORE[self.name][meth] = args[0]\015\012      else\015\012        STORE[self.name][meth]\015\012      end\015\012    end\015\012  end\015\012end\015\012</code></pre>\015\012\015\012Finally make some use of this like following hook:\015\012\015\012<pre>{{hide}}<code class="ruby">\015\012on :view_jump do |v|\015\012  v.visits += 1 rescue v.visits = 1\015\012  puts "View %s, %d visits" % [ v.name, v.visits ]\015\012end\015\012</code></pre>\015\012\015\012h2. Focus gravities\015\012\015\012Focus window a specific gravities on view.\015\012\015\012<pre>{{hide}}<code class="ruby">\015\012{\015\012  "KP_7" => :top_left,    "KP_8" => :top,    "KP_9" => :top_right,\015\012  "KP_4" => :left,        "KP_5" => :center, "KP_6" => :right,\015\012  "KP_1" => :bottom_left, "KP_2" => :bottom, "KP_3" => :bottom_right\015\012}.each do |k, v|\015\012  grab "A-C-" + k, lambda {\015\012    c = Subtlext::View.current.clients.select { |c|\015\012      c.gravity.name.to_sym == v\015\012    }\015\012  \015\012    c.first.focus unless(c.empty?)\015\012  }\015\012end\015\012</code></pre>\015\012\015\012h2. Move windows\015\012\015\012This snippet adds nine [[grabs]] to move windows on the fly to nine defined views. It uses [[tagging]] for this, creates [[tags]] based on the view names and applies them when needed.\015\012\015\012<pre>{{hide}}<code class="ruby">\015\012on :start do\015\012  # Create missing tags\015\012  views = Subtlext::View.all.map { |v| v.name }\015\012  tags  = Subtlext::Tag.all.map { |t| t.name }\015\012\015\012  views.each do |v|\015\012    unless(tags.include?(v))\015\012      t = Subtlext::Tag.new(v)\015\012      t.save\015\012    end\015\012  end\015\012end\015\012\015\012# Add nine C-< number> grabs\015\012(1..9).each do |i|\015\012 grab "C-%d" % [ i ] do |c|\015\012   views = Subtlext::View.all\015\012   names = views.map { |v| v.name }\015\012\015\012   # Sanity check\015\012   if(i <= views.size)\015\012     # Tag client\015\012     tags = c.tags.reject { |t| names.include?(t.name) or "default" == t.name }\015\012     tags << names[i - 1]\015\012\015\012     c.tags = tags\015\012\015\012     # Tag view\015\012     views[i - 1].tag(names[i - 1])\015\012   end\015\012 end\015\012end\015\012</code></pre>\015\012\015\012h2. Current view\015\012\015\012This snippet works similar to the previous, it adds tags based on the view names. When there is an untagged window (a window with the default tag only) it adds the name of the current view as tag, which effectively moves the window to the current view.\015\012\015\012<pre>{{hide}}<code class="ruby">\015\012on :start do\015\012  # Create missing tags\015\012  views = Subtlext::View.all.map { |v| v.name }\015\012  tags  = Subtlext::Tag.all.map { |t| t.name }\015\012\015\012  views.each do |v|\015\012    unless(tags.include?(v))\015\012      t = Subtlext::Tag.new(v)\015\012      t.save\015\012    end\015\012  end\015\012end\015\012\015\012# Assign tags to clients\015\012on :client_create do |c|\015\012  view = Subtlext::View.current\015\012  tags = c.tags.map { |t| t.name }\015\012\015\012  # Add tag to view\015\012  view.tag(view.name) unless(view.tags.include?(view.name))\015\012\015\012  # Exclusive for clients with default tag only\015\012  if(tags.include?("default") and 1 == tags.size)\015\012    c.tags = [ view.name ]\015\012  end\015\012end\015\012</code></pre>\015\012\015\012h2. Scratchpad\015\012\015\012The scratchpad snippet is just a small hack of the tagging. Normally [[subtle]] doesn't allow to create a window without tags, so that it's never visible. This grab just creates a "urxvt":http://software.schmorp.de/pkg/rxvt-unicode.html, strips all [[tagging|tags]] and sets sticky. On the next press it just toggles sticky and blends the window in and out, like a scratchpad.\015\012\015\012<pre>{{hide}}<code class="ruby">grab "A-b" do\015\012  if((c = Subtlext::Client["scratch"]))\015\012    c.toggle_stick\015\012    c.focus\015\012  elsif((c = Subtlext::Subtle.spawn("urxvt -name scratch")))\015\012    c.tags  = [] \015\012    c.flags = [ :stick ]\015\012  end\015\012end\015\012</code></pre>\015\012\015\012\015\012