Added support for sorting desktop icons from right to left. --- xfdesktop-4.4.2/settings/behavior-settings.c +++ xfdesktop-4.4.2-new/settings/behavior-settings.c @@ -37,6 +37,7 @@ OPT_ICONSSYSTEMFONT, OPT_ICONSICONSIZE, OPT_ICONSFONTSIZE, + OPT_ICONSRTLLAYOUT, #endif }; @@ -54,6 +55,7 @@ static gboolean desktop_icons_use_system_font = TRUE; static guint desktop_icons_font_size = 12; /* default, i guess */ static guint desktop_icons_icon_size = 32; /* default */ +static gboolean desktop_icons_rtl_layout = FALSE; #endif static void @@ -85,6 +87,13 @@ gtk_widget_set_sensitive(bd->frame_sysfont, !desktop_icons_use_system_font); break; + + case OPT_ICONSRTLLAYOUT: + desktop_icons_rtl_layout = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)); + mcs_manager_set_int(bd->plugin->manager, + "icons_rtl_layout", BACKDROP_CHANNEL, + desktop_icons_rtl_layout ? 1 : 0); + break; #endif default: g_warning("xfdesktop menu: got invalid checkbox ID"); @@ -202,6 +211,15 @@ if(setting && setting->data.v_int > 0) desktop_icons_icon_size = setting->data.v_int; + setting = mcs_manager_setting_lookup(plugin->manager, + "icons_rtl_layout", + BACKDROP_CHANNEL); + if(setting) + desktop_icons_rtl_layout = setting->data.v_int ? TRUE : FALSE; + else + mcs_manager_set_int(plugin->manager, "icons_rtl_layout", + BACKDROP_CHANNEL, 0); + #endif /* ENABLE_DESKTOP_ICONS */ } @@ -350,6 +368,15 @@ gtk_widget_set_sensitive(bd->frame_sysfont, !desktop_icons_use_system_font); + chk = gtk_check_button_new_with_mnemonic(_("Sort icons from _right to left")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk), + desktop_icons_rtl_layout); + g_object_set_data(G_OBJECT(chk), "xfce-chknum", + GUINT_TO_POINTER(OPT_ICONSRTLLAYOUT)); + gtk_widget_show(chk); + gtk_box_pack_start(GTK_BOX(bd->vbox_icon_settings), chk, FALSE, FALSE, 0); + g_signal_connect(G_OBJECT(chk), "toggled", G_CALLBACK(set_chk_option), bd); + if(desktop_icon_style == XFCE_DESKTOP_ICON_STYLE_NONE) gtk_widget_set_sensitive(bd->vbox_icon_settings, FALSE); --- xfdesktop-4.4.2/src/xfce-desktop-settings.c +++ xfdesktop-4.4.2-new/src/xfce-desktop-settings.c @@ -269,6 +269,14 @@ mcs_setting_free(setting); setting = NULL; } + + if(MCS_SUCCESS == mcs_client_get_setting(mcs_client, "icons_rtl_layout", + BACKDROP_CHANNEL, &setting)) + { + xfce_desktop_set_icons_rtl_layout(desktop, setting->data.v_int); + mcs_setting_free(setting); + setting = NULL; + } #endif for(i = 0; i < nmonitors; i++) { @@ -414,6 +422,11 @@ xfce_desktop_set_icon_font_size(desktop, setting->data.v_int); return TRUE; } + + if(!strcmp(setting->name, "icons_rtl_layout")) { + xfce_desktop_set_icons_rtl_layout_and_mirror(desktop, setting->data.v_int); + return TRUE; + } #endif /* get the screen and monitor number */ --- xfdesktop-4.4.2/src/xfce-desktop.c +++ xfdesktop-4.4.2-new/src/xfce-desktop.c @@ -96,6 +96,7 @@ gboolean icons_use_system_font; guint icons_font_size; guint icons_size; + gboolean rtl_layout; GtkWidget *icon_view; gdouble system_font_size; #endif @@ -244,6 +245,8 @@ xfdesktop_icon_view_set_icon_size(XFDESKTOP_ICON_VIEW(desktop->priv->icon_view), desktop->priv->icons_size); } + xfdesktop_icon_view_set_rtl_layout(XFDESKTOP_ICON_VIEW(desktop->priv->icon_view), + desktop->priv->rtl_layout); gtk_widget_show(desktop->priv->icon_view); gtk_container_add(GTK_CONTAINER(desktop), desktop->priv->icon_view); } @@ -534,6 +537,7 @@ GTK_WINDOW(desktop)->type = GTK_WINDOW_TOPLEVEL; #ifdef ENABLE_DESKTOP_ICONS desktop->priv->icons_use_system_font = TRUE; + desktop->priv->rtl_layout = FALSE; #endif gtk_window_set_type_hint(GTK_WINDOW(desktop), GDK_WINDOW_TYPE_HINT_DESKTOP); @@ -879,6 +883,45 @@ } void +xfce_desktop_set_icons_rtl_layout(XfceDesktop *desktop, + gboolean rtl_layout) +{ + g_return_if_fail(XFCE_IS_DESKTOP(desktop)); + +#ifdef ENABLE_DESKTOP_ICONS + if(rtl_layout == desktop->priv->rtl_layout) + return; + + desktop->priv->rtl_layout = rtl_layout; + + if(desktop->priv->icon_view) { + xfdesktop_icon_view_set_rtl_layout(XFDESKTOP_ICON_VIEW(desktop->priv->icon_view), + rtl_layout); + } +#endif +} + +void +xfce_desktop_set_icons_rtl_layout_and_mirror(XfceDesktop *desktop, + gboolean rtl_layout) +{ + g_return_if_fail(XFCE_IS_DESKTOP(desktop)); + +#ifdef ENABLE_DESKTOP_ICONS + if(rtl_layout == desktop->priv->rtl_layout) + return; + + desktop->priv->rtl_layout = rtl_layout; + + if(desktop->priv->icon_view) { + xfdesktop_icon_view_set_rtl_layout(XFDESKTOP_ICON_VIEW(desktop->priv->icon_view), + rtl_layout); + xfdesktop_icon_view_mirror(XFDESKTOP_ICON_VIEW(desktop->priv->icon_view)); + } +#endif +} + +void xfce_desktop_set_icon_font_size(XfceDesktop *desktop, guint font_size_points) { --- xfdesktop-4.4.2/src/xfce-desktop.h +++ xfdesktop-4.4.2-new/src/xfce-desktop.h @@ -87,6 +87,12 @@ void xfce_desktop_set_icon_font_size(XfceDesktop *desktop, guint font_size_points); +void xfce_desktop_set_icons_rtl_layout(XfceDesktop *desktop, + gboolean rtl_layout); + +void xfce_desktop_set_icons_rtl_layout_and_mirror(XfceDesktop *desktop, + gboolean rtl_layout); + void xfce_desktop_set_session_logout_func(XfceDesktop *desktop, SessionLogoutFunc logout_func); --- xfdesktop-4.4.2/src/xfdesktop-icon-view.c +++ xfdesktop-4.4.2-new/src/xfdesktop-icon-view.c @@ -100,6 +100,7 @@ guint icon_size; guint font_size; + gboolean rtl_layout; NetkScreen *netk_screen; PangoLayout *playout; @@ -364,6 +365,7 @@ icon_view->priv->icon_size = DEFAULT_ICON_SIZE; icon_view->priv->font_size = DEFAULT_FONT_SIZE; + icon_view->priv->rtl_layout = FALSE; icon_view->priv->native_targets = gtk_target_list_new(icon_view_targets, icon_view_n_targets); @@ -1680,6 +1682,12 @@ icon_view->priv->nrows = (height - SCREEN_MARGIN * 2) / CELL_SIZE; icon_view->priv->ncols = (width - SCREEN_MARGIN * 2) / CELL_SIZE; + + if(icon_view->priv->rtl_layout) { + gint remainder = width - icon_view->priv->ncols * CELL_SIZE - SCREEN_MARGIN * 2; + icon_view->priv->xorigin += remainder; + icon_view->priv->width -= remainder; + } DBG("CELL_SIZE=%d, TEXT_WIDTH=%d, ICON_SIZE=%d", CELL_SIZE, TEXT_WIDTH, ICON_SIZE); DBG("grid size is %dx%d", icon_view->priv->nrows, icon_view->priv->ncols); @@ -2201,9 +2209,16 @@ maxi = icon_view->priv->nrows * icon_view->priv->ncols; for(i = 0; i < maxi; ++i) { - if(!icon_view->priv->grid_layout[i]) { - *row = i % icon_view->priv->nrows; - *col = i / icon_view->priv->nrows; + gint index; + guint16 cur_row = i % icon_view->priv->nrows; + guint16 cur_col = i / icon_view->priv->nrows; + if(icon_view->priv->rtl_layout) { + cur_col = icon_view->priv->ncols - 1 - cur_col; + } + index = cur_col * icon_view->priv->nrows + cur_row; + if(!icon_view->priv->grid_layout[index]) { + *row = cur_row; + *col = cur_col; return TRUE; } } @@ -2946,6 +2961,58 @@ return icon_view->priv->font_size; } +void +xfdesktop_icon_view_set_rtl_layout(XfdesktopIconView *icon_view, + gboolean rtl_layout) +{ + g_return_if_fail(XFDESKTOP_IS_ICON_VIEW(icon_view)); + + if(rtl_layout == icon_view->priv->rtl_layout) + return; + + icon_view->priv->rtl_layout = rtl_layout; + + if(GTK_WIDGET_REALIZED(GTK_WIDGET(icon_view))) { + xfdesktop_grid_do_resize(icon_view); + gtk_widget_queue_draw(GTK_WIDGET(icon_view)); + } +} + +gboolean +xfdesktop_icon_view_get_rtl_layout(XfdesktopIconView *icon_view) +{ + g_return_val_if_fail(XFDESKTOP_IS_ICON_VIEW(icon_view), 0); + return icon_view->priv->rtl_layout; +} + +void +xfdesktop_icon_view_mirror(XfdesktopIconView *icon_view) +{ + gint col, row; + for(col = 0; col < icon_view->priv->ncols/2; col++) { + gint col2 = icon_view->priv->ncols - 1 - col; + for(row = 0; row < icon_view->priv->nrows; row++) { + gint idx1 = col * icon_view->priv->nrows + row; + gint idx2 = col2 * icon_view->priv->nrows + row; + + XfdesktopIcon *icon1 = icon_view->priv->grid_layout[idx1]; + XfdesktopIcon *icon2 = icon_view->priv->grid_layout[idx2]; + + xfdesktop_grid_set_position_free(icon_view, row, col2); + if(icon1) { + xfdesktop_icon_set_position(icon1, row, col2); + xfdesktop_grid_unset_position_free(icon_view, icon1); + } + + xfdesktop_grid_set_position_free(icon_view, row, col); + if(icon2) { + xfdesktop_icon_set_position(icon2, row, col); + xfdesktop_grid_unset_position_free(icon_view, icon2); + } + } + } +} + GtkWidget * xfdesktop_icon_view_get_window_widget(XfdesktopIconView *icon_view) { --- xfdesktop-4.4.2/src/xfdesktop-icon-view.h +++ xfdesktop-4.4.2-new/src/xfdesktop-icon-view.h @@ -103,6 +103,12 @@ gint font_size_points); guint xfdesktop_icon_view_get_font_size(XfdesktopIconView *icon_view); +void xfdesktop_icon_view_set_rtl_layout(XfdesktopIconView *icon_view, + gboolean rtl_layout); +gboolean xfdesktop_icon_view_get_rtl_layout(XfdesktopIconView *icon_view); + +void xfdesktop_icon_view_mirror(XfdesktopIconView *icon_view); + GtkWidget *xfdesktop_icon_view_get_window_widget(XfdesktopIconView *icon_view); G_END_DECLS