示例#1
0
class CroppedScreen(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="")

        # Create a fullscreen window and add drawing area
        self.fullscreen()
        self.drawing_area = Gtk.DrawingArea()
        self.add(self.drawing_area)

        # Set some variables
        self.draw = False
        self.rect_x = self.rect_width = 0
        self.rect_y = self.rect_height = 0

        # Connect events

        self.drawing_area.connect('draw', self.on_draw)
        self.drawing_area.set_events(Gdk.EventMask.EXPOSURE_MASK |
                                     Gdk.EventMask.BUTTON_PRESS_MASK |
                                     Gdk.EventMask.BUTTON_RELEASE_MASK |
                                     Gdk.EventMask.POINTER_MOTION_MASK)

        self.drawing_area.connect("button-press-event", self.mouse_down)
        self.drawing_area.connect("motion_notify_event", self.mouse_move)
        self.drawing_area.connect("button-release-event", self.mouse_release)
        self.connect("key-press-event", self.key_press)

        # Set mouse cursor type to CROSS/PLUS
        self.set_cursor(Gdk.Cursor(Gdk.CursorType.CROSS))

        # Take full screenshot to show in drawing area
        self.shot = Screenshot()
        self.pixel_buffer = self.shot.take_shot(0, 0, self.shot.full_width,
                                           self.shot.full_height, self.shot.root_window)

    def set_cursor(self, cursor):
        self.get_root_window().set_cursor(cursor)

    def on_draw(self, wid, cr):
        # Draw the full screen shot
        Gdk.cairo_set_source_pixbuf(cr, self.pixel_buffer, 0, 0)
        cr.paint()

        # rectangle overlay
        cr.set_source_rgba(1, 1, 1, 0.1)
        cr.rectangle(0, 0,
                     self.shot.full_width, self.shot.full_height)
        cr.fill()

        # Draw rectangle for current selection
        if self.draw:
            cr.set_source_rgba(0.5, 0.5, 0.5, 0.3)
            cr.rectangle(self.rect_x, self.rect_y,
                         self.rect_width, self.rect_height)
            cr.fill()
        return True

    def mouse_down(self, w, e):
        if e.button == MouseButtons.LEFT_BUTTON:
            self.rect_x = e.x
            self.rect_y = e.y
            self.init_x = e.x
            self.init_y = e.y
            self.draw = True

    def mouse_release(self, w, e):
        if e.button == MouseButtons.LEFT_BUTTON:
            y = e.y
            x = e.x
            self.get_rect(x, y)
            self.draw = False
            self.close()

            # restore the cursor type
            self.set_cursor(Gdk.Cursor(Gdk.CursorType.LEFT_PTR))

    def mouse_move(self, w, e):
        x = e.x
        y = e.y
        if self.draw:
            self.get_rect(x, y)
            self.queue_draw()

    # Calculate rectangle to draw selection
    def get_rect(self, x, y):
        x1 = self.init_x
        y1 = self.init_y
        self.rect_width = abs(x-x1)
        self.rect_height = abs(y-y1)

        if x < x1 and y < y1:
            self.rect_x = x
            self.rect_y = y
        elif x < x1 and y > y1:
            self.rect_x = x
        elif x > x1 and y < y1:
            self.rect_y = y
        else:
            pass

    def key_press(self, widget, event):
        # if Escape -> 65307 is the code
        if event.keyval == 65307:
            self.close()
            self.set_cursor(Gdk.Cursor(Gdk.CursorType.LEFT_PTR))
示例#2
0
    def __init__(self):
        Gtk.Window.__init__(self, title="ScreenEat")
        self.set_position(Gtk.WindowPosition.CENTER_ALWAYS)
        self.set_resizable(False)

        grid = Gtk.Grid(row_homogeneous=False, column_homogeneous=False)
        grid.props.margin_top = 5
        grid.props.margin_right = 5
        grid.props.margin_left = 5
        grid.props.margin_bottom = 5
        self.add(grid)
        self.grid = grid

        # Take shot, considering provided arguments
        shot = Screenshot()
        arguments = sys.argv[1::]

        if "--cropped" in arguments:
            win = CroppedScreen()
            win.connect("delete-event", Gtk.main_quit)
            win.set_modal(True)
            win.set_keep_above(True)
            win.show_all()

            Gdk.threads_enter()
            Gtk.main()
            Gdk.threads_leave()
            # If no rectangle is drawn, no need to get a screenshot
            if (win.rect_width * win.rect_height == 0):
                raise ManualError("No crop rectangle defined. Exiting.")

            buff = win.pixel_buffer
            pixel_buffer = buff.new_subpixbuf(win.rect_x, win.rect_y,
                                              win.rect_width, win.rect_height)
        elif "--active" in arguments:
            pixel_buffer = shot.take_shot(0, 0, shot.active_width,
                                          shot.active_height,
                                          shot.active_window)
        else:
            pixel_buffer = shot.take_shot(0, 0, shot.full_width,
                                          shot.full_height, shot.root_window)

        # save shot for future, if fails then exit
        shot.save_shot(pixel_buffer, "")

        self.filename = shot.filename
        self.url = ""

        # Create image preview
        ratio = pixel_buffer.get_height()/pixel_buffer.get_width()

        if ratio > 1:
            scaled = pixel_buffer.scale_simple(500/ratio, 500,
                                               GdkPixbuf.InterpType.BILINEAR)
        else:
            scaled = pixel_buffer.scale_simple(500, 500*ratio,
                                               GdkPixbuf.InterpType.BILINEAR)

        self.pixel_buffer = pixel_buffer
        image = Gtk.Image().new_from_pixbuf(scaled)
        self.image = image

        # create upload section:
        upload_section = Gtk.Box(spacing=5)
        upload_section.props.margin_top = 5
        self.upload_section = upload_section

        # create buttons for upload section:
        button_upload = Gtk.Button(label="Upload")
        button_upload.connect("clicked", self.upload)
        self.button_upload = button_upload
        upload_section.add(button_upload)

        # create buttons for copy section:
        button_copyurl = Gtk.Button(label="Copy url")
        button_copyurl.connect("clicked", self.copy_url)
        self.button_copyurl = button_copyurl
        upload_section.add(button_copyurl)

        # Create misc section:
        misc_section = Gtk.Box(spacing=5)
        misc_section.props.margin_top = 5
        misc_section.props.halign = Gtk.Align.END

        # Create buttons for misc section
        button_save = Gtk.Button(image=Gtk.Image(stock=Gtk.STOCK_SAVE_AS))
        button_save.set_tooltip_text("Save image (Ctrl+S)")
        button_save.connect("clicked", self.save_image, pixel_buffer)
        misc_section.add(button_save)

        button_copy = Gtk.Button(image=Gtk.Image(stock=Gtk.STOCK_COPY))
        button_copy.set_tooltip_text("Copy image to Clipboard")
        button_copy.connect("clicked", self.copy_image, pixel_buffer)
        misc_section.add(button_copy)

        button_settings =\
            Gtk.Button(image=Gtk.Image(stock=Gtk.STOCK_PREFERENCES))
        button_settings.set_tooltip_text("Settings")
        button_settings.connect("clicked", self.show_config)
        misc_section.add(button_settings)

        # Create notification label
        label_status = Gtk.Label("ScreenEat")
        label_status.set_margin_top(5)
        label_status.set_alignment(xalign=0.5, yalign=0.5)
        label_status.props.width_chars = 24
        self.label_status = label_status

        # attach to grid
        grid.attach(image, 0, 0, 3, 1)
        grid.attach_next_to(upload_section, image,
                            Gtk.PositionType.BOTTOM, 1, 1)
        grid.attach_next_to(label_status, upload_section,
                            Gtk.PositionType.RIGHT, 1, 1)
        grid.attach_next_to(misc_section, label_status,
                            Gtk.PositionType.RIGHT, 1, 1)

        # connect the main window to keypress
        self.connect("key-press-event", self.key_press)
        self.connect("delete-event", Gtk.main_quit)

        self.show_all()

        self.button_copyurl.hide()

        # if automatic upload then start uploading now
        config = ConfigWindow.load_config()
        if (config["automatic-upload"]):
            self.upload(None)