fusuma-plugin-wmctrl 0.1.0 → 0.4.0

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
  SHA256:
3
- metadata.gz: 316ce994f0890c7b67dbb07ca8305fcc47c3fa715adc693991d3fe809aa8b808
4
- data.tar.gz: 3f77d3c20e4e832adf3f40782cd1cbd9005064159575805d97e5e02193fafb63
3
+ metadata.gz: f9070f0ff5c01bf9dd2109c2e8c5a7413791fac4048937b3e4dc401c40dbd589
4
+ data.tar.gz: e232215a854eeb26c815478d8b68b58b89dd45983e534584fc377b2dd2e6fdd5
5
5
  SHA512:
6
- metadata.gz: '0888f8dfab2a61cd9dcd71b231da45804f6ea93fc8bc2ae03dd4cbd56eac13f7f46f3df0ac1bf311ede6e531f677ca439364175744bb3338478137a99b423811'
7
- data.tar.gz: 616aa9662f061ceb728007daccbee5520839d043af29715a635420738d3f5b8a3b39ad68a557ba23966db39c07595059ed2bf09ebc15c0e828426fb9837e7b7b
6
+ metadata.gz: 3d94aa6dc1afddd886a1e0aa60cb6978a96b1bba6ea34a1a204ecf34f56c26a6ec43cc31fcdec4bc503b31513311c8d208cc898fa8bc7e4b8f727db45c7c1e50
7
+ data.tar.gz: df7ccf6df129eb2a38e39451270ee3f200532c8cacf1cd3f044ffb2af49878042a8e849ff750c01c2f5b38f5b085cc01726f5cd187a7532507a4e97a8fb494ab
data/.rubocop_todo.yml CHANGED
@@ -0,0 +1,20 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2020-01-02 00:51:24 +0900 using RuboCop version 0.75.1.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 1
10
+ Metrics/AbcSize:
11
+ Max: 17
12
+
13
+ # Offense count: 1
14
+ Metrics/CyclomaticComplexity:
15
+ Max: 8
16
+
17
+ # Offense count: 1
18
+ # Configuration parameters: CountComments, ExcludedMethods.
19
+ Metrics/MethodLength:
20
+ Max: 17
data/.travis.yml CHANGED
@@ -3,5 +3,8 @@ sudo: false
3
3
  language: ruby
4
4
  cache: bundler
5
5
  rvm:
6
- - 2.4.1
7
- before_install: gem install bundler -v 2.0.1
6
+ - 2.3.1
7
+ - 2.4
8
+ - 2.5
9
+ - 2.6
10
+ before_install: gem install bundler --no-document -v 2.0.1
data/CHANGELOG.md CHANGED
@@ -1,5 +1,33 @@
1
- # Change Log
1
+ # Changelog
2
2
 
3
+ ## [v0.4.0.pre](https://github.com/iberianpig/fusuma-plugin-wmctrl/tree/v0.4.0.pre) (2020-11-09)
3
4
 
5
+ [Full Changelog](https://github.com/iberianpig/fusuma-plugin-wmctrl/compare/v0.3.0...v0.4.0.pre)
4
6
 
5
- \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
7
+ **Merged pull requests:**
8
+
9
+ - sudo for gem install? [\#3](https://github.com/iberianpig/fusuma-plugin-wmctrl/pull/3) ([oli-ver](https://github.com/oli-ver))
10
+
11
+ ## [v0.3.0](https://github.com/iberianpig/fusuma-plugin-wmctrl/tree/v0.3.0) (2020-01-03)
12
+
13
+ [Full Changelog](https://github.com/iberianpig/fusuma-plugin-wmctrl/compare/v0.2.0...v0.3.0)
14
+
15
+ **Implemented enhancements:**
16
+
17
+ - Control active window \(Close / Minimize / Maximize\) [\#2](https://github.com/iberianpig/fusuma-plugin-wmctrl/issues/2)
18
+
19
+ ## [v0.2.0](https://github.com/iberianpig/fusuma-plugin-wmctrl/tree/v0.2.0) (2019-11-07)
20
+
21
+ [Full Changelog](https://github.com/iberianpig/fusuma-plugin-wmctrl/compare/v0.1.0...v0.2.0)
22
+
23
+ **Implemented enhancements:**
24
+
25
+ - Move active window to next/prev workspace [\#1](https://github.com/iberianpig/fusuma-plugin-wmctrl/issues/1)
26
+
27
+ ## [v0.1.0](https://github.com/iberianpig/fusuma-plugin-wmctrl/tree/v0.1.0) (2019-10-12)
28
+
29
+ [Full Changelog](https://github.com/iberianpig/fusuma-plugin-wmctrl/compare/7e20b0138aaa335e4b9008ee9af680e8dad188aa...v0.1.0)
30
+
31
+
32
+
33
+ \* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)*
data/Gemfile CHANGED
@@ -4,3 +4,14 @@ source 'https://rubygems.org'
4
4
 
5
5
  # Specify your gem's dependencies in fusuma-plugin-wmctrl.gemspec
6
6
  gemspec
7
+
8
+ gem 'bundler'
9
+ gem 'github_changelog_generator', '~> 1.14'
10
+ gem 'pry-byebug', '~> 3.4'
11
+ gem 'pry-doc'
12
+ gem 'pry-inline'
13
+ gem 'rake', '~> 13.0'
14
+ gem 'reek'
15
+ gem 'rspec', '~> 3.0'
16
+ gem 'rubocop'
17
+ gem 'yard'
data/README.md CHANGED
@@ -1,31 +1,99 @@
1
- # Fusuma::Plugin::Wmctrl
1
+ # Fusuma::Plugin::Wmctrl [![Gem Version](https://badge.fury.io/rb/fusuma-plugin-wmctrl.svg)](https://badge.fury.io/rb/fusuma-plugin-wmctrl) [![Build Status](https://travis-ci.com/iberianpig/fusuma-plugin-wmctrl.svg?branch=master)](https://travis-ci.com/iberianpig/fusuma-plugin-wmctrl)
2
+
2
3
 
3
4
  Window Manager plugin for [Fusuma](https://github.com/iberianpig/fusuma)
4
5
 
6
+ * Move window or workspace instead of xdotool
7
+ * Works on Wayland(Not depends on xdotool)
8
+
5
9
  ## Installation
6
10
 
7
11
  Run the following code in your terminal.
8
12
 
9
- ### Install wmctrl
13
+ ### 1.Install wmctrl
14
+
15
+ #### For Debian Based Distros (Ubuntu, Debian, Mint, Pop!_OS)
16
+
17
+ ```
18
+ $ sudo apt install wmctrl -y
19
+ ```
20
+
21
+ #### For Arch Based Distros (Manjaro, Arch)
10
22
 
11
23
  ```
12
- $ sudo apt install wmctrl
24
+ sudo pacman -S wmctrl
13
25
  ```
14
- ### Install fusuma-plugin-wmctrl
26
+
27
+ ### 2. Install fusuma-plugin-wmctrl
15
28
 
16
29
  This plugin requires [Fusuma](https://github.com/iberianpig/fusuma#update) version 1.0 or later.
17
30
 
31
+
32
+ **Note For Arch Based Distros:** By default in Arch Linux, when running ```gem```, gems are installed per-user (into ```~/.gem/ruby/```), instead of system-wide (into ```/usr/lib/ruby/gems/```). This is considered the best way to manage gems on Arch, because otherwise they might interfere with gems installed by Pacman. (From Arch Wiki)
33
+
34
+ To install gems system-wide, see any of the methods listed on [Arch Wiki](https://wiki.archlinux.org/index.php/ruby#Installing_gems_system-wide)
35
+
18
36
  ```sh
19
- $ gem install fusuma-plugin-wmctrl
37
+ $ sudo gem install fusuma-plugin-wmctrl
20
38
  ```
21
39
 
22
40
  ## Properties
23
41
 
42
+ ### `workspace:` property
24
43
  Add `workspace:` property in `~/.config/fusuma/config.yml`.
25
44
 
26
- Currently, values following are available for `workspace`.
27
- * `prev`
28
- * `next`
45
+ Values following are available for `workspace`.
46
+
47
+ * `prev` is value to switch current workspace to previous workspace.
48
+ * `next` is value to switch current workspace to next workspace.
49
+
50
+ ### `window:` property
51
+ Add `window:` property in `~/.config/fusuma/config.yml`.
52
+
53
+ Values following are available for `window`.
54
+
55
+ * `prev` is value to move active window to previous workspace.
56
+ * `next` is value to move active window to next workspace.
57
+ * `fullscreen` is value to toggle fullscreen
58
+ * `fullscreen: toggle` toggles the active window to fullscreen.
59
+ ```yml
60
+ window: fullscreen
61
+ # ↑ same ↓
62
+ window:
63
+ fullscreen: toggle
64
+ ```
65
+
66
+ * `fullscreen: add` changes the active window to a fullscreen.
67
+ ```yml
68
+ window:
69
+ fullscreen: add
70
+ ```
71
+
72
+ * `fullscreen: remove` restores the active window from fullscreen.
73
+ ```yml
74
+ window:
75
+ fullscreen: remove
76
+ ```
77
+ * `maximized` is value to toggle maximized
78
+ * `maximized: toggle` toggles the active window to maximized.
79
+ ```yml
80
+ window: maximized
81
+ # ↑ same ↓
82
+ window:
83
+ maximized: toggle
84
+ ```
85
+
86
+ * `maximized: add` changes the active window to a maximized.
87
+ ```yml
88
+ window:
89
+ maximized: add
90
+ ```
91
+
92
+ * `maximized: remove` restores the active window from maximized.
93
+ ```yml
94
+ window:
95
+ maximized: remove
96
+ ```
29
97
 
30
98
 
31
99
  ## Example
@@ -41,6 +109,17 @@ swipe:
41
109
  workspace: 'prev'
42
110
  ```
43
111
 
112
+ ## Configuration
113
+
114
+ The plugin allows to enable (disabled by default) circular navigation between workspaces. To enable it set the following in your config file `~/.config/fusuma/config.yml`.
115
+
116
+ ```yaml
117
+ plugin:
118
+ executors:
119
+ wmctrl_executor:
120
+ wrap-navigation: true
121
+ ```
122
+
44
123
 
45
124
  ## Contributing
46
125
 
@@ -25,16 +25,5 @@ Gem::Specification.new do |spec|
25
25
  spec.require_paths = ['lib']
26
26
 
27
27
  spec.required_ruby_version = '>= 2.3' # https://packages.ubuntu.com/search?keywords=ruby&searchon=names&exact=1&suite=all&section=main
28
- spec.add_dependency 'fusuma', '~> 1.0'
29
-
30
- spec.add_development_dependency 'bundler'
31
- spec.add_development_dependency 'github_changelog_generator', '~> 1.14'
32
- spec.add_development_dependency 'pry-byebug', '~> 3.4'
33
- spec.add_development_dependency 'pry-doc'
34
- spec.add_development_dependency 'pry-inline'
35
- spec.add_development_dependency 'rake', '~> 13.0'
36
- spec.add_development_dependency 'reek'
37
- spec.add_development_dependency 'rspec', '~> 3.0'
38
- spec.add_development_dependency 'rubocop'
39
- spec.add_development_dependency 'yard'
28
+ spec.add_dependency 'fusuma', '~> 2.0.0'
40
29
  end
@@ -1,21 +1,38 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'posix/spawn'
4
+ require 'singleton'
5
+
3
6
  module Fusuma
4
7
  module Plugin
5
8
  module Executors
6
9
  # Control Window or Workspaces by executing wctrl
7
10
  class WmctrlExecutor < Executor
11
+ # executor properties on config.yml
12
+ # @return [Array<Symbol>]
13
+ def execute_keys
14
+ %i[wmctrl workspace]
15
+ end
16
+
17
+ def config_param_types
18
+ {
19
+ 'wrap-navigation': [TrueClass, FalseClass]
20
+ }
21
+ end
22
+
23
+ def initialize
24
+ super()
25
+ Workspace.configure(wrap_navigation: config_params(:'wrap-navigation'))
26
+ end
27
+
8
28
  # execute wmctrl command
9
29
  # @param event [Event]
10
30
  # @return [nil]
11
31
  def execute(event)
12
32
  return if search_command(event).nil?
13
33
 
14
- pid = fork do
15
- Process.daemon(true)
16
- exec(search_command(event))
17
- end
18
-
34
+ MultiLogger.info(wmctrl: search_command(event))
35
+ pid = POSIX::Spawn.spawn(search_command(event))
19
36
  Process.detach(pid)
20
37
  end
21
38
 
@@ -32,34 +49,137 @@ module Fusuma
32
49
  # @return [String]
33
50
  # @return [NilClass]
34
51
  def search_command(event)
52
+ search_workspace_command(event) || search_window_command(event)
53
+ end
54
+
55
+ private
56
+
57
+ # @param event [Event]
58
+ # @return [String]
59
+ # @return [NilClass]
60
+ def search_workspace_command(event)
35
61
  index = Config::Index.new([*event.record.index.keys, :workspace])
62
+
36
63
  direction = Config.search(index)
37
- return if direction.nil?
64
+ return unless direction.is_a?(String)
65
+
66
+ Workspace.move_command(direction: direction)
67
+ end
38
68
 
39
- Workspace.move_workspace_command(direction: direction)
69
+ # @param event [Event]
70
+ # @return [String]
71
+ # @return [NilClass]
72
+ def search_window_command(event)
73
+ index = Config::Index.new([*event.record.index.keys, :window])
74
+
75
+ case property = Config.search(index)
76
+ when 'prev', 'next'
77
+ Window.move_command(direction: property)
78
+ when 'fullscreen'
79
+ Window.fullscreen(method: 'toggle')
80
+ when 'maximized'
81
+ Window.maximized(method: 'toggle')
82
+ when 'close'
83
+ Window.close
84
+ when Hash
85
+ if property[:fullscreen]
86
+ Window.fullscreen(method: property[:fullscreen])
87
+ elsif property[:maximized]
88
+ Window.maximized(method: property[:maximized])
89
+ end
90
+ end
40
91
  end
41
92
 
42
93
  # Manage workspace
43
94
  class Workspace
95
+ include Singleton
96
+
97
+ attr_accessor :wrap_navigation
98
+
44
99
  class << self
45
- # get workspace number
100
+ # configure properties of the workspace switcher
101
+ # @return [NilClass]
102
+ def configure(wrap_navigation:)
103
+ instance.wrap_navigation = wrap_navigation
104
+ end
105
+
106
+ # get next workspace number
46
107
  # @return [Integer]
47
- def current_workspace_num
48
- text = `wmctrl -d`.split("\n").grep(/\*/).first
49
- text.chars.first.to_i
108
+ def next_workspace_num(step:)
109
+ current_workspace_num, total_workspace_num = workspace_values
110
+
111
+ next_workspace_num = current_workspace_num + step
112
+
113
+ return next_workspace_num unless instance.wrap_navigation
114
+
115
+ if next_workspace_num.negative?
116
+ next_workspace_num = total_workspace_num - 1
117
+ elsif next_workspace_num >= total_workspace_num
118
+ next_workspace_num = 0
119
+ else
120
+ next_workspace_num
121
+ end
122
+ end
123
+
124
+ def move_command(direction:)
125
+ workspace_num = case direction
126
+ when 'next'
127
+ next_workspace_num(step: 1)
128
+ when 'prev'
129
+ next_workspace_num(step: -1)
130
+ else
131
+ raise "#{direction} is invalid key"
132
+ end
133
+ "wmctrl -s #{workspace_num}"
134
+ end
135
+
136
+ private
137
+
138
+ # get current workspace and total workspace numbers
139
+ # @return [Integer, Integer]
140
+ def workspace_values
141
+ wmctrl_output = `wmctrl -d`.split("\n")
142
+
143
+ current_line = wmctrl_output.grep(/\*/).first
144
+ # NOTE: stderror when failed to get desktop
145
+ # `Cannot get current desktop properties. (_NET_CURRENT_DESKTOP or _WIN_WORKSPACE property)`
146
+ return [0, 1] if current_line.nil?
147
+
148
+ current_workspace_num = current_line.chars.first.to_i
149
+ total_workspace_num = wmctrl_output.length
150
+
151
+ [current_workspace_num, total_workspace_num]
152
+ end
153
+ end
154
+ end
155
+
156
+ # Manage Window
157
+ class Window
158
+ class << self
159
+ # @param method [String] "toggle" or "add" or "remove"
160
+ def maximized(method:)
161
+ "wmctrl -r :ACTIVE: -b #{method},maximized_vert,maximized_horz"
162
+ end
163
+
164
+ def close
165
+ 'wmctrl -c :ACTIVE:'
166
+ end
167
+
168
+ # @param method [String] "toggle" or "add" or "remove"
169
+ def fullscreen(method:)
170
+ "wmctrl -r :ACTIVE: -b #{method},fullscreen"
50
171
  end
51
172
 
52
- def move_workspace_command(direction:)
53
- new_workspace_num = case direction
54
- when 'next'
55
- current_workspace_num + 1
56
- when 'prev'
57
- current_workspace_num - 1
58
- else
59
- warn "#{direction} is invalid key"
60
- exit 1
61
- end
62
- "wmctrl -s #{new_workspace_num}"
173
+ def move_command(direction:)
174
+ workspace_num = case direction
175
+ when 'next'
176
+ Workspace.next_workspace_num(step: 1)
177
+ when 'prev'
178
+ Workspace.next_workspace_num(step: -1)
179
+ else
180
+ raise "#{direction} is invalid key"
181
+ end
182
+ "wmctrl -r :ACTIVE: -t #{workspace_num} ; wmctrl -s #{workspace_num}"
63
183
  end
64
184
  end
65
185
  end
@@ -3,7 +3,7 @@
3
3
  module Fusuma
4
4
  module Plugin
5
5
  module Wmctrl
6
- VERSION = '0.1.0'
6
+ VERSION = '0.4.0'
7
7
  end
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fusuma-plugin-wmctrl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - iberianpig
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-10-12 00:00:00.000000000 Z
11
+ date: 2021-04-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fusuma
@@ -16,154 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.0'
19
+ version: 2.0.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.0'
27
- - !ruby/object:Gem::Dependency
28
- name: bundler
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: github_changelog_generator
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '1.14'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '1.14'
55
- - !ruby/object:Gem::Dependency
56
- name: pry-byebug
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '3.4'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '3.4'
69
- - !ruby/object:Gem::Dependency
70
- name: pry-doc
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: pry-inline
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: rake
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: '13.0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: '13.0'
111
- - !ruby/object:Gem::Dependency
112
- name: reek
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- version: '0'
125
- - !ruby/object:Gem::Dependency
126
- name: rspec
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - "~>"
130
- - !ruby/object:Gem::Version
131
- version: '3.0'
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - "~>"
137
- - !ruby/object:Gem::Version
138
- version: '3.0'
139
- - !ruby/object:Gem::Dependency
140
- name: rubocop
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - ">="
144
- - !ruby/object:Gem::Version
145
- version: '0'
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - ">="
151
- - !ruby/object:Gem::Version
152
- version: '0'
153
- - !ruby/object:Gem::Dependency
154
- name: yard
155
- requirement: !ruby/object:Gem::Requirement
156
- requirements:
157
- - - ">="
158
- - !ruby/object:Gem::Version
159
- version: '0'
160
- type: :development
161
- prerelease: false
162
- version_requirements: !ruby/object:Gem::Requirement
163
- requirements:
164
- - - ">="
165
- - !ruby/object:Gem::Version
166
- version: '0'
26
+ version: 2.0.0
167
27
  description: fusuma-plugin-wmctrl is Fusuma plugin for window manager.
168
28
  email:
169
29
  - yhkyky@gmail.com
@@ -207,7 +67,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
207
67
  - !ruby/object:Gem::Version
208
68
  version: '0'
209
69
  requirements: []
210
- rubygems_version: 3.0.3
70
+ rubygems_version: 3.1.4
211
71
  signing_key:
212
72
  specification_version: 4
213
73
  summary: Wmctrl plugin for Fusuma