summaryrefslogtreecommitdiff
path: root/gtk-recordmydesktop/src/rmdSelectThumb.py
diff options
context:
space:
mode:
Diffstat (limited to 'gtk-recordmydesktop/src/rmdSelectThumb.py')
-rwxr-xr-xgtk-recordmydesktop/src/rmdSelectThumb.py217
1 files changed, 217 insertions, 0 deletions
diff --git a/gtk-recordmydesktop/src/rmdSelectThumb.py b/gtk-recordmydesktop/src/rmdSelectThumb.py
new file mode 100755
index 0000000..6130b26
--- /dev/null
+++ b/gtk-recordmydesktop/src/rmdSelectThumb.py
@@ -0,0 +1,217 @@
+# -*- Mode: Python -*-
+# vi:si:et:sw=4:sts=4:ts=4
+#
+# Istanbul - a desktop session recorder
+# Copyright (C) 2005 Zaheer Abbas Merali (zaheerabbas at merali dot org)
+# All rights reserved.
+
+# This file may be distributed and/or modified under the terms of
+# the GNU General Public License version 2 as published by
+# the Free Software Foundation.
+# This file is distributed without any warranty; without even the implied
+# warranty of merchantability or fitness for a particular purpose.
+# See "LICENSE.GPL" in the source distribution for more information.
+
+# Headers in this file shall remain intact.
+
+#This file has been modified to be used in gtk-recordMyDesktop
+#by John Varouhakis
+
+#Base class is DrawingArea instead of Window to allow insertion.
+#new methods:
+# update_image to keep the screenshot current.
+# __subsample__ to scale the screenshot
+# __draw_lines__ to highlight the selected area.
+#Calls to destroy have been removed, since this widget is meant to
+#live for an indefinite amount of time.
+#Click behavior has been changed. Selection now happens by left-click and dragging,
+#while right click resets the selection.
+
+
+#original file name is select.py in Istanbul-0.2.1
+
+
+import gtk
+import gtk.gdk
+#from rmdSelect import *
+import gobject
+import gc
+
+class GtkThumbSelector(gtk.DrawingArea):
+ def __init__(self,area_return,hidden,update_interval=2000):
+ self.hidden=hidden
+ self.area_return=area_return
+ self.selecting=0
+ gtk.DrawingArea.__init__(self)
+ self.set_app_paintable(True)
+ #self.fullscreen()
+ self.connect("expose-event", self.expose_cb)
+ self.connect("button-press-event", self.button_press_cb)
+ self.connect("button-release-event", self.button_release_cb)
+ self.connect("motion-notify-event", self.motion_notify_cb)
+ #self.connect("delete-event", self.delete_cb)
+ self.connect("realize", self.realize_cb)
+ #root = gtk.gdk.get_default_root_window()
+ self.wroot = gtk.gdk.get_default_root_window()
+ (self.wwidth, self.wheight) = self.wroot.get_size()
+ ###############################################################
+
+ self.factor=1;
+ twidth=self.wwidth
+ while twidth>320 or self.factor<4:
+ twidth/=2
+ self.factor*=2
+ self.root=gtk.gdk.Image(gtk.gdk.IMAGE_NORMAL,self.wroot.get_visual(),self.wwidth/self.factor,self.wheight/self.factor)
+ #(width, height) = root.get_size()
+ sroot = self.wroot.get_image(0, 0, self.wwidth, self.wheight)
+ self.__subsample__(sroot,self.wwidth,self.wheight,self.root,self.factor)
+ #self.root = root.get_image(0, 0, width, height)
+ self.x1 = self.y1 = -1
+ self.x2 = self.y2 = -1
+ self.set_size_request(self.wwidth/self.factor,self.wheight/self.factor)
+ self.timed_id=gobject.timeout_add(update_interval,self.update_image)
+
+ def __subsample__(self,im1,w,h,im2,stride,x=0,y=0):
+ for i in xrange(y,h,stride):
+ for k in xrange(x,w,stride):
+ im2.put_pixel(k/stride,i/stride,im1.get_pixel(k,i))
+ def button_release_cb(self, widget, event):
+ if event.button == 1 and self.x1 >= 0 and widget==self:
+ self.selecting=0
+ self.x2 = event.x + 1
+ self.y2 = event.y + 1
+ # stop
+ if self.x1 <0: self.x1=0
+ if self.x2 <0: self.x2=0
+ if self.y1 <0: self.y1=0
+ if self.y2 <0: self.y2=0
+ if self.x1 >self.wwidth/self.factor: self.x1=self.wwidth/self.factor
+ if self.x2 >self.wwidth/self.factor: self.x2=self.wwidth/self.factor
+ if self.y1 >self.wheight/self.factor: self.y1=self.wheight/self.factor
+ if self.y2 >self.wheight/self.factor: self.y2=self.wheight/self.factor
+
+
+ self.area_return[0]=min(int(self.x1),int(self.x2))*self.factor
+ self.area_return[1]=min(int(self.y1),int(self.y2))*self.factor
+ self.area_return[2]=max(int(self.x1),int(self.x2))*self.factor
+ self.area_return[3]=max(int(self.y1),int(self.y2))*self.factor
+ self.x1=self.y1=self.x2=self.y2=-1
+ #print self.area_return
+ self.update_image()
+
+ def button_press_cb(self, widget, event):
+ if widget==self:
+ if event.button == 1:
+ self.selecting=1
+ self.update_image()
+ self.x1 = event.x
+ self.y1 = event.y
+ else:
+ self.x1 = self.y1=self.x2=self.y2=-1
+ self.area_return[0]=self.area_return[1]=0
+ self.area_return[2]=self.wwidth
+ self.area_return[3]=self.wheight
+ self.update_image()
+
+ def realize_cb(self, widget):
+ if widget == self:
+ gdkwindow = self.window
+ gdkwindow.set_events(gdkwindow.get_events() |
+ gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE_MASK |
+ gtk.gdk.POINTER_MOTION_MASK);
+ cursor = gtk.gdk.Cursor(gtk.gdk.CROSSHAIR)
+ gdkwindow.set_cursor(cursor)
+ gdkwindow.set_back_pixmap(None, False)
+
+ def expose_cb(self, widget, event):
+ if widget==self:
+ dashes = [ 1.0, 2.0 ]
+ cr = self.window.cairo_create()
+ cr.rectangle(event.area.x, event.area.y, event.area.width,
+ event.area.height)
+ cr.clip()
+ self.window.draw_image(self.style.black_gc, self.root, event.area.x,
+ event.area.y, event.area.x, event.area.y, event.area.width,
+ event.area.height)
+ cr.set_line_width(1.0)
+ cr.set_source_rgba (1.0, 0.0, 0.0, 1.0)
+ cr.set_dash (dashes, 0.0)
+ cr.move_to (self.x1 - 0.5, 0.0)
+ cr.line_to (self.x1 - 0.5, event.area.y + event.area.height)
+ cr.move_to (0.0, self.y1 - 0.5)
+ cr.line_to (event.area.x + event.area.width, self.y1 - 0.5)
+ cr.stroke ()
+
+ if self.x1 >= 0:
+ x = min(self.x1, self.x2)
+ y = min(self.y1, self.y2)
+ w = max(self.x1, self.x2) - x
+ h = max(self.y1, self.y2) - y
+ cr.set_dash ([], 0.0)
+ cr.rectangle ( x, y, w, h)
+ cr.fill()
+ cr.set_source_rgba (0.0, 0.0, 0.5, 0.5)
+ cr.rectangle (x + 0.5, y + 0.5, w - 1, h - 1)
+ cr.stroke()
+
+ return False
+
+ def motion_notify_cb(self, widget, event):
+ if widget ==self:
+ self.queue_draw()
+
+ if self.x1 >= 0 :
+ rect = gtk.gdk.Rectangle()
+ rect.x = min(self.x1, min(self.x2, event.x + 1))
+ rect.width = max(self.x1, max(self.x2, event.x + 1)) - rect.x
+ rect.y = min(self.y1, min(self.y2, event.y + 1))
+ rect.height = max(self.y1, max(self.y2, event.y + 1)) - rect.y
+ self.queue_draw_area(rect.x, rect.y, rect.width, rect.height)
+
+ self.x2 = event.x + 1
+ self.y2 = event.y + 1
+
+ return True
+
+ def update_image(self):
+ #self.root.destroy()
+ self.queue_draw()
+ if self.hidden[0]==0 :
+ gc.collect()
+ sroot = self.wroot.get_image(0,0,self.wwidth,self.wheight)
+ self.__subsample__(sroot,self.wwidth,self.wheight,self.root,self.factor)
+ vals=[0,0, self.wwidth, self.wheight]
+ if self.area_return[0]>=0:
+ vals[0]=self.area_return[0]
+ if self.area_return[1]>=0:
+ vals[1]=self.area_return[1]
+ if self.area_return[2]>=0:
+ vals[2]=self.area_return[2]-self.area_return[0]
+ if self.area_return[3]>=0:
+ vals[3]=self.area_return[3]-self.area_return[1]
+ if vals[0] >0 or vals[1] >0 or vals[2] <self.wwidth or vals[3] <self.wheight:
+ if self.selecting==0:
+ self.__draw_lines__(self.root,vals,self.factor)
+ return True
+ def __draw_lines__(self,img,vals,factor):
+ for i in xrange(vals[0]/factor,vals[0]/factor+vals[2]/factor):
+ for k in range(2):
+ img.put_pixel(i,vals[1]/factor+k,0xff0000)
+ img.put_pixel(i,(vals[1]+vals[3]/2-k)/factor,0xff0000)
+ img.put_pixel(i,(vals[1]+vals[3]-1-k)/factor,0xff0000)
+ for i in xrange(vals[1]/factor,vals[1]/factor+vals[3]/factor):
+ for k in range(2):
+ img.put_pixel(vals[0]/factor+k,i,0xff0000)
+ img.put_pixel((vals[0]+vals[2]/2-k)/factor,i,0xff0000)
+ img.put_pixel((vals[0]+vals[2]-1-k)/factor,i,0xff0000)
+
+#area_return=[-1,-1,-1,-1]
+
+#w=GtkThumbSelector(area_return,0)
+#w.show()
+#gtk.main()
+#print area_return
+
+
+
+
© All Rights Reserved