Snippets » History » Version 25
Version 24 (Anonymous, 10/30/2010 09:56 PM) → Version 25/46 (Anonymous, 12/06/2010 04:56 PM)
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::View[:current].clients\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\012(1..9).each do |i|\015\012    grab "C-%d" % [ i ] do |c|\015\012      views = Subtlext::View.all.map { |v| v.name }\015\012\015\012      # Adjust tags\015\012      if(i < views.size)\015\012        views.each do |v|\015\012          c.untag(v)\015\012        end\015\012\015\012        c.tag(views[i - 1])\015\012\015\012        Subtlext::View[views[i - 1]].tag(views[i - 1])\015\012      end\015\012    end\015\012end\015\012\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</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 clients with default tag\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.tag(view.name)\015\012    end\015\012end\015\012</code></pre>\015\012\015\012