/** * Popup menu item has been clicked. This requires removing a master device. */ static gboolean signal_popup_activate(GtkWidget *menuitem, gpointer data) { GDeviceSetup *gds = (GDeviceSetup*)data; GtkTreeView *treeview = GTK_TREE_VIEW(gds->treeview); GtkTreeModel *model = gtk_tree_view_get_model(treeview); GtkTreeSelection *selection; GtkTreeIter iter; int id; selection = gtk_tree_view_get_selection(treeview); gtk_tree_selection_get_selected(selection, NULL, &iter); gtk_tree_model_get(model, &iter, COL_ID, &id, -1); remove_master(gds, id); return TRUE; }
int ProcXIChangeHierarchy(ClientPtr client) { xXIAnyHierarchyChangeInfo *any; int required_len = sizeof(xXIChangeHierarchyReq); char n; int rc = Success; int flags[MAXDEVICES] = {0}; REQUEST(xXIChangeHierarchyReq); REQUEST_AT_LEAST_SIZE(xXIChangeHierarchyReq); if (!stuff->num_changes) return rc; any = (xXIAnyHierarchyChangeInfo*)&stuff[1]; while(stuff->num_changes--) { SWAPIF(swapl(&any->type, n)); SWAPIF(swaps(&any->length, n)); required_len += any->length; if ((stuff->length * 4) < required_len) return BadLength; switch(any->type) { case XIAddMaster: { xXIAddMasterInfo* c = (xXIAddMasterInfo*)any; SWAPIF(swaps(&c->name_len, n)); rc = add_master(client, c, flags); if (rc != Success) goto unwind; } break; case XIRemoveMaster: { xXIRemoveMasterInfo* r = (xXIRemoveMasterInfo*)any; rc = remove_master(client, r, flags); if (rc != Success) goto unwind; } break; case XIDetachSlave: { xXIDetachSlaveInfo* c = (xXIDetachSlaveInfo*)any; rc = detach_slave(client, c, flags); if (rc != Success) goto unwind; } break; case XIAttachSlave: { xXIAttachSlaveInfo* c = (xXIAttachSlaveInfo*)any; rc = attach_slave(client, c, flags); if (rc != Success) goto unwind; } break; } any = (xXIAnyHierarchyChangeInfo*)((char*)any + any->length * 4); } unwind: XISendDeviceHierarchyEvent(flags); return rc; }