Browse Source

Fix some crashes and problems related to xfconf.

upstream/xfce4-panel-4.10.1
Nick Schermer 13 years ago
parent
commit
54d093a1fc
  1. 40
      common/panel-xfconf.c
  2. 76
      panel/panel-application.c
  3. 16
      panel/panel-preferences-dialog.c
  4. 3
      panel/panel-window.c

40
common/panel-xfconf.c

@ -25,6 +25,37 @@
static void
panel_properties_store_value (XfconfChannel *channel,
const gchar *xfconf_property,
GType xfconf_property_type,
GObject *object,
const gchar *object_property)
{
GValue value = { 0, };
#ifndef NDEBUG
GParamSpec *pspec;
#endif
panel_return_if_fail (G_IS_OBJECT (object));
panel_return_if_fail (XFCONF_IS_CHANNEL (channel));
#ifndef NDEBUG
/* check if the types match */
pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (object), object_property);
panel_assert (pspec != NULL);
panel_assert (G_PARAM_SPEC_VALUE_TYPE (pspec) == xfconf_property_type);
#endif
/* write the property to the xfconf channel */
g_value_init (&value, xfconf_property_type);
g_object_get_property (G_OBJECT (object), object_property, &value);
xfconf_channel_set_property (channel, xfconf_property, &value);
g_value_unset (&value);
}
XfconfChannel *
panel_properties_get_channel (GObject *object_for_weak_ref)
{
@ -71,12 +102,13 @@ panel_properties_bind (XfconfChannel *channel,
for (prop = properties; prop->property != NULL; prop++)
{
property = g_strconcat (property_base, "/", prop->property, NULL);
xfconf_g_property_bind (channel, property, prop->type, object, prop->property);
g_free (property);
/* notify the property to it gets saved */
if (save_properties)
g_object_notify (G_OBJECT (object), prop->property);
panel_properties_store_value (channel, property, prop->type, object, prop->property);
xfconf_g_property_bind (channel, property, prop->type, object, prop->property);
g_free (property);
}
}

76
panel/panel-application.c

@ -436,6 +436,18 @@ panel_application_plugin_delete_config (PanelApplication *application,
static void
panel_application_plugin_remove (GtkWidget *widget,
gpointer user_data)
{
panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (widget));
xfce_panel_plugin_provider_emit_signal (XFCE_PANEL_PLUGIN_PROVIDER (widget),
PROVIDER_SIGNAL_REMOVE_PLUGIN);
}
static void
panel_application_plugin_provider_signal (XfcePanelPluginProvider *provider,
XfcePanelPluginProviderSignal provider_signal,
@ -635,10 +647,11 @@ static void
panel_application_window_destroyed (GtkWidget *window,
PanelApplication *application)
{
guint n;
gchar buf[100];
GSList *li, *lnext;
gboolean passed_destroyed_window = FALSE;
guint n;
gchar *property;
GSList *li, *lnext;
gboolean passed_destroyed_window = FALSE;
GtkWidget *itembar;
panel_return_if_fail (PANEL_IS_WINDOW (window));
panel_return_if_fail (PANEL_IS_APPLICATION (application));
@ -649,31 +662,39 @@ panel_application_window_destroyed (GtkWidget *window,
{
lnext = li->next;
/* skip window if we're not passed the active window */
if (!passed_destroyed_window && li->data != window)
continue;
/* keep updating from now on */
passed_destroyed_window = TRUE;
if (passed_destroyed_window)
{
/* save this panel again at it's new position */
panel_properties_unbind (G_OBJECT (li->data));
panel_application_xfconf_window_bindings (application,
PANEL_WINDOW (li->data),
TRUE);
}
else if (li->data == window)
{
/* disconnect bindings from this panel */
panel_properties_unbind (G_OBJECT (window));
/* disconnect bindings from this panel */
panel_properties_unbind (G_OBJECT (li->data));
/* remove all the plugins from the itembar */
itembar = gtk_bin_get_child (GTK_BIN (window));
gtk_container_foreach (GTK_CONTAINER (itembar),
panel_application_plugin_remove, NULL);
/* remove the properties of this panel */
g_snprintf (buf, sizeof (buf), "/panels/panel-%u", n);
if (xfconf_channel_has_property (application->xfconf, buf))
xfconf_channel_reset_property (application->xfconf, buf, TRUE);
/* remove from the internal list */
application->windows = g_slist_delete_link (application->windows, li);
/* either remove the window or add the bindings */
if (li->data == window)
application->windows = g_slist_delete_link (application->windows, li);
else
panel_application_xfconf_window_bindings (application,
PANEL_WINDOW (li->data),
TRUE);
/* keep updating the bindings for the remaining windows */
passed_destroyed_window = TRUE;
}
}
/* force a panel save to store plugins and panel count */
/* remove the last property from the channel */
property = g_strdup_printf ("/panels/panel-%u", n - 1);
panel_assert (n - 1 == g_slist_length (application->windows));
xfconf_channel_reset_property (application->xfconf, property, TRUE);
g_free (property);
/* schedule a save to store the new number of panels */
panel_application_save (application, FALSE);
/* quit if there are no windows opened */
@ -1160,6 +1181,7 @@ panel_application_new_window (PanelApplication *application,
GtkWidget *window;
GtkWidget *itembar;
gchar *property;
gint idx;
panel_return_val_if_fail (PANEL_IS_APPLICATION (application), NULL);
panel_return_val_if_fail (screen == NULL || GDK_IS_SCREEN (screen), NULL);
@ -1185,9 +1207,9 @@ panel_application_new_window (PanelApplication *application,
if (new_window)
{
/* remove the xfconf properties */
property = g_strdup_printf ("/panels/panel-%d", g_slist_index (application->windows, window));
if (xfconf_channel_has_property (application->xfconf, property))
xfconf_channel_reset_property (application->xfconf, property, TRUE);
idx = g_slist_index (application->windows, window);
property = g_strdup_printf ("/panels/panel-%d", idx);
xfconf_channel_reset_property (application->xfconf, property, TRUE);
g_free (property);
/* set default position */

16
panel/panel-preferences-dialog.c

@ -54,7 +54,7 @@ static void panel_preferences_dialog_panel_remove (GtkWidget *widget, PanelPrefe
static XfcePanelPluginProvider *panel_preferences_dialog_item_get_selected (PanelPreferencesDialog *dialog, GtkTreeIter *return_iter);
static void panel_preferences_dialog_item_store_rebuild (PanelPreferencesDialog *dialog);
static void panel_preferences_dialog_item_store_rebuild (GtkWidget *itembar, PanelPreferencesDialog *dialog);
static void panel_preferences_dialog_item_move (GtkWidget *button, PanelPreferencesDialog *dialog);
static void panel_preferences_dialog_item_remove (GtkWidget *button, PanelPreferencesDialog *dialog);
static void panel_preferences_dialog_item_add (GtkWidget *button, PanelPreferencesDialog *dialog);
@ -354,15 +354,15 @@ panel_preferences_dialog_panel_combobox_changed (GtkComboBox *combobo
{
itembar = gtk_bin_get_child (GTK_BIN (dialog->active));
dialog->changed_handler_id =
g_signal_connect_swapped (G_OBJECT (itembar), "changed",
G_CALLBACK (panel_preferences_dialog_item_store_rebuild),
dialog);
g_signal_connect (G_OBJECT (itembar), "changed",
G_CALLBACK (panel_preferences_dialog_item_store_rebuild),
dialog);
/* rebind the dialog bindings */
panel_preferences_dialog_bindings_update (dialog);
/* update the items treeview */
panel_preferences_dialog_item_store_rebuild (dialog);
panel_preferences_dialog_item_store_rebuild (itembar, dialog);
}
/* sensitivity of the add button in item tab */
@ -518,21 +518,21 @@ panel_preferences_dialog_item_get_selected (PanelPreferencesDialog *dialog,
static void
panel_preferences_dialog_item_store_rebuild (PanelPreferencesDialog *dialog)
panel_preferences_dialog_item_store_rebuild (GtkWidget *itembar,
PanelPreferencesDialog *dialog)
{
GtkWidget *itembar;
GList *items, *li;
guint i;
PanelModule *module;
panel_return_if_fail (PANEL_IS_PREFERENCES_DIALOG (dialog));
panel_return_if_fail (GTK_IS_LIST_STORE (dialog->store));
panel_return_if_fail (PANEL_IS_ITEMBAR (itembar));
/* clear the store */
gtk_list_store_clear (dialog->store);
/* get the panel items */
itembar = gtk_bin_get_child (GTK_BIN (dialog->active));
items = gtk_container_get_children (GTK_CONTAINER (itembar));
/* add items to the store */

3
panel/panel-window.c

@ -550,7 +550,8 @@ panel_window_set_property (GObject *object,
case PROP_POSITION:
val_string = g_value_get_string (value);
if (sscanf (val_string, "p=%d;x=%d;y=%d", &snap_position, &x, &y) == 3)
if (!exo_str_is_empty (val_string)
&& sscanf (val_string, "p=%d;x=%d;y=%d", &snap_position, &x, &y) == 3)
{
window->snap_position = CLAMP (snap_position, SNAP_POSITION_NONE, SNAP_POSITION_S);
window->base_x = x;

Loading…
Cancel
Save