wacom: update the UI if a new tool comes in

The device_added_cb is called once for each tool added. The wacom driver
hotplugs tools in the order stylus, eraser, cursor, pad.

update_current_page will add a new page once a tablet has stylus and
eraser, before cursor and pad exist. priv->pad is thus always NULL,
causing, cc_wacom_page's update_tablet_ui to remove the "Map Buttons..."
button for any device.

Change the code to update the tool list for every new tool we get,
merely triggering the visibility of the button instead of destroying it
completely.

https://bugzilla.gnome.org/show_bug.cgi?id=672691
This commit is contained in:
Peter Hutterer 2012-04-12 15:29:36 +02:00 committed by Bastien Nocera
parent 0463ba8622
commit ff31b771bb
3 changed files with 71 additions and 28 deletions

View file

@ -95,6 +95,32 @@ enum {
MODE_RELATIVE, /* stylus + eraser relative */
};
/* Different types of layout for the tablet config */
enum {
LAYOUT_NORMAL, /* tracking mode, button mapping */
LAYOUT_REVERSIBLE, /* tracking mode, button mapping, left-hand orientation */
LAYOUT_SCREEN /* button mapping, calibration, display resolution */
};
static void
update_tablet_ui (CcWacomPage *page,
int layout);
static int
get_layout_type (GsdWacomDevice *device)
{
int layout;
if (gsd_wacom_device_is_screen_tablet (device))
layout = LAYOUT_SCREEN;
else if (gsd_wacom_device_reversible (device))
layout = LAYOUT_REVERSIBLE;
else
layout = LAYOUT_NORMAL;
return layout;
}
static void
set_calibration (gint *cal,
gsize ncal,
@ -661,11 +687,14 @@ display_mapping_dialog_closed (GtkDialog *dialog,
CcWacomPage *page)
{
CcWacomPagePrivate *priv;
int layout;
priv = page->priv;
gtk_widget_destroy (priv->dialog);
priv->dialog = NULL;
priv->mapping = NULL;
layout = get_layout_type (priv->stylus);
update_tablet_ui (page, layout);
}
static void
@ -981,13 +1010,6 @@ stylus_changed (GsdWacomDevice *device,
gsd_wacom_stylus_get_name (stylus));
}
/* Different types of layout for the tablet config */
enum {
LAYOUT_NORMAL, /* tracking mode, button mapping */
LAYOUT_REVERSIBLE, /* tracking mode, button mapping, left-hand orientation */
LAYOUT_SCREEN /* button mapping, calibration, display resolution */
};
static void
remove_left_handed (CcWacomPagePrivate *priv)
{
@ -1013,7 +1035,8 @@ update_tablet_ui (CcWacomPage *page,
priv = page->priv;
/* FIXME Handle ->pad being NULL and hide the pad buttons */
/* Hide the pad buttons if no pad is present */
gtk_widget_set_visible (WID ("map-buttons-button"), priv->pad != NULL);
switch (layout) {
case LAYOUT_NORMAL:
@ -1045,6 +1068,33 @@ update_tablet_ui (CcWacomPage *page,
}
}
gboolean
cc_wacom_page_update_tools (CcWacomPage *page,
GsdWacomDevice *stylus,
GsdWacomDevice *eraser,
GsdWacomDevice *pad)
{
CcWacomPagePrivate *priv;
int layout;
gboolean changed;
/* Type of layout */
layout = get_layout_type (stylus);
priv = page->priv;
changed = (priv->stylus != stylus || priv->eraser != eraser || priv->pad != pad);
if (!changed)
return FALSE;
priv->stylus = stylus;
priv->eraser = eraser;
priv->pad = pad;
update_tablet_ui (CC_WACOM_PAGE (page), layout);
return TRUE;
}
GtkWidget *
cc_wacom_page_new (CcWacomPanel *panel,
GsdWacomDevice *stylus,
@ -1053,7 +1103,6 @@ cc_wacom_page_new (CcWacomPanel *panel,
{
CcWacomPage *page;
CcWacomPagePrivate *priv;
int layout;
g_return_val_if_fail (GSD_IS_WACOM_DEVICE (stylus), NULL);
g_return_val_if_fail (gsd_wacom_device_get_device_type (stylus) == WACOM_TYPE_STYLUS, NULL);
@ -1067,10 +1116,8 @@ cc_wacom_page_new (CcWacomPanel *panel,
page = g_object_new (CC_TYPE_WACOM_PAGE, NULL);
priv = page->priv;
priv->panel = panel;
priv->stylus = stylus;
priv->eraser = eraser;
priv->pad = pad;
cc_wacom_page_update_tools (page, stylus, eraser, pad);
/* FIXME move this to construct */
priv->wacom_settings = gsd_wacom_device_get_settings (stylus);
@ -1079,16 +1126,6 @@ cc_wacom_page_new (CcWacomPanel *panel,
/* Tablet name */
gtk_label_set_text (GTK_LABEL (WID ("label-tabletmodel")), gsd_wacom_device_get_name (stylus));
/* Type of layout */
if (gsd_wacom_device_is_screen_tablet (stylus))
layout = LAYOUT_SCREEN;
else if (gsd_wacom_device_reversible (stylus))
layout = LAYOUT_REVERSIBLE;
else
layout = LAYOUT_NORMAL;
update_tablet_ui (page, layout);
/* Left-handedness */
if (gsd_wacom_device_reversible (stylus))
set_left_handed_from_gsettings (page);

View file

@ -74,6 +74,11 @@ GtkWidget * cc_wacom_page_new (CcWacomPanel *panel,
GsdWacomDevice *eraser,
GsdWacomDevice *pad);
gboolean cc_wacom_page_update_tools (CcWacomPage *page,
GsdWacomDevice *stylus,
GsdWacomDevice *eraser,
GsdWacomDevice *pad);
void cc_wacom_page_set_navigation (CcWacomPage *page,
GtkNotebook *notebook,
gboolean ignore_first_page);

View file

@ -200,12 +200,11 @@ update_current_page (CcWacomPanel *self)
tablets = g_hash_table_get_values (ht);
for (l = tablets; l; l = l->next) {
Tablet *tablet;
GtkWidget *page;
tablet = l->data;
if (tablet->stylus == NULL ||
tablet->eraser == NULL) {
GtkWidget *page;
page = g_hash_table_lookup (priv->pages, tablet->name);
if (page != NULL) {
remove_page (GTK_NOTEBOOK (priv->notebook), page);
@ -215,9 +214,9 @@ update_current_page (CcWacomPanel *self)
}
continue;
}
if (g_hash_table_lookup (priv->pages, tablet->name) == NULL) {
GtkWidget *page;
/* this code is called once the stylus + eraser were set up, but the pad does not exist yet */
page = g_hash_table_lookup (priv->pages, tablet->name);
if (page == NULL) {
page = cc_wacom_page_new (self, tablet->stylus, tablet->eraser, tablet->pad);
cc_wacom_page_set_navigation (CC_WACOM_PAGE (page), GTK_NOTEBOOK (priv->notebook), TRUE);
gtk_widget_show (page);
@ -225,6 +224,8 @@ update_current_page (CcWacomPanel *self)
g_hash_table_insert (priv->pages, g_strdup (tablet->name), page);
changed = TRUE;
} else {
cc_wacom_page_update_tools (CC_WACOM_PAGE (page), tablet->stylus, tablet->eraser, tablet->pad);
}
}
g_list_free (tablets);