[Xfce4-commits] [xfce/xfce4-power-manager] 01/01: Devices tab flickers on update (Bug 10937)
noreply at xfce.org
noreply at xfce.org
Sun Jun 8 10:55:35 CEST 2014
This is an automated email from the git hooks/post-receive script.
eric pushed a commit to branch master
in repository xfce/xfce4-power-manager.
commit 23341dcb785c3a3eaf59a5555c912779101b067d
Author: Eric Koegel <eric.koegel at gmail.com>
Date: Sun Jun 8 11:28:17 2014 +0300
Devices tab flickers on update (Bug 10937)
On a upower notify/change signal, the devices entry was completely
recreated to update to the new settings. This patch changes it so
that only the items in that treeview get updated.
---
settings/xfpm-settings.c | 271 ++++++++++++++++++++++++----------------------
1 file changed, 142 insertions(+), 129 deletions(-)
diff --git a/settings/xfpm-settings.c b/settings/xfpm-settings.c
index 5e85440..126e231 100644
--- a/settings/xfpm-settings.c
+++ b/settings/xfpm-settings.c
@@ -71,6 +71,7 @@ enum
COL_SIDEBAR_BATTERY_DEVICE, /* Pointer to the UpDevice */
COL_SIDEBAR_OBJECT_PATH, /* UpDevice object path */
COL_SIDEBAR_SIGNAL_ID, /* device changed callback id */
+ COL_SIDEBAR_VIEW, /* Pointer to GtkTreeView of the devcie details */
NCOLS_SIDEBAR
};
@@ -1519,6 +1520,38 @@ find_device_in_tree (const gchar *object_path)
return NULL;
}
+/* Call gtk_tree_iter_free when done with the tree iter */
+static GtkTreeIter*
+find_device_info_name_in_tree (GtkTreeView *view, const gchar *device_info_name)
+{
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+
+ if ( !view )
+ return NULL;
+
+ model = gtk_tree_view_get_model(view);
+
+ if (!model)
+ return NULL;
+
+ if(gtk_tree_model_get_iter_first(model, &iter)) {
+ do {
+ gchar *name = NULL;
+ gtk_tree_model_get(model, &iter, XFPM_DEVICE_INFO_NAME, &name, -1);
+
+ if(g_strcmp0(name, device_info_name) == 0) {
+ g_free(name);
+ return gtk_tree_iter_copy(&iter);
+ }
+
+ g_free(name);
+ } while(gtk_tree_model_iter_next(model, &iter));
+ }
+
+ return NULL;
+}
+
static gchar *
xfpm_info_get_energy_property (gdouble energy, const gchar *unit)
{
@@ -1530,6 +1563,46 @@ xfpm_info_get_energy_property (gdouble energy, const gchar *unit)
}
static void
+update_device_info_value_for_name (GtkTreeView *view,
+ GtkListStore *list_store,
+ const gchar *name,
+ const gchar *value)
+{
+ GtkTreeIter *iter;
+
+ g_return_if_fail (GTK_IS_TREE_VIEW(view));
+ g_return_if_fail (GTK_IS_LIST_STORE(list_store));
+ g_return_if_fail (name != NULL);
+ /* Value can be NULL */
+
+ DBG ("updating name %s with value %s", name, value);
+
+ iter = find_device_info_name_in_tree (view, name);
+ if (iter == NULL)
+ {
+ /* The row doesn't exist yet, add it */
+ GtkTreeIter new_iter;
+ gtk_list_store_append (list_store, &new_iter);
+ iter = gtk_tree_iter_copy (&new_iter);
+ }
+
+ if (value != NULL)
+ {
+ gtk_list_store_set (list_store, iter,
+ XFPM_DEVICE_INFO_NAME, name,
+ XFPM_DEVICE_INFO_VALUE, value,
+ -1);
+ }
+ else
+ {
+ /* The value no longer applies, remove the row */
+ gtk_list_store_remove (list_store, iter);
+ }
+
+ gtk_tree_iter_free (iter);
+}
+
+static void
update_sideview_icon (UpDevice *device)
{
GtkListStore *list_store;
@@ -1583,13 +1656,10 @@ update_sideview_icon (UpDevice *device)
static void
update_device_details (UpDevice *device)
{
- GtkWidget *view;
- GtkListStore *list_store, *sideview_liststore;
- GtkTreeIter iter, *sideview_iter;
- GtkTreeViewColumn *col;
- GtkCellRenderer *renderer;
+ GtkTreeView *view;
+ GtkListStore *list_store;
+ GtkTreeIter *sideview_iter;
gchar *str;
- gint i = 0, page_index, current_page;
guint type = 0, tech = 0;
gdouble energy_full_design = -1.0, energy_full = -1.0, energy_empty = -1.0, voltage = -1.0, percent = -1.0;
gboolean p_supply = FALSE;
@@ -1605,39 +1675,20 @@ update_device_details (UpDevice *device)
if (sideview_iter == NULL)
return;
- view = gtk_tree_view_new ();
-
- list_store = gtk_list_store_new (XFPM_DEVICE_INFO_LAST, G_TYPE_STRING, G_TYPE_STRING);
-
- gtk_tree_view_set_model (GTK_TREE_VIEW (view), GTK_TREE_MODEL (list_store));
-
- renderer = gtk_cell_renderer_text_new ();
-
- /*Device Attribute*/
- col = gtk_tree_view_column_new();
- gtk_tree_view_column_pack_start (col, renderer, FALSE);
- gtk_tree_view_column_set_attributes (col, renderer, "text", XFPM_DEVICE_INFO_NAME, NULL);
- gtk_tree_view_column_set_title (col, _("Attribute"));
- gtk_tree_view_append_column (GTK_TREE_VIEW (view), col);
-
- /*Device Attribute Value*/
- col = gtk_tree_view_column_new();
- gtk_tree_view_column_pack_start (col, renderer, FALSE);
- gtk_tree_view_column_set_attributes (col, renderer, "text", XFPM_DEVICE_INFO_VALUE, NULL);
- gtk_tree_view_column_set_title (col, _("Value"));
+ gtk_tree_model_get (gtk_tree_view_get_model(GTK_TREE_VIEW(sideview)), sideview_iter,
+ COL_SIDEBAR_VIEW, &view,
+ -1);
- gtk_tree_view_append_column (GTK_TREE_VIEW (view), col);
+ list_store = GTK_LIST_STORE (gtk_tree_view_get_model (view));
/**
- * Add Device information:
+ * Add/Update Device information:
**/
/*Device*/
- gtk_list_store_append (list_store, &iter);
- gtk_list_store_set (list_store, &iter,
- XFPM_DEVICE_INFO_NAME, _("Device"),
- XFPM_DEVICE_INFO_VALUE, g_str_has_prefix (object_path, UPOWER_PATH_DEVICE) ? object_path + strlen (UPOWER_PATH_DEVICE) : object_path,
- -1);
- i++;
+ update_device_info_value_for_name (view,
+ list_store,
+ _("Device"),
+ g_str_has_prefix (object_path, UPOWER_PATH_DEVICE) ? object_path + strlen (UPOWER_PATH_DEVICE) : object_path);
/*Type*/
/* hack, this depends on XFPM_DEVICE_TYPE_* being in sync with UP_DEVICE_KIND_* */
@@ -1658,51 +1709,31 @@ update_device_details (UpDevice *device)
if (type != UP_DEVICE_KIND_UNKNOWN)
{
battery_type = xfpm_power_translate_device_type (type);
- gtk_list_store_append (list_store, &iter);
- gtk_list_store_set (list_store, &iter,
- XFPM_DEVICE_INFO_NAME, _("Type"),
- XFPM_DEVICE_INFO_VALUE, battery_type,
- -1);
- i++;
+ update_device_info_value_for_name (view, list_store, _("Type"), battery_type);
}
- gtk_list_store_append (list_store, &iter);
- gtk_list_store_set (list_store, &iter,
- XFPM_DEVICE_INFO_NAME, _("PowerSupply"),
- XFPM_DEVICE_INFO_VALUE, p_supply == TRUE ? _("True") : _("False"),
- -1);
- i++;
+ update_device_info_value_for_name (view,
+ list_store,
+ _("PowerSupply"),
+ p_supply == TRUE ? _("True") : _("False"));
if ( type != UP_DEVICE_KIND_LINE_POWER )
{
/*Model*/
if (model && strlen (model) > 0)
{
- gtk_list_store_append (list_store, &iter);
- gtk_list_store_set (list_store, &iter,
- XFPM_DEVICE_INFO_NAME, _("Model"),
- XFPM_DEVICE_INFO_VALUE, model,
- -1);
- i++;
+ update_device_info_value_for_name (view, list_store, _("Model"), model);
}
- gtk_list_store_append (list_store, &iter);
- gtk_list_store_set (list_store, &iter,
- XFPM_DEVICE_INFO_NAME, _("Technology"),
- XFPM_DEVICE_INFO_VALUE, xfpm_power_translate_technology (tech),
- -1);
- i++;
+ update_device_info_value_for_name (view, list_store, _("Technology"), xfpm_power_translate_technology (tech));
/*Percentage*/
if (percent >= 0)
{
str = g_strdup_printf("%d", (guint) percent);
- gtk_list_store_append (list_store, &iter);
- gtk_list_store_set (list_store, &iter,
- XFPM_DEVICE_INFO_NAME, _("Energy percent"),
- XFPM_DEVICE_INFO_VALUE, str,
- -1);
- i++;
+
+ update_device_info_value_for_name (view, list_store, _("Energy percent"), str);
+
g_free(str);
}
@@ -1710,12 +1741,9 @@ update_device_details (UpDevice *device)
{
/* TRANSLATORS: Unit here is Watt hour*/
str = xfpm_info_get_energy_property (energy_full_design, _("Wh"));
- gtk_list_store_append (list_store, &iter);
- gtk_list_store_set (list_store, &iter,
- XFPM_DEVICE_INFO_NAME, _("Energy full design"),
- XFPM_DEVICE_INFO_VALUE, str,
- -1);
- i++;
+
+ update_device_info_value_for_name (view, list_store, _("Energy full design"), str);
+
g_free (str);
}
@@ -1723,12 +1751,9 @@ update_device_details (UpDevice *device)
{
/* TRANSLATORS: Unit here is Watt hour*/
str = xfpm_info_get_energy_property (energy_full, _("Wh"));
- gtk_list_store_append (list_store, &iter);
- gtk_list_store_set (list_store, &iter,
- XFPM_DEVICE_INFO_NAME, _("Energy full"),
- XFPM_DEVICE_INFO_VALUE, str,
- -1);
- i++;
+
+ update_device_info_value_for_name (view, list_store, _("Energy full"), str);
+
g_free (str);
}
@@ -1736,12 +1761,9 @@ update_device_details (UpDevice *device)
{
/* TRANSLATORS: Unit here is Watt hour*/
str = xfpm_info_get_energy_property (energy_empty, _("Wh"));
- gtk_list_store_append (list_store, &iter);
- gtk_list_store_set (list_store, &iter,
- XFPM_DEVICE_INFO_NAME, _("Energy empty"),
- XFPM_DEVICE_INFO_VALUE, str,
- -1);
- i++;
+
+ update_device_info_value_for_name (view, list_store, _("Energy empty"), str);
+
g_free (str);
}
@@ -1749,61 +1771,25 @@ update_device_details (UpDevice *device)
{
/* TRANSLATORS: Unit here is Volt*/
str = xfpm_info_get_energy_property (voltage, _("V"));
- gtk_list_store_append (list_store, &iter);
- gtk_list_store_set (list_store, &iter,
- XFPM_DEVICE_INFO_NAME, _("Voltage"),
- XFPM_DEVICE_INFO_VALUE, str,
- -1);
- i++;
+
+ update_device_info_value_for_name (view, list_store, _("Voltage"), str);
+
g_free (str);
}
if (vendor && strlen (vendor) > 0)
{
- gtk_list_store_append (list_store, &iter);
- gtk_list_store_set (list_store, &iter,
- XFPM_DEVICE_INFO_NAME, _("Vendor"),
- XFPM_DEVICE_INFO_VALUE, vendor,
- -1);
- i++;
+ update_device_info_value_for_name (view, list_store, _("Vendor"), vendor);
}
if (serial && strlen (serial) > 0)
{
- gtk_list_store_append (list_store, &iter);
- gtk_list_store_set (list_store, &iter,
- XFPM_DEVICE_INFO_NAME, _("Serial"),
- XFPM_DEVICE_INFO_VALUE, serial,
- -1);
- i++;
+ update_device_info_value_for_name (view, list_store, _("Serial"), serial);
}
}
update_sideview_icon (device);
-
- sideview_liststore = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (sideview)));
-
- gtk_tree_model_get (GTK_TREE_MODEL(sideview_liststore), sideview_iter,
- COL_SIDEBAR_INT, &page_index,
- -1);
-
- /* Replace the old page with the new one, if the user is viewing that
- * page we'll need to change back to it */
- current_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (device_details_notebook));
- DBG("current page %d page_index %d", current_page, page_index);
- gtk_notebook_remove_page (GTK_NOTEBOOK (device_details_notebook), page_index);
- gtk_notebook_insert_page (GTK_NOTEBOOK (device_details_notebook), view, NULL, page_index);
-
- gtk_widget_show (view);
-
- /* Attempt to redisplay the current page (or display the first item
- * on startup.
- */
- if (current_page - 1 == page_index)
- {
- DBG("current page == page index");
- gtk_notebook_set_current_page (GTK_NOTEBOOK (device_details_notebook), page_index);
- }
+ gtk_widget_show_all (GTK_WIDGET(view));
}
static void
@@ -1820,7 +1806,9 @@ static void
add_device (UpDevice *device)
{
GtkTreeIter iter, *device_iter;
- GtkListStore *list_store;
+ GtkListStore *sideview_store, *devices_store;
+ GtkTreeViewColumn *col;
+ GtkCellRenderer *renderer;
GtkWidget *view;
const gchar *object_path = up_device_get_object_path(device);
gulong signal_id;
@@ -1842,7 +1830,7 @@ add_device (UpDevice *device)
signal_id = g_signal_connect (device, "changed", G_CALLBACK (device_changed_cb), NULL);
#endif
- list_store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (sideview)));
+ sideview_store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (sideview)));
index = gtk_notebook_get_n_pages (GTK_NOTEBOOK (device_details_notebook));
@@ -1850,12 +1838,36 @@ add_device (UpDevice *device)
view = gtk_tree_view_new ();
gtk_notebook_append_page (GTK_NOTEBOOK (device_details_notebook), view, NULL);
- gtk_list_store_append (list_store, &iter);
- gtk_list_store_set (list_store, &iter,
+ /* Create the list store that the devices view will display */
+ devices_store = gtk_list_store_new (XFPM_DEVICE_INFO_LAST, G_TYPE_STRING, G_TYPE_STRING);
+ gtk_tree_view_set_model (GTK_TREE_VIEW (view), GTK_TREE_MODEL (devices_store));
+
+ /* Create the headers for this item in the device details tab */
+ renderer = gtk_cell_renderer_text_new ();
+
+ /*Device Attribute*/
+ col = gtk_tree_view_column_new();
+ gtk_tree_view_column_pack_start (col, renderer, FALSE);
+ gtk_tree_view_column_set_attributes (col, renderer, "text", XFPM_DEVICE_INFO_NAME, NULL);
+ gtk_tree_view_column_set_title (col, _("Attribute"));
+ gtk_tree_view_append_column (GTK_TREE_VIEW (view), col);
+
+ /*Device Attribute Value*/
+ col = gtk_tree_view_column_new();
+ gtk_tree_view_column_pack_start (col, renderer, FALSE);
+ gtk_tree_view_column_set_attributes (col, renderer, "text", XFPM_DEVICE_INFO_VALUE, NULL);
+ gtk_tree_view_column_set_title (col, _("Value"));
+
+ gtk_tree_view_append_column (GTK_TREE_VIEW (view), col);
+
+ /* Add the new device to the sidebar */
+ gtk_list_store_append (sideview_store, &iter);
+ gtk_list_store_set (sideview_store, &iter,
COL_SIDEBAR_INT, index,
COL_SIDEBAR_BATTERY_DEVICE, device,
COL_SIDEBAR_OBJECT_PATH, object_path,
COL_SIDEBAR_SIGNAL_ID, signal_id,
+ COL_SIDEBAR_VIEW, view,
-1);
/* Add the icon and description for the device */
@@ -2052,7 +2064,8 @@ xfpm_settings_dialog_new (XfconfChannel *channel, gboolean system_laptop,
G_TYPE_INT, /* COL_SIDEBAR_INT */
G_TYPE_POINTER, /* COL_SIDEBAR_BATTERY_DEVICE */
G_TYPE_STRING, /* COL_SIDEBAR_OBJECT_PATH */
- G_TYPE_ULONG /* COL_SIDEBAR_SIGNAL_ID */
+ G_TYPE_ULONG, /* COL_SIDEBAR_SIGNAL_ID */
+ G_TYPE_POINTER /* COL_SIDEBAR_VIEW */
);
gtk_tree_view_set_model (GTK_TREE_VIEW (sideview), GTK_TREE_MODEL (list_store));
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list