fvwm-window-search 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -8
  3. data/focus.sh +16 -1
  4. data/fvwm-window-search +25 -8
  5. data/lib.rb +5 -5
  6. metadata +12 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 580941b472f2b948d9f6d854a337a1d066646c7b3705986f76f3b429845026a3
4
- data.tar.gz: 2e7b0a76b19a24514641ce603f35eee86f380bc8293c155014e80bfba9b24652
3
+ metadata.gz: dd55a9dff4bdaee0fcb2e3aab600d85f6c0d40b8a706ea1dd0d7d17e2c0a83c8
4
+ data.tar.gz: b47ae4bac4a1a0e68f629306de58e76f6d0111f48e1a9bb686fb63362179161b
5
5
  SHA512:
6
- metadata.gz: e85229be05ab43082df6362ca7b4b72c5f57cfdca85835027c979f305d01c332d74d5fa6830338548e08beb0718b4b25f2cd382c03da4ff66b5bce7a05429d79
7
- data.tar.gz: e9926afb792d151259ca4dadd48d6346da71437cbdc7642009392d08ff1e03a610b10b78e12475a58a6b901efb0551192d2977394e08e06aabdf51772e7c46e2
6
+ metadata.gz: 13ce630d60e59c33f1bd26c6b29f4dcca5134dabc8d4f0a6a54f812e9d5d50ebb4ca644031e126785cefdaad6cd95ce008a3ca7167deb04b103a0e9dfc43ed53
7
+ data.tar.gz: 00311f2288294e4556f3e38b297c33581a7f0ab0b8ced615daf07d31c88682d0555b164a8eb5be6d68729495a8460469ed244511d93d8f2cab0793abac7a8fbc
data/README.md CHANGED
@@ -5,14 +5,14 @@ Incremental window search & immediate switch to the selected window
5
5
 
6
6
  $ gem install fvwm-window-search
7
7
 
8
- ![A screenshot of running fvwm-window-search](https://raw.github.com/gromnitsky/fvwm-window-search/master/screnshot1.png)
8
+ ![demo](https://thumbs.gfycat.com/GenerousRingedFlicker-small.gif)
9
9
 
10
- * Should work w/ any X11 window manager.
11
- * Filtering by windows names/resources/classes.
10
+ * Should work w/ most stackings X11 window managers.
11
+ * Filtering by window name/resource/classe.
12
12
 
13
13
  ## Reqs
14
14
 
15
- * Ruby
15
+ * Ruby 2.4+
16
16
  * `xwininfo` & `xdotool` (`xorg-x11-utils` & `xdotool` Fedora pkgs)
17
17
 
18
18
  ## Compilation
@@ -22,7 +22,12 @@ not contravene w/ a system-installed dmenu.
22
22
 
23
23
  ## Usage
24
24
 
25
- Run `fvwm-window-search`.
25
+ ~~~
26
+ $ ./fvwm-window-search -h
27
+ Usage: fvwm-window-search [options]
28
+ -c path an alternative path to conf.yaml
29
+ -r focus a window only if Return is pressed
30
+ ~~~
26
31
 
27
32
  To customise dmenu or filtering, create a yaml file
28
33
  `$XDG_CONFIG_HOME/fvwm-window-search/conf.yaml`, e.g.:
@@ -40,8 +45,8 @@ filter:
40
45
  ~~~
41
46
 
42
47
  Subkeys in `dmenu` are the usual CLOs for
43
- [dmenu(1)][]. `selhook-return-key-focus-only` is a custom one, that
44
- enables window focusing on pressing Return only.
48
+ [dmenu(1)][]. `selhook-return-key-focus-only` is an equivalent of `-r`
49
+ CLO.
45
50
 
46
51
  [dmenu(1)]: https://manpages.debian.org/unstable/suckless-tools/dmenu.1.en.html
47
52
 
@@ -51,7 +56,7 @@ a subkey is an array of regexes. See the defaults in
51
56
 
52
57
  ## Bugs
53
58
 
54
- * Tested only w/ Ruby-2.7.0 & Fvwm3.
59
+ * Tested only w/ Fvwm3.
55
60
  * No distinction between normal & iconified windows.
56
61
 
57
62
  ## License
data/focus.sh CHANGED
@@ -4,4 +4,19 @@ id=`echo "$1" | awk -F'|' '{print $NF} END { exit $NF == "" ? 1 : 0}'` || {
4
4
  echo "usage: `basename "$0"` 'name | class | id'"
5
5
  exit 1
6
6
  }
7
- xdotool windowactivate "$id" mousemove --window "$id" 0 0
7
+
8
+ # tries to put a mouse pointer as shown on the picture below (▲ is the
9
+ # pointer):
10
+ #
11
+ # +-------------+
12
+ # | Title |
13
+ # +-------------+
14
+ # | ▲ |
15
+ # | |
16
+ # | |
17
+ # +-------------+
18
+
19
+ eval "`xdotool getwindowgeometry --shell "$id"`"
20
+ x=$((WIDTH/2))
21
+
22
+ xdotool windowactivate "$id" mousemove --window "$id" "$x" 0
@@ -3,18 +3,13 @@
3
3
  require_relative './lib'
4
4
  include FvwmWindowSearch
5
5
  require 'yaml'
6
-
7
- def options_load
8
- xdg_config_home = ENV['XDG_CONFIG_HOME'] || File.expand_path('~/.config')
9
- conf = File.join xdg_config_home, 'fvwm-window-search', 'conf.yaml'
10
- r = File.read conf rescue nil
11
- YAML.load r, conf rescue errx 1, "invalid config: #{$!}" if r
12
- end
6
+ require 'optparse'
13
7
 
14
8
  def options
15
9
  default = {
16
10
  "dmenu" => { # each key is a corresponding CL option
17
11
  "selhook" => File.join(__dir__, "focus.sh %s"),
12
+ "selhook-return-key-focus-only" => false,
18
13
  "fn" => "Monospace-10",
19
14
  "l" => 8,
20
15
  "b" => true,
@@ -27,7 +22,29 @@ def options
27
22
  }
28
23
  }
29
24
 
30
- deep_merge(default, options_load || {})
25
+ cl = options_load_cl
26
+ env = deep_merge(default, options_load_file(cl) || {})
27
+ deep_merge env, cl
28
+ end
29
+
30
+ def options_load_cl
31
+ opt = { "dmenu" => {} }
32
+ OptionParser.new do |o|
33
+ o.on("-c path", "an alternative path to conf.yaml") { |v| opt["conf"] = v }
34
+ o.on("-r", "focus a window only if Return is pressed") do
35
+ opt["dmenu"]["selhook-return-key-focus-only"] = true
36
+ end
37
+ end.parse!
38
+ opt
39
+ end
40
+
41
+ def options_load_file opt # return nil if config wasn't found
42
+ conf = opt["conf"] || -> do
43
+ xdg_config_home = ENV['XDG_CONFIG_HOME'] || File.expand_path('~/.config')
44
+ File.join xdg_config_home, 'fvwm-window-search', 'conf.yaml'
45
+ end.call
46
+ r = File.read conf rescue nil
47
+ YAML.load r, conf rescue errx 1, "invalid config: #{$!}" if r
31
48
  end
32
49
 
33
50
  def menu params, text
data/lib.rb CHANGED
@@ -71,8 +71,8 @@ module FvwmWindowSearch
71
71
 
72
72
  def windows_filter patterns, winlist
73
73
  desired = -> (type, value) {
74
- include = patterns[type].filter{|v| v[0] != '!'}
75
- exclude = patterns[type].filter{|v| v[0] == '!'}.map {|v| v[1..-1]}
74
+ include = patterns[type].select {|v| v[0] != '!'}
75
+ exclude = patterns[type].select {|v| v[0] == '!'}.map {|v| v[1..-1]}
76
76
 
77
77
  exclude.each do |pattern|
78
78
  return true if value.match pattern
@@ -83,9 +83,9 @@ module FvwmWindowSearch
83
83
  true
84
84
  }
85
85
 
86
- winlist.filter { |w| desired.call "class", w.class }
87
- .filter{ |w| desired.call "resource", w.resource }
88
- .filter{ |w| desired.call "name", w.name }
86
+ winlist.select { |w| desired.call "class", w.class }
87
+ .select { |w| desired.call "resource", w.resource }
88
+ .select { |w| desired.call "name", w.name }
89
89
  end
90
90
 
91
91
  def deep_merge first, second
metadata CHANGED
@@ -1,19 +1,23 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fvwm-window-search
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Gromnitsky
8
8
  autorequire:
9
9
  bindir: "."
10
10
  cert_chain: []
11
- date: 2020-07-19 00:00:00.000000000 Z
11
+ date: 2020-07-21 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |
14
- Search for windows interactively using a patched dmenu utility.
15
- Originally made for Fvwm, it's been fully rewritten to work out-of-the-box
16
- with any window manager. Requires xdotool & xwininfo installed.
14
+ A window switcher: search for windows interactively using a patched
15
+ dmenu utility (comes with the gem). This was originally made for Fvwm,
16
+ but it's been fully rewritten to work out-of-the-box with any stacking
17
+ window manager. Requires xdotool & xwininfo installed.
18
+
19
+ It differs from rofi & co in that it activates (brings up) windows
20
+ _during_ the search.
17
21
  email: alexander.gromnitsky@gmail.com
18
22
  executables:
19
23
  - fvwm-window-search
@@ -40,7 +44,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
40
44
  requirements:
41
45
  - - ">="
42
46
  - !ruby/object:Gem::Version
43
- version: '0'
47
+ version: 2.4.0
44
48
  required_rubygems_version: !ruby/object:Gem::Requirement
45
49
  requirements:
46
50
  - - ">="
@@ -50,5 +54,6 @@ requirements: []
50
54
  rubygems_version: 3.1.2
51
55
  signing_key:
52
56
  specification_version: 4
53
- summary: Interactive incremental windows search & selection for X Window
57
+ summary: 'A window switcher: an interactive incremental windows search & selection
58
+ for X Window'
54
59
  test_files: []