249 lines
7.4 KiB
Plaintext
249 lines
7.4 KiB
Plaintext
|
#!/usr/bin/python
|
||
|
# -*- coding: UTF-8 -*-
|
||
|
'''gimpbox.py
|
||
|
|
||
|
启动单窗口的 Gimp
|
||
|
|
||
|
用法:
|
||
|
python gimpbox.py
|
||
|
或
|
||
|
gimp & 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 = _('Layer') 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 %s & ) &' % (' '.join([ '"%s"' % i.replace('"', '\\"') for i in sys.argv[1:] ])))
|
||
|
pass
|
||
|
else:
|
||
|
os.popen('(sleep 0.5 ; gimp & ) &')
|
||
|
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()
|
||
|
|