uh-wm 0.0.2.pre → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.rspec +1 -0
- data/.travis.yml +15 -0
- data/Gemfile +5 -0
- data/Guardfile +12 -0
- data/LICENSE +30 -0
- data/README.md +68 -0
- data/Rakefile +40 -0
- data/bin/uhwm +5 -0
- data/config/cucumber.yaml +1 -0
- data/features/actions/execute.feature +9 -0
- data/features/actions/layout_delegation.feature +31 -0
- data/features/actions/quit.feature +9 -0
- data/features/cli/debug.feature +5 -0
- data/features/cli/layout.feature +15 -0
- data/features/cli/require.feature +5 -0
- data/features/cli/run_control.feature +9 -0
- data/features/cli/usage.feature +11 -0
- data/features/cli/verbose.feature +5 -0
- data/features/cli/version.feature +6 -0
- data/features/cli/worker.feature +9 -0
- data/features/layout/manage.feature +12 -0
- data/features/layout/protocol.feature +24 -0
- data/features/layout/unmanage.feature +10 -0
- data/features/manager/check_other_wm.feature +8 -0
- data/features/manager/input_events.feature +8 -0
- data/features/manager/manage.feature +14 -0
- data/features/manager/unmanage.feature +13 -0
- data/features/manager/x_errors.feature +17 -0
- data/features/run_control/evaluation.feature +18 -0
- data/features/run_control/key.feature +33 -0
- data/features/run_control/modifier.feature +10 -0
- data/features/run_control/worker.feature +9 -0
- data/features/session/connection.feature +5 -0
- data/features/session/termination.feature +13 -0
- data/features/steps/filesystem_steps.rb +3 -0
- data/features/steps/output_steps.rb +44 -0
- data/features/steps/run_control_steps.rb +3 -0
- data/features/steps/run_steps.rb +41 -0
- data/features/steps/x_steps.rb +53 -0
- data/features/support/env.rb +33 -0
- data/lib/uh/wm.rb +8 -0
- data/lib/uh/wm/actions_handler.rb +46 -0
- data/lib/uh/wm/cli.rb +20 -13
- data/lib/uh/wm/client.rb +64 -0
- data/lib/uh/wm/dispatcher.rb +3 -1
- data/lib/uh/wm/env.rb +15 -9
- data/lib/uh/wm/env_logging.rb +8 -0
- data/lib/uh/wm/logger_formatter.rb +16 -0
- data/lib/uh/wm/manager.rb +96 -14
- data/lib/uh/wm/run_control.rb +8 -3
- data/lib/uh/wm/runner.rb +82 -14
- data/lib/uh/wm/testing/acceptance_helpers.rb +140 -18
- data/lib/uh/wm/version.rb +1 -1
- data/lib/uh/wm/workers.rb +21 -0
- data/lib/uh/wm/workers/base.rb +27 -0
- data/lib/uh/wm/workers/blocking.rb +11 -0
- data/lib/uh/wm/workers/mux.rb +18 -0
- data/spec/spec_helper.rb +26 -0
- data/spec/support/exit_helpers.rb +6 -0
- data/spec/support/filesystem_helpers.rb +11 -0
- data/spec/uh/wm/actions_handler_spec.rb +30 -0
- data/spec/uh/wm/cli_spec.rb +214 -0
- data/spec/uh/wm/client_spec.rb +133 -0
- data/spec/uh/wm/dispatcher_spec.rb +76 -0
- data/spec/uh/wm/env_spec.rb +145 -0
- data/spec/uh/wm/manager_spec.rb +355 -0
- data/spec/uh/wm/run_control_spec.rb +102 -0
- data/spec/uh/wm/runner_spec.rb +186 -0
- data/uh-wm.gemspec +25 -0
- metadata +112 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ba8fdd593aed4b5a3c017c9dba5f2bf97e180b90
|
4
|
+
data.tar.gz: 1bc9621e7454e1fd4aaf1370eaee472ec35281eb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b7a6b5b73f564fb63fcf89724307dd9a5934b9fd3210e90c6df722ed1159928638485706090e3c94d9cddb3db4578398f83efe3c997b86e4c126974b91c855ca
|
7
|
+
data.tar.gz: 40cbe74253fa28aa76cf0eb5cf762bd14c1fe4ddced31a4e6143fd6751bb6eac65974bc77b45f993828e109714ce34b33c304bf8096a1c5de758a992c1a3fcfa
|
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--require spec_helper
|
data/.travis.yml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
language: ruby
|
2
|
+
cache: bundler
|
3
|
+
rvm:
|
4
|
+
- 2.2
|
5
|
+
- ruby-head
|
6
|
+
- 2.1
|
7
|
+
before_install:
|
8
|
+
- travis_retry sudo apt-get update -qq
|
9
|
+
- travis_retry sudo apt-get install -qq twm x11-utils xdotool
|
10
|
+
matrix:
|
11
|
+
allow_failures:
|
12
|
+
- rvm: ruby-head
|
13
|
+
notifications:
|
14
|
+
email:
|
15
|
+
- tj+travis_uh_wm@a13.fr
|
data/Gemfile
ADDED
data/Guardfile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
directories %w[features lib spec]
|
2
|
+
|
3
|
+
guard :cucumber, cli: '--format pretty --quiet', all_on_start: false do
|
4
|
+
watch(%r{\Afeatures/.+\.feature\z})
|
5
|
+
end
|
6
|
+
|
7
|
+
guard :rspec, cmd: 'bundle exec rspec -f doc' do
|
8
|
+
watch(%r{\Aspec/.+_spec\.rb\z})
|
9
|
+
watch(%r{\Alib/(.+)\.rb\z}) { |m| "spec/#{m[1]}_spec.rb" }
|
10
|
+
watch('spec/spec_helper.rb') { 'spec' }
|
11
|
+
watch(%r{\Aspec/support/.+\.rb\z}) { 'spec' }
|
12
|
+
end
|
data/LICENSE
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
Copyright 2015 Thibault Jouan. All rights reserved.
|
2
|
+
|
3
|
+
Redistribution and use in source and binary forms, with or without
|
4
|
+
modification, are permitted provided that the following conditions are
|
5
|
+
met:
|
6
|
+
|
7
|
+
* Redistributions of source code must retain the above copyright
|
8
|
+
notice, this list of conditions and the following disclaimer.
|
9
|
+
|
10
|
+
* Redistributions in binary form must reproduce the above copyright
|
11
|
+
notice, this list of conditions and the following disclaimer in
|
12
|
+
the documentation and/or other materials provided with the
|
13
|
+
distribution.
|
14
|
+
|
15
|
+
* Neither the name of the software nor the names of its contributors
|
16
|
+
may be used to endorse or promote products derived from this
|
17
|
+
software without specific prior written permission.
|
18
|
+
|
19
|
+
|
20
|
+
THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS "AS IS" AND
|
21
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
22
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
23
|
+
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS
|
24
|
+
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
25
|
+
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
26
|
+
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
27
|
+
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
28
|
+
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
29
|
+
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
30
|
+
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
uh-wm
|
2
|
+
=====
|
3
|
+
|
4
|
+
uh-wm is a minimalistic tiling and stacking window manager for X. It
|
5
|
+
shares some similarities with dwm and wmii, but is written in ruby so
|
6
|
+
you can configure and extend features with ruby code.
|
7
|
+
|
8
|
+
The layout strategy is interchangeable, the default one being the
|
9
|
+
`uh-layout` ruby gem. A layout is a simple object obeying a defined
|
10
|
+
protocol.
|
11
|
+
|
12
|
+
Features:
|
13
|
+
|
14
|
+
* Xinerama support;
|
15
|
+
* Multiple event handling strategy: blocking or multiplexing
|
16
|
+
(`select()`);
|
17
|
+
* Configuration with a run control file;
|
18
|
+
* Key bindings with user defined code as callback;
|
19
|
+
* Configurable modifier key;
|
20
|
+
* Support user-defined layout strategy;
|
21
|
+
* Program execution via key binding.
|
22
|
+
|
23
|
+
* No re-parenting (so no window decoration either);
|
24
|
+
* No grabbing of the modifier key;
|
25
|
+
* No mouse handling;
|
26
|
+
* Very limited ICCCM support.
|
27
|
+
|
28
|
+
|
29
|
+
[![Version ][badge-version-img]][badge-version-uri]
|
30
|
+
[![Build status ][badge-build-img]][badge-build-uri]
|
31
|
+
[![Code Climate ][badge-cclimate-img]][badge-cclimate-uri]
|
32
|
+
|
33
|
+
|
34
|
+
Getting started
|
35
|
+
---------------
|
36
|
+
|
37
|
+
### Installation (requires ruby ~> 2.1 with rubygems)
|
38
|
+
|
39
|
+
```
|
40
|
+
$ gem install uh-wm
|
41
|
+
```
|
42
|
+
|
43
|
+
|
44
|
+
### Usage
|
45
|
+
|
46
|
+
```
|
47
|
+
Usage: uhwm [options]
|
48
|
+
|
49
|
+
options:
|
50
|
+
-v, --verbose enable verbose mode
|
51
|
+
-d, --debug enable debug mode
|
52
|
+
-f, --run-control PATH specify alternate run control file
|
53
|
+
-r, --require PATH require ruby feature
|
54
|
+
-l, --layout LAYOUT specify layout
|
55
|
+
-w, --worker WORKER specify worker
|
56
|
+
|
57
|
+
-h, --help print this message
|
58
|
+
-V, --version print version
|
59
|
+
```
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
[badge-version-img]: https://img.shields.io/gem/v/uh-wm.svg?style=flat-square
|
64
|
+
[badge-version-uri]: https://rubygems.org/gems/uh-wm
|
65
|
+
[badge-build-img]: https://img.shields.io/travis/tjouan/uh-wm/master.svg?style=flat-square
|
66
|
+
[badge-build-uri]: https://travis-ci.org/tjouan/uh-wm
|
67
|
+
[badge-cclimate-img]: https://img.shields.io/codeclimate/github/tjouan/uh-wm.svg?style=flat-square
|
68
|
+
[badge-cclimate-uri]: https://codeclimate.com/github/tjouan/uh-wm
|
data/Rakefile
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
require 'cucumber/rake/task'
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
|
5
|
+
XEPHYR_DISPLAY = ':42'
|
6
|
+
XEPHYR_CMD = "$(command -v Xephyr) #{XEPHYR_DISPLAY} -ac -br -noreset".freeze
|
7
|
+
XEPHYR_SCREENS = '-screen 1436x400'.freeze
|
8
|
+
XEPHYR_SCREENS_XINERAMA =
|
9
|
+
'+xinerama -origin 0,0 -screen 1920x400 -origin 1920,0 -screen 1920x400'.freeze
|
10
|
+
|
11
|
+
task default: %i[features spec]
|
12
|
+
|
13
|
+
Cucumber::Rake::Task.new(:features)
|
14
|
+
|
15
|
+
RSpec::Core::RakeTask.new
|
16
|
+
|
17
|
+
desc 'Run uhwm in a Xephyr X server'
|
18
|
+
task :run do
|
19
|
+
uhwm_args = ARGV.include?('--') ?
|
20
|
+
ARGV.slice_after('--').to_a.last :
|
21
|
+
%w[-d]
|
22
|
+
Tempfile.create('uhwm_xinitrc') do |xinitrc|
|
23
|
+
xinitrc.write <<-eoh
|
24
|
+
[ -f $HOME/.Xdefaults ] && xrdb $HOME/.Xdefaults
|
25
|
+
#xkbcomp #{ENV['DISPLAY']} #{XEPHYR_DISPLAY}
|
26
|
+
xmodmap -display #{ENV['DISPLAY']} -pke | xmodmap -
|
27
|
+
xsetroot -solid SpringGreen
|
28
|
+
echo "######## UHWM START ########"
|
29
|
+
./bin/uhwm #{uhwm_args.join ' '}
|
30
|
+
echo "######## UHWM END ##########"
|
31
|
+
eoh
|
32
|
+
xinitrc.flush
|
33
|
+
sh "xinit #{xinitrc.path} -- %s" % [
|
34
|
+
XEPHYR_CMD,
|
35
|
+
ENV.key?('UHWM_XINERAMA') ?
|
36
|
+
XEPHYR_SCREENS_XINERAMA :
|
37
|
+
XEPHYR_SCREENS
|
38
|
+
].join(' ')
|
39
|
+
end
|
40
|
+
end
|
data/bin/uhwm
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
default: --require features/support --require features/steps
|
@@ -0,0 +1,9 @@
|
|
1
|
+
Feature: `execute' action keyword
|
2
|
+
|
3
|
+
Scenario: executes the given command in a shell with current standard output
|
4
|
+
Given uhwm is running with this run control file:
|
5
|
+
"""
|
6
|
+
key(:f) { execute 'echo etucexe_tset | rev' }
|
7
|
+
"""
|
8
|
+
When I press the alt+f keys
|
9
|
+
Then the output must contain "test_execute"
|
@@ -0,0 +1,31 @@
|
|
1
|
+
Feature: `layout_*' action keywords
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given a file named layout.rb with:
|
5
|
+
"""
|
6
|
+
class Layout
|
7
|
+
def register _; end
|
8
|
+
|
9
|
+
def handle_some_action arg
|
10
|
+
puts arg
|
11
|
+
end
|
12
|
+
end
|
13
|
+
"""
|
14
|
+
|
15
|
+
Scenario: delegates messages matching `layout_*' to `layout_handle_*'
|
16
|
+
Given a run control file with:
|
17
|
+
"""
|
18
|
+
key(:f) { layout_some_action :testing_some_action }
|
19
|
+
"""
|
20
|
+
And uhwm is running
|
21
|
+
When I press the alt+f keys
|
22
|
+
Then the output must contain ":testing_some_action"
|
23
|
+
|
24
|
+
Scenario: logs an error about unimplemented messages
|
25
|
+
Given a run control file with:
|
26
|
+
"""
|
27
|
+
key(:f) { layout_unknown_action }
|
28
|
+
"""
|
29
|
+
And uhwm is running
|
30
|
+
When I press the alt+f keys
|
31
|
+
Then the output must match /layout.+no.+implem.+handle_unknown_action/i
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Feature: layout CLI option
|
2
|
+
|
3
|
+
Scenario: specifies the layout class
|
4
|
+
Given a file named layout.rb with:
|
5
|
+
"""
|
6
|
+
class MyLayout
|
7
|
+
def register _; end
|
8
|
+
end
|
9
|
+
"""
|
10
|
+
When I run uhwm with option -v -r./layout -l MyLayout
|
11
|
+
Then the output must match /layout.+mylayout/i
|
12
|
+
|
13
|
+
Scenario: resolves layout class from the root namespace
|
14
|
+
When I run uhwm with option -v -l Layout
|
15
|
+
Then the output must contain "uninitialized constant Layout"
|
@@ -0,0 +1,9 @@
|
|
1
|
+
Feature: run control file path CLI option
|
2
|
+
|
3
|
+
Scenario: specifies run control file path
|
4
|
+
Given a file named uhwmrc.rb with:
|
5
|
+
"""
|
6
|
+
puts 'run control evaluation'
|
7
|
+
"""
|
8
|
+
When I run uhwm with option -f uhwmrc.rb
|
9
|
+
Then the output must contain "run control evaluation"
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Feature: CLI usage
|
2
|
+
|
3
|
+
Scenario: prints the usage when unknown option switch is given
|
4
|
+
When I run uhwm with option --unknown-option
|
5
|
+
Then the exit status must be 64
|
6
|
+
And the output must contain exactly the usage
|
7
|
+
|
8
|
+
Scenario: prints the help when -h option is given
|
9
|
+
When I run uhwm with option -h
|
10
|
+
Then uhwm must terminate successfully
|
11
|
+
And the output must contain exactly the usage
|
@@ -0,0 +1,9 @@
|
|
1
|
+
Feature: worker CLI option
|
2
|
+
|
3
|
+
Scenario: uses the blocking worker when `block' is given
|
4
|
+
When I run uhwm with option -v -w block
|
5
|
+
Then the output must match /work.+event.+block/i
|
6
|
+
|
7
|
+
Scenario: uses the multiplexing worker when `mux' is given
|
8
|
+
When I run uhwm with option -v -w mux
|
9
|
+
Then the output must match /work.+event.+mux/i
|
@@ -0,0 +1,12 @@
|
|
1
|
+
Feature: layout client management
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given uhwm is running
|
5
|
+
|
6
|
+
Scenario: maps new client window
|
7
|
+
When a window requests to be mapped
|
8
|
+
Then the window must be mapped
|
9
|
+
|
10
|
+
Scenario: focuses new client window
|
11
|
+
When a window requests to be mapped
|
12
|
+
Then the window must be focused
|
@@ -0,0 +1,24 @@
|
|
1
|
+
Feature: layout protocol
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given a file named layout.rb with:
|
5
|
+
"""
|
6
|
+
class Layout
|
7
|
+
def register display
|
8
|
+
puts display
|
9
|
+
end
|
10
|
+
|
11
|
+
def << client
|
12
|
+
puts client
|
13
|
+
end
|
14
|
+
end
|
15
|
+
"""
|
16
|
+
|
17
|
+
Scenario: tells the layout to register with #register message
|
18
|
+
When I run uhwm with option -r./layout -l Layout
|
19
|
+
Then the output must contain current display
|
20
|
+
|
21
|
+
Scenario: tells the layout to manage a client with #<< message
|
22
|
+
Given uhwm is running with options -v -r./layout -l Layout
|
23
|
+
When a window requests to be mapped
|
24
|
+
Then the output must contain the window name
|
@@ -0,0 +1,10 @@
|
|
1
|
+
Feature: layout client unmanagement
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given uhwm is running
|
5
|
+
And a first window is mapped
|
6
|
+
And a second window is mapped
|
7
|
+
|
8
|
+
Scenario: maps another window
|
9
|
+
When the second window requests to be unmapped
|
10
|
+
Then the first window must be mapped
|
@@ -0,0 +1,8 @@
|
|
1
|
+
Feature: checking if another window manager is running
|
2
|
+
|
3
|
+
@other_wm_running
|
4
|
+
Scenario: fails when another window manager is running
|
5
|
+
Given another window manager is running
|
6
|
+
When I start uhwm
|
7
|
+
Then the exit status must be 70
|
8
|
+
And the output must match /error.+other.+window.+manager/i
|
@@ -0,0 +1,8 @@
|
|
1
|
+
Feature: input events selection
|
2
|
+
|
3
|
+
Scenario: selects the appropriate input event mask for a window manager
|
4
|
+
Given uhwm is running
|
5
|
+
Then the input event mask must include StructureNotifyMask
|
6
|
+
And the input event mask must include SubstructureNotifyMask
|
7
|
+
And the input event mask must include SubstructureRedirectMask
|
8
|
+
And the input event mask must include PropertyChangeMask
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Feature: manager client management
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given uhwm is running
|
5
|
+
|
6
|
+
Scenario: logs when a new client is managed
|
7
|
+
When a window requests to be mapped
|
8
|
+
Then the output must match /manag.+xclient/i
|
9
|
+
|
10
|
+
Scenario: manages a given client only once
|
11
|
+
When a window requests to be mapped 2 times
|
12
|
+
And I quit uhwm
|
13
|
+
Then the output must not match /manag.*\n.*manag/mi
|
14
|
+
And the output must not match /xerror/i
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Feature: manager client unmanagement
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given uhwm is running
|
5
|
+
And a window is managed
|
6
|
+
|
7
|
+
Scenario: logs when a new client is unmanaged
|
8
|
+
When the window requests to be unmapped
|
9
|
+
Then the output must match /unmanag.+xclient/i
|
10
|
+
|
11
|
+
Scenario: unmanages client on destroy notify X events
|
12
|
+
When the window is destroyed
|
13
|
+
Then the output must match /unmanag.+xclient/i
|