rpms/fast-user-switch-applet/devel error-dialog.patch, NONE, 1.1 many-users.patch, NONE, 1.1 throttle.patch, NONE, 1.1 fast-user-switch-applet.spec, 1.15, 1.16

Matthias Clasen (mclasen) fedora-extras-commits at redhat.com
Mon Sep 17 06:20:50 UTC 2007


Author: mclasen

Update of /cvs/extras/rpms/fast-user-switch-applet/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv17254

Modified Files:
	fast-user-switch-applet.spec 
Added Files:
	error-dialog.patch many-users.patch throttle.patch 
Log Message:
Some bug fixes


error-dialog.patch:

--- NEW FILE error-dialog.patch ---
diff -up fast-user-switch-applet-2.18.0/src/applet.c.error-dialog fast-user-switch-applet-2.18.0/src/applet.c
--- fast-user-switch-applet-2.18.0/src/applet.c.error-dialog	2007-09-16 23:51:41.000000000 -0400
+++ fast-user-switch-applet-2.18.0/src/applet.c	2007-09-16 23:51:41.000000000 -0400
@@ -2147,6 +2147,7 @@ show_error_dialog (FusaAppletData *adata
 
       dialog = glade_xml_get_widget (xml, "error_dialog");
       gtk_dialog_run (GTK_DIALOG (dialog));
+      gtk_widget_destroy (dialog);
 
       if (is_fatal)
 	bonobo_main_quit ();
diff -up fast-user-switch-applet-2.18.0/data/ui.glade.error-dialog fast-user-switch-applet-2.18.0/data/ui.glade
--- fast-user-switch-applet-2.18.0/data/ui.glade.error-dialog	2007-09-16 23:57:08.000000000 -0400
+++ fast-user-switch-applet-2.18.0/data/ui.glade	2007-04-09 12:01:04.000000000 -0400
@@ -726,7 +726,7 @@
 		<widget class="GtkExpander" id="details_expander">
 		  <property name="visible">True</property>
 		  <property name="can_focus">True</property>
-		  <property name="expanded">True</property>
+		  <property name="expanded">False</property>
 		  <property name="spacing">0</property>
 
 		  <child>

many-users.patch:

--- NEW FILE many-users.patch ---
diff -up fast-user-switch-applet-2.18.0/src/fusa-manager.c.many-users fast-user-switch-applet-2.18.0/src/fusa-manager.c
--- fast-user-switch-applet-2.18.0/src/fusa-manager.c.many-users	2007-09-17 01:56:45.000000000 -0400
+++ fast-user-switch-applet-2.18.0/src/fusa-manager.c	2007-09-17 02:08:59.000000000 -0400
@@ -129,11 +129,13 @@ struct _FusaManager
 
   GHashTable *shells;
   GHashTable *exclusions;
+  GHashTable *inclusions;
   gchar *global_face_dir;
   uid_t minimal_uid;
   gsize user_max_file;
   gint max_icon_size;
 
+  guint8 include_all : 1;
   guint8 allow_root  : 1;
   guint8 relax_group : 1;
   guint8 relax_other : 1;
@@ -341,6 +343,8 @@ fusa_manager_init (FusaManager *manager)
   /* GDM config file */
   manager->exclusions = g_hash_table_new_full (g_str_hash, g_str_equal,
 					       g_free, NULL);
+  manager->inclusions = g_hash_table_new_full (g_str_hash, g_str_equal,
+					       g_free, NULL);
   reload_gdm_config (manager, FALSE);
   error = NULL;
   uri = g_filename_to_uri (GDMCONFIGFILE, NULL, &error);
@@ -645,6 +649,38 @@ merge_gdm_exclusions (FusaManager  *mana
   return TRUE;
 }
 
+/* Returns TRUE if changed */
+static gboolean
+merge_gdm_inclusions (FusaManager  *manager,
+		      gchar       **includev,
+		      const gchar  *include_default[])
+{
+  gint i;
+
+  if (strv_equals_string_table (includev, manager->inclusions))
+    return FALSE;
+
+  g_hash_table_foreach_remove (manager->inclusions,
+			       clear_hash_table_hrfunc, NULL);
+
+  if (include_default)
+    {
+      for (i = 0; include_default[i] != NULL; i++)
+        g_hash_table_insert (manager->inclusions,
+			     g_strdup (include_default[i]),
+			     GUINT_TO_POINTER (TRUE));
+    }
+
+  if (includev)
+    {
+      for (i = 0; includev[i] != NULL; i++)
+        g_hash_table_insert (manager->inclusions,
+			     g_strdup (includev[i]), GUINT_TO_POINTER (TRUE));
+    }
+
+  return TRUE;
+}
+
 static void resolve_dirty_flags(GdmResultState dummy1, const gchar *dummy2, gpointer data)
 {
   FusaManager *manager = data;
@@ -687,6 +723,27 @@ static void handler_Exclude(GdmResultSta
     manager->users_dirty = TRUE;
 }
 
+static void handler_Include(GdmResultState is_ok, const gchar *value, gpointer data)
+{
+  FusaManager *manager = data;
+  gchar** includev = g_strsplit (value, ",", G_MAXINT);
+  
+  if (merge_gdm_inclusions (manager, includev, NULL))
+    manager->users_dirty = TRUE;
+}
+
+static void handler_IncludeAll(GdmResultState is_ok, const gchar *value, gpointer data)
+{
+  FusaManager *manager = data;
+  gboolean tmp_include_all = strcasecmp(value, "false") != 0;
+  
+  if (tmp_include_all != manager->include_all)
+    {
+      manager->include_all = tmp_include_all;
+      manager->users_dirty = TRUE;
+    }
+}
+
 static void handler_GlobalFaceDir(GdmResultState is_ok, const gchar *value, gpointer data)
 {
   FusaManager *manager = data;
@@ -744,6 +801,8 @@ struct SettingsHandler {
 } settings_handlers[] = {
   { "greeter/MinimalUID", handler_MinimalUID },
   { "greeter/Exclude", handler_Exclude },
+  { "greeter/Include", handler_Include },
+  { "greeter/IncludeAll", handler_IncludeAll },
   { "greeter/GlobalFaceDir", handler_GlobalFaceDir },
   { "security/UserMaxFile", handler_UserMaxFile },
   { "security/AllowRoot", handler_AllowRoot },
@@ -798,27 +857,76 @@ reload_shells (FusaManager *manager)
   endusershell ();
 }
 
-static void
-reload_passwd (FusaManager *manager)
+#define OLD_FLAG 1
+#define NEW_FLAG 2
+
+static void set_flag (GObject *obj, int flag)
 {
-  struct passwd *pwent;
-  GSList *old_users, *new_users, *list;
-  
-  old_users = NULL;
-  new_users = NULL;
+  int flags;
+
+  flags = GPOINTER_TO_INT (g_object_get_data (obj, "fusa-user-flags"));
+  flags |= flag;
+  g_object_set_data (obj, "fusa-user-flags", GINT_TO_POINTER (flags));  
+}
+
+static int get_flags (GObject *obj)
+{
+  return GPOINTER_TO_INT (g_object_get_data (obj, "fusa-user-flags"));
+}
+
+static void clear_flags (GObject *obj)
+{
+  g_object_set_data (obj, "fusa-user-flags", NULL);
+}
 
-  g_hash_table_foreach (manager->users, listify_hash_values_hfunc, &old_users);
-  g_slist_foreach (old_users, (GFunc) g_object_ref, NULL);
+static void mark_as_old (gpointer key, gpointer value, gpointer data)
+{
+  GObject *user = value;
 
+  set_flag (user, OLD_FLAG);  
   /* Make sure we keep users who are logged in no matter what. */
-  for (list = old_users; list; list = list->next)
+  if (fusa_user_get_n_displays (FUSA_USER (user)))
     {
-      if (fusa_user_get_n_displays (list->data))
-	{
-	  g_object_freeze_notify (G_OBJECT (list->data));
-	  new_users = g_slist_prepend (new_users, g_object_ref (list->data));
-	}
+      set_flag (user, NEW_FLAG);
+      g_object_freeze_notify (user);
+    }
+}
+
+static gboolean emit_add_or_remove (gpointer key, gpointer value, gpointer data)
+{
+  FusaManager *manager = data;
+  int flags;
+
+  flags = get_flags (value);
+  clear_flags (value);
+
+  if (flags == NEW_FLAG) 
+    { 
+      g_signal_emit (manager, signals[USER_ADDED], 0, value);
+      return FALSE;
+    }
+  else if (flags == OLD_FLAG)
+    {
+      g_signal_emit (manager, signals[USER_REMOVED], 0, value);
+      g_hash_table_remove (manager->users_by_uid,
+			   GINT_TO_POINTER (fusa_user_get_uid (value)));
+      return TRUE;
     }
+  else
+    return FALSE;
+}
+
+static void thaw (gpointer key, gpointer value, gpointer data)
+{
+  g_object_thaw_notify (value);
+}
+
+static void
+reload_passwd (FusaManager *manager)
+{
+  struct passwd *pwent;
+  
+  g_hash_table_foreach (manager->users, mark_as_old, NULL);
 
   setpwent ();
 
@@ -841,65 +949,36 @@ reload_passwd (FusaManager *manager)
       if (g_hash_table_lookup (manager->exclusions, pwent->pw_name))
 	continue;
 
+      if (g_hash_table_size (manager->inclusions) > 0)
+        {
+          if (!g_hash_table_lookup (manager->inclusions, pwent->pw_name))
+            continue;
+        }
+      else if (!manager->include_all)
+        continue;
+      
       user = g_hash_table_lookup (manager->users, pwent->pw_name);
 
-      /* Update users already in the *new* list */
-      if (g_slist_find (new_users, user))
-	{
-	  _fusa_user_update (user, pwent);
-	  continue;
-	}
-
-      if (!user)
-	user = g_object_new (FUSA_TYPE_USER, "manager", manager, NULL);
-      else
-	g_object_ref (user);
+      if (!user) 
+        {
+	  user = g_object_new (FUSA_TYPE_USER, "manager", manager, NULL);
+          g_hash_table_insert (manager->users,
+	  		       g_strdup (pwent->pw_name),
+			       user);
+          g_hash_table_insert (manager->users_by_uid,
+			       GINT_TO_POINTER (pwent->pw_uid),
+			       g_object_ref (user));
+        }
 
-      /* Freeze & update users not already in the new list */
       g_object_freeze_notify (G_OBJECT (user));
       _fusa_user_update (user, pwent);
-
-      new_users = g_slist_prepend (new_users, user);
+      set_flag (G_OBJECT (user), NEW_FLAG);
     }
   
   endpwent ();
 
-  /* Go through and handle added users */
-  for (list = new_users; list; list = list->next)
-    {
-      if (!g_slist_find (old_users, list->data))
-	{
-	  g_hash_table_insert (manager->users,
-			       g_strdup (fusa_user_get_user_name (list->data)),
-			       g_object_ref (list->data));
-	  g_hash_table_insert (manager->users_by_uid,
-			       GINT_TO_POINTER (fusa_user_get_uid (list->data)),
-			       list->data);
-	  g_signal_emit (manager, signals[USER_ADDED], 0, list->data);
-	}
-    }
-
-  /* Go through and handle removed users */
-  for (list = old_users; list; list = list->next)
-    {
-      if (!g_slist_find (new_users, list->data))
-	{
-	  g_signal_emit (manager, signals[USER_REMOVED], 0, list->data);
-	  g_hash_table_remove (manager->users_by_uid,
-			       GINT_TO_POINTER (fusa_user_get_uid (list->data)));
-	  g_hash_table_remove (manager->users,
-			       fusa_user_get_user_name (list->data));
-          /* FIXME: signals[USER_REMOVED]??? Why not? */
-	}
-    }
-
-  /* Cleanup */
-  g_slist_foreach (new_users, (GFunc) g_object_thaw_notify, NULL);
-  g_slist_foreach (new_users, (GFunc) g_object_unref, NULL);
-  g_slist_free (new_users);
-
-  g_slist_foreach (old_users, (GFunc) g_object_unref, NULL);
-  g_slist_free (old_users);
+  g_hash_table_foreach_remove (manager->users, emit_add_or_remove, manager);
+  g_hash_table_foreach (manager->users, thaw, NULL);
 }
 
 
diff -up fast-user-switch-applet-2.18.0/src/fusa-user.c.many-users fast-user-switch-applet-2.18.0/src/fusa-user.c
--- fast-user-switch-applet-2.18.0/src/fusa-user.c.many-users	2007-04-09 12:01:02.000000000 -0400
+++ fast-user-switch-applet-2.18.0/src/fusa-user.c	2007-09-17 01:56:45.000000000 -0400
@@ -81,6 +81,7 @@ struct _FusaUser
   gchar *display_name;
   gchar *home_dir;
   gchar *shell;
+  gchar *key;
 
   GSList *displays;
 };
@@ -444,6 +445,9 @@ _fusa_user_update (FusaUser            *
       g_object_notify (G_OBJECT (user), "shell");
     }
 
+  g_free (user->key);
+  user->key = NULL;
+
   g_object_thaw_notify (G_OBJECT (user));
 }
 
@@ -684,12 +688,28 @@ fusa_user_render_icon (FusaUser  *user,
   return _fusa_manager_render_icon (user->manager, user, widget, icon_size);
 }
 
+static gchar *
+get_collate_key (FusaUser *user)
+{
+  if (!user->key)
+    {
+      gchar *str;
+
+      if (user->display_name)
+        str = user->display_name;
+      else
+        str = user->username;
+
+      user->key = g_utf8_collate_key (str, -1);
+    }
+
+  return user->key;
+}
+
 gint
 fusa_user_collate (FusaUser *user1,
 		   FusaUser *user2)
 {
-  const gchar *str1, *str2;
-
   g_return_val_if_fail (user1 == NULL || FUSA_IS_USER (user1), 0);
   g_return_val_if_fail (user2 == NULL || FUSA_IS_USER (user2), 0);
 
@@ -702,24 +722,5 @@ fusa_user_collate (FusaUser *user1,
   if (!user1 && !user2)
     return 0;
 
-  if (user1->display_name)
-    str1 = user1->display_name;
-  else
-    str1 = user1->username;
-
-  if (user2->display_name)
-    str2 = user2->display_name;
-  else
-    str2 = user2->username;
-
-  if (!str1 && str2)
-    return -1;
-
-  if (str1 && !str2)
-    return 1;
-
-  if (!str1 && !str2)
-    return 0;
-
-  return g_utf8_collate (str1, str2);
+  return strcmp (get_collate_key (user1), get_collate_key (user2));
 }

throttle.patch:

--- NEW FILE throttle.patch ---
diff -up fast-user-switch-applet-2.18.0/src/applet.c.throttle fast-user-switch-applet-2.18.0/src/applet.c
--- fast-user-switch-applet-2.18.0/src/applet.c.throttle	2007-09-16 23:28:17.000000000 -0400
+++ fast-user-switch-applet-2.18.0/src/applet.c	2007-09-16 23:29:07.000000000 -0400
@@ -2347,18 +2347,16 @@ maybe_lock_screen (FusaAppletData *adata
 	  g_error_free (err);
 	}
 
-      if (use_gscreensaver)
-	args[1] = "--throttle";
-      else
-	args[1] = "-throttle";
+      args[1] = "-throttle";
 
-      if (!gdk_spawn_on_screen (screen, g_get_home_dir (), args, NULL,
+      if (use_gscreensaver ||
+          !gdk_spawn_on_screen (screen, g_get_home_dir (), args, NULL,
 				(G_SPAWN_STDERR_TO_DEV_NULL |
 				 G_SPAWN_STDOUT_TO_DEV_NULL),
 				NULL, NULL, NULL, &err))
 	{
 	  g_warning (_("Can't temporarily set screensaver to blank screen: %s"),
-		     err->message);
+		     err ? err->message : "");
 	  g_error_free (err);
 	}
 


Index: fast-user-switch-applet.spec
===================================================================
RCS file: /cvs/extras/rpms/fast-user-switch-applet/devel/fast-user-switch-applet.spec,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- fast-user-switch-applet.spec	6 Aug 2007 06:00:13 -0000	1.15
+++ fast-user-switch-applet.spec	17 Sep 2007 06:20:11 -0000	1.16
@@ -1,6 +1,6 @@
 Name:           fast-user-switch-applet
 Version:        2.18.0
-Release:        2%{?dist}
+Release:        3%{?dist}
 Summary:        A panel applet for user-switching 
 Group:          User Interface/Desktops
 License:        GPLv2+
@@ -16,6 +16,12 @@
 Patch4:		fast-user-switch-applet-2.17.4-bug-buddy.patch
 # http://bugzilla.gnome.org/show_bug.cgi?id=412541 
 Patch5:		fast-user-switch-applet-2.17.4-socket-check.patch
+# http://bugzilla.gnome.org/show_bug.cgi?id=477639
+Patch6:		throttle.patch
+# http://bugzilla.gnome.org/show_bug.cgi?id=477656
+Patch7:		error-dialog.patch
+# http://bugzilla.gnome.org/show_bug.cgi?id=477666
+Patch8:		many-users.patch
 
 BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 
@@ -55,6 +61,9 @@
 %patch3 -p1 -b .no-session
 %patch4 -p1 -b .bug-buddy
 %patch5 -p1 -b .socket-check
+%patch6 -p1 -b .throttle
+%patch7 -p1 -b .error-dialog
+%patch8 -p1 -b .many-users
 
 %build
 %configure --disable-scrollkeeper \
@@ -97,7 +106,7 @@
 fi
  
 %postun
-scrollkeeper-update -q || :
+
 
 %files -f %{name}.lang
 %defattr(-,root,root,-)
@@ -109,6 +118,11 @@
 %{_datadir}/omf/fast-user-switch-applet
 
 %changelog
+* Sun Sep 16 2007 Matthias Clasen <mclasen at redhat.com> 2.18.0-3
+- Don't try to throttle gnome-screensaver (#246188)
+- Make the close button on the error dialog work
+- Make the handling of large numbers of users more efficient (#353831)
+
 * Mon Aug  6 2007 Matthias Clasen <mclasen at redhat.com> 2.18.0-2
 - Use %%find_lang for help files, too
 




More information about the scm-commits mailing list