mireru 0.2.1 → 0.9.0

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.
@@ -1,3 +1,3 @@
1
1
  module Mireru
2
- VERSION = "0.2.1"
2
+ VERSION = "0.9.0"
3
3
  end
@@ -4,26 +4,23 @@ require "mireru/widget/pdf"
4
4
  require "mireru/widget/svg"
5
5
  require "mireru/widget/text"
6
6
  require "mireru/widget/binary"
7
- require "mireru/widget/thumbnail"
8
7
 
9
8
  module Mireru
10
9
  module Widget
11
10
  module_function
12
- def create(file, width=10000, height=10000)
11
+ def create(file, width, height)
13
12
  if image?(file)
14
- widget = Mireru::Widget::Image.create(file, width, height)
15
- elsif video?(file)
16
- widget = Mireru::Widget::Video.create(file)
13
+ widget = Mireru::Widget::Image.new(file, width, height)
14
+ elsif video?(file) or music?(file)
15
+ widget = Mireru::Widget::Video.new(file)
17
16
  elsif pdf?(file)
18
- widget = Mireru::Widget::PDF.create(file)
17
+ widget = Mireru::Widget::PDF.new(file)
19
18
  elsif svg?(file)
20
- widget = Mireru::Widget::SVG.create(file)
19
+ widget = Mireru::Widget::SVG.new(file)
21
20
  elsif text?(file)
22
- widget = Mireru::Widget::Text.create(file)
23
- elsif file.is_a?(Enumerable)
24
- widget = Mireru::Widget::Thumbnail.create(file, width, height)
21
+ widget = Mireru::Widget::Text.new(file)
25
22
  else
26
- widget = Mireru::Widget::Binary.create(file)
23
+ widget = Mireru::Widget::Binary.new(file)
27
24
  end
28
25
  widget
29
26
  end
@@ -32,8 +29,12 @@ module Mireru
32
29
  /\.(png|jpe?g|gif|ico|ani|bmp|pnm|ras|tga|tiff|xbm|xpm)\z/i =~ file
33
30
  end
34
31
 
32
+ def music?(file)
33
+ /\.(og[ag]|wav|acc|mp3|m4a|wma|flac|tta|aiff|ape|tak)\z/i =~ file
34
+ end
35
+
35
36
  def video?(file)
36
- /\.(ogm|mp4|flv|mpe?g2?|ts|mov|avi|divx|mkv|wmv|asf|wmx)\z/i =~ file
37
+ /\.(ogm|mp4|m4v|flv|mpe?g2?|ts|mov|avi|divx|mkv|wmv|asf|wmx)\z/i =~ file
37
38
  end
38
39
 
39
40
  def pdf?(file)
@@ -45,7 +46,12 @@ module Mireru
45
46
  end
46
47
 
47
48
  def text?(file)
49
+ return false if binary?(file)
48
50
  File.read(file).valid_encoding?
49
51
  end
52
+
53
+ def binary?(file)
54
+ /\.(la|lo|o|so|a|dll|exe|msi|tar|gz|zip|7z|lzh|rar|iso)\z/i =~ file
55
+ end
50
56
  end
51
57
  end
@@ -1,31 +1,25 @@
1
+ require "gtk3"
1
2
  require "stringio"
2
3
  require "hexdump"
3
4
 
4
5
  module Mireru
5
6
  module Widget
6
- class Binary
7
- class << self
8
- def create(file)
9
- dump = hexdump(file).string
10
- create_text_view(dump)
11
- end
12
-
13
- private
14
- def hexdump(file)
15
- io = StringIO.new
16
- bytes = File.open(file, "rb").read(20 * 1024)
17
- Hexdump.dump(bytes, :output => io)
18
- io
19
- end
7
+ class Binary < Gtk::TextView
8
+ def initialize(file)
9
+ text = hexdump(file).string
10
+ buffer = Gtk::TextBuffer.new
11
+ buffer.text = text
12
+ super(buffer)
13
+ editable = false
14
+ override_font(Pango::FontDescription.new("Monospace"))
15
+ end
20
16
 
21
- def create_text_view(text)
22
- buffer = Gtk::TextBuffer.new
23
- buffer.text = text
24
- view = Gtk::TextView.new(buffer)
25
- view.editable = false
26
- view.override_font(Pango::FontDescription.new("Monospace"))
27
- view
28
- end
17
+ private
18
+ def hexdump(file)
19
+ io = StringIO.new
20
+ bytes = File.open(file, "rb").read(20 * 1024)
21
+ Hexdump.dump(bytes, :output => io)
22
+ io
29
23
  end
30
24
  end
31
25
  end
@@ -1,15 +1,19 @@
1
+ require "gtk3"
2
+
1
3
  module Mireru
2
4
  module Widget
3
- class Image
4
- class << self
5
- def create(file, width, height)
6
- image = Gtk::Image.new
7
- pixbuf = Gdk::Pixbuf.new(file)
5
+ class Image < Gtk::Image
6
+ def initialize(file, width, height)
7
+ super()
8
+ pixbuf_animation = Gdk::PixbufAnimation.new(file)
9
+ if pixbuf_animation.static_image?
10
+ pixbuf = pixbuf_animation.static_image
8
11
  if pixbuf.width > width || pixbuf.height > height
9
12
  pixbuf = Gdk::Pixbuf.new(file, width, height)
10
13
  end
11
- image.pixbuf = pixbuf
12
- widget = image
14
+ self.pixbuf = pixbuf
15
+ else
16
+ self.pixbuf_animation = pixbuf_animation
13
17
  end
14
18
  end
15
19
  end
@@ -1,31 +1,49 @@
1
+ require "gtk3"
1
2
  require "poppler"
2
3
 
3
4
  module Mireru
4
5
  module Widget
5
- class PDF
6
- class << self
7
- def create(file)
8
- drawing_area = Gtk::DrawingArea.new
6
+ class PDF < Gtk::DrawingArea
7
+ def initialize(file)
8
+ super()
9
+ document = Poppler::Document.new(file)
10
+ @page_index = 0
11
+ @page_max = document.size - 1
12
+ width, height = document.first.size
13
+ set_size_request(width, height)
9
14
 
10
- document = Poppler::Document.new(file)
11
- width, height = document.first.size
12
- drawing_area.set_size_request(width, height * document.size)
13
-
14
- drawing_area.signal_connect("draw") do |widget, event|
15
- context = widget.window.create_cairo_context
16
- document.each_with_index do |page, i|
17
- context.save do
18
- context.translate(0, height * i)
19
- context.render_poppler_page(document[i])
20
- end
21
- end
22
- context.show_page
23
- true
15
+ signal_connect("draw") do |widget, event|
16
+ context = widget.window.create_cairo_context
17
+ window_width = widget.allocated_width
18
+ window_height = widget.allocated_height
19
+ width_scale = window_width.to_f / width
20
+ height_scale = window_height.to_f / height
21
+ scale = [width_scale, height_scale].min
22
+ begin
23
+ context.scale(scale, scale)
24
+ rescue => e
25
+ $stderr.puts("#{e.class}: #{e.message}")
26
+ $stderr.puts(e.backtrace)
24
27
  end
25
-
26
- drawing_area
28
+ context.render_poppler_page(document[@page_index])
29
+ context.show_page
30
+ true
27
31
  end
28
32
  end
33
+
34
+ def next
35
+ @page_index += 1
36
+ @page_index = @page_max if @page_index > @page_max
37
+ hide
38
+ show
39
+ end
40
+
41
+ def prev
42
+ @page_index -= 1
43
+ @page_index = 0 if @page_index < 0
44
+ hide
45
+ show
46
+ end
29
47
  end
30
48
  end
31
49
  end
@@ -1,25 +1,29 @@
1
+ require "gtk3"
1
2
  require "rsvg2"
2
3
 
3
4
  module Mireru
4
5
  module Widget
5
- class SVG
6
- class << self
7
- def create(file)
8
- drawing_area = Gtk::DrawingArea.new
6
+ class SVG < Gtk::DrawingArea
7
+ def initialize(file)
8
+ super()
9
+ handle = RSVG::Handle.new_from_file(file)
10
+ width, height = handle.dimensions.to_a
9
11
 
10
- handle = RSVG::Handle.new_from_file(file)
11
- width, height = handle.dimensions.to_a
12
- drawing_area.set_size_request(width, height)
13
-
14
- drawing_area.signal_connect("draw") do |widget, event|
15
- context = widget.window.create_cairo_context
16
- context.save do
17
- context.render_rsvg_handle(handle)
18
- end
19
- true
12
+ signal_connect("draw") do |widget, event|
13
+ context = widget.window.create_cairo_context
14
+ window_width = widget.allocated_width
15
+ window_height = widget.allocated_height
16
+ width_scale = window_width.to_f / width
17
+ height_scale = window_height.to_f / height
18
+ scale = [width_scale, height_scale].min
19
+ begin
20
+ context.scale(scale, scale)
21
+ rescue => e
22
+ $stderr.puts("#{e.class}: #{e.message}")
23
+ $stderr.puts(e.backtrace)
20
24
  end
21
-
22
- drawing_area
25
+ context.render_rsvg_handle(handle)
26
+ true
23
27
  end
24
28
  end
25
29
  end
@@ -2,32 +2,30 @@ require "gtksourceview3"
2
2
 
3
3
  module Mireru
4
4
  module Widget
5
- class Text
6
- class << self
7
- def create(file)
8
- buffer = buffer_from_file(file)
9
- view = GtkSource::View.new(buffer)
10
- view.show_line_numbers = true
11
- lang = GtkSource::LanguageManager.new.get_language("ruby")
12
- view.buffer.language = lang
13
- view.buffer.highlight_syntax = true
14
- view.buffer.highlight_matching_brackets = true
15
- view.editable = false
16
- view.override_font(Pango::FontDescription.new("Monospace"))
17
- end
5
+ class Text < GtkSource::View
6
+ def initialize(file)
7
+ buffer = buffer_from_file(file)
8
+ super(buffer)
9
+ self.show_line_numbers = true
10
+ lang = GtkSource::LanguageManager.new.get_language("ruby")
11
+ self.buffer.language = lang
12
+ self.buffer.highlight_syntax = true
13
+ self.buffer.highlight_matching_brackets = true
14
+ self.editable = false
15
+ override_font(Pango::FontDescription.new("Monospace"))
16
+ end
18
17
 
19
- private
20
- def buffer_from_file(file)
21
- text = File.open(file).read
22
- buffer_from_text(text)
23
- end
18
+ private
19
+ def buffer_from_file(file)
20
+ text = File.open(file).read
21
+ buffer_from_text(text)
22
+ end
24
23
 
25
- def buffer_from_text(text)
26
- text.encode!("utf-8") unless text.encoding == "utf-8"
27
- buffer = GtkSource::Buffer.new
28
- buffer.text = text
29
- buffer
30
- end
24
+ def buffer_from_text(text)
25
+ text.encode!("utf-8") unless text.encoding == "utf-8"
26
+ buffer = GtkSource::Buffer.new
27
+ buffer.text = text
28
+ buffer
31
29
  end
32
30
  end
33
31
  end
@@ -3,46 +3,47 @@ require "clutter-gst"
3
3
 
4
4
  module Mireru
5
5
  module Widget
6
- class Video
7
- class << self
8
- def create(file)
9
- clutter = ClutterGtk::Embed.new
10
- stage = clutter.stage
11
- stage.background_color = Clutter::Color.new(:black)
12
- video_texture = ClutterGst::VideoTexture.new
13
- stage.add_child(video_texture)
14
- video_texture.signal_connect("eos") do |_video_texture|
15
- _video_texture.progress = 0.0
16
- _video_texture.playing = true
17
- end
18
- video_texture.filename = file
19
- video_texture.playing = true
20
- define_events(stage, video_texture)
21
- clutter.signal_connect("destroy") do
22
- video_texture.playing = false
23
- end
24
- clutter
6
+ class Video < ClutterGtk::Embed
7
+ def initialize(file)
8
+ super()
9
+ stage.background_color = Clutter::Color.new(:black)
10
+ @video_texture = ClutterGst::VideoTexture.new
11
+ stage.add_child(@video_texture)
12
+ @video_texture.signal_connect("eos") do |_video_texture|
13
+ _video_texture.progress = 0.0
14
+ _video_texture.playing = true
15
+ end
16
+ @video_texture.filename = file
17
+ @video_texture.playing = true
18
+ signal_connect("destroy") do
19
+ next if @video_texture.destroyed?
20
+ @video_texture.playing = false
25
21
  end
26
22
 
27
- def define_events(stage, video_texture)
28
- stage.signal_connect("event") do |_stage, event|
29
- handled = false
30
-
31
- case event.type
32
- when Clutter::EventType::KEY_PRESS
33
- animation = nil
34
- case event.key_symbol
35
- when Clutter::Keys::KEY_space
36
- state = video_texture.playing?
37
- video_texture.playing = state ? false : true
38
- end
39
- handled = true
40
- end
23
+ @video_texture.signal_connect_after("size-change") do |texture, base_width, base_height|
24
+ stage_width, stage_height = stage.size
25
+ frame_width, frame_height = texture.size
41
26
 
42
- handled
27
+ new_height = (frame_height * stage_width) / frame_width
28
+ if new_height <= stage_height
29
+ new_width = stage_width
30
+ new_x = 0
31
+ new_y = (stage_height - new_height) / 2
32
+ else
33
+ new_width = (frame_width * stage_height) / frame_height
34
+ new_height = stage_height
35
+ new_x = (stage_width - new_width) / 2
36
+ new_y = 0
43
37
  end
38
+ texture.set_position(new_x, new_y)
39
+ texture.set_size(new_width, new_height)
44
40
  end
45
41
  end
42
+
43
+ def pause_or_play
44
+ state = @video_texture.playing?
45
+ @video_texture.playing = state ? false : true
46
+ end
46
47
  end
47
48
  end
48
49
  end
@@ -1,111 +1,43 @@
1
1
  require "gtk3"
2
2
  require "mireru/widget"
3
+ require "mireru/navigator"
3
4
 
4
5
  module Mireru
5
6
  class Window < Gtk::Window
6
7
  attr_accessor :font
7
- def initialize
8
- super
8
+ attr_accessor :file
9
+ def initialize(files)
10
+ super()
11
+ @files = files
12
+
13
+ @paned = Gtk::Paned.new(:horizontal)
14
+ add(@paned)
15
+
16
+ @navigator = Navigator.new(self, files)
17
+ @paned.add(@navigator)
18
+
9
19
  @scroll = Gtk::ScrolledWindow.new
10
20
  @scroll.set_policy(:automatic, :automatic)
11
- add(@scroll)
12
- set_default_size(640, 640)
21
+ @paned.add(@scroll)
22
+
23
+ set_default_size(800, 600)
13
24
  signal_connect("destroy") do
14
25
  Gtk.main_quit
15
26
  end
16
- end
17
27
 
18
- def add_container(container)
19
- @container = container
20
-
21
- @file = @container.shift
22
- add_from_file(@file)
23
-
24
- signal_connect("key-press-event") do |widget, event|
25
- case event.keyval
26
- when Gdk::Keyval::GDK_KEY_n
27
- @file = @container.shift(@file)
28
- add_from_file(@file)
29
- when Gdk::Keyval::GDK_KEY_p
30
- @file = @container.pop(@file)
31
- add_from_file(@file)
32
- when Gdk::Keyval::GDK_KEY_r
33
- add_from_file(@file)
34
- when Gdk::Keyval::GDK_KEY_e
35
- self.title = File.expand_path(@file)
36
- when Gdk::Keyval::GDK_KEY_f
37
- if Mireru::Widget.image?(@file)
38
- pixbuf = Gdk::Pixbuf.new(@file, *self.size)
39
- @widget.pixbuf = pixbuf
40
- elsif @widget.is_a?(Gtk::TextView)
41
- font = @widget.pango_context.families.sample.name
42
- @widget.override_font(Pango::FontDescription.new(font))
43
- self.title = "#{File.basename(@file)} (#{font})"
44
- end
45
- when Gdk::Keyval::GDK_KEY_o
46
- if Mireru::Widget.image?(@file)
47
- pixbuf = Gdk::Pixbuf.new(@file)
48
- @widget.pixbuf = pixbuf
49
- end
50
- when Gdk::Keyval::GDK_KEY_T
51
- files = @container.instance_variable_get(:@files)
52
- add_from_file(files)
53
- when Gdk::Keyval::GDK_KEY_plus
54
- if Mireru::Widget.image?(@file)
55
- pixbuf = @widget.pixbuf
56
- scale = 1.1
57
- @widget.pixbuf = pixbuf.scale(pixbuf.width * scale,
58
- pixbuf.height * scale)
59
- elsif @widget.is_a?(Gtk::TextView)
60
- font = @widget.pango_context.font_description.to_s
61
- font_size = font.scan(/\d+\z/).first.to_i
62
- font = font.sub(/\d+\z/, (font_size + 1).to_s)
63
- @widget.override_font(Pango::FontDescription.new(font))
64
- end
65
- when Gdk::Keyval::GDK_KEY_minus
66
- if Mireru::Widget.image?(@file)
67
- pixbuf = @widget.pixbuf
68
- scale = 0.9
69
- @widget.pixbuf = pixbuf.scale(pixbuf.width * scale,
70
- pixbuf.height * scale)
71
- elsif @widget.is_a?(Gtk::TextView)
72
- font = @widget.pango_context.font_description.to_s
73
- font_size = font.scan(/\d+\z/).first.to_i
74
- font = font.sub(/\d+\z/, (font_size - 1).to_s)
75
- @widget.override_font(Pango::FontDescription.new(font))
76
- end
77
- when Gdk::Keyval::GDK_KEY_h
78
- @scroll.hadjustment.value -= 17
79
- when Gdk::Keyval::GDK_KEY_j
80
- @scroll.vadjustment.value += 17
81
- when Gdk::Keyval::GDK_KEY_k
82
- @scroll.vadjustment.value -= 17
83
- when Gdk::Keyval::GDK_KEY_l
84
- @scroll.hadjustment.value += 17
85
- when Gdk::Keyval::GDK_KEY_H
86
- @scroll.hadjustment.value -= 1000000
87
- when Gdk::Keyval::GDK_KEY_J, Gdk::Keyval::GDK_KEY_G
88
- @scroll.vadjustment.value += 1000000
89
- when Gdk::Keyval::GDK_KEY_K
90
- @scroll.vadjustment.value -= 1000000
91
- when Gdk::Keyval::GDK_KEY_L
92
- @scroll.hadjustment.value += 1000000
93
- when Gdk::Keyval::GDK_KEY_q
94
- destroy
95
- end
96
- end
28
+ define_keybind
97
29
  end
98
30
 
99
31
  def add_from_file(file)
100
32
  @scroll.hadjustment.value = 0
101
33
  @scroll.vadjustment.value = 0
102
- @scroll.each {|child| child.destroy }
103
- @widget = Mireru::Widget.create(file, *self.size)
104
- if @widget.is_a?(Mireru::Widget::Thumbnail)
105
- self.title = "Thumbnails: #{file.size} / #{file.size}"
106
- else
107
- self.title = File.basename(file)
34
+ @scroll.each do |child|
35
+ @scroll.remove(child)
36
+ child.destroy
108
37
  end
38
+ width = @scroll.allocated_width - 10
39
+ height = @scroll.allocated_height - 10
40
+ @widget = Mireru::Widget.create(file, width, height)
109
41
  @widget.override_font(Pango::FontDescription.new(@font)) if @font
110
42
  if @widget.is_a?(Gtk::Scrollable)
111
43
  @scroll.add(@widget)
@@ -114,5 +46,132 @@ module Mireru
114
46
  end
115
47
  show_all
116
48
  end
49
+
50
+ def run
51
+ show_all
52
+ Gtk.main
53
+ end
54
+
55
+ private
56
+ def define_keybind
57
+ signal_connect("key-press-event") do |widget, event|
58
+ handled = false
59
+
60
+ if event.state.control_mask?
61
+ handled = action_from_keyval_with_control_mask(event.keyval)
62
+ else
63
+ handled = action_from_keyval(event.keyval)
64
+ end
65
+
66
+ handled
67
+ end
68
+ end
69
+
70
+ def action_from_keyval(keyval)
71
+ case keyval
72
+ when Gdk::Keyval::GDK_KEY_n
73
+ @navigator.next
74
+ when Gdk::Keyval::GDK_KEY_p
75
+ @navigator.prev
76
+ when Gdk::Keyval::GDK_KEY_r
77
+ add_from_file(@file) # reload
78
+ when Gdk::Keyval::GDK_KEY_e
79
+ @navigator.expand_toggle
80
+ when Gdk::Keyval::GDK_KEY_Return
81
+ @navigator.expand_toggle
82
+ when Gdk::Keyval::GDK_KEY_space
83
+ if @widget.is_a?(Widget::Video)
84
+ @widget.pause_or_play
85
+ end
86
+ when Gdk::Keyval::GDK_KEY_f
87
+ if Mireru::Widget.image?(@file)
88
+ width = @scroll.allocated_width - 10
89
+ height = @scroll.allocated_height - 10
90
+ pixbuf = Gdk::Pixbuf.new(@file, width, height)
91
+ @widget.pixbuf = pixbuf
92
+ elsif @widget.is_a?(Gtk::TextView)
93
+ font = @widget.pango_context.families.sample.name
94
+ @widget.override_font(Pango::FontDescription.new(font))
95
+ end
96
+ when Gdk::Keyval::GDK_KEY_o
97
+ if Mireru::Widget.image?(@file)
98
+ pixbuf = Gdk::Pixbuf.new(@file)
99
+ @widget.pixbuf = pixbuf
100
+ end
101
+ when Gdk::Keyval::GDK_KEY_plus
102
+ if Mireru::Widget.image?(@file)
103
+ pixbuf = @widget.pixbuf
104
+ scale = 1.1
105
+ @widget.pixbuf = pixbuf.scale(pixbuf.width * scale,
106
+ pixbuf.height * scale)
107
+ elsif @widget.is_a?(Gtk::TextView)
108
+ font = @widget.pango_context.font_description.to_s
109
+ font_size = font.scan(/\d+\z/).first.to_i
110
+ font = font.sub(/\d+\z/, (font_size + 1).to_s)
111
+ @widget.override_font(Pango::FontDescription.new(font))
112
+ end
113
+ when Gdk::Keyval::GDK_KEY_minus
114
+ if Mireru::Widget.image?(@file)
115
+ pixbuf = @widget.pixbuf
116
+ scale = 0.9
117
+ @widget.pixbuf = pixbuf.scale(pixbuf.width * scale,
118
+ pixbuf.height * scale)
119
+ elsif @widget.is_a?(Gtk::TextView)
120
+ font = @widget.pango_context.font_description.to_s
121
+ font_size = font.scan(/\d+\z/).first.to_i
122
+ font = font.sub(/\d+\z/, (font_size - 1).to_s)
123
+ @widget.override_font(Pango::FontDescription.new(font))
124
+ end
125
+ when Gdk::Keyval::GDK_KEY_h
126
+ @scroll.hadjustment.value -= 17
127
+ when Gdk::Keyval::GDK_KEY_j
128
+ if @widget.is_a?(Widget::PDF)
129
+ @widget.next
130
+ else
131
+ @scroll.vadjustment.value += 17
132
+ end
133
+ when Gdk::Keyval::GDK_KEY_k
134
+ if @widget.is_a?(Widget::PDF)
135
+ @widget.prev
136
+ else
137
+ @scroll.vadjustment.value -= 17
138
+ end
139
+ when Gdk::Keyval::GDK_KEY_l
140
+ @scroll.hadjustment.value += 17
141
+ when Gdk::Keyval::GDK_KEY_H
142
+ @scroll.hadjustment.value -= 17 * 100
143
+ when Gdk::Keyval::GDK_KEY_J
144
+ @scroll.vadjustment.value += 17 * 100
145
+ when Gdk::Keyval::GDK_KEY_G
146
+ @scroll.vadjustment.value = @scroll.vadjustment.upper
147
+ when Gdk::Keyval::GDK_KEY_K
148
+ @scroll.vadjustment.value -= 17 * 100
149
+ when Gdk::Keyval::GDK_KEY_L
150
+ @scroll.hadjustment.value += 17 * 100
151
+ when Gdk::Keyval::GDK_KEY_q
152
+ destroy
153
+ else
154
+ return false
155
+ end
156
+ true
157
+ end
158
+
159
+ def action_from_keyval_with_control_mask(keyval)
160
+ case keyval
161
+ when Gdk::Keyval::GDK_KEY_n
162
+ 10.times { @navigator.next }
163
+ when Gdk::Keyval::GDK_KEY_p
164
+ 10.times { @navigator.prev }
165
+ when Gdk::Keyval::GDK_KEY_e
166
+ @navigator.expand_toggle(true)
167
+ when Gdk::Keyval::GDK_KEY_h
168
+ @paned.position -= 2
169
+ when Gdk::Keyval::GDK_KEY_l
170
+ @paned.position += 2
171
+ else
172
+ return false
173
+ end
174
+ true
175
+ end
117
176
  end
118
177
  end