Sophie

Sophie

distrib > Mandriva > current > i586 > by-pkgid > 46ef77237880843af7ac4acaf8dbb7ca > files > 1

gimpbox-0.1.0-1mdv2010.2.src.rpm

#!/usr/bin/python
# -*- coding: UTF-8 -*-
'''gimpbox.py

启动单窗口的 Gimp

用法:
    python gimpbox.py
    或
    gimp-2.6 & sleep 5s ; python gimpbox.py

'''

import gtk, gobject
import wnck
import time
import os
import sys

import gettext
gettext.install('gimp20')
STR_GIMP = _('GNU Image Manipulation Program') or 'GNU 图像处理程序'
STR_TOOLBOX = _('Toolbox') or '工具箱'
STR_LAYER = _('Layers') or '图层'

def get_screenshot_thumb(drawable, width=32, height=32):
    w, h = drawable.get_size()
    ## gimp 图像窗口截图时减去菜单栏等非图像区域
    x = 15
    y = 45
    w = w - x
    h = h - y - 32
    screenshot = gtk.gdk.Pixbuf.get_from_drawable(
        gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, w, h),
        drawable,
        gtk.gdk.colormap_get_system(),
        x, y, 0, 0, w, h)
    #screenshot.save(filename, 'png')
    if not screenshot:
        return None
    return screenshot.scale_simple(width, height, gtk.gdk.InterpType(2))

class mainwindow:
    '''主窗口
    '''
    def __init__(self, create = True, accel_group = None, tooltips = None):
        '''建立主窗口和布局
        '''

        self.mainwindow = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.mainwindow.set_icon_name("gimp")
        self.mainwindow.set_default_size(700, 500)
        self.mainwindow.maximize()
        self.mainwindow.set_title(_("GimpBox"))
        #self.mainwindow.set_position(gtk.WIN_POS_CENTER)
        self.mainwindow.show()
        self.mainwindow.connect("delete_event", self.quit)

        self.screen = wnck.screen_get_default()

        self.hpaned1 = gtk.HPaned()
        self.hpaned1.set_position(180)
        self.hpaned1.show()

        self.toolboxarea = gtk.Socket()
        self.toolboxarea.show()
        self.hpaned1.pack1(self.toolboxarea, False, True)

        self.hpaned2 = gtk.HPaned()
        self.hpaned2.show()

        self.notebook = gtk.Notebook()
        self.notebook.set_tab_pos(gtk.POS_BOTTOM)
        self.notebook.popup_enable()
        self.notebook.set_scrollable(True)
        self.notebook.show()

        self.hpaned2.pack1(self.notebook, False, True)

        self.miscboxarea = gtk.Socket()
        self.miscboxarea.show()
        self.hpaned2.pack2(self.miscboxarea, False, False)

        self.hpaned1.pack2(self.hpaned2, True, True)

        self.mainwindow.add(self.hpaned1)

        gobject.idle_add(self.start)
        #self.toolboxarea.connect('realize', self.start)

        self.mainwindow.show_all()
        pass

    def start(self, *args):
        '''开始处理
        '''
        self.hpaned2.set_position(self.hpaned2.get_allocation()[2] - 180)
        self.query_windows()
        gobject.timeout_add(2000, self.update_thumb)
        pass

    def _on_window_open(self, screen, wnck_window):
        '''新窗口事件
        '''
        gobject.timeout_add(2000, self.proc_window, wnck_window)
        pass

    def proc_window(self, wnck_window, *args):
        '''挑选窗口
        '''
        if not wnck_window.get_application():
            return
        if wnck_window.get_application().get_icon_name() != STR_GIMP:
            return
        if wnck_window.get_window_type() == wnck.WINDOW_UTILITY:
            if wnck_window.get_icon_name().startswith(STR_TOOLBOX):
                self._add_wnck_window_to_drawingarea(wnck_window, self.toolboxarea)
                pass
            elif STR_LAYER in wnck_window.get_icon_name():
                self._add_wnck_window_to_drawingarea(wnck_window, self.miscboxarea)
                pass
            pass
        elif wnck_window.get_window_type() == wnck.WINDOW_NORMAL:
            if wnck_window.get_icon_name().startswith('GNU') \
                    or wnck_window.get_icon_name().endswith('GIMP') \
                    or wnck_window.get_icon_name().endswith('GNU'):
                self.add_wnck_window_to_tab(wnck_window)
                pass
            pass
        pass

    def query_windows(self):
        '''遍历现有窗口
        '''
        for w in self.screen.get_windows_stacked():
            gobject.timeout_add(500, self.proc_window, w)
            pass
        if not self.tabs:
            if sys.argv[1:]:
                os.popen('(sleep 0.5 ; gimp-2.6 %s & ) &' % (' '.join([ '"%s"' % i.replace('"', '\\"') for i in sys.argv[1:] ])))
                pass
            else:
                os.popen('(sleep 0.5 ; gimp-2.6 & ) &')
                pass
            pass
        self.screen.connect('window-opened', self._on_window_open)
        pass

    def _on_add_wnck_window_to_drawingarea(self, widget, wnck_window, drawingarea=None):
        self._add_wnck_window_to_drawingarea(wnck_window, drawingarea)
        pass

    def _add_wnck_window_to_drawingarea(self, wnck_window, drawingarea=None):
        '''真正将窗口曳入标签
        '''
        drawingarea.wnck_window = wnck_window
        return drawingarea.add_id(wnck_window.get_xid())

    def on_tab_window_name_change(self, wnck_window, drawingarea):
        '''处理窗口标题
        '''
        name = wnck_window.get_name()
        drawingarea.tabmenu.set_text(name)
        pass

    def on_tab_window_icon_change(self, wnck_window, drawingarea):
        '''处理窗口图标
        '''
        icon = wnck_window.get_icon()
        drawingarea.tabimage.set_from_pixbuf(icon)
        pass

    def update_thumb(self):
        '''更新标签栏缩略图
        '''
        if self.notebook.get_n_pages():
            box = self.notebook.get_nth_page( self.notebook.get_current_page() )
            if not box.window:
                return True
            pixbuf = get_screenshot_thumb(box.window, 48, 48)
            if not pixbuf:
                return True
            img = self.notebook.get_tab_label(box)
            if img.get_pixbuf() != pixbuf:
                img.set_from_pixbuf(pixbuf)
                img.show()
                pass
            pass
        return True

    def _tab_remove(self, drawingarea):
        '''当标签页有窗口关闭
        '''
        box = drawingarea.parent
        self.notebook.remove(box)
        wnck_window = drawingarea.wnck_window
        if wnck_window in self.tabs:
            del self.tabs[wnck_window]
            pass
        if not self.notebook.get_n_pages():
            self.quit()
            pass
        pass

    tabs = {}
    def add_wnck_window_to_tab(self, wnck_window):
        '''将窗口添加到标签
        '''
        notebook = self.notebook
        drawingarea = gtk.Socket()
        drawingarea.show()
        drawingarea.connect('realize', self._on_add_wnck_window_to_drawingarea, wnck_window, drawingarea)
        drawingarea.connect('plug-removed', self._tab_remove)
        tabimage = gtk.Image()
        tabimage.set_from_pixbuf(wnck_window.get_icon())
        tabimage.set_padding(0, 0)
        tabimage.show()
        tabmenu = gtk.Label(wnck_window.get_name())

        box = gtk.Viewport()
        box.add(drawingarea)
        box.show()

        box.set_flags(gtk.CAN_FOCUS)

        drawingarea.box = box
        drawingarea.tabimage = tabimage
        drawingarea.tabmenu = tabmenu
        drawingarea.wnck_window = wnck_window

        notebook.append_page_menu(box, tabimage, tabmenu)
        notebook.set_current_page( notebook.page_num(box) )

        notebook.set_tab_reorderable(drawingarea, 1)

        self.tabs[wnck_window] = drawingarea

        pass

    def quit(self, *args):
        gtk.main_quit()
        pass


if __name__ == '__main__':
    win=mainwindow()
    gtk.main()