Git-Url: 
http://git.frugalware.org/gitweb/gitweb.cgi?p=gfpm.git;a=commitdiff;h=9e9c9ed88705aaa88871e4ae6fdc6ca65afd73cf

commit 9e9c9ed88705aaa88871e4ae6fdc6ca65afd73cf
Author: Priyank <priy...@frugalware.org>
Date:   Mon Mar 23 18:47:29 2009 +0530

GFpm now uses the gthread library for certain operations
* The package search function is now a separate thread. This prevents
lockups/freezes when searching.
* Fixes #3691

diff --git a/configure.ac b/configure.ac
index 8c12f44..5d6d3eb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -86,6 +86,7 @@ fi


pkg_modules="gtk+-2.0 >= 2.12.0 \
+                       gthread-2.0 \
libglade-2.0 >= 2.6.0 "
PKG_CHECK_MODULES([GFPM], [$pkg_modules])

diff --git a/src/gfpm-interface.c b/src/gfpm-interface.c
index 7ddfdf3..96652e1 100644
--- a/src/gfpm-interface.c
+++ b/src/gfpm-interface.c
@@ -72,6 +72,8 @@ gboolean init = FALSE;
/* indicates gfpm is doing a package install/remove operation */
gboolean running = FALSE;

+static GMutex *search_mutex = NULL;
+
enum gfpm_cols {
COL_PKG_STATUS,
COL_PKG_ICON,
@@ -122,6 +124,7 @@ static void cb_gfpm_mark_for_upgrade (GtkButton *button, 
gpointer data);
static void cb_gfpm_reinstall (GtkButton *button, gpointer data);
static gint gfpm_trans_prepare (PM_LIST *list);
static gint gfpm_trans_commit (PM_LIST **list);
+static void gfpm_search (GtkWidget *widget);

static guint
gfpm_populate_repos_combobox (GtkComboBox *combo)
@@ -433,6 +436,9 @@ gfpm_interface_init (void)
gfpm_logviewer_init ();
gfpm_prefs_init ();

+       /* init search mutex */
+       search_mutex = g_mutex_new ();
+
gtk_widget_hide (gfpm_splash);
title = g_strdup_printf ("%s (%s)", PACKAGE_STRING, GFPM_RELEASE_NAME);
gtk_window_set_title (GTK_WINDOW(gfpm_mw), title);
@@ -1780,6 +1786,26 @@ cb_gfpm_search_buttonpress (GtkButton *button, gpointer 
data)
static void
cb_gfpm_search_keypress (GtkWidget *widget, GdkEventKey *event, gpointer data)
{
+       GError  *error = NULL;
+
+       if (event!=NULL)
+       {
+               if (event->keyval != GDK_Return)
+                       return;
+       }
+       if (!g_thread_create ((GThreadFunc)gfpm_search,
+                       (gpointer)widget,
+                       FALSE,
+                       &error))
+       {
+               g_print ("Error creating search thread: %s\n", error->message);
+       }
+       return;
+}
+
+static void
+gfpm_search (GtkWidget *widget)
+{
GtkListStore    *store;
GdkPixbuf       *icon_yes;
GdkPixbuf       *icon_no;
@@ -1797,24 +1823,27 @@ cb_gfpm_search_keypress (GtkWidget *widget, GdkEventKey 
*event, gpointer data)
gchar           *srepo = NULL;
PM_DB           *search_db = NULL;
guint           nounreg = 0;
-
-       if (event!=NULL)
-       {
-               if (event->keyval != GDK_Return)
-                       return;
-       }
+
+       g_mutex_lock (search_mutex);
+       gdk_threads_enter ();
search_str = (gchar*)gtk_entry_get_text (GTK_ENTRY(widget));
if (search_str == NULL)
-               return;
+       {
+               gdk_threads_leave ();
+               goto cleanup;
+       }

srepo = gtk_combo_box_get_active_text (GTK_COMBO_BOX(gfpm_search_combo));
-       if (srepo == NULL) return;
+       if (srepo == NULL)
+       {
+               gdk_threads_leave ();
+               goto cleanup;
+       }
if (!strcmp(srepo, _("Installed Packages")))
{
g_free (srepo);
srepo = g_strdup ("local");
}
-
model = gtk_tree_view_get_model (GTK_TREE_VIEW(gfpm_pkgs_tvw));
gtk_list_store_clear (GTK_LIST_STORE(model));
store = (GtkListStore*) model;
@@ -1842,15 +1871,17 @@ cb_gfpm_search_keypress (GtkWidget *widget, GdkEventKey 
*event, gpointer data)
{
gfpm_update_status (_("Search Complete"));
gfpm_error (_("Package not found"), _("No such package found"));
-               return;
+               gdk_threads_leave ();
+               goto cleanup;
}
+
icon_yes = gfpm_get_icon (ICON_INSTALLED, 16);
icon_no = gfpm_get_icon (ICON_NINSTALLED, 16);
icon_up = gfpm_get_icon (ICON_NEEDUPDATE, 16);
icon_ln = gfpm_get_icon (ICON_LOCALNEWER, 16);
gfpm_update_status (_("Searching for packages ..."));
-       while (gtk_events_pending())
-                       gtk_main_iteration ();
+       gdk_threads_leave ();
+
if (r == 0)
{
PM_PKG  *pm_spkg;
@@ -1877,6 +1908,7 @@ cb_gfpm_search_keypress (GtkWidget *widget, GdkEventKey 
*event, gpointer data)
{
up = FALSE;
}
+                       gdk_threads_enter ();
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter,
0, TRUE,
@@ -1886,11 +1918,11 @@ cb_gfpm_search_keypress (GtkWidget *widget, GdkEventKey 
*event, gpointer data)
4, (char*)pacman_pkg_getinfo (pm_spkg, PM_PKG_VERSION),
//5, (char*)pacman_pkg_getinfo (pm_lpkg, PM_PKG_DESC),
-1);
+                       gdk_flush ();
+                       gdk_threads_leave ();
pacman_pkg_free (pm_lpkg);
pacman_pkg_free (pm_spkg);
}
-               while (gtk_events_pending())
-                       gtk_main_iteration ();
}
else
if (r == 1)
@@ -1933,6 +1965,7 @@ cb_gfpm_search_keypress (GtkWidget *widget, GdkEventKey 
*event, gpointer data)
}
else
inst = FALSE;
+                       gdk_threads_enter ();
gtk_list_store_append (store, &iter);
if (inst == TRUE)
gtk_list_store_set (store, &iter, 3, (char*)pacman_pkg_getinfo (pm_lpkg, 
PM_PKG_VERSION), -1);
@@ -1946,10 +1979,12 @@ cb_gfpm_search_keypress (GtkWidget *widget, GdkEventKey 
*event, gpointer data)
4, (char*)pacman_pkg_getinfo (pm_pkg, PM_PKG_VERSION),
//5, (char*)pacman_pkg_getinfo (pm_pkg, PM_PKG_DESC),
-1);
+                       gdk_flush ();
+                       gdk_threads_leave ();
pacman_pkg_free (pm_pkg);
pacman_pkg_free (pm_lpkg);
-                       while (gtk_events_pending())
-                               gtk_main_iteration ();
+                       /*while (gtk_events_pending())
+                               gtk_main_iteration ();*/
}
}
pacman_set_option (PM_OPT_NEEDLES, (long)NULL);
@@ -1957,12 +1992,16 @@ cb_gfpm_search_keypress (GtkWidget *widget, GdkEventKey 
*event, gpointer data)
{
pacman_db_unregister (search_db);
}
+       gdk_threads_enter ();
gfpm_update_status (_("Searching for packages ...DONE"));

g_object_unref (icon_yes);
g_object_unref (icon_no);
g_object_unref (icon_up);
g_object_unref (icon_ln);
+       gdk_threads_leave ();
+       cleanup:
+       g_mutex_unlock (search_mutex);

return;
}
diff --git a/src/gfpm.c b/src/gfpm.c
index 453284f..6158648 100644
--- a/src/gfpm.c
+++ b/src/gfpm.c
@@ -41,6 +41,9 @@ main (int argc, char *argv[])
{
gchar *path;

+       /* invite trouble */
+       g_thread_init (NULL);
+
setlocale (LC_ALL, "");
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
@@ -63,9 +66,16 @@ main (int argc, char *argv[])
gfpm_error (_("Error initializing libpacman"), _("Failed to initialize 
libpacman"));
return 1;
}
+       /* initialize configuration subsystem */
gfpm_config_init ();
+       /* initialize everything else */
gfpm_interface_init ();
+
+       /* the main loop */
+       gdk_threads_enter ();
gtk_main ();
+       gdk_threads_leave ();
+
gfpm_db_cleanup ();
gfpm_config_free ();
gfpm_prefs_cleanup ();
_______________________________________________
Frugalware-git mailing list
Frugalware-git@frugalware.org
http://frugalware.org/mailman/listinfo/frugalware-git

Reply via email to