uh-wm 0.0.9 → 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d964f7fa9ddc317e9e179e07a20cd462457a7a80
4
- data.tar.gz: 93baa823c8b9fbc18fef96b37ad79416daa7059e
3
+ metadata.gz: 304d345d72ebfed7045a3ac0cd0bdb58fe8fbd31
4
+ data.tar.gz: cb5379acb77ac283dbb0f28b27e4e93fe9e13b5f
5
5
  SHA512:
6
- metadata.gz: 613887c13875de0901994d0dad1ff57ff4ba45f175fb149e0e6e6ef85ec1c7d9fc6d4faceb00e199ef40ec8c571f80c77bff4ef02bc355389dba9e6dd0b19936
7
- data.tar.gz: 9182b6a47768f16bfe5e0fae1db0e8d3dc1f6f75b3213ba267842025a3cabb7e39144f7f8173f8e805389e8cf01ec8b614a5c5eb15e29d0811b4d10bce240e02
6
+ metadata.gz: fdc8985073e35f6d54f1d627e0233ab0ebdad4cfe25ce0baf8d7b1847083f942fc91fbf9e36ee4bac812f489df4bc190660d947bcdcf8e6f5454380376363897
7
+ data.tar.gz: a69f26be2e7bfd9781222840f0bec1508d962f7fc192e2b5908718dd496f7a996827cee6f6abc92b2639e173766b7a10164772cd8d6f221ba2966cc79a52bc09
data/README.md CHANGED
@@ -17,13 +17,13 @@ specific messages, so it's easy to write your own layout.
17
17
  Main features:
18
18
 
19
19
  * Xinerama support;
20
- * multiple event handling strategy: blocking or multiplexing
21
- with `select()`;
22
- * configuration with a run control file (ruby DSL);
20
+ * different adapters for event handling: blocking, multiplexing
21
+ with `select()` or `kqueue()`;
22
+ * configuration with a run control file;
23
23
  * key bindings with user defined code as callback;
24
24
  * configurable modifier key;
25
25
  * support user-defined layout strategies;
26
- * program execution;
26
+ * external program execution;
27
27
  * no re-parenting (therefore, no window decoration either);
28
28
  * no grabbing of the modifier key alone;
29
29
  * no mouse handling;
@@ -64,9 +64,9 @@ options:
64
64
  Configuration
65
65
  -------------
66
66
 
67
- uhwm can be configured with a run control file, written in ruby. A
68
- simple example is provided below, more details will be available in
69
- the [`RunControl` class documentation][run_control_doc].
67
+ uhwm can be configured with a run control file written in ruby. A
68
+ simple example is provided below, more details are available in the
69
+ [`RunControl` class documentation][run_control_doc].
70
70
 
71
71
  ``` ruby
72
72
  DMENU = 'dmenu_run -b'.freeze
@@ -77,8 +77,8 @@ BROWSERS = %w[
77
77
  ].freeze
78
78
 
79
79
 
80
- modifier :mod1 # This key will be added to the modifier mask for
81
- # *all* key bindings.
80
+ modifier :mod1 # This key is added to the modifier mask for *all*
81
+ # key bindings.
82
82
  key(:p) { execute DMENU } # Execute given command in a shell when mod1+shift
83
83
  # is pressed.
84
84
  key(:Q) { quit } # Quit when mod1+shift+q is pressed (a capitalized
@@ -87,19 +87,19 @@ key(:enter) { execute VT } # Common key names (`enter') are translated to
87
87
  # their X equivalent (`return').
88
88
 
89
89
  rule BROWSERS do # Move windows to the `www' view when their app
90
- layout_view_set 'www' # class matches either /\Aarora/, /\Achromium/… etc
90
+ layout_view_set 'www' # class match either /\Aarora/, /\Achromium/… etc
91
91
  end
92
92
 
93
93
  launch do # Execute urxvt program twice, synchronously.
94
94
  execute! VT # `execute!' is a variant of `execute' which
95
- execute! VT # will only return when a window is mapped.
95
+ execute! VT # return when a window is mapped.
96
96
  layout_client_column_set :succ # Move last mapped window to next column.
97
97
  end
98
98
  ```
99
99
 
100
100
  Blocks given to `key`, `rule`, `launch` are executed in a special
101
101
  context providing access to methods named "actions", which are
102
- described in next section.
102
+ described in the following section.
103
103
 
104
104
  [run_control_doc]: http://www.rubydoc.info/gems/uh-wm/Uh/WM/RunControl
105
105
 
@@ -108,10 +108,10 @@ Actions
108
108
  -------
109
109
 
110
110
  The actions DSL implements a few built-in messages, but also acts as
111
- a proxy to the layout. Any message prefixed with `layout_` will be
112
- forwarded to the layout, with the prefix stripped. That is, if
111
+ a proxy to the layout. Any message prefixed with `layout_` is
112
+ forwarded to the layout, with its prefix stripped. That is, if
113
113
  `layout_view_sel '2'` is evaluated, then the layout will receive the
114
- `view_sel` message with `"2"` as argument. Up to date information is
114
+ `view_sel` message with `"2"` as argument. Accurate information is
115
115
  available in the [`ActionsHandler` class documentation][actions_doc]
116
116
 
117
117
  | Message | Arguments | Description
@@ -1,15 +1,29 @@
1
1
  module Uh
2
2
  module WM
3
+ # Provides a context with helper methods for key bindings
4
+ # ({RunControl#key}), client rules ({RunControl#rule}) and the {Launcher}
5
+ # ({RunControl#launch}).
3
6
  class ActionsHandler
4
7
  include EnvLogging
5
8
 
6
9
  extend Forwardable
10
+ # @!method layout
11
+ # Returns the layout
12
+ # @return [Object] The layout
13
+ # @see Env#layout
7
14
  def_delegator :@env, :layout
8
15
 
16
+ # @api private
17
+ # @param env [Env] An environment
18
+ # @param events [Dispatcher] A dispatcher
9
19
  def initialize env, events
10
20
  @env, @events = env, events
11
21
  end
12
22
 
23
+ # Evaluates action code given as normal argument or block parameter
24
+ # @api private
25
+ # @param code [Proc] Action code
26
+ # @param block [Proc] Action code
13
27
  def evaluate code = nil, &block
14
28
  if code
15
29
  instance_exec &code
@@ -18,11 +32,14 @@ module Uh
18
32
  end
19
33
  end
20
34
 
21
- def quit
22
- log 'Quit requested'
23
- @events.emit :quit
24
- end
25
-
35
+ # Executes given command. Forks twice, creates a new session and makes
36
+ # the new process the session leader and process group leader of a new
37
+ # process group. The new process has no controlling terminal. Refer to
38
+ # `fork(2)` and `setsid(2)` for more detail.
39
+ #
40
+ # `command` argument is executed with `Kernel#exec`.
41
+ #
42
+ # @param command [String, Array] Command to execute
26
43
  def execute command
27
44
  log "Execute: #{command}"
28
45
  pid = fork do
@@ -38,16 +55,22 @@ module Uh
38
55
  Process.waitpid pid
39
56
  end
40
57
 
58
+ # Kills layout current client (focused) with {Client#kill}
41
59
  def kill_current
42
60
  return unless layout.current_client
43
61
  layout.current_client.kill
44
62
  end
45
63
 
64
+ # Logs a separator string, can help during debug
46
65
  def log_separator
47
66
  log '- ' * 24
48
67
  end
49
68
 
50
- def method_missing(m, *args, &block)
69
+ # Forwards unhandled messages prefixed with `layout_` to the layout,
70
+ # without the prefix
71
+ # @example
72
+ # layout_foo # delegates to `layout.foo'
73
+ def method_missing m, *args, &block
51
74
  if respond_to? m
52
75
  meth = layout_method m
53
76
  log "#{layout.class.name}##{meth} #{args.inspect}"
@@ -61,14 +84,22 @@ module Uh
61
84
  end
62
85
  end
63
86
 
64
- def respond_to_missing?(m, *)
87
+ # Requests the window manager to terminate
88
+ def quit
89
+ log 'Quit requested'
90
+ @events.emit :quit
91
+ end
92
+
93
+ # Checks method existence in layout
94
+ # @api private
95
+ def respond_to_missing? m, _
65
96
  m.to_s =~ /\Alayout_/ || super
66
97
  end
67
98
 
68
99
 
69
100
  private
70
101
 
71
- def layout_method(m)
102
+ def layout_method m
72
103
  m.to_s.gsub(/\Alayout_/, 'handle_').to_sym
73
104
  end
74
105
  end
@@ -1,6 +1,8 @@
1
1
  module Uh
2
2
  module WM
3
+ # Provides the context and behavior for run control file evaluation.
3
4
  class RunControl
5
+ # Key sym translations for key bindings.
4
6
  KEYSYM_TRANSLATIONS = {
5
7
  backspace: :BackSpace,
6
8
  enter: :Return,
@@ -9,6 +11,10 @@ module Uh
9
11
  }.freeze
10
12
 
11
13
  class << self
14
+ # Builds an instance and evaluates any run control file defined in
15
+ # the given {Env} instance
16
+ # @api private
17
+ # @param env [Env] An environment
12
18
  def evaluate env
13
19
  rc_path = File.expand_path(env.rc_path)
14
20
  rc = new env
@@ -16,24 +22,59 @@ module Uh
16
22
  end
17
23
  end
18
24
 
25
+ # @api private
26
+ # @param env [Env] An environment
19
27
  def initialize env
20
28
  @env = env
21
29
  end
22
30
 
31
+ # Evaluates run control code
32
+ # @api private
33
+ # @param code [String] The run control file content
34
+ # @param path [String] The run control file path
23
35
  def evaluate code, path
24
36
  instance_eval code, path
25
37
  rescue ::StandardError, ::ScriptError => e
26
38
  raise RunControlEvaluationError, e.message, e.backtrace
27
39
  end
28
40
 
29
- def modifier mod
30
- @env.modifier = mod
31
- end
32
-
41
+ # Registers a key binding
42
+ # @example Output message on standard output when `modkey+f` is pressed
43
+ # key(:f) { puts 'hello world!' }
44
+ # @example Add `shift` key sym to the modifier mask
45
+ # key(:q, :shift) { quit }
46
+ # @example Convert capitalized key sym `Q` to `shift+q`
47
+ # key(:Q) { quit }
48
+ # @example Convert `enter` to `return` X key sym
49
+ # key(:enter) { execute 'xterm' }
50
+ # @param keysyms [Symbol] X key sym
51
+ # @param block Code to execute when the key binding is triggered, with
52
+ # `self` as an {ActionsHandler} instance
33
53
  def key *keysyms, &block
34
54
  @env.keybinds[translate_keysym *keysyms] = block
35
55
  end
36
56
 
57
+ # Declares code to execute on window manager connection
58
+ # @example
59
+ # launch { execute 'xterm' }
60
+ # @param block Code to execute when the window manager has connected,
61
+ # with `self` as a {Launcher} instance
62
+ def launch &block
63
+ @env.launch = block
64
+ end
65
+
66
+ # Defines the layout with either a layout class or an instance with
67
+ # optional layout options. When given only a hash, configures options for
68
+ # the default layout and ignores the `options` parameter.
69
+ # @example
70
+ # layout MyLayout
71
+ # layout MyLayout, foo: :bar
72
+ # layout MyLayout.new
73
+ # layout MyLayout.new(foo: :bar)
74
+ # layout foo: :bar
75
+ # @param arg [Class, Object, Hash] A layout class, a layout instance, or
76
+ # options for the default layout
77
+ # @param options [Hash] Layout options
37
78
  def layout arg, **options
38
79
  case arg
39
80
  when Class
@@ -49,16 +90,38 @@ module Uh
49
90
  end
50
91
  end
51
92
 
52
- def worker type, **options
53
- @env.worker = [type, options]
93
+ # Defines the modifier key to use for key bindings
94
+ # @example
95
+ # modifier :mod1 # Use `mod1' as modifier
96
+ # @param keysym [Symbol] X key sym
97
+ def modifier keysym
98
+ @env.modifier = keysym
54
99
  end
55
100
 
101
+ # Declares a client rule
102
+ # @example
103
+ # rule %w[firefox chrome] do
104
+ # log 'moving client to `www\' view!'
105
+ # layout_view_set 'www'
106
+ # end
107
+ # @param selectors [String, Array<String>] Substring matched against the
108
+ # beginning of clients window application name
109
+ # @param block Code to execute when the client rule is matched
56
110
  def rule selectors = '', &block
57
111
  [*selectors].each { |selector| @env.rules[/\A#{selector}/i] = block }
58
112
  end
59
113
 
60
- def launch &block
61
- @env.launch = block
114
+ # Configures the worker
115
+ # @example Use the blocking worker
116
+ # worker :block
117
+ # @example Use the kqueue worker with 1 second timeout
118
+ # worker :kqueue, timeout: 1
119
+ # @example Use the multiplexing (`select()`) worker with 1 second timeout
120
+ # worker :mux, timeout: 1
121
+ # @param type [Symbol] Worker type: `:block`, `:kqueue` or `:mux`
122
+ # @param options [Hash] Worker options
123
+ def worker type, **options
124
+ @env.worker = [type, options]
62
125
  end
63
126
 
64
127
 
data/lib/uh/wm/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Uh
2
2
  module WM
3
- VERSION = '0.0.9'
3
+ VERSION = '0.0.10'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uh-wm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thibault Jouan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-31 00:00:00.000000000 Z
11
+ date: 2015-06-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rb-kqueue