Added buggy cursor changing support.
authorMing-Ting Wei <mwei@lxde.org>
Thu, 9 Jul 2009 01:48:47 +0000 (01:48 +0000)
committerMing-Ting Wei <mwei@lxde.org>
Thu, 9 Jul 2009 01:48:47 +0000 (01:48 +0000)
src/main-dlg-ui.c
src/main-dlg.c
src/main-dlg.h

index e1826a0..6373762 100644 (file)
@@ -53,6 +53,16 @@ create_dlg (void)
   GtkWidget *label18;
   GtkWidget *remove_theme;
   GtkWidget *label3;
+  GtkWidget *vbox2;
+  GtkWidget *label4;
+  GtkWidget *scrolledwindow3;
+  GtkWidget *cursor_theme_view;
+  GtkWidget *hbox2;
+  GtkWidget *label6;
+  GtkWidget *label9;
+  GtkWidget *cursor_theme_size;
+  GtkWidget *label10;
+  GtkWidget *label1;
   GtkWidget *vbox5;
   GtkWidget *vbox6;
   GtkWidget *label19;
@@ -68,7 +78,6 @@ create_dlg (void)
 
   dlg = gtk_dialog_new ();
   gtk_window_set_title (GTK_WINDOW (dlg), _("Appearance Settings"));
-  gtk_window_set_position (GTK_WINDOW (dlg), GTK_WIN_POS_CENTER);
   gtk_window_set_default_size (GTK_WINDOW (dlg), 640, 450);
   gtk_window_set_type_hint (GTK_WINDOW (dlg), GDK_WINDOW_TYPE_HINT_DIALOG);
 
@@ -96,7 +105,6 @@ create_dlg (void)
   gtk_widget_show (scrolledwindow1);
   gtk_box_pack_start (GTK_BOX (vbox4), scrolledwindow1, TRUE, TRUE, 0);
   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_SHADOW_IN);
 
   gtk_theme_view = gtk_tree_view_new ();
   gtk_widget_show (gtk_theme_view);
@@ -136,7 +144,6 @@ create_dlg (void)
   gtk_widget_show (scrolledwindow2);
   gtk_box_pack_start (GTK_BOX (vbox3), scrolledwindow2, TRUE, TRUE, 0);
   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow2), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow2), GTK_SHADOW_IN);
 
   icon_theme_view = gtk_tree_view_new ();
   gtk_widget_show (icon_theme_view);
@@ -175,6 +182,51 @@ create_dlg (void)
   gtk_widget_show (label3);
   gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 1), label3);
 
+  vbox2 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_show (vbox2);
+  gtk_container_add (GTK_CONTAINER (notebook1), vbox2);
+
+  label4 = gtk_label_new (_("Available Cursor Themes"));
+  gtk_widget_show (label4);
+  gtk_box_pack_start (GTK_BOX (vbox2), label4, FALSE, FALSE, 0);
+  gtk_misc_set_padding (GTK_MISC (label4), 4, 4);
+
+  scrolledwindow3 = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_show (scrolledwindow3);
+  gtk_box_pack_start (GTK_BOX (vbox2), scrolledwindow3, TRUE, TRUE, 0);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow3), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+  cursor_theme_view = gtk_tree_view_new ();
+  gtk_widget_show (cursor_theme_view);
+  gtk_container_add (GTK_CONTAINER (scrolledwindow3), cursor_theme_view);
+  gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (cursor_theme_view), FALSE);
+
+  hbox2 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (hbox2);
+  gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, TRUE, 8);
+
+  label6 = gtk_label_new (_("Size"));
+  gtk_widget_show (label6);
+  gtk_box_pack_start (GTK_BOX (hbox2), label6, FALSE, FALSE, 4);
+
+  label9 = gtk_label_new (_("Small"));
+  gtk_widget_show (label9);
+  gtk_box_pack_start (GTK_BOX (hbox2), label9, FALSE, FALSE, 4);
+
+  cursor_theme_size = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 16, 64, 1, 0, 0)));
+  gtk_widget_show (cursor_theme_size);
+  gtk_box_pack_start (GTK_BOX (hbox2), cursor_theme_size, TRUE, TRUE, 0);
+  gtk_scale_set_draw_value (GTK_SCALE (cursor_theme_size), FALSE);
+  gtk_scale_set_digits (GTK_SCALE (cursor_theme_size), 0);
+
+  label10 = gtk_label_new (_("Large"));
+  gtk_widget_show (label10);
+  gtk_box_pack_start (GTK_BOX (hbox2), label10, FALSE, FALSE, 4);
+
+  label1 = gtk_label_new (_("Cursor"));
+  gtk_widget_show (label1);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 2), label1);
+
   vbox5 = gtk_vbox_new (FALSE, 4);
   gtk_widget_show (vbox5);
   gtk_container_add (GTK_CONTAINER (notebook1), vbox5);
@@ -199,7 +251,7 @@ create_dlg (void)
 
   label5 = gtk_label_new (_("Other"));
   gtk_widget_show (label5);
-  gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 2), label5);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 3), label5);
 
   vbox1 = gtk_vbox_new (FALSE, 0);
   gtk_widget_show (vbox1);
@@ -246,6 +298,9 @@ create_dlg (void)
   g_signal_connect ((gpointer) remove_theme, "clicked",
                     G_CALLBACK (on_remove_theme_clicked),
                     NULL);
+  g_signal_connect ((gpointer) cursor_theme_size, "value_changed",
+                    G_CALLBACK (on_cursor_size_changed),
+                    NULL);
   g_signal_connect ((gpointer) tb_style, "changed",
                     G_CALLBACK (on_tb_style_changed),
                     NULL);
@@ -283,6 +338,16 @@ create_dlg (void)
   GLADE_HOOKUP_OBJECT (dlg, label18, "label18");
   GLADE_HOOKUP_OBJECT (dlg, remove_theme, "remove_theme");
   GLADE_HOOKUP_OBJECT (dlg, label3, "label3");
+  GLADE_HOOKUP_OBJECT (dlg, vbox2, "vbox2");
+  GLADE_HOOKUP_OBJECT (dlg, label4, "label4");
+  GLADE_HOOKUP_OBJECT (dlg, scrolledwindow3, "scrolledwindow3");
+  GLADE_HOOKUP_OBJECT (dlg, cursor_theme_view, "cursor_theme_view");
+  GLADE_HOOKUP_OBJECT (dlg, hbox2, "hbox2");
+  GLADE_HOOKUP_OBJECT (dlg, label6, "label6");
+  GLADE_HOOKUP_OBJECT (dlg, label9, "label9");
+  GLADE_HOOKUP_OBJECT (dlg, cursor_theme_size, "cursor_theme_size");
+  GLADE_HOOKUP_OBJECT (dlg, label10, "label10");
+  GLADE_HOOKUP_OBJECT (dlg, label1, "label1");
   GLADE_HOOKUP_OBJECT (dlg, vbox5, "vbox5");
   GLADE_HOOKUP_OBJECT (dlg, vbox6, "vbox6");
   GLADE_HOOKUP_OBJECT (dlg, label19, "label19");
index 04a210f..865c513 100644 (file)
@@ -45,9 +45,14 @@ static GtkListStore* gtk_theme_list = NULL;
 static GtkTreeView* icon_theme_view = NULL;
 static GtkListStore* icon_theme_list = NULL;
 
+static GtkTreeView* cursor_theme_view = NULL;
+static GtkListStore* cursor_theme_list = NULL;
+
 static char* gtk_theme_name = NULL;
 static char* icon_theme_name = NULL;
 static char* font_name = NULL;
+static char* cursor_theme_name = NULL;
+static gint cursor_theme_size = 0;
 static GtkToolbarStyle tb_style = GTK_TOOLBAR_BOTH;
 
 extern char tmp_rc_file[];
@@ -159,6 +164,8 @@ static void write_rc_file( const char* path )
         fprintf( f, "gtk-icon-theme-name=\"%s\"\n", icon_theme_name );
         fprintf( f, "gtk-font-name=\"%s\"\n", font_name );
         fprintf( f, "gtk-toolbar-style=%d\n", tb_style );
+        fprintf( f, "gtk-cursor-theme-name=\"%s\"\n", cursor_theme_name );
+        fprintf( f, "gtk-cursor-theme-size=\"%d\"\n", cursor_theme_size );
 
         fprintf( f, "include \"%s/.gtkrc-2.0.mine\"\n", g_get_home_dir() );
 
@@ -180,38 +187,40 @@ static void create_lxde_config_dir()
 static void write_lxde_config()
 {
     FILE* f;
-       char* file, *data;
-       gsize len;
-       GKeyFile* kf = g_key_file_new();
-       gboolean ret;
-
-       file = g_build_filename( g_get_user_config_dir(), "lxde/config", NULL );
-       ret = g_key_file_load_from_file( kf, file, G_KEY_FILE_KEEP_COMMENTS, NULL );
-
-       if( ! ret )
-       {
-               const gchar* const * dir;
-               const gchar* const * dirs = g_get_system_data_dirs();
-               create_lxde_config_dir();
-               /* load system-wide config file */
-               for( dir = dirs; *dir; ++dir )
-               {
-                       char* path = g_build_filename( *dir, "lxde/config", NULL );
-                       ret = g_key_file_load_from_file( kf, path, 0, NULL );
-                       g_free( path );
-                       if( ret )
-                               break;
-               }
-       }
-
-       g_key_file_set_string( kf, "GTK", "sNet/ThemeName", gtk_theme_name );
-       g_key_file_set_string( kf, "GTK", "sNet/IconThemeName", icon_theme_name );
-       g_key_file_set_string( kf, "GTK", "sGtk/FontName", font_name );
-       g_key_file_set_integer( kf, "GTK", "iGtk/ToolbarStyle", tb_style );
-
-       data = g_key_file_to_data( kf, &len, NULL );
-       g_key_file_free( kf );
-
+    char* file, *data;
+    gsize len;
+    GKeyFile* kf = g_key_file_new();
+    gboolean ret;
+    
+    file = g_build_filename( g_get_user_config_dir(), "lxde/config", NULL );
+    ret = g_key_file_load_from_file( kf, file, G_KEY_FILE_KEEP_COMMENTS, NULL );
+    
+    if( ! ret )
+    {
+       const gchar* const * dir;
+       const gchar* const * dirs = g_get_system_data_dirs();
+       create_lxde_config_dir();
+       /* load system-wide config file */
+       for( dir = dirs; *dir; ++dir )
+       {
+               char* path = g_build_filename( *dir, "lxde/config", NULL );
+               ret = g_key_file_load_from_file( kf, path, 0, NULL );
+               g_free( path );
+               if( ret )
+                       break;
+       }
+    }
+    
+    g_key_file_set_string( kf, "GTK", "sNet/ThemeName", gtk_theme_name );
+    g_key_file_set_string( kf, "GTK", "sNet/IconThemeName", icon_theme_name );
+    g_key_file_set_string( kf, "GTK", "sGtk/FontName", font_name );
+    g_key_file_set_integer( kf, "GTK", "iGtk/ToolbarStyle", tb_style );
+    g_key_file_set_string( kf, "GTK", "sGtk/CursorThemeName", cursor_theme_name );
+    g_key_file_set_integer( kf, "GTK", "iGtk/CursorThemeSize", cursor_theme_size );
+    
+    data = g_key_file_to_data( kf, &len, NULL );
+    g_key_file_free( kf );
+    
     if( f = fopen( file, "w" ) )
     {
                fwrite( data, sizeof(char), len, f );
@@ -255,6 +264,17 @@ static void on_list_sel_changed( GtkTreeSelection* sel, const char* prop )
             if( under_lxde )
                                g_object_set( gtk_settings_get_default(), "gtk-icon-theme-name", name, NULL );
         }
+        else if( model == GTK_TREE_MODEL (cursor_theme_list) )   /* cursor theme */
+        {
+            if( name && cursor_theme_name && 0 == strcmp( name, cursor_theme_name ) )
+                goto out;
+            g_free( cursor_theme_name );
+            cursor_theme_name = g_strdup(name);
+           //gdk_x11_display_set_cursor_theme ( gdk_display_get_default (), name, cursor_theme_size );
+
+            if( under_lxde )
+                               g_object_set( gtk_settings_get_default(), "gtk-cursor-theme-name", name, NULL );
+        }
 
        if( under_lxde )
        {
@@ -289,7 +309,7 @@ static GtkListStore* init_tree_view( GtkTreeView* view, GCallback on_sel_changed
     GtkTreeViewColumn* col;
     GtkListStore* list;
     GtkTreeSelection* sel;
-    int text_col = strcmp(prop, "gtk-theme-name") ? COL_DISP_NAME : COL_NAME;
+    int text_col = strcmp(prop, "gtk-theme-name") && strcmp(prop, "gtk-cursor-theme-name") ? COL_DISP_NAME : COL_NAME;
 
     col = gtk_tree_view_column_new_with_attributes( NULL, gtk_cell_renderer_text_new(),
                                                     "text", text_col, NULL );
@@ -459,6 +479,16 @@ static void load_icon_themes( GtkListStore* list, const char* cur_sel )
     gtk_tree_sortable_set_sort_column_id( (GtkTreeSortable*)list, 0, GTK_SORT_ASCENDING );
 }
 
+static void load_cursor_themes( GtkListStore* list, const char* cur_sel )
+{
+    char* path;
+    GtkTreeSelection* sel = gtk_tree_view_get_selection( cursor_theme_view );
+    load_from_data_dirs( list, "icons", "cursors", sel, cur_sel, NULL );
+    path = g_build_filename( g_get_home_dir(), ".icons", NULL );
+    load_themes_from_dir( list, path, "cursors", sel, cur_sel, NULL );
+    g_free( path );
+    gtk_tree_sortable_set_sort_column_id( (GtkTreeSortable*)list, 0, GTK_SORT_ASCENDING );
+}
 /*
 static void load_fonts( GtkListStore* list )
 {
@@ -505,14 +535,20 @@ void main_dlg_init( GtkWidget* dlg )
                         "gtk-icon-theme-name", &icon_theme_name,
                         "gtk-font-name", &font_name,
                         "gtk-toolbar-style", &tb_style,
+                        "gtk-cursor-theme-name", &cursor_theme_name,
+                        "gtk-cursor-theme-size", &cursor_theme_size,
                         NULL );
 
     if(  ! gtk_theme_name )
         gtk_theme_name = g_strdup( "Raleigh" );
     if(  ! icon_theme_name )
-        gtk_theme_name = g_strdup( "hicolor" );
+        icon_theme_name = g_strdup( "hicolor" );
+    if(  ! cursor_theme_name )
+        cursor_theme_name = g_strdup( "default" );
     if( ! font_name )
         font_name = g_strdup( "Sans 10" );
+    if(  ! cursor_theme_size )
+        cursor_theme_size = 16;
 
        /* no lxde-settings daemon, use gtkrc-2.0 */
        if( ! under_lxde )
@@ -520,7 +556,9 @@ void main_dlg_init( GtkWidget* dlg )
 
     INIT_LIST( gtk_theme, "gtk-theme-name" )
     INIT_LIST( icon_theme, "gtk-icon-theme-name" )
+    INIT_LIST( cursor_theme, "gtk-cursor-theme-name" )
     gtk_font_button_set_font_name( (GtkFontButton*)lookup_widget(dlg, "font"), font_name );
+    gtk_range_set_value( GTK_RANGE(lookup_widget(dlg, "cursor_theme_size")), cursor_theme_size );
 
     gtk_combo_box_set_active( (GtkComboBox*)lookup_widget(dlg, "tb_style"), tb_style < 4 ? tb_style : 3 );
 
@@ -646,6 +684,10 @@ on_install_theme_clicked               (GtkButton       *button,
             /* reload all icon themes */
             gtk_list_store_clear( icon_theme_list );
             load_icon_themes( icon_theme_list, stdo ? stdo : "" );
+
+            /* reload all cursor themes */
+            gtk_list_store_clear( cursor_theme_list );
+            load_cursor_themes( cursor_theme_list, stdo ? stdo : "" );
         }
         g_free( file );
     }
@@ -661,6 +703,23 @@ on_remove_theme_clicked                (GtkButton       *button,
 
 }
 
+void
+on_cursor_size_changed                 (GtkHScale       *cursorsizescale,
+                                        gpointer         user_data)
+{
+    cursor_theme_size = gtk_range_get_value( GTK_RANGE(cursorsizescale) );
+
+       if( under_lxde )
+       {
+               g_object_set( gtk_settings_get_default(), "gtk-cursor-theme-size", cursor_theme_size, NULL );
+               enable_apply();
+       }
+       else
+       {
+               write_rc_file( tmp_rc_file );
+               reload_demo_process();
+       }
+}
 
 void
 on_tb_style_changed                    (GtkComboBox     *combobox,
index b19768c..51e1388 100644 (file)
@@ -19,5 +19,9 @@ on_remove_theme_clicked                (GtkButton       *button,
                                         gpointer         user_data);
 
 void
+on_cursor_size_changed                 (GtkHScale       *cursorsizescale,
+                                        gpointer         user_data);
+
+void
 on_tb_style_changed                    (GtkComboBox     *combobox,
                                         gpointer         user_data);