dockapps/wmcliphist/clipboard.c

208 lines
4.3 KiB
C

#include <wmcliphist.h>
#include <time.h>
/* when true, clipboard will be automatically taken up by wmcliphist */
gint auto_take_up = 0;
/* number of items to keep (may be overriden from command line) */
gint num_items_to_keep = 10;
/* number if items kept */
gint num_items = 0;
/* current number of locked items */
gint locked_count;
/* list of clipboard history items */
GList *history_items = NULL;
/* selected item */
HISTORY_ITEM *selected = NULL;
/*
* dumps history list to stderr
* for debugging purposes only
*/
void
dump_history_list_fn(char *header)
{
gint indent = 1, i;
GList *node = history_items;
HISTORY_ITEM *data;
gchar *converted;
fprintf(stderr, "%s\n", header);
while (node) {
data = (HISTORY_ITEM *)node->data;
for (i = 0; i < indent; i++)
putc('-', stderr);
converted = from_utf8(data->content);
fprintf(stderr, " %s\n", converted);
g_free(converted);
indent++;
node = node->next;
}
fprintf(stderr, "==========\n");
}
void
my_get_selection_text(GtkClipboard *clipboard, const gchar *text, gpointer
data)
{
/* previous clipboard content */
static gchar *old_content = "";
static gint has_old_content = 0;
gchar *content;
gchar *converted;
begin_func("my_get_selection_text");
if (text == NULL) {
return_void();
}
if (g_utf8_collate(text, old_content) != 0 &&
!GTK_CHECK_MENU_ITEM(menu_app_clip_ignore)->active) {
/* new data in clipboard */
/* store new content for future comparation */
content = g_strdup(text);
converted = from_utf8(content);
/* fprintf(stderr, ">>> %s\n", converted); */
g_free(converted);
if (has_old_content > 0)
g_free(old_content);
old_content = content;
has_old_content = 1;
/* process item */
process_item(content, 0, TRUE);
}
/* when clipboard is locked, set selection owener to myself */
if (GTK_CHECK_MENU_ITEM(menu_app_clip_ignore)->active ||
GTK_CHECK_MENU_ITEM(menu_app_clip_lock)->active) {
if (gtk_selection_owner_set(dock_app,
GDK_SELECTION_PRIMARY,
GDK_CURRENT_TIME) == 0)
selected = NULL;
}
return_void();
}
/*
* get clipboard content - partialy inspired by Downloader for X
*/
gboolean
my_get_xselection(GtkWidget *window, GdkEvent *event)
{
GdkAtom atom;
gint format;
size_t length;
gchar *content = NULL;
/* previous clipboard content */
static size_t old_content_len = 0;
static gchar *old_content = "";
begin_func("my_get_xselection");
gtk_clipboard_request_text(gtk_clipboard_get(GDK_SELECTION_PRIMARY),
my_get_selection_text, NULL);
return_val(TRUE);
length = (size_t) gdk_selection_property_get(window->window,
(guchar **) &content, &atom, &format);
if (length > 0) {
if ((length != old_content_len ||
memcmp(content, old_content, length) != 0) &&
!GTK_CHECK_MENU_ITEM(menu_app_clip_ignore)->active) {
/* new data in clipboard */
/* store new content for future comparation */
if (old_content_len > 0)
g_free(old_content);
old_content = content;
old_content_len = length;
/* process item */
/* process_item(content, length, 0, TRUE); */
} else {
/* no new data */
g_free(content);
}
/* when clipboard is locked, set selection owener to myself */
if (GTK_CHECK_MENU_ITEM(menu_app_clip_ignore)->active ||
GTK_CHECK_MENU_ITEM(menu_app_clip_lock)->active) {
if (gtk_selection_owner_set(dock_app,
GDK_SELECTION_PRIMARY,
GDK_CURRENT_TIME) == 0)
selected = NULL;
}
}
return_val(TRUE);
}
/*
* clipboard conversion - inspired by Downloader for X too :)
*/
gboolean
time_conv_select()
{
begin_func("time_conv_select");
gtk_selection_convert(main_window,
GDK_SELECTION_PRIMARY,
GDK_TARGET_STRING,
GDK_CURRENT_TIME);
return_val(TRUE);
}
/*
* handles request for selection from other apps
*/
gboolean
selection_handle(GtkWidget *widget,
GtkSelectionData *selection_data,
guint info,
guint time_stamp,
gpointer data)
{
static gchar *converted = NULL;
begin_func("selection_handle");
if (converted != NULL) {
g_free(converted);
}
if (selected) {
converted = from_utf8(selected->content);
gtk_selection_data_set(selection_data,
GDK_SELECTION_TYPE_STRING,
8,
(guchar *) converted,
strlen(converted));
} else {
gtk_selection_data_set(selection_data,
GDK_SELECTION_TYPE_STRING,
8,
(guchar *)"",
0);
}
return_val(TRUE);
}