diff options
-rw-r--r-- | settings/main.c | 28 | ||||
-rw-r--r-- | settings/xfdesktop-settings-ui.glade | 47 | ||||
-rw-r--r-- | src/xfdesktop-icon-view.c | 110 |
3 files changed, 167 insertions, 18 deletions
diff --git a/settings/main.c b/settings/main.c index 7122d35c..3e92b16d 100644 --- a/settings/main.c +++ b/settings/main.c @@ -75,6 +75,8 @@ #define DESKTOP_ICONS_ICON_SIZE_PROP "/desktop-icons/icon-size" #define DESKTOP_ICONS_FONT_SIZE_PROP "/desktop-icons/font-size" #define DESKTOP_ICONS_CUSTOM_FONT_SIZE_PROP "/desktop-icons/use-custom-font-size" +#define DESKTOP_ICONS_SHOW_TOOLTIP_PROP "/desktop-icons/show-tooltips" +#define DESKTOP_ICONS_TOOLTIP_SIZE_PROP "/desktop-icons/tooltip-size" #define DESKTOP_ICONS_SINGLE_CLICK_PROP "/desktop-icons/single-click" typedef struct @@ -867,9 +869,11 @@ xfdesktop_settings_get_active_workspace(AppearancePanel *panel, return workspace_num; } +/* This works for both the custom font size and show tooltips check buttons, + * it just enables the associated spin button */ static void -cb_xfdesktop_chk_custom_font_size_toggled(GtkCheckButton *button, - gpointer user_data) +cb_xfdesktop_chk_button_toggled(GtkCheckButton *button, + gpointer user_data) { GtkWidget *spin_button = GTK_WIDGET(user_data); @@ -1599,7 +1603,7 @@ xfdesktop_settings_dialog_setup_tabs(GtkBuilder *main_gxml, GtkWidget *appearance_container, *chk_custom_font_size, *spin_font_size, *w, *box, *spin_icon_size, *chk_show_thumbnails, *chk_single_click, *appearance_settings, - *bnt_exit; + *chk_show_tooltips, *spin_tooltip_size, *bnt_exit; GtkBuilder *appearance_gxml; AppearancePanel *panel = g_new0(AppearancePanel, 1); GError *error = NULL; @@ -1639,10 +1643,20 @@ xfdesktop_settings_dialog_setup_tabs(GtkBuilder *main_gxml, chk_single_click = GTK_WIDGET(gtk_builder_get_object(main_gxml, "chk_single_click")); + /* tooltip options */ + chk_show_tooltips = GTK_WIDGET(gtk_builder_get_object(main_gxml, "chk_show_tooltips")); + spin_tooltip_size = GTK_WIDGET(gtk_builder_get_object(main_gxml, "spin_tooltip_size")); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_tooltip_size), 128); + + /* connect up the signals */ g_signal_connect(G_OBJECT(chk_custom_font_size), "toggled", - G_CALLBACK(cb_xfdesktop_chk_custom_font_size_toggled), + G_CALLBACK(cb_xfdesktop_chk_button_toggled), spin_font_size); + g_signal_connect(G_OBJECT(chk_show_tooltips), "toggled", + G_CALLBACK(cb_xfdesktop_chk_button_toggled), + spin_tooltip_size); + /* thumbnails */ chk_show_thumbnails = GTK_WIDGET(gtk_builder_get_object(main_gxml, "chk_show_thumbnails")); @@ -1836,6 +1850,12 @@ xfdesktop_settings_dialog_setup_tabs(GtkBuilder *main_gxml, xfconf_g_property_bind(channel, DESKTOP_ICONS_CUSTOM_FONT_SIZE_PROP, G_TYPE_BOOLEAN, G_OBJECT(chk_custom_font_size), "active"); + xfconf_g_property_bind(channel, DESKTOP_ICONS_SHOW_TOOLTIP_PROP, + G_TYPE_BOOLEAN, G_OBJECT(chk_show_tooltips), + "active"); + xfconf_g_property_bind(channel, DESKTOP_ICONS_TOOLTIP_SIZE_PROP, G_TYPE_DOUBLE, + G_OBJECT(gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(spin_tooltip_size))), + "value"); xfconf_g_property_bind(channel, DESKTOP_ICONS_SHOW_THUMBNAILS, G_TYPE_BOOLEAN, G_OBJECT(chk_show_thumbnails), "active"); diff --git a/settings/xfdesktop-settings-ui.glade b/settings/xfdesktop-settings-ui.glade index b69fe4b8..1e721791 100644 --- a/settings/xfdesktop-settings-ui.glade +++ b/settings/xfdesktop-settings-ui.glade @@ -17,6 +17,14 @@ <property name="page_size">0</property> <property name="value">12</property> </object> + <object class="GtkAdjustment" id="adjustment_tooltip"> + <property name="upper">256</property> + <property name="lower">0</property> + <property name="page_increment">10</property> + <property name="step_increment">1</property> + <property name="page_size">0</property> + <property name="value">128</property> + </object> <object class="GtkListStore" id="model3"> <columns> <column type="gchararray"/> @@ -635,6 +643,45 @@ </object> </child> <child> + <object class="GtkHBox" id="hboxtooltip"> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="spacing">4</property> + <child> + <object class="GtkCheckButton" id="chk_show_tooltips"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="label" translatable="yes">Show icon tooltips. Size:</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <property name="active">True</property> + </object> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="spin_tooltip_size"> + <property name="visible">True</property> + <property name="sensitive">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="adjustment">adjustment_tooltip</property> + <property name="tooltip-text" translatable="yes">Size of the tooltip preview image.</property> + </object> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="position">2</property> + </packing> + </child> + <child> <object class="GtkHBox" id="hbox9"> <property name="visible">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> diff --git a/src/xfdesktop-icon-view.c b/src/xfdesktop-icon-view.c index 817db459..dd4a7e40 100644 --- a/src/xfdesktop-icon-view.c +++ b/src/xfdesktop-icon-view.c @@ -52,8 +52,10 @@ #include <libxfce4ui/libxfce4ui.h> #include <xfconf/xfconf.h> -#define DEFAULT_FONT_SIZE 12 -#define DEFAULT_ICON_SIZE 32 +#define DEFAULT_FONT_SIZE 12 +#define DEFAULT_ICON_SIZE 32 +#define DEFAULT_TOOLTIP_SIZE 128 +#define MAX_TOOLTIP_SIZE 512 #define ICON_SIZE (icon_view->priv->icon_size) #define TEXT_WIDTH ((icon_view->priv->cell_text_width_proportion) * ICON_SIZE) @@ -178,7 +180,13 @@ struct _XfdesktopIconViewPrivate gdouble cell_text_width_proportion; gboolean ellipsize_icon_labels; - guint tooltip_size; + + /* tooltip options - There's a style and an xfconf property. + * The order is xfconf, style, with a fall back of DEFAULT_TOOLTIP_SIZE. + * xfdesktop_icon_view_get_tooltip_size will return the correct size. */ + gboolean show_tooltips; + gint tooltip_size_from_style; + double tooltip_szie_from_xfconf; gboolean single_click; }; @@ -327,6 +335,7 @@ static gboolean xfdesktop_icon_view_icon_find_position(XfdesktopIconView *icon_v static gboolean xfdesktop_icon_view_shift_area_to_cell(XfdesktopIconView *icon_view, XfdesktopIcon *icon, GdkRectangle *text_area); +static gint xfdesktop_icon_view_get_tooltip_size(XfdesktopIconView *icon_view); static gboolean xfdesktop_icon_view_show_tooltip(GtkWidget *widget, gint x, gint y, @@ -361,6 +370,8 @@ enum { PROP_0 = 0, PROP_SINGLE_CLICK, + PROP_SHOW_TOOLTIPS, + PROP_TOOLTIP_SIZE, }; @@ -575,11 +586,11 @@ xfdesktop_icon_view_class_init(XfdesktopIconViewClass *klass) G_PARAM_READABLE)); gtk_widget_class_install_style_property(widget_class, - g_param_spec_uint("tooltip-size", - "Tooltip Image Size", - "The size of the tooltip image preview", - 0, 512, 128, - G_PARAM_READABLE)); + g_param_spec_int("tooltip-size", + "Tooltip Image Size", + "The size of the tooltip image preview", + -1, MAX_TOOLTIP_SIZE, -1, + G_PARAM_READABLE)); #define XFDESKTOP_PARAM_FLAGS (G_PARAM_READWRITE \ | G_PARAM_CONSTRUCT \ @@ -594,6 +605,20 @@ xfdesktop_icon_view_class_init(XfdesktopIconViewClass *klass) FALSE, XFDESKTOP_PARAM_FLAGS)); + g_object_class_install_property(gobject_class, PROP_SHOW_TOOLTIPS, + g_param_spec_boolean("show-tooltips", + "show tooltips", + "show tooltips for icons on the desktop", + TRUE, + XFDESKTOP_PARAM_FLAGS)); + + g_object_class_install_property(gobject_class, PROP_TOOLTIP_SIZE, + g_param_spec_double("tooltip-size", + "tooltip size", + "size of the tooltip image preview", + -1, MAX_TOOLTIP_SIZE, -1, + XFDESKTOP_PARAM_FLAGS)); + #undef XFDESKTOP_PARAM_FLAGS /* same binding entries as GtkIconView */ @@ -726,6 +751,14 @@ xfce_icon_view_set_property(GObject *object, icon_view->priv->single_click = g_value_get_boolean (value); break; + case PROP_SHOW_TOOLTIPS: + icon_view->priv->show_tooltips = g_value_get_boolean(value); + break; + + case PROP_TOOLTIP_SIZE: + icon_view->priv->tooltip_szie_from_xfconf = g_value_get_double(value); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break; @@ -745,6 +778,14 @@ xfce_icon_view_get_property(GObject *object, g_value_set_boolean(value, icon_view->priv->single_click); break; + case PROP_SHOW_TOOLTIPS: + g_value_set_boolean(value, icon_view->priv->show_tooltips); + break; + + case PROP_TOOLTIP_SIZE: + g_value_set_double(value, icon_view->priv->tooltip_szie_from_xfconf); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break; @@ -922,6 +963,27 @@ xfdesktop_icon_view_get_single_click(XfdesktopIconView *icon_view) return icon_view->priv->single_click; } +static gint +xfdesktop_icon_view_get_tooltip_size(XfdesktopIconView *icon_view) +{ + g_return_val_if_fail(XFDESKTOP_IS_ICON_VIEW(icon_view), DEFAULT_TOOLTIP_SIZE); + + /* Check if we're showing tooltips at all */ + if(!icon_view->priv->show_tooltips) + return 0; + + /* If the xfconf size is set and sane, use it */ + if(icon_view->priv->tooltip_szie_from_xfconf >= 0) + return icon_view->priv->tooltip_szie_from_xfconf; + + /* if the style size is set and sane, use it */ + if(icon_view->priv->tooltip_size_from_style >= 0) + return icon_view->priv->tooltip_size_from_style; + + /* Fall back */ + return DEFAULT_TOOLTIP_SIZE; +} + static gboolean xfdesktop_icon_view_button_release(GtkWidget *widget, GdkEventButton *evt, @@ -1091,24 +1153,32 @@ xfdesktop_icon_view_show_tooltip(GtkWidget *widget, XfdesktopIconView *icon_view = XFDESKTOP_ICON_VIEW(widget); const gchar *tip_text; gchar *padded_tip_text = NULL; + gint tooltip_size; if(!icon_view->priv->item_under_pointer || icon_view->priv->definitely_dragging) { return FALSE; } - + + /* not showing tooltips */ + if(!icon_view->priv->show_tooltips) + return FALSE; + + tooltip_size = xfdesktop_icon_view_get_tooltip_size(icon_view); + DBG("tooltip size %d", tooltip_size); + tip_text = xfdesktop_icon_peek_tooltip(icon_view->priv->item_under_pointer); if(!tip_text) return FALSE; padded_tip_text = g_strdup_printf("%s\t", tip_text); - if(icon_view->priv->tooltip_size > 0) { + if(tooltip_size > 0) { gtk_tooltip_set_icon(tooltip, xfdesktop_icon_peek_tooltip_pixbuf(icon_view->priv->item_under_pointer, - icon_view->priv->tooltip_size * 1.5f, - icon_view->priv->tooltip_size)); + tooltip_size * 1.5f, + tooltip_size)); } gtk_tooltip_set_text(tooltip, padded_tip_text); @@ -1884,7 +1954,7 @@ xfdesktop_icon_view_style_set(GtkWidget *widget, "cell-padding", &icon_view->priv->cell_padding, "cell-text-width-proportion", &icon_view->priv->cell_text_width_proportion, "ellipsize-icon-labels", &icon_view->priv->ellipsize_icon_labels, - "tooltip-size", &icon_view->priv->tooltip_size, + "tooltip-size", &icon_view->priv->tooltip_size_from_style, "label-radius", &icon_view->priv->label_radius, NULL); @@ -1892,7 +1962,7 @@ xfdesktop_icon_view_style_set(GtkWidget *widget, DBG("cell padding is %d", icon_view->priv->cell_padding); DBG("cell text width proportion is %f", icon_view->priv->cell_text_width_proportion); DBG("ellipsize icon label is %s", icon_view->priv->ellipsize_icon_labels?"true":"false"); - DBG("tooltip size is %d", icon_view->priv->tooltip_size); + DBG("tooltip size is %d", icon_view->priv->tooltip_size_from_style); DBG("label radius is %f", icon_view->priv->label_radius); if(icon_view->priv->selection_box_color) { @@ -3596,6 +3666,18 @@ xfdesktop_icon_view_new(XfdesktopIconViewManager *manager) G_TYPE_BOOLEAN, G_OBJECT(icon_view), "single_click"); + + xfconf_g_property_bind(icon_view->priv->channel, + "/desktop-icons/show-tooltips", + G_TYPE_BOOLEAN, + G_OBJECT(icon_view), + "show_tooltips"); + + xfconf_g_property_bind(icon_view->priv->channel, + "/desktop-icons/tooltip-size", + G_TYPE_DOUBLE, + G_OBJECT(icon_view), + "tooltip_size"); return GTK_WIDGET(icon_view); } |