From d5df895a766896235d612be04a185b5fb6fc556a Mon Sep 17 00:00:00 2001 From: Jerome Guelfucci <jeromeg@xfce.org> Date: Fri, 1 May 2009 08:22:48 +0000 Subject: [PATCH] 2009-05-01 jeromeg This still needs a lot of polishment, but let's make things public. * src/Makefile.am, panel-plugin/Makefile.am: change the linking order. * lib/screenshooter-zimagez.c: - (warn_if_fault_occurred) to warn if an error occured during the XML transaction. - (screenshooter_upload_to_zimagez) to upload the screenshot. Still needs a lot of polish, but at least it works. * TODO: updated. 2009-04-19 jeromeg * src/main.c: - sort the CLI options by alphabetical order. - add an upload CLI option. - add some G_LIKELY and G_UNLIKELY macros. * lib/screenshooter-actions.c: - add some G_LIKELY and G_UNLIKELY macros. - call the upload function when the user requested it. * lib/screenshooter-utils.{c,h}: add a (rot13) function to encode the password before sending it. * lib/screenshooter-zimagez.{c,h}: two new files to support the upload of screenshots to ZimageZ.com, a free Web hosting solution. * lib/screenshooter-global.h: add the upload option. * lib/Makefile.am: add the two new files to the source. * configure.ac.in: check for xmlrpc-c, this is a bit uggly, but xmlrpc-c does not provide a .pc file... (Old svn revision: 7299) --- ChangeLog | 30 +++ TODO | 4 + configure.ac.in | 23 ++- lib/Makefile.am | 9 +- lib/screenshooter-actions.c | 59 +++--- lib/screenshooter-actions.h | 1 + lib/screenshooter-global.h | 1 + lib/screenshooter-utils.c | 19 +- lib/screenshooter-utils.h | 3 + lib/screenshooter-zimagez.c | 380 ++++++++++++++++++++++++++++++++++++ lib/screenshooter-zimagez.h | 38 ++++ panel-plugin/Makefile.am | 12 +- src/Makefile.am | 11 +- src/main.c | 108 ++++++---- 14 files changed, 613 insertions(+), 85 deletions(-) create mode 100644 lib/screenshooter-zimagez.c create mode 100644 lib/screenshooter-zimagez.h diff --git a/ChangeLog b/ChangeLog index b900784d..30782a12 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,33 @@ +2009-05-01 jeromeg + + This still needs a lot of polishment, but let's make things public. + + * src/Makefile.am, panel-plugin/Makefile.am: change the linking order. + * lib/screenshooter-zimagez.c: + - (warn_if_fault_occurred) to warn if an error occured during the XML + transaction. + - (screenshooter_upload_to_zimagez) to upload the screenshot. Still needs + a lot of polish, but at least it works. + * TODO: updated. + +2009-04-19 jeromeg + + * src/main.c: + - sort the CLI options by alphabetical order. + - add an upload CLI option. + - add some G_LIKELY and G_UNLIKELY macros. + * lib/screenshooter-actions.c: + - add some G_LIKELY and G_UNLIKELY macros. + - call the upload function when the user requested it. + * lib/screenshooter-utils.{c,h}: add a (rot13) function to encode the + password before sending it. + * lib/screenshooter-zimagez.{c,h}: two new files to support the upload + of screenshots to ZimageZ.com, a free Web hosting solution. + * lib/screenshooter-global.h: add the upload option. + * lib/Makefile.am: add the two new files to the source. + * configure.ac.in: check for xmlrpc-c, this is a bit uggly, but xmlrpc-c + does not provide a .pc file... + 2009-04-18 jeromeg * lib/screenshooter-utils.c: start to add G_LIKELY and G_UNLIKELY macros. diff --git a/TODO b/TODO index 20f56ab3..5c00228a 100644 --- a/TODO +++ b/TODO @@ -2,6 +2,10 @@ as in thunar and xfdesktop. * Check for leaks using valgrind. * Use Xshape to have a transparent background in the generated screenshots. +* Remove every call to xfce_err with a gtk_message_dialog. +* the Zimagez code needs a lot of error checking. +* The login dialog is uggly. +* the upload adress is only passed in the debug statements at the moment. Low priority: * Try to get borders captured with compiz. diff --git a/configure.ac.in b/configure.ac.in index 2902f594..d62cc66b 100644 --- a/configure.ac.in +++ b/configure.ac.in @@ -57,6 +57,28 @@ XDT_CHECK_PACKAGE([GTHREAD], [gthread-2.0], [2.6.0]) XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [2.12.0]) XDT_CHECK_PACKAGE([GLIB], [glib-2.0], [2.16.0]) +dnl ************************** +dnl *** Check for xmlrpc-c *** +dnl ************************** + +XMLRPC_LIBS="" +XMLRPC_CFLAGS="" +AC_PATH_PROG([XMLRPC_CONFIG], [xmlrpc-c-config], [no]) +if test x"$XMLRPC_CONFIG" != x"no"; then + AC_MSG_CHECKING([XMLRPC_CFLAGS]) + XMLRPC_CFLAGS="`$XMLRPC_CONFIG --cflags client`" + AC_MSG_RESULT([$XMLRPC_CFLAGS]) + + AC_MSG_CHECKING([XMLRPC_LIBS]) + XMLRPC_LIBS="`$XMLRPC_CONFIG --libs client`" + AC_MSG_RESULT([$XMLRPC_LIBS]) + + AC_SUBST([XMLRPC_CFLAGS]) + AC_SUBST([XMLRPC_LIBS]) +else + AC_MSG_ERROR(Xmlrpc was not found on your system.) +fi + dnl ************************** dnl *** Check for xsltproc *** dnl ************************** @@ -81,7 +103,6 @@ if test x"$enable_xml2po" = x"yes"; then fi AM_CONDITIONAL([ENABLE_XML2PO], [test x"$enable_xml2po" = x"yes"]) - dnl ****************************** dnl *** Check for i18n support *** dnl ****************************** diff --git a/lib/Makefile.am b/lib/Makefile.am index b071cad7..a6a27aa6 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -7,18 +7,21 @@ libscreenshooter_la_SOURCES = \ screenshooter-utils.c screenshooter-utils.h \ screenshooter-capture.c screenshooter-capture.h \ screenshooter-dialogs.c screenshooter-dialogs.h \ - screenshooter-actions.c screenshooter-actions.h + screenshooter-actions.c screenshooter-actions.h \ + screenshooter-zimagez.c screenshooter-zimagez.h libscreenshooter_la_CFLAGS = \ -I$(top_srcdir) \ + $(XMLRPC_CFLAGS) \ @GTK_CFLAGS@ \ @GLIB_CFLAGS@ \ @LIBXFCE4UTIL_CFLAGS@ \ @LIBXFCEGUI4_CFLAGS@ \ - -DPACKAGE_LOCALE_DIR=\"$(localedir)\" + -DPACKAGE_LOCALE_DIR=\"$(localedir)\" libscreenshooter_la_LIBADD = \ + $(XMLRPC_LIBS) -lxmlrpc_client\ @GTK_LIBS@ \ @LIBXFCE4UTIL_LIBS@ \ @LIBXFCEGUI4_LIBS@ \ - @GLIB_LIBS@ + @GLIB_LIBS@ diff --git a/lib/screenshooter-actions.c b/lib/screenshooter-actions.c index b086930e..1aec049c 100644 --- a/lib/screenshooter-actions.c +++ b/lib/screenshooter-actions.c @@ -24,43 +24,50 @@ void screenshooter_take_and_output_screenshot (ScreenshotData *sd) GdkPixbuf *screenshot = screenshooter_take_screenshot (sd->region, sd->delay, sd->show_mouse); - if (screenshot != NULL) + g_return_if_fail (screenshot != NULL); + + if (sd->action == SAVE) { - if (sd->action == SAVE) + if (sd->screenshot_dir == NULL) { - if (sd->screenshot_dir == NULL) - { - sd->screenshot_dir = screenshooter_get_home_uri (); - } - - screenshooter_save_screenshot (screenshot, - sd->show_save_dialog, - sd->screenshot_dir); - } - else if (sd->action == CLIPBOARD) - { - screenshooter_copy_to_clipboard (screenshot); + sd->screenshot_dir = screenshooter_get_home_uri (); } - else - { - GFile *temp_dir = g_file_new_for_path (g_get_tmp_dir ()); - gchar *temp_dir_uri = g_file_get_uri (temp_dir); - gchar *screenshot_path = - screenshooter_save_screenshot (screenshot, FALSE, temp_dir_uri); - if (screenshot_path != NULL) + screenshooter_save_screenshot (screenshot, + sd->show_save_dialog, + sd->screenshot_dir); + } + else if (sd->action == CLIPBOARD) + { + screenshooter_copy_to_clipboard (screenshot); + } + else + { + GFile *temp_dir = g_file_new_for_path (g_get_tmp_dir ()); + gchar *temp_dir_uri = g_file_get_uri (temp_dir); + gchar *screenshot_path = + screenshooter_save_screenshot (screenshot, FALSE, temp_dir_uri); + + if (screenshot_path != NULL) + { + if (sd->action == OPEN) { screenshooter_open_screenshot (screenshot_path, sd->app); - g_free (screenshot_path); + } + else + { + screenshooter_upload_to_zimagez (screenshot_path); } - g_free (temp_dir_uri); - - g_object_unref (temp_dir); + g_free (screenshot_path); } - g_object_unref (screenshot); + g_free (temp_dir_uri); + g_object_unref (temp_dir); } + g_object_unref (screenshot); + + } diff --git a/lib/screenshooter-actions.h b/lib/screenshooter-actions.h index b7f052fc..d5168e16 100644 --- a/lib/screenshooter-actions.h +++ b/lib/screenshooter-actions.h @@ -24,6 +24,7 @@ #include "screenshooter-capture.h" #include "screenshooter-global.h" #include "screenshooter-dialogs.h" +#include "screenshooter-zimagez.h" void screenshooter_take_and_output_screenshot (ScreenshotData *sd); diff --git a/lib/screenshooter-global.h b/lib/screenshooter-global.h index efad1d37..a917024d 100644 --- a/lib/screenshooter-global.h +++ b/lib/screenshooter-global.h @@ -32,6 +32,7 @@ enum { SAVE, CLIPBOARD, OPEN, + UPLOAD, }; diff --git a/lib/screenshooter-utils.c b/lib/screenshooter-utils.c index 4c456e6f..e4f468b1 100644 --- a/lib/screenshooter-utils.c +++ b/lib/screenshooter-utils.c @@ -185,8 +185,7 @@ screenshooter_open_screenshot (gchar *screenshot_path, gchar *application) -gchar -*screenshooter_get_home_uri () +gchar *screenshooter_get_home_uri () { gchar *result = NULL; const gchar *home_path = g_getenv ("HOME"); @@ -212,3 +211,19 @@ gboolean screenshooter_is_remote_uri (const gchar *uri) return FALSE; } + + + +gchar *rot13 (gchar *string) +{ + gchar *result = string; + + for (; *string; string++) + if (*string >= 'a' && *string <= 'z') + *string = (*string - 'a' + 13) % 26 + 'a'; + else if (*string >= 'A' && *string <= 'Z') + *string = (*string - 'A' + 13) % 26 + 'A'; + + return result; +} + diff --git a/lib/screenshooter-utils.h b/lib/screenshooter-utils.h index c5f79185..ebf89c0d 100644 --- a/lib/screenshooter-utils.h +++ b/lib/screenshooter-utils.h @@ -55,4 +55,7 @@ gchar gboolean screenshooter_is_remote_uri (const gchar *uri); +gchar +*rot13 (gchar *string); + #endif diff --git a/lib/screenshooter-zimagez.c b/lib/screenshooter-zimagez.c new file mode 100644 index 00000000..b6f89a00 --- /dev/null +++ b/lib/screenshooter-zimagez.c @@ -0,0 +1,380 @@ +/* $Id$ + * + * Copyright © 2009 Jérôme Guelfucci <jerome.guelfucci@gmail.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * */ + + +/* XML-RPC API for ZimageZ.com */ + +/* URL of the API: http://www.zimagez.com/apiXml.php + + xmlrpcLogin: Takes the user name and the password (encrypted using rot13 and + reversed using g_strrev. + Returns a string containing the ID for the user session if the couple was correct. + Returns a boolean set to FALSE if the couple was wrong. + + xmlrpcLogout: destroys the current user session. + + xmlrpcUpload: Takes the file content encoded in base64, the name of the file, + the title of the picture, a comment and the user session ID. + Returns the name of the file on the website if the upload was succesful. + Returns a boolean set to FALSE if the upload failed. + + If the returned name is "wii0". The URLs will be: + * http://www.zimagez.com/zimage/wii0.php for the image. + * http://www.zimagez.com/miniature/wii0.jpg for the thumbnail. + * http://www.zimagez.com/avatar/wii0.jpg for the avatar. + +*/ + +#include "screenshooter-zimagez.h" + + + +static gboolean +warn_if_fault_occurred (xmlrpc_env * const envP); + + + +/* Private */ + + + +gboolean warn_if_fault_occurred (xmlrpc_env * const envP) +{ + gboolean error_occured = FALSE; + + if (envP->fault_occurred) + { + TRACE ("An error occured during the XML transaction %s, %d", + envP->fault_string, envP->fault_code ); + + xfce_err (_("An error occurred during the XML exchange: %s (%d).\n The screenshot " + "could not be uploaded."), + envP->fault_string, envP->fault_code ); + + error_occured = TRUE; + } + + return error_occured; +} + + + +/* Public */ + + + +gboolean screenshooter_upload_to_zimagez (const gchar *image_path) +{ + xmlrpc_env env; + xmlrpc_value *resultP; + + const gchar * const serverurl = "http://www.zimagez.com/apiXml.php"; + const gchar * const method_login = "apiXml.xmlrpcLogin"; + const gchar * const method_logout = "apiXml.xmlrpcLogout"; + const gchar * const method_upload = "apiXml.xmlrpcUpload"; + + gchar *data; + gchar *password = NULL; + const gchar *user; + const gchar *title; + const gchar *comment; + const gchar *encoded_data; + const gchar *encoded_password; + const gchar *file_name = g_path_get_basename (image_path); + const gchar *online_file_name; + const gchar *login_response; + gsize data_length; + + GtkWidget *dialog; + GtkWidget *information_label; + GtkWidget *user_hbox, *password_hbox, *title_hbox, *comment_hbox; + GtkWidget *user_entry, *password_entry, *title_entry, *comment_entry; + GtkWidget *user_label, *password_label, *title_label, *comment_label; + + /* Get the user information */ + /* Create the information dialog */ + dialog = + xfce_titled_dialog_new_with_buttons (_("Details about the screenshot for ZimageZ©"), + NULL, + GTK_DIALOG_NO_SEPARATOR, + GTK_STOCK_OK, + GTK_RESPONSE_OK, + NULL); + + gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER); + gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), 20); + gtk_box_set_spacing (GTK_BOX (GTK_DIALOG(dialog)->vbox), 12); + + gtk_window_set_icon_name (GTK_WINDOW (dialog), "gtk-info"); + + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); + + /* Create the information label */ + + information_label = + gtk_label_new (_("Please file the following fields with your ZimageZ© user name and " + "password.")); + + /* Create the user box */ + + user_hbox = gtk_hbox_new (FALSE, 6); + + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), user_hbox); + + /* Create the user label */ + user_label = gtk_label_new (_("User:")); + + gtk_container_add (GTK_CONTAINER (user_hbox), user_label); + + /* Create the user entry */ + user_entry = gtk_entry_new (); + + gtk_container_add (GTK_CONTAINER (user_hbox), user_entry); + + /* Create the password box */ + + password_hbox = gtk_hbox_new (FALSE, 6); + + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), password_hbox); + + /* Create the password label */ + password_label = gtk_label_new (_("Password:")); + + gtk_container_add (GTK_CONTAINER (password_hbox), password_label); + + /* Create the password entry */ + password_entry = gtk_entry_new (); + + gtk_entry_set_visibility (GTK_ENTRY (password_entry), FALSE); + + gtk_container_add (GTK_CONTAINER (password_hbox), password_entry); + + /* Create the title box */ + + title_hbox = gtk_hbox_new (FALSE, 6); + + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), title_hbox); + + /* Create the title label */ + title_label = gtk_label_new (_("Title:")); + + gtk_container_add (GTK_CONTAINER (title_hbox), title_label); + + /* Create the title entry */ + title_entry = gtk_entry_new (); + + gtk_container_add (GTK_CONTAINER (title_hbox), title_entry); + + /* Create the comment box */ + + comment_hbox = gtk_hbox_new (FALSE, 6); + + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), comment_hbox); + + /* Create the comment label */ + comment_label = gtk_label_new (_("Comment:")); + + gtk_container_add (GTK_CONTAINER (comment_hbox), comment_label); + + /* Create the comment entry */ + comment_entry = gtk_entry_new (); + + gtk_container_add (GTK_CONTAINER (comment_hbox), comment_entry); + + /* Show the dialog */ + + gtk_widget_show_all (GTK_DIALOG(dialog)->vbox); + + gtk_dialog_run (GTK_DIALOG (dialog)); + + user = g_strdup (gtk_entry_get_text (GTK_ENTRY (user_entry))); + password = g_strdup (gtk_entry_get_text (GTK_ENTRY (password_entry))); + title = g_strdup (gtk_entry_get_text (GTK_ENTRY (title_entry))); + comment = g_strdup (gtk_entry_get_text (GTK_ENTRY (comment_entry))); + + gtk_widget_destroy (dialog); + + while (gtk_events_pending ()) + gtk_main_iteration_do (FALSE); + + encoded_password = g_strreverse (rot13 (password)); + + TRACE ("User: %s Password: %s", user, encoded_password); + + /* Get the contents of the image file and encode it to base64 */ + g_file_get_contents (image_path, &data, &data_length, NULL); + + encoded_data = g_base64_encode ((guchar*)data, data_length); + + g_free (data); + + /* Start the user session */ + + TRACE ("Initiate the RPC environment"); + xmlrpc_env_init(&env); + + TRACE ("Initiate the RPC client"); + xmlrpc_client_init2 (&env, XMLRPC_CLIENT_NO_FLAGS, PACKAGE_NAME, PACKAGE_VERSION, + NULL, 0); + + if (warn_if_fault_occurred (&env)) + { + xmlrpc_env_clean (&env); + xmlrpc_client_cleanup (); + + g_free (password); + + return FALSE; + } + + /* Start the user session */ + TRACE ("Call the login method"); + + resultP = xmlrpc_client_call (&env, serverurl, method_login, + "(ss)", user, encoded_password); + + g_free (password); + + if (warn_if_fault_occurred (&env)) + { + xmlrpc_env_clean (&env); + xmlrpc_client_cleanup (); + + return FALSE; + } + + TRACE ("Read the login response"); + + /* If the response is a boolean, there was an error */ + if (xmlrpc_value_type (resultP) == XMLRPC_TYPE_BOOL) + { + xmlrpc_bool response; + + xmlrpc_read_bool (&env, resultP, &response); + + if (warn_if_fault_occurred (&env)) + { + xmlrpc_env_clean (&env); + xmlrpc_client_cleanup (); + + return FALSE; + } + + if (!response) + { + xfce_err (_("The username or the password you gave is incorrect.")); + + TRACE ("Incorrect password/login"); + + xmlrpc_env_clean (&env); + xmlrpc_client_cleanup (); + + return FALSE; + } + } + /* Else we read the string response to get the session ID */ + else + { + TRACE ("Read the session ID"); + xmlrpc_read_string (&env, resultP, (const gchar ** const)&login_response); + + if (warn_if_fault_occurred (&env)) + { + xmlrpc_env_clean (&env); + xmlrpc_client_cleanup (); + + return FALSE; + } + } + + xmlrpc_DECREF (resultP); + + TRACE ("Call the upload method"); + resultP = xmlrpc_client_call (&env, serverurl, method_upload, + "(sssss)", encoded_data, file_name, title, comment, + login_response); + + if (warn_if_fault_occurred (&env)) + { + xmlrpc_env_clean (&env); + xmlrpc_client_cleanup (); + + return FALSE; + } + + /* If the response is a boolean, there was an error */ + if (xmlrpc_value_type (resultP) == XMLRPC_TYPE_BOOL) + { + xmlrpc_bool response; + + xmlrpc_read_bool (&env, resultP, &response); + + if (warn_if_fault_occurred (&env)) + { + xmlrpc_env_clean (&env); + xmlrpc_client_cleanup (); + + return FALSE; + } + + if (!response) + { + xfce_err (_("An error occurred while uploading the screenshot.")); + + TRACE ("Error while uploading the screenshot."); + + xmlrpc_env_clean (&env); + xmlrpc_client_cleanup (); + + return FALSE; + } + } + /* Else we get the file name */ + else + { + xmlrpc_read_string (&env, resultP, (const char **)&online_file_name); + + TRACE ("The screenshot has been uploaded, get the file name."); + + if (warn_if_fault_occurred (&env)) + { + xmlrpc_env_clean (&env); + xmlrpc_client_cleanup (); + + return FALSE; + } + + TRACE (_("The screenshot was uploaded to http://www.zimagez.com/zimage/%s.php"), + online_file_name); + } + + xmlrpc_DECREF (resultP); + + /* End the user session */ + + TRACE ("Closing the user session"); + + xmlrpc_client_call (&env, serverurl, method_logout, "(s)", login_response); + + TRACE ("Cleanup the XMLRPC session"); + xmlrpc_env_clean (&env); + xmlrpc_client_cleanup (); + + return TRUE; +} diff --git a/lib/screenshooter-zimagez.h b/lib/screenshooter-zimagez.h new file mode 100644 index 00000000..83cb0732 --- /dev/null +++ b/lib/screenshooter-zimagez.h @@ -0,0 +1,38 @@ +/* $Id$ + * + * Copyright © 2009 Jérôme Guelfucci <jerome.guelfucci@gmail.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * */ + +#ifndef __HAVE_ZIMAGEZ_H__ +#define __HAVE_ZIMAGEZ_H__ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <glib.h> +#include <glib/gstdio.h> + +#include <xmlrpc-c/base.h> +#include <xmlrpc-c/client.h> + +#include "screenshooter-utils.h" + + +gboolean screenshooter_upload_to_zimagez (const gchar *image_path); + +#endif diff --git a/panel-plugin/Makefile.am b/panel-plugin/Makefile.am index f2139374..99163e84 100644 --- a/panel-plugin/Makefile.am +++ b/panel-plugin/Makefile.am @@ -1,19 +1,19 @@ plugindir = $(libexecdir)/xfce4/panel-plugins plugin_PROGRAMS = xfce4-screenshooter-plugin -xfce4_screenshooter_plugin_CFLAGS = \ - -DPACKAGE_LOCALE_DIR=\"$(localedir)\" \ - -I$(top_srcdir) \ - -I$(top_srcdir)/lib \ +xfce4_screenshooter_plugin_CFLAGS = \ + -DPACKAGE_LOCALE_DIR=\"$(localedir)\" \ + -I$(top_srcdir) \ + -I$(top_srcdir)/lib \ @LIBXFCE4PANEL_CFLAGS@ \ @GTHREAD_CFLAGS@ -xfce4_screenshooter_plugin_LDFLAGS = \ +xfce4_screenshooter_plugin_LDFLAGS = \ @LIBXFCE4PANEL_LIBS@ \ @GTHREAD_LIBS@ \ $(top_builddir)/lib/libscreenshooter.la -xfce4_screenshooter_plugin_SOURCES = \ +xfce4_screenshooter_plugin_SOURCES = \ screenshooter-plugin.c # .desktop file diff --git a/src/Makefile.am b/src/Makefile.am index 09be1b50..4d964238 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,21 +1,22 @@ bin_PROGRAMS = xfce4-screenshooter xfce4_screenshooter_CFLAGS = \ + -I$(top_srcdir)/lib \ @GTK_CFLAGS@ \ @GLIB_CFLAGS@ \ @LIBXFCE4UTIL_CFLAGS@ \ @LIBXFCEGUI4_CFLAGS@ \ @GTHREAD_CFLAGS@ \ - -DPACKAGE_LOCALE_DIR=\"$(localedir)\" \ - -I$(top_srcdir)/lib + -DPACKAGE_LOCALE_DIR=\"$(localedir)\" -xfce4_screenshooter_LDFLAGS = \ +xfce4_screenshooter_LDFLAGS = \ + $(top_builddir)/lib/libscreenshooter.la \ @GTK_LIBS@ \ @GLIB_LIBS@ \ @GTHREAD_LIBS@ \ @LIBXFCE4UTIL_LIBS@ \ - @LIBXFCEGUI4_LIBS@ \ - $(top_builddir)/lib/libscreenshooter.la + @LIBXFCEGUI4_LIBS@ + xfce4_screenshooter_SOURCES = \ main.c diff --git a/src/main.c b/src/main.c index c3376272..b6632c45 100644 --- a/src/main.c +++ b/src/main.c @@ -32,6 +32,7 @@ gboolean region = FALSE; gboolean fullscreen = FALSE; gboolean no_save_dialog = FALSE; gboolean hide_mouse = FALSE; +gboolean upload = FALSE; gchar *screenshot_dir; gchar *application; gint delay = 0; @@ -41,45 +42,63 @@ gint delay = 0; /* Set cli options. */ static GOptionEntry entries[] = { - { "version", 'V', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &version, - N_("Version information"), - NULL - }, - { "window", 'w', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &window, - N_("Take a screenshot of the active window"), - NULL - }, - { "fullscreen", 'f', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &fullscreen, - N_("Take a screenshot of the entire screen"), - NULL - }, - { "region", 'r', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, ®ion, - N_("Select a region to be captured by clicking a point of the screen " - "without releasing the mouse button, dragging your mouse to the " - "other corner of the region, and releasing the mouse button."), - NULL - }, - { "delay", 'd', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_INT, &delay, - N_("Delay in seconds before taking the screenshot"), - NULL - }, - { "hide", 'h', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &no_save_dialog, - N_("Do not display the save dialog"), - NULL - }, - { "mouse", 'm', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &hide_mouse, - N_("Do not display the mouse on the screenshot"), - NULL - }, - { "save", 's', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_FILENAME, &screenshot_dir, - N_("Directory where the screenshot will be saved"), - NULL - }, - { "open", 'o', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_STRING, &application, - N_("Application to open the screenshot"), - NULL - }, - { NULL, ' ', 0, 0, NULL, NULL, NULL } + { + "delay", 'd', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_INT, &delay, + N_("Delay in seconds before taking the screenshot"), + NULL + }, + { + "fullscreen", 'f', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &fullscreen, + N_("Take a screenshot of the entire screen"), + NULL + }, + { + "hide", 'h', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &no_save_dialog, + N_("Do not display the save dialog"), + NULL + }, + { + "mouse", 'm', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &hide_mouse, + N_("Do not display the mouse on the screenshot"), + NULL + }, + { + "open", 'o', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_STRING, &application, + N_("Application to open the screenshot"), + NULL + }, + { + "region", 'r', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, ®ion, + N_("Select a region to be captured by clicking a point of the screen " + "without releasing the mouse button, dragging your mouse to the " + "other corner of the region, and releasing the mouse button."), + NULL + }, + { + "save", 's', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_FILENAME, &screenshot_dir, + N_("Directory where the screenshot will be saved"), + NULL + }, + { + "upload", 'u', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &upload, + N_("Upload the screenshot to ZimageZ©, a free Web hosting solution"), + NULL + }, + { + "version", 'V', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &version, + N_("Version information"), + NULL + }, + { + "window", 'w', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &window, + N_("Take a screenshot of the active window"), + NULL + }, + { + NULL, ' ', 0, 0, NULL, + NULL, + NULL + } }; static void @@ -210,14 +229,14 @@ int main(int argc, char **argv) screenshooter_read_rc_file (rc_file, sd); - if (rc_file != NULL) + if (G_LIKELY (rc_file != NULL)) g_free (rc_file); /* Check if the directory read from the preferences is valid */ default_save_dir = g_file_new_for_uri (sd->screenshot_dir); - if (!g_file_query_exists (default_save_dir, NULL)) + if (G_UNLIKELY (!g_file_query_exists (default_save_dir, NULL))) { g_free (sd->screenshot_dir); @@ -265,6 +284,11 @@ int main(int argc, char **argv) sd->app = application; sd->action = OPEN; } + else if (upload) + { + sd->app = g_strdup ("none"); + sd->action = UPLOAD; + } else { sd->app = g_strdup ("none"); @@ -276,7 +300,7 @@ int main(int argc, char **argv) { default_save_dir = g_file_new_for_commandline_arg (screenshot_dir); - if (g_file_query_exists (default_save_dir, NULL)) + if (G_LIKELY (g_file_query_exists (default_save_dir, NULL))) { g_free (sd->screenshot_dir); sd->screenshot_dir = g_file_get_uri (default_save_dir); -- GitLab