ClipIt-v1.3.4-26112010001
+ Fixed: Now we are warning the user that his history is saved in a plain text file and ask for his explicit permission to save the history. + Fixed: When the user disables history saving we also ask if he wants to empty the current history file. + Fixed: Renamed "Find" menu entry to "Manage history". + Fixed: ClipIt now complies to the "XDG Base Directory Specification". Changes to be committed: modified: ChangeLog modified: NEWS modified: configure.in modified: src/history.c modified: src/history.h modified: src/main.c modified: src/preferences.c modified: src/preferences.h modified: src/utils.c modified: src/utils.h
This commit is contained in:
parent
81b7d97d83
commit
f75139eb4a
@ -1,3 +1,12 @@
|
|||||||
|
ClipIt-v1.3.4-26112010001 - 26 Nov. 2010
|
||||||
|
+ Fixed: Now we are warning the user that his history is saved in a
|
||||||
|
plain text file and ask for his explicit permission
|
||||||
|
to save the history.
|
||||||
|
+ Fixed: When the user disables history saving we also ask if he wants
|
||||||
|
to empty the current history file.
|
||||||
|
+ Fixed: Renamed "Find" menu entry to "Manage history".
|
||||||
|
+ Fixed: ClipIt now complies to the "XDG Base Directory Specification".
|
||||||
|
|
||||||
ClipIt-v1.3.3-23112010001 - 23 Nov. 2010
|
ClipIt-v1.3.3-23112010001 - 23 Nov. 2010
|
||||||
+ Fixed: Fixed some more markup.
|
+ Fixed: Fixed some more markup.
|
||||||
+ Fixed: Rearranged parts of the Preferences dialog to be cleaner.
|
+ Fixed: Rearranged parts of the Preferences dialog to be cleaner.
|
||||||
|
2
NEWS
2
NEWS
@ -1 +1 @@
|
|||||||
Project website: http://sourceforge.net/projects/gtkclipit/
|
Project website: http://gtkclipit.sourceforge.net/
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
# Autoconf/automake.
|
# Autoconf/automake.
|
||||||
# -------------------------------------------------------------------------------
|
# -------------------------------------------------------------------------------
|
||||||
AC_PREREQ([2.5])
|
AC_PREREQ([2.5])
|
||||||
AC_INIT([clipit], [1.3.3], [oss@web-tm.com])
|
AC_INIT([clipit], [1.3.4], [oss@web-tm.com])
|
||||||
AM_INIT_AUTOMAKE([AC_PACKAGE_TARNAME()], [AC_PACKAGE_VERSION()])
|
AM_INIT_AUTOMAKE([AC_PACKAGE_TARNAME()], [AC_PACKAGE_VERSION()])
|
||||||
|
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
|
@ -28,11 +28,11 @@
|
|||||||
|
|
||||||
GSList *history;
|
GSList *history;
|
||||||
|
|
||||||
/* Reads history from ~/.local/share/clipit/history */
|
/* Reads history from DATADIR/clipit/history */
|
||||||
void read_history ()
|
void read_history ()
|
||||||
{
|
{
|
||||||
/* Build file path */
|
/* Build file path */
|
||||||
gchar *history_path = g_build_filename(g_get_home_dir(),
|
gchar *history_path = g_build_filename(g_get_user_data_dir(),
|
||||||
HISTORY_FILE,
|
HISTORY_FILE,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
@ -66,13 +66,13 @@ void read_history ()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Saves history to ~/.local/share/clipit/history */
|
/* Saves history to DATADIR/clipit/history */
|
||||||
void save_history()
|
void save_history()
|
||||||
{
|
{
|
||||||
/* Check that the directory is available */
|
/* Check that the directory is available */
|
||||||
check_dirs();
|
check_dirs();
|
||||||
/* Build file path */
|
/* Build file path */
|
||||||
gchar *history_path = g_build_filename(g_get_home_dir(),
|
gchar *history_path = g_build_filename(g_get_user_data_dir(),
|
||||||
HISTORY_FILE,
|
HISTORY_FILE,
|
||||||
NULL);
|
NULL);
|
||||||
/* Open the file for writing */
|
/* Open the file for writing */
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
#define HISTORY_FILE ".local/share/clipit/history"
|
#define HISTORY_FILE "clipit/history"
|
||||||
|
|
||||||
/* Set maximum size of one clipboard entry to 1024KB (1MB)
|
/* Set maximum size of one clipboard entry to 1024KB (1MB)
|
||||||
* 1024 pages × 2000 characters per page - should be more than enough.
|
* 1024 pages × 2000 characters per page - should be more than enough.
|
||||||
|
@ -450,7 +450,7 @@ static gboolean show_actions_menu(gpointer data)
|
|||||||
/* -------------------- */
|
/* -------------------- */
|
||||||
gtk_menu_shell_append((GtkMenuShell*)menu, gtk_separator_menu_item_new());
|
gtk_menu_shell_append((GtkMenuShell*)menu, gtk_separator_menu_item_new());
|
||||||
/* Actions */
|
/* Actions */
|
||||||
gchar* path = g_build_filename(g_get_home_dir(), ACTIONS_FILE, NULL);
|
gchar* path = g_build_filename(g_get_user_data_dir(), ACTIONS_FILE, NULL);
|
||||||
FILE* actions_file = fopen(path, "rb");
|
FILE* actions_file = fopen(path, "rb");
|
||||||
g_free(path);
|
g_free(path);
|
||||||
/* Check that it opened and begin read */
|
/* Check that it opened and begin read */
|
||||||
@ -746,8 +746,10 @@ static void show_clipit_menu(GtkStatusIcon *status_icon, guint button, guint act
|
|||||||
g_signal_connect((GObject*)menu_item, "activate", (GCallback)show_history_menu_full, NULL);
|
g_signal_connect((GObject*)menu_item, "activate", (GCallback)show_history_menu_full, NULL);
|
||||||
gtk_menu_shell_append((GtkMenuShell*)menu, menu_item);
|
gtk_menu_shell_append((GtkMenuShell*)menu, menu_item);
|
||||||
}
|
}
|
||||||
/* Search */
|
/* Manage history */
|
||||||
menu_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_FIND, NULL);
|
menu_item = gtk_image_menu_item_new_with_mnemonic(_("_Manage history"));
|
||||||
|
menu_image = gtk_image_new_from_stock(GTK_STOCK_FIND, GTK_ICON_SIZE_MENU);
|
||||||
|
gtk_image_menu_item_set_image((GtkImageMenuItem*)menu_item, menu_image);
|
||||||
g_signal_connect((GObject*)menu_item, "activate", (GCallback)show_search, NULL);
|
g_signal_connect((GObject*)menu_item, "activate", (GCallback)show_search, NULL);
|
||||||
gtk_menu_shell_append((GtkMenuShell*)menu, menu_item);
|
gtk_menu_shell_append((GtkMenuShell*)menu, menu_item);
|
||||||
/* Preferences */
|
/* Preferences */
|
||||||
|
@ -102,7 +102,7 @@ static void apply_preferences()
|
|||||||
truncate_history();
|
truncate_history();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save preferences to ~/.config/clipit/clipitrc */
|
/* Save preferences to CONFIGDIR/clipit/clipitrc */
|
||||||
static void save_preferences()
|
static void save_preferences()
|
||||||
{
|
{
|
||||||
/* Create key */
|
/* Create key */
|
||||||
@ -133,16 +133,81 @@ static void save_preferences()
|
|||||||
/* Check config and data directories */
|
/* Check config and data directories */
|
||||||
check_dirs();
|
check_dirs();
|
||||||
/* Save key to file */
|
/* Save key to file */
|
||||||
gchar* rc_file = g_build_filename(g_get_home_dir(), PREFERENCES_FILE, NULL);
|
gchar* rc_file = g_build_filename(g_get_user_config_dir(), PREFERENCES_FILE, NULL);
|
||||||
g_file_set_contents(rc_file, g_key_file_to_data(rc_key, NULL, NULL), -1, NULL);
|
g_file_set_contents(rc_file, g_key_file_to_data(rc_key, NULL, NULL), -1, NULL);
|
||||||
g_key_file_free(rc_key);
|
g_key_file_free(rc_key);
|
||||||
g_free(rc_file);
|
g_free(rc_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read ~/.config/clipit/clipitrc */
|
/* This will be run if there is no config file */
|
||||||
|
static void first_run_check()
|
||||||
|
{
|
||||||
|
/* If the configfile doesn't exist, we ask the user if he wants to save the history */
|
||||||
|
gchar *rc_file = g_build_filename(g_get_user_config_dir(), PREFERENCES_FILE, NULL);
|
||||||
|
/* Check if config file exists */
|
||||||
|
if (!g_file_test(rc_file, G_FILE_TEST_EXISTS))
|
||||||
|
{
|
||||||
|
GtkWidget* confirm_dialog = gtk_message_dialog_new(NULL,
|
||||||
|
GTK_DIALOG_MODAL,
|
||||||
|
GTK_MESSAGE_OTHER,
|
||||||
|
GTK_BUTTONS_YES_NO,
|
||||||
|
SAVE_HIST_MESSAGE);
|
||||||
|
gtk_window_set_title((GtkWindow*)confirm_dialog, "Save history");
|
||||||
|
|
||||||
|
if (gtk_dialog_run((GtkDialog*)confirm_dialog) == GTK_RESPONSE_YES)
|
||||||
|
{
|
||||||
|
prefs.save_history = TRUE;
|
||||||
|
} else {
|
||||||
|
prefs.save_history = FALSE;
|
||||||
|
}
|
||||||
|
gtk_widget_destroy(confirm_dialog);
|
||||||
|
/* We make sure these aren't empty */
|
||||||
|
prefs.history_key = DEF_HISTORY_KEY;
|
||||||
|
prefs.actions_key = DEF_ACTIONS_KEY;
|
||||||
|
prefs.menu_key = DEF_MENU_KEY;
|
||||||
|
prefs.search_key = DEF_SEARCH_KEY;
|
||||||
|
save_preferences();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Ask the user if he wants to delete the history file and act accordingly */
|
||||||
|
static void check_saved_hist_file()
|
||||||
|
{
|
||||||
|
/* If the history file doesn't exist, there's nothing to do here */
|
||||||
|
gchar *history_path = g_build_filename(g_get_user_data_dir(), HISTORY_FILE, NULL);
|
||||||
|
/* Check if config file exists */
|
||||||
|
if (g_file_test(history_path, G_FILE_TEST_EXISTS))
|
||||||
|
{
|
||||||
|
GtkWidget* confirm_dialog = gtk_message_dialog_new(NULL,
|
||||||
|
GTK_DIALOG_MODAL,
|
||||||
|
GTK_MESSAGE_OTHER,
|
||||||
|
GTK_BUTTONS_YES_NO,
|
||||||
|
CHECK_HIST_MESSAGE);
|
||||||
|
gtk_window_set_title((GtkWindow*)confirm_dialog, "Remove history file");
|
||||||
|
|
||||||
|
if (gtk_dialog_run((GtkDialog*)confirm_dialog) == GTK_RESPONSE_YES)
|
||||||
|
{
|
||||||
|
/* Open the file for writing */
|
||||||
|
FILE *history_file = fopen(history_path, "wb");
|
||||||
|
g_free(history_path);
|
||||||
|
/* Check that it opened and begin write */
|
||||||
|
if (history_file)
|
||||||
|
{
|
||||||
|
/* Write 0 to indicate end of file */
|
||||||
|
gint end = 0;
|
||||||
|
fwrite(&end, 4, 1, history_file);
|
||||||
|
fclose(history_file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gtk_widget_destroy(confirm_dialog);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read CONFIGDIR/clipit/clipitrc */
|
||||||
void read_preferences()
|
void read_preferences()
|
||||||
{
|
{
|
||||||
gchar* rc_file = g_build_filename(g_get_home_dir(), PREFERENCES_FILE, NULL);
|
first_run_check();
|
||||||
|
gchar* rc_file = g_build_filename(g_get_user_config_dir(), PREFERENCES_FILE, NULL);
|
||||||
/* Create key */
|
/* Create key */
|
||||||
GKeyFile* rc_key = g_key_file_new();
|
GKeyFile* rc_key = g_key_file_new();
|
||||||
if (g_key_file_load_from_file(rc_key, rc_file, G_KEY_FILE_NONE, NULL))
|
if (g_key_file_load_from_file(rc_key, rc_file, G_KEY_FILE_NONE, NULL))
|
||||||
@ -199,11 +264,11 @@ void read_preferences()
|
|||||||
g_free(rc_file);
|
g_free(rc_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read ~/.clipit/actions into the treeview */
|
/* Read DATADIR/clipit/actions into the treeview */
|
||||||
static void read_actions()
|
static void read_actions()
|
||||||
{
|
{
|
||||||
/* Open the file for reading */
|
/* Open the file for reading */
|
||||||
gchar* path = g_build_filename(g_get_home_dir(), ACTIONS_FILE, NULL);
|
gchar* path = g_build_filename(g_get_user_data_dir(), ACTIONS_FILE, NULL);
|
||||||
FILE* actions_file = fopen(path, "rb");
|
FILE* actions_file = fopen(path, "rb");
|
||||||
g_free(path);
|
g_free(path);
|
||||||
/* Check that it opened and begin read */
|
/* Check that it opened and begin read */
|
||||||
@ -238,13 +303,13 @@ static void read_actions()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save the actions treeview to ~/.local/share/clipit/actions */
|
/* Save the actions treeview to DATADIR/clipit/actions */
|
||||||
static void save_actions()
|
static void save_actions()
|
||||||
{
|
{
|
||||||
/* Check config and data directories */
|
/* Check config and data directories */
|
||||||
check_dirs();
|
check_dirs();
|
||||||
/* Open the file for writing */
|
/* Open the file for writing */
|
||||||
gchar* path = g_build_filename(g_get_home_dir(), ACTIONS_FILE, NULL);
|
gchar* path = g_build_filename(g_get_user_data_dir(), ACTIONS_FILE, NULL);
|
||||||
FILE* actions_file = fopen(path, "wb");
|
FILE* actions_file = fopen(path, "wb");
|
||||||
g_free(path);
|
g_free(path);
|
||||||
/* Check that it opened and begin write */
|
/* Check that it opened and begin write */
|
||||||
@ -407,11 +472,11 @@ static void edit_action(GtkCellRendererText *renderer, gchar *path,
|
|||||||
|
|
||||||
/* exclude Functions */
|
/* exclude Functions */
|
||||||
|
|
||||||
/* Read ~/.clipit/excludes into the treeview */
|
/* Read DATADIR/clipit/excludes into the treeview */
|
||||||
static void read_excludes()
|
static void read_excludes()
|
||||||
{
|
{
|
||||||
/* Open the file for reading */
|
/* Open the file for reading */
|
||||||
gchar* path = g_build_filename(g_get_home_dir(), EXCLUDES_FILE, NULL);
|
gchar* path = g_build_filename(g_get_user_data_dir(), EXCLUDES_FILE, NULL);
|
||||||
FILE* excludes_file = fopen(path, "rb");
|
FILE* excludes_file = fopen(path, "rb");
|
||||||
g_free(path);
|
g_free(path);
|
||||||
/* Check that it opened and begin read */
|
/* Check that it opened and begin read */
|
||||||
@ -440,13 +505,13 @@ static void read_excludes()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save the actions treeview to ~/.local/share/clipit/excludes */
|
/* Save the actions treeview to DATADIR/clipit/excludes */
|
||||||
static void save_excludes()
|
static void save_excludes()
|
||||||
{
|
{
|
||||||
/* Check config and data directories */
|
/* Check config and data directories */
|
||||||
check_dirs();
|
check_dirs();
|
||||||
/* Open the file for writing */
|
/* Open the file for writing */
|
||||||
gchar* path = g_build_filename(g_get_home_dir(), EXCLUDES_FILE, NULL);
|
gchar* path = g_build_filename(g_get_user_data_dir(), EXCLUDES_FILE, NULL);
|
||||||
FILE* excludes_file = fopen(path, "wb");
|
FILE* excludes_file = fopen(path, "wb");
|
||||||
g_free(path);
|
g_free(path);
|
||||||
/* Check that it opened and begin write */
|
/* Check that it opened and begin write */
|
||||||
@ -823,13 +888,6 @@ void show_preferences(gint tab)
|
|||||||
tree_column = gtk_tree_view_column_new_with_attributes(_("Regex"), name_renderer_exclude, "text", 0, NULL);
|
tree_column = gtk_tree_view_column_new_with_attributes(_("Regex"), name_renderer_exclude, "text", 0, NULL);
|
||||||
gtk_tree_view_column_set_resizable(tree_column, TRUE);
|
gtk_tree_view_column_set_resizable(tree_column, TRUE);
|
||||||
gtk_tree_view_append_column((GtkTreeView*)treeview_exclude, tree_column);
|
gtk_tree_view_append_column((GtkTreeView*)treeview_exclude, tree_column);
|
||||||
/* GtkCellRenderer* command_renderer_exclude = gtk_cell_renderer_text_new();
|
|
||||||
g_object_set(command_renderer_exclude, "editable", TRUE, NULL);
|
|
||||||
g_object_set(command_renderer_exclude, "ellipsize-set", TRUE, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
|
|
||||||
g_signal_connect((GObject*)command_renderer_exclude, "edited", (GCallback)edit_action, (gpointer)1);
|
|
||||||
tree_column = gtk_tree_view_column_new_with_attributes(_("Command"), command_renderer_exclude, "text", 1, NULL);
|
|
||||||
gtk_tree_view_column_set_expand(tree_column, TRUE);
|
|
||||||
gtk_tree_view_append_column((GtkTreeView*)treeview_exclude, tree_column); */
|
|
||||||
gtk_container_add((GtkContainer*)scrolled_window_exclude, treeview_exclude);
|
gtk_container_add((GtkContainer*)scrolled_window_exclude, treeview_exclude);
|
||||||
gtk_box_pack_start((GtkBox*)vbox_exclude, scrolled_window_exclude, TRUE, TRUE, 0);
|
gtk_box_pack_start((GtkBox*)vbox_exclude, scrolled_window_exclude, TRUE, TRUE, 0);
|
||||||
|
|
||||||
@ -939,6 +997,9 @@ void show_preferences(gint tab)
|
|||||||
gtk_notebook_set_current_page((GtkNotebook*)notebook, tab);
|
gtk_notebook_set_current_page((GtkNotebook*)notebook, tab);
|
||||||
if (gtk_dialog_run((GtkDialog*)dialog) == GTK_RESPONSE_ACCEPT)
|
if (gtk_dialog_run((GtkDialog*)dialog) == GTK_RESPONSE_ACCEPT)
|
||||||
{
|
{
|
||||||
|
/* If the user disabled history saving, we ask him if he wants to delete the history file */
|
||||||
|
if(prefs.save_history && !gtk_toggle_button_get_active((GtkToggleButton*)save_check))
|
||||||
|
check_saved_hist_file();
|
||||||
/* Apply and save preferences */
|
/* Apply and save preferences */
|
||||||
apply_preferences();
|
apply_preferences();
|
||||||
save_preferences();
|
save_preferences();
|
||||||
|
@ -51,10 +51,17 @@ G_BEGIN_DECLS
|
|||||||
#define DEF_SEARCH_KEY "<Ctrl><Alt>F"
|
#define DEF_SEARCH_KEY "<Ctrl><Alt>F"
|
||||||
#define DEF_NO_ICON FALSE
|
#define DEF_NO_ICON FALSE
|
||||||
|
|
||||||
#define ACTIONS_FILE ".local/share/clipit/actions"
|
#define ACTIONS_FILE "clipit/actions"
|
||||||
#define EXCLUDES_FILE ".local/share/clipit/excludes"
|
#define EXCLUDES_FILE "clipit/excludes"
|
||||||
#define PREFERENCES_FILE ".config/clipit/clipitrc"
|
#define PREFERENCES_FILE "clipit/clipitrc"
|
||||||
#define THEMES_FOLDER ".config/clipit/themes"
|
#define THEMES_FOLDER "clipit/themes"
|
||||||
|
|
||||||
|
#define SAVE_HIST_MESSAGE "ClipIt can save your history in a plain text file. If you copy \
|
||||||
|
passwords or other sensible data and other people have access to the computer, this might be a \
|
||||||
|
security risk. Do you want to enable history saving?"
|
||||||
|
|
||||||
|
#define CHECK_HIST_MESSAGE "It appears that you have disabled history saving, the current history \
|
||||||
|
file still exists though. Do you want to empty the current history file?"
|
||||||
|
|
||||||
void read_preferences();
|
void read_preferences();
|
||||||
|
|
||||||
|
@ -31,8 +31,8 @@
|
|||||||
void
|
void
|
||||||
check_dirs()
|
check_dirs()
|
||||||
{
|
{
|
||||||
gchar *data_dir = g_build_path("/", g_get_home_dir(), DATA_DIR, NULL);
|
gchar *data_dir = g_build_path(G_DIR_SEPARATOR_S, g_get_user_data_dir(), DATA_DIR, NULL);
|
||||||
gchar *config_dir = g_build_path("/", g_get_home_dir(), CONFIG_DIR, NULL);
|
gchar *config_dir = g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), CONFIG_DIR, NULL);
|
||||||
/* Check if data directory exists */
|
/* Check if data directory exists */
|
||||||
if (!g_file_test(data_dir, G_FILE_TEST_EXISTS))
|
if (!g_file_test(data_dir, G_FILE_TEST_EXISTS))
|
||||||
{
|
{
|
||||||
@ -71,7 +71,7 @@ is_hyperlink(gchar *text)
|
|||||||
gboolean is_excluded(gchar *text)
|
gboolean is_excluded(gchar *text)
|
||||||
{
|
{
|
||||||
/* Open the file for reading */
|
/* Open the file for reading */
|
||||||
gchar *path = g_build_filename(g_get_home_dir(), EXCLUDES_FILE, NULL);
|
gchar *path = g_build_filename(g_get_user_data_dir(), EXCLUDES_FILE, NULL);
|
||||||
FILE *excludes_file = fopen(path, "rb");
|
FILE *excludes_file = fopen(path, "rb");
|
||||||
g_free(path);
|
g_free(path);
|
||||||
/* Check that it opened and begin read */
|
/* Check that it opened and begin read */
|
||||||
|
@ -24,8 +24,8 @@
|
|||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
#define CONFIG_DIR ".local/share/clipit"
|
#define CONFIG_DIR "clipit"
|
||||||
#define DATA_DIR ".config/clipit"
|
#define DATA_DIR "clipit"
|
||||||
|
|
||||||
void check_dirs();
|
void check_dirs();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user