+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等のクラスでは意識しなくて良いようにした.
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)
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]
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)
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()
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))
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
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']),
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)
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')
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'))
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)
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)
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
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()
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
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):
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)
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)