OSDN Git Service

update on the implementation of TransparentWindow class(4)
authorShyouzou Sugitani <shy@users.sourceforge.jp>
Mon, 25 Feb 2013 15:11:18 +0000 (00:11 +0900)
committerShyouzou Sugitani <shy@users.sourceforge.jp>
Mon, 25 Feb 2013 15:11:18 +0000 (00:11 +0900)
ChangeLog
lib/ninix/balloon.py
lib/ninix/dll/bln.py
lib/ninix/kinoko.py
lib/ninix/nekodorif.py
lib/ninix/ngm.py
lib/ninix/pix.py
lib/ninix/surface.py

index 954407f..fcb635e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Mon February 25 2013   Shyouzou Sugitani <shy@users.sourceforge.jp>
+       * Gtk.DrawingAreaを持たないBaseTransparentWindowクラスを追加し,
+         TransparentWindowはこのクラスを継承するようにした.
+       * CommunicateWindowはGtk.Windowではなく, BaseTransparentWindowの
+         インスタンスを作成して使うようにした.
+       * SurfaceWindow等で共通して行なっていた処理の幾つかを
+         TransparentWindowに移した.
+       * NGM内でのサーフェス画像描画処理を修正した.
+
 Sun February 24 2013   Shyouzou Sugitani <shy@users.sourceforge.jp>
        * 描画位置の補正処理はTransparentWindowクラス内で全て行ない
          SurfaceWindow等のクラスでは意識しなくて良いようにした.
index 0eff926..486d00c 100644 (file)
@@ -88,10 +88,7 @@ class Balloon:
 
     def create_gtk_window(self, title):
         window = ninix.pix.TransparentWindow()
-        window.set_focus_on_map(False)
         window.set_title(title)
-        window.set_decorated(False)
-        window.set_resizable(False)
         window.set_skip_pager_hint(False)
         window.set_skip_taskbar_hint(True)
         window.connect('delete_event', self.delete)
@@ -845,7 +842,6 @@ class BalloonWindow:
         cr.set_operator(cairo.OPERATOR_SOURCE)
         cr.paint()
         cr.set_operator(cairo.OPERATOR_OVER) # restore default
-        self.window.update_shape(cr.get_target())
         # draw images
         for i in range(len(self.images)):
             image_surface, (x, y) = self.images[i]
@@ -1302,18 +1298,8 @@ class CommunicateWindow(metaclass=abc.ABCMeta):
     def new(self, desc, balloon):
         if self.window:
             self.window.destroy()
-        self.window = Gtk.Window()
-        screen = self.window.get_screen()
-        if self.window.is_composited():
-            visual = screen.get_rgba_visual()
-        else:
-            visual = screen.get_system_visual()
-            logging.debug('screen does NOT support alpha.\n')
-        assert visual is not None
-        self.window.set_visual(visual)
+        self.window = ninix.pix.BaseTransparentWindow()
         self.window.set_title('communicate')
-        self.window.set_decorated(False)
-        self.window.set_resizable(False)
         self.window.connect('delete_event', self.delete)
         self.window.connect('key_press_event', self.key_press)
         self.window.connect('button_press_event', self.button_press)
index 1e00d1a..7aedb0c 100644 (file)
@@ -165,11 +165,8 @@ class Balloon:
         self.timeout_id = None
         self.data = data # XXX
         self.window = ninix.pix.TransparentWindow()
-        self.window.set_focus_on_map(False)
         self.window.set_title(name)
         self.window.set_skip_taskbar_hint(True)
-        self.window.set_decorated(False)
-        self.window.set_resizable(False)
         self.window.connect('delete_event', self.delete)
         self.position = data.get('position', 'sakura')
         left, top, scrn_w, scrn_h = ninix.pix.get_workarea()
@@ -566,7 +563,6 @@ class Balloon:
         cr.set_operator(cairo.OPERATOR_SOURCE)
         cr.paint()
         cr.set_operator(cairo.OPERATOR_OVER) # restore default
-        self.window.update_shape(cr.get_target())
         if self.layout:
             cr.set_source_rgb(*self.fontcolor)
             cr.move_to(int(self.left), int(self.top))
index 3f2bda0..43933d1 100644 (file)
@@ -243,10 +243,7 @@ class Skin:
         self.__shown = False
         self.surface_id = 0 # dummy
         self.window = ninix.pix.TransparentWindow()
-        self.window.set_focus_on_map(False)
         ##self.window.set_title(''.join(('surface.', name)))
-        self.window.set_decorated(False)
-        self.window.set_resizable(False)
         self.window.set_skip_taskbar_hint(True)
         self.window.connect('delete_event', self.delete)
         self.window.add_accel_group(self.accelgroup) ## FIXME
@@ -344,7 +341,6 @@ class Skin:
         cr.set_source_surface(self.image_surface, 0, 0)
         cr.set_operator(cairo.OPERATOR_SOURCE)
         cr.paint()
-        self.window.update_shape(cr.get_target())
 
     def get_image_surface(self, surface_id):
         path = os.path.join(os.fsencode(self.data['dir']),
index 06a8013..c571f5e 100644 (file)
@@ -261,9 +261,6 @@ class Skin:
         self.window = ninix.pix.TransparentWindow()
         name, top_dir = ninix.home.read_profile_txt(dir) # XXX
         self.window.set_title(name)
-        self.window.set_decorated(False)
-        self.window.set_resizable(False)
-        self.window.set_focus_on_map(False)
         self.window.connect('delete_event', self.delete)
         self.window.connect('key_press_event', self.key_press)
         self.window.add_accel_group(self.accelgroup)
@@ -311,7 +308,6 @@ class Skin:
         cr.set_source_surface(self.image_surface, 0, 0)
         cr.set_operator(cairo.OPERATOR_SOURCE)
         cr.paint()
-        self.window.update_shape(cr.get_target())
 
     def delete(self, widget, event):
         self.request_parent('NOTIFY', 'finalize')
@@ -505,7 +501,6 @@ class Katochan:
         cr.set_source_surface(self.image_surface, 0, 0)
         cr.set_operator(cairo.OPERATOR_SOURCE)
         cr.paint()
-        self.window.update_shape(cr.get_target())
 
     def set_movement(self, timing):
         key = ''.join((timing, 'fall.type'))
@@ -616,10 +611,7 @@ class Katochan:
         self.offset_y = offset_y
         self.window = ninix.pix.TransparentWindow()
         self.window.set_title(self.data['name'])
-        self.window.set_decorated(False)
-        self.window.set_resizable(False)
         self.window.set_skip_taskbar_hint(True) # XXX
-        self.window.set_focus_on_map(False)
         self.window.connect('delete_event', self.delete)
         self.darea = self.window.get_child()
         self.darea.set_events(Gdk.EventMask.EXPOSURE_MASK)
index 74f819a..c2fa764 100644 (file)
@@ -510,7 +510,7 @@ class UI:
     def redraw(self, widget, cr, side):
         if self.surface[side] is not None:
             cr.set_source_surface(self.surface[side], 0, 0)
-            cr.set_operator(cairo.OPERATOR_SOURCE)
+            cr.set_operator(cairo.OPERATOR_OVER)
             cr.paint()
         else:
             cr.set_operator(cairo.OPERATOR_CLEAR)
@@ -534,8 +534,6 @@ class UI:
                     w = surface.get_width()
                     h = surface.get_height()
                     darea.set_size_request(w, h)
-                    region = Gdk.cairo_region_create_from_surface(surface)
-                    darea.get_window().shape_combine_region(region, 0, 0)
             else:
                 surface = None
             self.surface[side] = surface
index 5d12a83..3a2ef74 100644 (file)
@@ -24,16 +24,37 @@ import cairo
 import numpy
 
 
-class TransparentWindow(Gtk.Window):
+class BaseTransparentWindow(Gtk.Window):
     __gsignals__ = {'screen-changed': 'override', }
 
     def __init__(self, type=Gtk.WindowType.TOPLEVEL):
         Gtk.Window.__init__(self, type=type)
+        self.set_decorated(False)
+        self.set_resizable(False)
+        self.screen_changed()
+
+    def screen_changed(self, old_screen=None):
+        screen = self.get_screen()
+        if self.is_composited():
+            visual = screen.get_rgba_visual()
+            self.supports_alpha = True
+        else:
+            visual = screen.get_system_visual()
+            logging.debug('screen does NOT support alpha.\n')
+            self.supports_alpha = False
+        assert visual is not None
+        self.set_visual(visual)
+
+
+class TransparentWindow(BaseTransparentWindow):
+
+    def __init__(self, type=Gtk.WindowType.TOPLEVEL):
+        BaseTransparentWindow.__init__(self, type=type)
+        self.set_app_paintable(True)
+        self.set_focus_on_map(False)
         self.__position = (0, 0)
         self.__surface_position = (0, 0)
         self.__redraw = None
-        self.set_app_paintable(True)
-        self.screen_changed()
         self.connect_after('size_allocate', self.size_allocate)
         # create drawing area
         self.darea = Gtk.DrawingArea()
@@ -64,6 +85,8 @@ class TransparentWindow(Gtk.Window):
             user_function(darea, cr, user_data)
         else:
             user_function(darea, cr)
+        region = Gdk.cairo_region_create_from_surface(cr.get_target())
+        self.input_shape_combine_region(region)
 
     def update_size(self, w, h):
         self.get_child().set_size_request(w, h) # XXX
@@ -94,22 +117,6 @@ class TransparentWindow(Gtk.Window):
         new_y = int((y - (surface_y - window_y)) * 100 / scale)
         return new_x, new_y
 
-    def screen_changed(self, old_screen=None):
-        screen = self.get_screen()
-        if self.is_composited():
-            visual = screen.get_rgba_visual()
-            self.supports_alpha = True
-        else:
-            visual = screen.get_system_visual()
-            logging.debug('screen does NOT support alpha.\n')
-            self.supports_alpha = False
-        assert visual is not None
-        self.set_visual(visual)
-
-    def update_shape(self, surface):
-        region = Gdk.cairo_region_create_from_surface(surface)
-        self.get_window().input_shape_combine_region(region, 0, 0)
-
 
 def get_png_size(path):
     if not path or not os.path.exists(path):
index a650d29..521757b 100644 (file)
@@ -67,10 +67,7 @@ class Surface:
 
     def create_gtk_window(self, title, skip_taskbar):
         window = ninix.pix.TransparentWindow()
-        window.set_focus_on_map(False)
         window.set_title(title)
-        window.set_decorated(False)
-        window.set_resizable(False)
         if skip_taskbar:
             window.set_skip_taskbar_hint(True)
         window.connect('delete_event', self.delete)
@@ -1090,7 +1087,6 @@ class SurfaceWindow:
         cr.set_operator(cairo.OPERATOR_SOURCE)
         cr.paint()
         cr.restore()
-        self.window.update_shape(cr.get_target())
         if self.request_parent('GET', 'get_preference', 'check_collision'):
             self.draw_region(cr)