Peter Hutterer wrote:
> Thanks again for the patch, I'll just comment on the patch in this email so
> we can keep the patch review separate from the XI2 questions in your email.
>
>> From a620e928c3478636320d6924e4cbacf2667ad789 Mon Sep 17 00:00:00 2001
>> From: Thomas Jaeger <[email protected]>
>> Date: Sun, 14 Jun 2009 13:58:39 -0400
>> Subject: [PATCH] reattach: Default to return to VCP/VCK when returnMode is
>> AttachToMaster
>>
>> Signed-off-by: Thomas Jaeger <[email protected]>
>> ---
>> src/hierarchy.c | 40 ++++++++++++++++++++++++++++++++++++----
>> src/xinput.c | 2 +-
>> 2 files changed, 37 insertions(+), 5 deletions(-)
>>
>> diff --git a/src/hierarchy.c b/src/hierarchy.c
>> index cf0f783..cb25876 100644
>> --- a/src/hierarchy.c
>> +++ b/src/hierarchy.c
>> @@ -77,8 +77,8 @@ remove_master(Display* dpy, int argc, char** argv, char
>> *name, char *desc)
>> info = xi2_find_device_info(dpy, argv[0]);
>>
>> if (!info) {
>> - fprintf(stderr, "unable to find device %s\n", argv[0]);
>> - return EXIT_FAILURE;
>> + fprintf(stderr, "unable to find device %s\n", argv[0]);
>> + return EXIT_FAILURE;
>> }
>>
>> r.type = XIRemoveMaster;
>
> Please skip this hunk. I'm not a big fan of changing whitespaces in an
> otherwise unrelated patch.
Sorry, this happened when I reindented the function to get rid of tabs.
>
>> @@ -96,8 +96,40 @@ remove_master(Display* dpy, int argc, char** argv, char
>> *name, char *desc)
>>
>> if (r.return_mode == XIAttachToMaster)
>> {
>> - r.return_pointer = atoi(argv[2]);
>> - r.return_keyboard = atoi(argv[3]);
>> + r.return_pointer = 0;
>> + if (argc >= 3) {
>> + info = xi2_find_device_info(dpy, argv[2]);
>> + if (!info) {
>> + fprintf(stderr, "unable to find device %s\n", argv[2]);
>> + return EXIT_FAILURE;
>> + }
>> +
>> + r.return_pointer = info->deviceid;
>> + }
>> +
>> + r.return_keyboard = 0;
>> + if (argc >= 4) {
>> + info = xi2_find_device_info(dpy, argv[3]);
>> + if (!info) {
>> + fprintf(stderr, "unable to find device %s\n", argv[3]);
>> + return EXIT_FAILURE;
>> + }
>> +
>> + r.return_keyboard = info->deviceid;
>> + }
>> +
>> + if (!r.return_pointer || !r.return_keyboard) {
>> + int i, ndevices;
>> + info = XIQueryDevice(dpy, XIAllMasterDevices, &ndevices);
>> + for(i = 0; i < ndevices; i++) {
>> + if (info[i].use == XIMasterPointer && !r.return_pointer)
>> + r.return_pointer = info[i].deviceid;
>> + if (info[i].use == XIMasterKeyboard && !r.return_keyboard)
>> + r.return_keyboard = info[i].deviceid;
>> + }
>> +
>> + XIFreeDeviceInfo(info);
>> + }
>> }
>>
>
> minor nitpick: the loop condition should include the checks for
> r.return_pointer and r.return_keyboard so we can break early when we have
> found them.
> (which btw. is always after the VCK in the current implementation, the server
> guarantees VCP and VCK are always there and they have the lowest device
> ids. not that the protocol requires this, but might be interesting to know)
Done, although performance is really not something we need to worry
about here.
Tom
>From a25ed91b3c08f3e8e46c0a23ea61e905b86c16c7 Mon Sep 17 00:00:00 2001
From: Thomas Jaeger <[email protected]>
Date: Sun, 14 Jun 2009 13:58:39 -0400
Subject: [PATCH] reattach: Default to return to VCP/VCK when returnMode is AttachToMaster
Signed-off-by: Thomas Jaeger <[email protected]>
---
src/hierarchy.c | 38 ++++++++++++++++++++++++++++++++++++--
src/xinput.c | 2 +-
2 files changed, 37 insertions(+), 3 deletions(-)
diff --git a/src/hierarchy.c b/src/hierarchy.c
index cf0f783..b69b98c 100644
--- a/src/hierarchy.c
+++ b/src/hierarchy.c
@@ -96,8 +96,42 @@ remove_master(Display* dpy, int argc, char** argv, char *name, char *desc)
if (r.return_mode == XIAttachToMaster)
{
- r.return_pointer = atoi(argv[2]);
- r.return_keyboard = atoi(argv[3]);
+ r.return_pointer = 0;
+ if (argc >= 3) {
+ info = xi2_find_device_info(dpy, argv[2]);
+ if (!info) {
+ fprintf(stderr, "unable to find device %s\n", argv[2]);
+ return EXIT_FAILURE;
+ }
+
+ r.return_pointer = info->deviceid;
+ }
+
+ r.return_keyboard = 0;
+ if (argc >= 4) {
+ info = xi2_find_device_info(dpy, argv[3]);
+ if (!info) {
+ fprintf(stderr, "unable to find device %s\n", argv[3]);
+ return EXIT_FAILURE;
+ }
+
+ r.return_keyboard = info->deviceid;
+ }
+
+ if (!r.return_pointer || !r.return_keyboard) {
+ int i, ndevices;
+ info = XIQueryDevice(dpy, XIAllMasterDevices, &ndevices);
+ for(i = 0; i < ndevices; i++) {
+ if (info[i].use == XIMasterPointer && !r.return_pointer)
+ r.return_pointer = info[i].deviceid;
+ if (info[i].use == XIMasterKeyboard && !r.return_keyboard)
+ r.return_keyboard = info[i].deviceid;
+ if (return_pointer && return_keyboard)
+ break;
+ }
+
+ XIFreeDeviceInfo(info);
+ }
}
ret = XIChangeHierarchy(dpy, (XIAnyHierarchyChangeInfo*)&r, 1);
diff --git a/src/xinput.c b/src/xinput.c
index 007fe2c..7c47c3c 100644
--- a/src/xinput.c
+++ b/src/xinput.c
@@ -87,7 +87,7 @@ static entry drivers[] =
create_master
},
{ "remove-master",
- "<id> [returnMode (dflt:Floating)] [returnPointer] [returnKeyboard]",
+ "<id> [returnMode (dflt:Floating, AttachToMaster)] [returnPointer] [returnKeyboard]",
remove_master
},
{ "reattach",
--
1.6.3.1
_______________________________________________
xorg-devel mailing list
[email protected]
http://lists.x.org/mailman/listinfo/xorg-devel