249 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			249 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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()
 | |
| 
 |