diff options
-rw-r--r-- | charpick/charpick.c | 52 | ||||
-rw-r--r-- | charpick/charpick.h | 2 |
2 files changed, 47 insertions, 7 deletions
diff --git a/charpick/charpick.c b/charpick/charpick.c index 6f03e6b6..acc4a408 100644 --- a/charpick/charpick.c +++ b/charpick/charpick.c @@ -169,10 +169,10 @@ toggle_button_toggled_cb (GtkToggleButton *button, unichar = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (button), "unichar")); curr_data->selected_unichar = unichar; /* set this? widget as the selection owner */ - gtk_selection_owner_set (curr_data->applet, + gtk_selection_owner_set (curr_data->invisible, GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME); - gtk_selection_owner_set (curr_data->applet, + gtk_selection_owner_set (curr_data->invisible, GDK_SELECTION_CLIPBOARD, GDK_CURRENT_TIME); curr_data->last_index = button_index; @@ -547,6 +547,31 @@ build_table (charpick_data *p_curr_data) p_curr_data->last_toggle_button = NULL; } +static gboolean +rebuild_cb (gpointer user_data) +{ + charpick_data *curr_data; + + curr_data = user_data; + curr_data->rebuild_id = 0; + + build_table (curr_data); + + return G_SOURCE_REMOVE; +} + +static void +queue_rebuild (charpick_data *curr_data) +{ + if (curr_data->rebuild_id != 0) + return; + + curr_data->rebuild_id = g_idle_add (rebuild_cb, curr_data); + g_source_set_name_by_id (curr_data->rebuild_id, "[charpick] rebuild_cb"); +} + + + static void applet_size_allocate (MatePanelApplet *applet, GtkAllocation *allocation, @@ -563,7 +588,7 @@ applet_size_allocate (MatePanelApplet *applet, curr_data->panel_size = allocation->height; } - build_table (curr_data); + queue_rebuild (curr_data); return; } @@ -647,6 +672,12 @@ applet_destroy (GtkWidget *widget, g_return_if_fail (curr_data); + if (curr_data->rebuild_id != 0) + { + g_source_remove (curr_data->rebuild_id); + curr_data->rebuild_id = 0; + } + if (curr_data->about_dialog) gtk_widget_destroy (curr_data->about_dialog); if (curr_data->propwindow) @@ -655,6 +686,8 @@ applet_destroy (GtkWidget *widget, gtk_widget_destroy (curr_data->box); if (curr_data->menu) gtk_widget_destroy (curr_data->menu); + if (curr_data->invisible) + gtk_widget_destroy (curr_data->invisible); g_free (curr_data->charlist); g_free (curr_data); } @@ -729,6 +762,7 @@ charpicker_applet_fill (MatePanelApplet *applet) { MatePanelAppletOrient orientation; charpick_data *curr_data; + GdkScreen *screen; GdkAtom utf8_atom; gchar *string; GtkActionGroup *action_group; @@ -746,6 +780,7 @@ charpicker_applet_fill (MatePanelApplet *applet) curr_data->add_edit_dialog = NULL; curr_data->settings = mate_panel_applet_settings_new (applet, "org.mate.panel.applet.charpick"); + curr_data->rebuild_id = 0; get_chartable (curr_data); @@ -769,19 +804,22 @@ charpicker_applet_fill (MatePanelApplet *applet) utf8_atom = gdk_atom_intern ("UTF8_STRING", FALSE); - gtk_selection_add_target (curr_data->applet, + screen = gtk_widget_get_screen (GTK_WIDGET (applet)); + curr_data->invisible = gtk_invisible_new_for_screen (screen); + + gtk_selection_add_target (curr_data->invisible, GDK_SELECTION_PRIMARY, utf8_atom, 0); - gtk_selection_add_target (curr_data->applet, + gtk_selection_add_target (curr_data->invisible, GDK_SELECTION_CLIPBOARD, utf8_atom, 0); - g_signal_connect (curr_data->applet, "selection_get", + g_signal_connect (curr_data->invisible, "selection_get", G_CALLBACK (charpick_selection_handler), curr_data); - g_signal_connect (curr_data->applet, "selection_clear_event", + g_signal_connect (curr_data->invisible, "selection_clear_event", G_CALLBACK (selection_clear_cb), curr_data); diff --git a/charpick/charpick.h b/charpick/charpick.h index 7a70ef5b..713685c2 100644 --- a/charpick/charpick.h +++ b/charpick/charpick.h @@ -22,6 +22,7 @@ struct _charpick_data { GtkWidget *box; GtkWidget *frame; GtkWidget *applet; + GtkWidget *invisible; GtkToggleButton *last_toggle_button; gint panel_size; gboolean panel_vertical; @@ -32,6 +33,7 @@ struct _charpick_data { GtkWidget *add_edit_dialog; GtkWidget *add_edit_entry; GSettings *settings; + guint rebuild_id; }; typedef struct _charpick_button_cb_data charpick_button_cb_data; |