[Goodies-commits] r4896 - in xfce4-screenshooter-plugin/trunk: . panel-plugin

Jerome Guelfucci jeromeg at xfce.org
Fri Jun 6 15:30:44 CEST 2008


Author: jeromeg
Date: 2008-06-06 13:30:44 +0000 (Fri, 06 Jun 2008)
New Revision: 4896

Modified:
   xfce4-screenshooter-plugin/trunk/AUTHORS
   xfce4-screenshooter-plugin/trunk/ChangeLog
   xfce4-screenshooter-plugin/trunk/README
   xfce4-screenshooter-plugin/trunk/configure.ac
   xfce4-screenshooter-plugin/trunk/panel-plugin/screenshooter.c
Log:
Update the code, changes available in changelog.

Modified: xfce4-screenshooter-plugin/trunk/AUTHORS
===================================================================
--- xfce4-screenshooter-plugin/trunk/AUTHORS	2008-06-06 13:00:26 UTC (rev 4895)
+++ xfce4-screenshooter-plugin/trunk/AUTHORS	2008-06-06 13:30:44 UTC (rev 4896)
@@ -1,3 +1,3 @@
 Daniel Bobadilla Leal <dbobadil at dcc.uchile.cl>
 Jani Monoses <jani at ubuntu.com> 
-
+Jérôme Guelfucci <jerome.guelfucci at gmail.com>

Modified: xfce4-screenshooter-plugin/trunk/ChangeLog
===================================================================
--- xfce4-screenshooter-plugin/trunk/ChangeLog	2008-06-06 13:00:26 UTC (rev 4895)
+++ xfce4-screenshooter-plugin/trunk/ChangeLog	2008-06-06 13:30:44 UTC (rev 4896)
@@ -1,3 +1,13 @@
+2008-06-06 15:19 jeromeg
+
+	* panel-plugin/screenshooter.c:
+	  - new behaviour (fullscreen or active window screenshot).
+	  - fix delay
+	  - fix file saving (cancel now works, based on debian patch).
+	  - button made insensitive while screenshot is taken.
+	* configure.ac: added x11-proto-core to build deps.
+	* README: updated.
+	
 2008-05-18 18:25 mmassonnet
 
 	* Fix GCC warnings and bug with delay (Patch from Jérôme Guelfucci)

Modified: xfce4-screenshooter-plugin/trunk/README
===================================================================
--- xfce4-screenshooter-plugin/trunk/README	2008-06-06 13:00:26 UTC (rev 4895)
+++ xfce4-screenshooter-plugin/trunk/README	2008-06-06 13:30:44 UTC (rev 4896)
@@ -1,9 +1,5 @@
-Screenshot XFce4 panel plugin.
+Xfce4-screenshooter-plugin
 
-	A xfce-panel plugin to take screenshots, it's copy^^^similar of gnome-screenshot
-for gnome. I try to maintain a clean code an simple. But improvementns, corrections,
-bug reporting, are welcome.
+	This is a plugin for the Xfce panel to take screenshots, similar to gnome-screenshot. The code is designed to be clean and simple, but improvements, fixes, bug reporting are welcome.
 
-	Since version 1.0.0 the plugin it's compatible with xfce4-panel >= 4.3-svn, with several
-improvements. Thanks to Jani Monoses who ported the plugin to the new structure and 
-added new features.
+	Since version 1.0.0 the plugin is compatible with xfce4-panel >= 4.3-svn, with several improvements. Thanks to Jani Monoses who ported the plugin to the new structure and added new features.

Modified: xfce4-screenshooter-plugin/trunk/configure.ac
===================================================================
--- xfce4-screenshooter-plugin/trunk/configure.ac	2008-06-06 13:00:26 UTC (rev 4895)
+++ xfce4-screenshooter-plugin/trunk/configure.ac	2008-06-06 13:30:44 UTC (rev 4896)
@@ -32,6 +32,9 @@
 dnl configure the panel plugin
 XDT_CHECK_PACKAGE([LIBXFCE4PANEL], [libxfce4panel-1.0], [4.3.22])
 
+dnl check for x11proto
+XDT_CHECK_PACKAGE([X11PROTO_CORE], [xproto], [7])
+
 dnl Translations
 XDT_I18N([ca cs de en_GB eu fr hu nb_NO pl pt_PT sq zh_TW])
 

Modified: xfce4-screenshooter-plugin/trunk/panel-plugin/screenshooter.c
===================================================================
--- xfce4-screenshooter-plugin/trunk/panel-plugin/screenshooter.c	2008-06-06 13:00:26 UTC (rev 4895)
+++ xfce4-screenshooter-plugin/trunk/panel-plugin/screenshooter.c	2008-06-06 13:30:44 UTC (rev 4896)
@@ -1,4 +1,3 @@
-/* vim: set expandtab ts=8 sw=4: */
 /*  $Id$
  *
  *  Copyright © 2004 German Poo-Caaman~o <gpoo at ubiobio.cl>
@@ -39,8 +38,8 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
+#include <X11/Xatom.h>
 
-
 #define SCREENSHOT_ICON_NAME  "applets-screenshooter"
 #define MODE 0644
 
@@ -57,7 +56,6 @@
     gint whole_screen;
     gint ask_for_file;
 
-    gint window_delay;
     gint screenshot_delay;
     gchar *screenshots_dir;
 
@@ -115,81 +113,86 @@
     g_free (sd);
 }
 
-static GdkNativeWindow
-select_window (GdkScreen *screen)
+/* Borrowed from libwnck */
+static Window
+get_window_property (Window  xwindow,
+		     Atom    atom)
 {
-#define MASK (ButtonPressMask | ButtonReleaseMask)
+  Atom type;
+  int format;
+  gulong nitems;
+  gulong bytes_after;
+  Window *w;
+  int err, result;
+  Window retval;
 
-  Display    *x_dpy;
-  Cursor      x_cursor;
-  XEvent      x_event;
-  Window      x_win;
-  Window      x_root;
-  gint        x_scr;
-  gint        status;
-  gint        buttons;
+  gdk_error_trap_push ();
 
-  x_dpy = GDK_SCREEN_XDISPLAY (screen);
-  x_scr = GDK_SCREEN_XNUMBER (screen);
+  type = None;
+  result = XGetWindowProperty (gdk_display,
+			       xwindow,
+			       atom,
+			       0, G_MAXLONG,
+			       False, XA_WINDOW, &type, &format, &nitems,
+			       &bytes_after, (unsigned char **) &w);  
+  err = gdk_error_trap_pop ();
 
-  x_win    = None;
-  x_root   = RootWindow (x_dpy, x_scr);
-  x_cursor = XCreateFontCursor (x_dpy, GDK_CROSSHAIR);
-  buttons  = 0;
-
-  status = XGrabPointer (x_dpy, x_root, False,
-                         MASK, GrabModeSync, GrabModeAsync,
-                         x_root, x_cursor, CurrentTime);
-
-  if (status != GrabSuccess)
+  if (err != Success ||
+      result != Success)
+    return None;
+  
+  if (type != XA_WINDOW)
     {
-      g_message (_("Error grabbing the pointer %d"), status);
-      return 0;
+      XFree (w);
+      return None;
     }
 
-  while ((x_win == None) || (buttons != 0))
-    {
-      XAllowEvents (x_dpy, SyncPointer, CurrentTime);
-      XWindowEvent (x_dpy, x_root, MASK, &x_event);
+  retval = *w;
+  XFree (w);
+  
+  return retval;
+}
 
-      switch (x_event.type)
-        {
-        case ButtonPress:
-          if (x_win == None)
-            {
-              x_win = x_event.xbutton.subwindow;
-              if (x_win == None)
-                x_win = x_root;
-            }
-          buttons++;
-          break;
+/* Borrowed from gnome-screenshot */
+static Window
+screenshot_find_active_window (void)
+{
+  Window retval = None;
+  Window root_window;
 
-        case ButtonRelease:
-          if (buttons > 0)
-            buttons--;
-          break;
+  root_window = GDK_ROOT_WINDOW ();
 
-        default:
-          g_assert_not_reached ();
-        }
+  if (gdk_net_wm_supports (gdk_atom_intern ("_NET_ACTIVE_WINDOW", FALSE)))
+    {
+      retval = get_window_property (root_window,
+				    gdk_x11_get_xatom_by_name ("_NET_ACTIVE_WINDOW"));
     }
 
-  XUngrabPointer (x_dpy, CurrentTime);
-  XFreeCursor (x_dpy, x_cursor);
-
-  return x_win;
+  return retval;  
 }
 
-static gboolean
-delay_callback (gpointer data)
+/* Borrowed from gnome-screenshot */
+static Window
+find_toplevel_window (Window xid)
 {
-    gint *left = data;
+  Window root, parent, *children;
+  unsigned int nchildren;
 
-    (*left)--;
-    if (!*left)
-        gtk_main_quit();
+  do
+    {
+      if (XQueryTree (GDK_DISPLAY (), xid, &root,
+		      &parent, &children, &nchildren) == 0)
+	{
+	  g_warning ("Couldn't find window manager window");
+	  return None;
+	}
 
-    return *left;
+      if (root == parent)
+	return xid;
+
+      xid = parent;
+    }
+  while (TRUE);
 }
 
 gchar *generate_filename_for_uri(char *uri){
@@ -199,59 +202,48 @@
     if(uri == NULL)
         return NULL;
     file_name = g_strdup ("Screenshot.png");
-    if((test=open(file_name,O_RDWR,MODE))==-1)
-    if((test=open(g_build_filename(uri, file_name, NULL),O_RDWR,MODE))==-1) {
+    if((test=open(g_build_filename(uri, file_name, NULL),O_RDWR,MODE))==-1) 
+    {
         return file_name;
     }
-    do{
+    do
+    {
         i++;
         g_free (file_name);
         file_name = g_strdup_printf ("Screenshot-%d.png",i);
     }
     while((test=open(g_build_filename(uri, file_name, NULL),O_RDWR,MODE))!=-1);
     return file_name;
-
-
 }
 
-
 static void
 button_clicked(GtkWidget * button,  ScreenshotData * sd)
 {
     GdkPixbuf * screenshot;
     GdkPixbuf * thumbnail;
     GdkWindow * window;
-    GdkNativeWindow nwindow;
-    gint delay;
-
     gint width;
     gint height;
     gint dialog_response;
-
     gchar * filename = NULL;
 
-    if (sd->whole_screen) {
-        window = gdk_get_default_root_window();
-    } else {
-        if (delay == sd->window_delay) {
-            g_timeout_add(1000, delay_callback, &delay);
-            gtk_main();
-        }
-        nwindow = select_window(gdk_screen_get_default());
-        if (nwindow) {
-            window = gdk_window_foreign_new(nwindow);
-        } else {
-            window = gdk_get_default_root_window();
-        }
+    if (sd->whole_screen)
+    {
+       window = gdk_get_default_root_window();
+    } 
+    else 
+    {
+       window = gdk_window_foreign_new (find_toplevel_window (screenshot_find_active_window ()));
     }
 
+    /* delay, we make the button unclickable so that no other screenshot 
+       can be taken at the same time */
+    gtk_widget_set_sensitive(GTK_WIDGET (sd->button), FALSE);
+    sleep( sd->screenshot_delay);
+    gtk_widget_set_sensitive(GTK_WIDGET ( sd->button), TRUE);
+
     gdk_drawable_get_size(window, &width, &height);
 
-    if (delay == sd->screenshot_delay) {
-        g_timeout_add(1000, delay_callback, &delay);
-        gtk_main();
-    }
-
     screenshot = gdk_pixbuf_get_from_drawable (NULL,
 					       window,
 					       NULL, 0, 0, 0, 0,
@@ -263,26 +255,27 @@
 
     gtk_image_set_from_pixbuf (GTK_IMAGE (sd->preview), thumbnail);
     g_object_unref (thumbnail);
-      filename = generate_filename_for_uri (xfce_file_chooser_get_current_folder(XFCE_FILE_CHOOSER (sd->chooser)));
-
-    if (sd->ask_for_file && filename)
+    
+    filename = generate_filename_for_uri (xfce_file_chooser_get_current_folder(XFCE_FILE_CHOOSER (sd->chooser)));  
+    
+    if (sd->ask_for_file)
     {
-        gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (sd->chooser), filename);
-
-        dialog_response = gtk_dialog_run (GTK_DIALOG (sd->chooser));       
-         if (dialog_response == GTK_RESPONSE_ACCEPT)
-        {
+      gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (sd->chooser), filename);
+      dialog_response = gtk_dialog_run (GTK_DIALOG (sd->chooser));
+      
+      if ( dialog_response == GTK_RESPONSE_ACCEPT )
+      {
         filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(sd->chooser));
-        }
-        gtk_widget_hide (GTK_WIDGET (sd->chooser));
+        gdk_pixbuf_save (screenshot, filename, "png", NULL, NULL);
+       }
+      
+      gtk_widget_hide ( GTK_WIDGET (sd->chooser) );
+    }  
+    else
+    {    
+       gdk_pixbuf_save (screenshot, filename, "png", NULL, NULL);
     }
-
-    if (filename) 
-    {
-        if (!(sd->ask_for_file) || dialog_response == GTK_RESPONSE_ACCEPT)
-                gdk_pixbuf_save (screenshot, filename, "png", NULL, NULL);g_free (filename);
-        g_free(filename);
-    }
+    g_free (filename);
 }
 
 static void
@@ -298,7 +291,6 @@
     char *file;
     XfceRc *rc;
     gint screenshot_delay = 2;
-    gint window_delay = 2;
     gint whole_screen = 1;
     gint ask_for_file = 1;
 
@@ -310,7 +302,6 @@
         if (rc != NULL)
         {
             screenshot_delay = xfce_rc_read_int_entry (rc, "screenshot_delay", 2);
-            window_delay = xfce_rc_read_int_entry (rc, "window_delay", 2);
             whole_screen = xfce_rc_read_int_entry (rc, "whole_screen", 1);
             ask_for_file = xfce_rc_read_int_entry (rc, "ask_for_file", 1);
 
@@ -319,7 +310,6 @@
     }
 
     screenshot->screenshot_delay = screenshot_delay;
-    screenshot->window_delay = window_delay;
     screenshot->whole_screen = whole_screen;
     screenshot->ask_for_file = ask_for_file;
 }
@@ -340,7 +330,6 @@
         return;
 
     xfce_rc_write_int_entry (rc, "screenshot_delay", screenshot->screenshot_delay);
-    xfce_rc_write_int_entry (rc, "window_delay", screenshot->window_delay);
     xfce_rc_write_int_entry (rc, "whole_screen", screenshot->whole_screen);
     xfce_rc_write_int_entry (rc, "ask_for_file", screenshot->ask_for_file);
 
@@ -360,12 +349,6 @@
 }
 
 static void
-window_delay_spinner_changed(GtkWidget * spinner, ScreenshotData *sd)
-{
-    sd->window_delay = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spinner));
-}
-
-static void
 screenshot_delay_spinner_changed(GtkWidget * spinner, ScreenshotData *sd)
 {
     sd->screenshot_delay = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spinner));
@@ -385,8 +368,8 @@
 static void
 screenshot_properties_dialog (XfcePanelPlugin *plugin, ScreenshotData *sd)
 {
-    GtkWidget *dlg, *header, *vbox, *hbox1, *hbox2, *label1, *label2, *cb1, *cb2;
-    GtkWidget *window_delay_spinner, *screenshot_delay_spinner;
+    GtkWidget *dlg, *header, *vbox, *hbox2, *label2, *cb1, *cb2;
+    GtkWidget *screenshot_delay_spinner;
 
     xfce_panel_plugin_block_menu (plugin);
 
@@ -427,31 +410,14 @@
     g_signal_connect (cb1, "toggled", G_CALLBACK (ask_for_file_toggled),
                       sd);
 
-    cb2 = gtk_check_button_new_with_mnemonic (_("Always take shot of the whole screen"));
+    cb2 = gtk_check_button_new_with_mnemonic (_("Take a screenshot of the whole screen"));
     gtk_widget_show (cb2);
     gtk_box_pack_start (GTK_BOX (vbox), cb2, FALSE, FALSE, 0);
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb2),
                                   sd->whole_screen);
     g_signal_connect (cb2, "toggled", G_CALLBACK (whole_screen_toggled),
                       sd);
-
-    /* Window selection delay */
-    hbox1 = gtk_hbox_new(FALSE, 8);
-    gtk_widget_show(hbox1);
-    gtk_box_pack_start (GTK_BOX (vbox), hbox1, FALSE, FALSE, 0);
-
-    window_delay_spinner = gtk_spin_button_new_with_range(0.0, 60.0, 1.0);
-    gtk_spin_button_set_value(GTK_SPIN_BUTTON(window_delay_spinner), sd->window_delay);
-    gtk_widget_show(window_delay_spinner);
-    gtk_box_pack_start (GTK_BOX (hbox1), window_delay_spinner, FALSE, FALSE, 0);
-
-    label1 = gtk_label_new_with_mnemonic(_("Window selection delay"));
-    gtk_widget_show(label1);
-    gtk_box_pack_start (GTK_BOX (hbox1), label1, FALSE, FALSE, 0);
-
-    g_signal_connect(window_delay_spinner, "value-changed",
-                        G_CALLBACK(window_delay_spinner_changed), sd);
-
+    
     /* Screenshot delay */
     hbox2 = gtk_hbox_new(FALSE, 8);
     gtk_widget_show(hbox2);
@@ -462,7 +428,7 @@
     gtk_widget_show(screenshot_delay_spinner);
     gtk_box_pack_start (GTK_BOX (hbox2), screenshot_delay_spinner, FALSE, FALSE, 0);
 
-    label2 = gtk_label_new_with_mnemonic(_("Screenshot delay"));
+    label2 = gtk_label_new_with_mnemonic(_("Delay before taking screenshot"));
     gtk_widget_show(label2);
     gtk_box_pack_start (GTK_BOX (hbox2), label2, FALSE, FALSE, 0);
 




More information about the Goodies-commits mailing list