class GSuper::SuperWindow

字幕ウィンドウを表わすクラス。

Constants

BACKGROUND_ALPHA
BACKGROUND_COLOR

Attributes

font_name[R]
shadow_color[R]
text[R]
text_color[R]

Public Class Methods

new() click to toggle source
Calls superclass method
# File lib/gsuper/super_window.rb, line 13
def initialize
  super()

  @font_name = 'Sans Bold 24'
  @text_color = Color::gdk_color([1.0, 0.5, 0.0])
  @shadow_color = Color::gdk_color([0.0, 0.0, 1.0])
  @text = ""

  @interactive = true

  self.app_paintable = true

  signal_connect('expose-event') do
    if @interactive
      exposed_interactive
    else
      exposed_noninteractive
    end
  end

  self.events = Gdk::Event::BUTTON_PRESS_MASK |
                Gdk::Event::BUTTON_RELEASE_MASK |
                Gdk::Event::POINTER_MOTION_MASK

  signal_connect('screen-changed') do 
    screen_changed
  end

  signal_connect('configure-event') do
    # p :configure
    invalidate
    set_responsive(interactive?)
    # exposeを誘発するためにfalseを返す
    false
  end

  button_pressed = false
  press_point = nil
  move = nil
  signal_connect('button-press-event') do |_, ev_button|
    button_pressed = true
    w, h = size
    if ev_button.x.between?(w - 30, w - 1) &&
       ev_button.y.between?(h - 30, h - 1)
      move = false
      press_point = [(w - ev_button.x), (h - ev_button.y)]
    else
      move = true
      press_point = [ev_button.x, ev_button.y]
    end
    # p :press
  end

  signal_connect('button-release-event') do
    button_pressed = false
    press_point = nil
    move = nil
    # p :release
  end

  signal_connect('motion-notify-event') do |_, ev_motion|
    if interactive? && button_pressed
      if move
        move(ev_motion.x_root - press_point[0], ev_motion.y_root - press_point[1])
      else
        w = ev_motion.x + press_point[0]
        h = ev_motion.y + press_point[1]
        resize([w, 100].max, [h, 100].max)
        # invalidate
        # set_responsive(true)
      end
    end
    # p :pointer_motion
  end

  # self.decorated = false

  self.set_default_size(640,480)

  @alpha_supported = false
  screen_changed

  # GDK window を作る。
  realize

  window.override_redirect = true
  set_responsive(true)
end

Public Instance Methods

draw_text(cr) click to toggle source
# File lib/gsuper/super_window.rb, line 169
def draw_text(cr)
  # p [:draw_text, font_name]
  desc = Pango::FontDescription.new(font_name)

  layout = create_pango_layout
  layout.width = size[0] * Pango::SCALE
  layout.font_description = desc
  layout.text = text

  offset = shadow_offset(desc)

  cr.move_to(offset, offset)
  cr.set_source_rgba(*pango_triple(@shadow_color), 1.0)
  cr.show_pango_layout(layout)

  cr.move_to(0, 0)
  cr.set_source_rgba(*pango_triple(@text_color), 1.0)
  cr.show_pango_layout(layout)
end
exposed_interactive() click to toggle source
# File lib/gsuper/super_window.rb, line 124
def exposed_interactive
  cr = window.create_cairo_context 

  if @alpha_supported
    cr.set_source_rgba(*pango_triple(BACKGROUND_COLOR), BACKGROUND_ALPHA)
  else
    cr.set_source_rgb(*pango_triple(BACKGROUND_COLOR))
  end

  cr.set_operator(Cairo::OPERATOR_SOURCE)
  cr.paint

  draw_text(cr)

  cr.set_source_rgb(0.5, 0.5, 0.5)
  w, h = size
  cr.fill do
    cr.rectangle(w - 30, h - 3, w, h)
    cr.rectangle(w - 3, h - 30, w, h)
  end

  cr.destroy

  return false
end
exposed_noninteractive() click to toggle source
# File lib/gsuper/super_window.rb, line 150
def exposed_noninteractive
  cr = window.create_cairo_context 

  if @alpha_supported
    cr.set_source_rgba(0.0, 0.0, 0.0, 0.0)
  else
    cr.set_source_rgb(0.0, 0.0, 0.0)
  end

  cr.set_operator(Cairo::OPERATOR_SOURCE)
  cr.paint

  draw_text(cr)

  cr.destroy

  return false
end
font_name=(font) click to toggle source
# File lib/gsuper/super_window.rb, line 102
def font_name=(font)
  @font_name = font
  invalidate
end
interactive=(flag) click to toggle source
# File lib/gsuper/super_window.rb, line 207
def interactive=(flag)
  @interactive = flag
  set_responsive(flag)
  invalidate
end
interactive?() click to toggle source
# File lib/gsuper/super_window.rb, line 203
def interactive?
  @interactive
end
invalidate() click to toggle source
# File lib/gsuper/super_window.rb, line 223
def invalidate
  window.invalidate(window.clip_region, true)
  window.process_updates(true)
end
pt_to_px(point, dpi) click to toggle source
# File lib/gsuper/super_window.rb, line 199
def pt_to_px(point, dpi)
  point / 72.0 * dpi
end
screen_changed() click to toggle source
# File lib/gsuper/super_window.rb, line 228
def screen_changed
  colormap = self.screen.rgba_colormap
  if colormap
    # puts 'alpha channel supported'
    @alpha_supported = true
    self.colormap = colormap
  else
    STDERR.puts 'Warning: alpha channel NOT supported'
    @alpha_supported = false
    self.colormap = self.screen.rgb_colormap
  end
end
set_responsive(responsive) click to toggle source
# File lib/gsuper/super_window.rb, line 213
def set_responsive(responsive)
  if responsive
    width, height = size
    region = Gdk::Region.new(Gdk::Rectangle.new(0, 0, width, height))
  else
    region = Gdk::Region.new(Gdk::Rectangle.new(0, 0, 0, 0))
  end
  window.input_shape_combine_region(region, 0, 0)
end
shadow_color=(color) click to toggle source
# File lib/gsuper/super_window.rb, line 113
def shadow_color=(color)
  raise TypeError unless color.is_a? Gdk::Color
  @shadow_color = color
  invalidate
end
shadow_offset(desc) click to toggle source

右下に二度打ちで「影」を落とす。そのオフセットは線の太さの半分にし たいとする。

# File lib/gsuper/super_window.rb, line 191
def shadow_offset(desc)
  raise TypeError unless desc.is_a? Pango::FontDescription
  dpi = window.screen.resolution

  font_px = pt_to_px(desc.size.fdiv(Pango::SCALE), dpi)
  return ( font_px * (1/12.0) * (desc.weight.to_i / 400.0) * (1/3.0) ).round
end
text=(str) click to toggle source
# File lib/gsuper/super_window.rb, line 119
def text=(str)
  @text = str
  invalidate
end
text_color=(color) click to toggle source
# File lib/gsuper/super_window.rb, line 107
def text_color=(color)
  raise TypeError unless color.is_a? Gdk::Color
  @text_color = color
  invalidate
end