diff --git a/ChangeLog b/ChangeLog index 45d5ac389066b296b14c3d30c590b440af614491..a44ca8fc4682f5986dde70d67bcbf8a49690fdf9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2008-10-04 jeromeg + + * Partially refactor the code: + - screenshooter-utils.{c,h}: + - simplify some variable names. + - use an enum for screenshot modes. + - (take_screenshot) and (save_screenshot) do not depend anymore on the + backend. + - main.c: + - updated to use the new functions and structs' variables. + - move some code from (main) to (screenshooter_preferences_dialog). + - screenshooter-plugin.c: + - updated to use the new functions and structs' variables. + - use cb_ callbacks names rather than funky ones. + 2008-10-02 jeromeg * src/screenshooter-utils.c: in (take_screenshot), don't crash when taking a diff --git a/src/main.c b/src/main.c index 88a0803962e6f5cc1781cb2fe87320d236bc56b1..2b07f31fefeceb8e9f103c008061c54c60989a7a 100644 --- a/src/main.c +++ b/src/main.c @@ -71,6 +71,46 @@ static GOptionEntry entries[] = +void screenshooter_preferences_dialog (gchar *rc_file, + gchar *current_default_dir) +{ + GtkWidget * chooser; + gint dialog_response; + gchar * dir; + XfceRc *rc; + + /* The preferences dialog is a plain gtk_file_chooser, we just get the + folder the user selected and write it in the conf file*/ + + chooser = + gtk_file_chooser_dialog_new (_("Default save folder"), + NULL, + GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + NULL); + gtk_window_set_icon_name (GTK_WINDOW (chooser), "applets-screenshooter"); + gtk_dialog_set_default_response (GTK_DIALOG (chooser), GTK_RESPONSE_ACCEPT); + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (chooser), + current_default_dir); + + dialog_response = gtk_dialog_run(GTK_DIALOG (chooser)); + + if (dialog_response == GTK_RESPONSE_ACCEPT) + { + dir = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser)); + + rc = xfce_rc_simple_open (rc_file, FALSE); + xfce_rc_write_entry (rc, "screenshot_dir", dir); + xfce_rc_close (rc); + + g_free (dir); + } + gtk_widget_destroy (GTK_WIDGET (chooser)); +} + + + int main(int argc, char **argv) { GError *cli_error = NULL; @@ -79,6 +119,8 @@ int main(int argc, char **argv) XfceRc *rc; gchar *rc_file; + xfce_textdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8"); + /* Get the path to the conf file */ rc_file = g_build_filename (xfce_get_homedir(), ".config", "xfce4", "xfce4-screenshooter", NULL); @@ -96,9 +138,7 @@ int main(int argc, char **argv) { sd->screenshot_dir = g_strdup (DEFAULT_SAVE_DIRECTORY); } - - xfce_textdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8"); - + /* Print a message to advise to use help when a non existing cli option is passed to the executable. */ if (!gtk_init_with_args(&argc, &argv, _(""), entries, PACKAGE, &cli_error)) @@ -123,11 +163,11 @@ int main(int argc, char **argv) the desktop.*/ if (window) { - sd->whole_screen = 0; + sd->mode = ACTIVE_WINDOW; } else { - sd->whole_screen = 1; + sd->mode = FULLSCREEN; } /* Wether to show the save dialog allowing to choose a filename and a save @@ -141,7 +181,7 @@ int main(int argc, char **argv) sd->show_save_dialog = 1; } - sd->screenshot_delay = delay; + sd->delay = delay; /* If the user gave a directory name, verify that it is valid */ if (screenshot_dir != NULL) @@ -172,45 +212,14 @@ int main(int argc, char **argv) with the given options */ if (!preferences) { - screenshot = take_screenshot (sd); - save_screenshot (screenshot, sd); + screenshot = take_screenshot (sd->mode, sd->delay); + save_screenshot (screenshot, sd->show_save_dialog, sd->screenshot_dir); g_object_unref (screenshot); } else { - GtkWidget * chooser; - gint dialog_response; - gchar * dir; - - /* The preferences dialog is a plain gtk_file_chooser, we just get the - folder the user selected and write it in the conf file*/ - - chooser = - gtk_file_chooser_dialog_new (_("Default save folder"), - NULL, - GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, - NULL); - gtk_window_set_icon_name (GTK_WINDOW (chooser), "applets-screenshooter"); - gtk_dialog_set_default_response (GTK_DIALOG (chooser), GTK_RESPONSE_ACCEPT); - gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (chooser), - sd->screenshot_dir); - - dialog_response = gtk_dialog_run(GTK_DIALOG (chooser)); - - if (dialog_response == GTK_RESPONSE_ACCEPT) - { - dir = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser)); - - rc = xfce_rc_simple_open (rc_file, FALSE); - xfce_rc_write_entry (rc, "screenshot_dir", dir); - xfce_rc_close (rc); - - g_free (dir); - } - gtk_widget_destroy (GTK_WIDGET (chooser)); + screenshooter_preferences_dialog (rc_file, sd->screenshot_dir); } g_free (sd->screenshot_dir); diff --git a/src/screenshooter-plugin.c b/src/screenshooter-plugin.c index 665f9d208223f2a8c123aa36b09d10d2a0e2b367..4c11978c2c34ed2fda5f0c322ed8c5fc121e200c 100755 --- a/src/screenshooter-plugin.c +++ b/src/screenshooter-plugin.c @@ -72,7 +72,7 @@ static void screenshot_write_rc_file (XfcePanelPlugin *plugin, PluginData *pd); static void show_save_dialog_toggled (GtkToggleButton *tb, PluginData *pd); static void whole_screen_toggled (GtkToggleButton *tb, PluginData *pd); static void active_window_toggled (GtkToggleButton *tb, PluginData *pd); -static void screenshot_delay_spinner_changed (GtkWidget *spinner, +static void cb_delay_spinner_changed (GtkWidget *spinner, PluginData *pd); static void cb_default_folder (GtkWidget *chooser, PluginData *pd); static void screenshot_dialog_response (GtkWidget *dlg, int reponse, @@ -141,9 +141,10 @@ button_clicked (GtkWidget *button, PluginData *pd) gtk_widget_set_sensitive (GTK_WIDGET (pd->button), FALSE); /* Get the screenshot */ - screenshot = take_screenshot (pd->sd); + screenshot = take_screenshot (pd->sd->mode, pd->sd->delay); - save_screenshot (screenshot, pd->sd); + save_screenshot (screenshot, pd->sd->show_save_dialog, + pd->sd->screenshot_dir); gtk_widget_set_sensitive (GTK_WIDGET (pd->button), TRUE); @@ -174,8 +175,8 @@ screenshot_read_rc_file (XfcePanelPlugin *plugin, PluginData *pd) { char *file; XfceRc *rc; - gint screenshot_delay = 0; - gint whole_screen = 1; + gint delay = 0; + gint mode = FULLSCREEN; gint show_save_dialog = 1; gchar *screenshot_dir = g_strdup (DEFAULT_SAVE_DIRECTORY); @@ -186,8 +187,8 @@ screenshot_read_rc_file (XfcePanelPlugin *plugin, PluginData *pd) if ( rc != NULL) { - screenshot_delay = xfce_rc_read_int_entry (rc, "screenshot_delay", 0); - whole_screen = xfce_rc_read_int_entry (rc, "whole_screen", 1); + delay = xfce_rc_read_int_entry (rc, "delay", 0); + mode = xfce_rc_read_int_entry (rc, "mode", FULLSCREEN); show_save_dialog = xfce_rc_read_int_entry (rc, "show_save_dialog", 1); screenshot_dir = g_strdup (xfce_rc_read_entry (rc, @@ -200,8 +201,8 @@ screenshot_read_rc_file (XfcePanelPlugin *plugin, PluginData *pd) } /* And set the pd values */ - pd->sd->screenshot_delay = screenshot_delay; - pd->sd->whole_screen = whole_screen; + pd->sd->delay = delay; + pd->sd->mode = mode; pd->sd->show_save_dialog = show_save_dialog; pd->sd->screenshot_dir = screenshot_dir; } @@ -227,8 +228,8 @@ screenshot_write_rc_file (XfcePanelPlugin *plugin, PluginData *pd) if (!rc) return; - xfce_rc_write_int_entry (rc, "screenshot_delay", pd->sd->screenshot_delay); - xfce_rc_write_int_entry (rc, "whole_screen", pd->sd->whole_screen); + xfce_rc_write_int_entry (rc, "delay", pd->sd->delay); + xfce_rc_write_int_entry (rc, "mode", pd->sd->mode); xfce_rc_write_int_entry (rc, "show_save_dialog", pd->sd->show_save_dialog); xfce_rc_write_entry (rc, "screenshot_dir", pd->sd->screenshot_dir); @@ -254,7 +255,14 @@ show_save_dialog_toggled (GtkToggleButton *tb, PluginData *pd) static void whole_screen_toggled (GtkToggleButton *tb, PluginData *pd) { - pd->sd->whole_screen = gtk_toggle_button_get_active (tb); + if (gtk_toggle_button_get_active (tb)) + { + pd->sd->mode = FULLSCREEN; + } + else + { + pd->sd->mode = ACTIVE_WINDOW; + } } @@ -265,7 +273,14 @@ whole_screen_toggled (GtkToggleButton *tb, PluginData *pd) static void active_window_toggled (GtkToggleButton *tb, PluginData *pd) { - pd->sd->whole_screen = !gtk_toggle_button_get_active (tb); + if (gtk_toggle_button_get_active (tb)) + { + pd->sd->mode = ACTIVE_WINDOW; + } + else + { + pd->sd->mode = FULLSCREEN; + } } @@ -274,9 +289,9 @@ active_window_toggled (GtkToggleButton *tb, PluginData *pd) Get the value of the toggle button and set the delay option. */ static void -screenshot_delay_spinner_changed(GtkWidget *spinner, PluginData *pd) +cb_delay_spinner_changed(GtkWidget *spinner, PluginData *pd) { - pd->sd->screenshot_delay = + pd->sd->delay = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)); } @@ -308,7 +323,7 @@ screenshot_dialog_response (GtkWidget *dlg, int reponse, /* Update tooltips according to the chosen option */ #if GTK_CHECK_VERSION(2,12,0) - if (pd->sd->whole_screen) + if (pd->sd->mode == FULLSCREEN) { gtk_widget_set_tooltip_text (GTK_WIDGET (pd->button), _("Take a screenshot of desktop")); @@ -335,7 +350,7 @@ screenshot_properties_dialog (XfcePanelPlugin *plugin, PluginData *pd) GtkWidget *options_frame, *modes_frame, *delay_box, *options_box, *modes_box; GtkWidget *save_button, *desktop_button, *active_window_button; GtkWidget *dir_chooser, *default_save_label, *delay_label; - GtkWidget *screenshot_delay_spinner; + GtkWidget *delay_spinner; /* Block the menu to prevent the user from launching several dialogs at the same time */ @@ -382,7 +397,7 @@ screenshot_properties_dialog (XfcePanelPlugin *plugin, PluginData *pd) gtk_widget_show (desktop_button); gtk_box_pack_start (GTK_BOX (modes_box), desktop_button, FALSE, FALSE, 0); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (desktop_button), - pd->sd->whole_screen); + (pd->sd->mode == FULLSCREEN)); g_signal_connect (desktop_button, "toggled", G_CALLBACK (whole_screen_toggled), pd); @@ -393,7 +408,7 @@ screenshot_properties_dialog (XfcePanelPlugin *plugin, PluginData *pd) gtk_widget_show (active_window_button); gtk_box_pack_start (GTK_BOX (modes_box), active_window_button, FALSE, FALSE, 0); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (active_window_button), - !pd->sd->whole_screen); + (pd->sd->mode == ACTIVE_WINDOW)); g_signal_connect (active_window_button, "toggled", G_CALLBACK (active_window_toggled), pd); @@ -447,19 +462,19 @@ screenshot_properties_dialog (XfcePanelPlugin *plugin, PluginData *pd) gtk_widget_show (delay_box); gtk_box_pack_start (GTK_BOX (options_box), delay_box, FALSE, FALSE, 0); - screenshot_delay_spinner = gtk_spin_button_new_with_range(0.0, 60.0, 1.0); - gtk_spin_button_set_value (GTK_SPIN_BUTTON (screenshot_delay_spinner), - pd->sd->screenshot_delay); - gtk_widget_show (screenshot_delay_spinner); - gtk_box_pack_start (GTK_BOX (delay_box), screenshot_delay_spinner, FALSE, + delay_spinner = gtk_spin_button_new_with_range(0.0, 60.0, 1.0); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (delay_spinner), + pd->sd->delay); + gtk_widget_show (delay_spinner); + gtk_box_pack_start (GTK_BOX (delay_box), delay_spinner, FALSE, FALSE, 0); label2 = gtk_label_new_with_mnemonic(_("seconds")); gtk_widget_show (label2); gtk_box_pack_start (GTK_BOX (delay_box), label2, FALSE, FALSE, 0); - g_signal_connect (screenshot_delay_spinner, "value-changed", - G_CALLBACK (screenshot_delay_spinner_changed), pd); + g_signal_connect (delay_spinner, "value-changed", + G_CALLBACK (cb_delay_spinner_changed), pd); gtk_widget_show (dlg); } @@ -492,7 +507,7 @@ screenshot_construct (XfcePanelPlugin *plugin) /* Set the tooltips if available */ #if GTK_CHECK_VERSION(2,12,0) - if ( pd->sd->whole_screen ) + if (pd->sd->mode == FULLSCREEN) { gtk_widget_set_tooltip_text (GTK_WIDGET (pd->button), _("Take a screenshot of desktop")); diff --git a/src/screenshooter-utils.c b/src/screenshooter-utils.c index f6925eb4d86775e0f9fb7c4757c3303336e18c03..91dc6aa640659c78bc07d66b8114beec7a05e4b3 100644 --- a/src/screenshooter-utils.c +++ b/src/screenshooter-utils.c @@ -125,10 +125,10 @@ cb_current_folder_changed (GtkFileChooser *chooser, gpointer user_data) *sd: a ScreenshotData struct. returns: the screenshot in a *GdkPixbuf. */ -GdkPixbuf *take_screenshot (ScreenshotData *sd) +GdkPixbuf *take_screenshot (gint mode, gint delay) { GdkPixbuf *screenshot; - GdkWindow *window; + GdkWindow *window = NULL; GdkScreen *screen; gint width; @@ -141,12 +141,12 @@ GdkPixbuf *take_screenshot (ScreenshotData *sd) screen = gdk_screen_get_default (); /* Get the window/desktop we want to screenshot*/ - if (sd->whole_screen) + if (mode == FULLSCREEN) { window = gdk_get_default_root_window (); needs_unref = FALSE; } - else + else if (mode == ACTIVE_WINDOW) { window = gdk_screen_get_active_window (screen); @@ -166,7 +166,7 @@ GdkPixbuf *take_screenshot (ScreenshotData *sd) } /* wait for n=delay seconds */ - sleep (sd->screenshot_delay); + sleep (delay); /* get the size of the part of the screen we want to screenshot */ gdk_drawable_get_size(window, &width, &height); @@ -188,7 +188,8 @@ GdkPixbuf *take_screenshot (ScreenshotData *sd) /* Saves the screenshot according to the options in sd. *screenshot: a GdkPixbuf containing our screenshot *sd: a ScreenshotData struct containing the save options.*/ -void save_screenshot (GdkPixbuf *screenshot, ScreenshotData *sd) +void save_screenshot (GdkPixbuf *screenshot, gboolean show_save_dialog, + gchar * default_dir) { GdkPixbuf * thumbnail; gchar * filename = NULL; @@ -196,9 +197,9 @@ void save_screenshot (GdkPixbuf *screenshot, ScreenshotData *sd) GtkWidget * chooser; gint dialog_response; - filename = generate_filename_for_uri (sd->screenshot_dir); + filename = generate_filename_for_uri (default_dir); - if (sd->show_save_dialog) + if (show_save_dialog) { /* If the user wants a save dialog, we run it, and grab the filename the user has chosen. */ @@ -216,7 +217,7 @@ void save_screenshot (GdkPixbuf *screenshot, ScreenshotData *sd) gtk_dialog_set_default_response (GTK_DIALOG (chooser), GTK_RESPONSE_ACCEPT); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER (chooser), - sd->screenshot_dir); + default_dir); preview = gtk_image_new (); @@ -249,8 +250,9 @@ void save_screenshot (GdkPixbuf *screenshot, ScreenshotData *sd) else { /* Else, we just save the file in the default folder */ - filename = g_build_filename (sd->screenshot_dir, filename, NULL); + filename = g_build_filename (default_dir, filename, NULL); gdk_pixbuf_save (screenshot, filename, "png", NULL, NULL); } + g_free (filename); } diff --git a/src/screenshooter-utils.h b/src/screenshooter-utils.h index 2f17169e51acd6e85e744ea75c48542c888a00c1..4f376c3a150e12cb890d349f50a4d078ca06c6b9 100644 --- a/src/screenshooter-utils.h +++ b/src/screenshooter-utils.h @@ -31,16 +31,23 @@ #define DEFAULT_SAVE_DIRECTORY xfce_get_homedir () +enum { + MODE_0, + FULLSCREEN, + ACTIVE_WINDOW, +}; + /* Struct to store the screenshot options */ typedef struct { - gint whole_screen; + gint mode; gint show_save_dialog; - gint screenshot_delay; + gint delay; gchar *screenshot_dir; } ScreenshotData; -GdkPixbuf *take_screenshot (ScreenshotData *sd); -void save_screenshot (GdkPixbuf *screenshot, ScreenshotData *sd); +GdkPixbuf *take_screenshot (gint mode, gint delay); +void save_screenshot (GdkPixbuf *screenshot, gboolean show_save_dialog, + gchar * default_dir);