[PATCH 2/3] server: Added server-side raw input function implementations (try 4)
Vitaliy Margolen
wine-devel at kievinfo.com
Mon Jun 20 09:24:33 CDT 2011
On 06/20/2011 02:55 AM, Vincas Miliūnas wrote:
> (see the message in the first part of the patch)
> +struct raw_input
> +{
> + struct list entry;
> + unsigned short usage_page;
> + unsigned short usage;
> + BOOL processed;
> + BOOL retrieved;
> + RAWINPUT raw;
> +
> + /* common fields */
> + unsigned int type;
> + unsigned int message;
> + unsigned int flags;
> + unsigned int extra_info;
> +
> + /* mouse fields */
> + unsigned int point_x;
> + unsigned int point_y;
> + unsigned int mouse_data;
> + unsigned int cursor_x;
> + unsigned int cursor_y;
> +
> + /* keyboard fields */
> + unsigned int vk_code;
> + unsigned int scan_code;
> +};
Mouse and keyboard fields should be a union to save space.
> +#define NUM_RAW_DEVICES (sizeof( raw_devices ) / sizeof( struct raw_device ))
Please use "sizeof(array)/sizeof(array[0])" construct instead.
> + UINT i, size_in_bytes;
In server please use standard C types ("unsigned int" in this case).
> + /* Currently fake handles are provided, however they are only used for the GetRawInputDeviceInfo function,
> + thus it should not create any undesirable side effects */
> + result[i].hDevice = (HANDLE)raw_devices[i].handle;
This doesn't sound right. What this handle can be used for?
> + if (!(raw = malloc( sizeof( *raw ) )))
In server please use mem_alloc() instead.
> +/* Unregister a raw input device */
> +DECL_HANDLER(unregister_raw_input_device)
I don't see handing of case where device is not found. Should you return
error instead?
> + LIST_FOR_EACH( registration_entry, ¤t->process->raw_registered )
> + {
> + struct raw_registration *registration = LIST_ENTRY( registration_entry, struct raw_registration, entry );
You can use this instead:
LIST_FOR_EACH_ENTRY( registration, ¤t->process->raw_registered,
struct raw_registration, entry )
> + /* Prevent unprocessed raw input entries from being queued indefinitely */
> + while (current->process->raw_inputs_len >= MAX_RAW_INPUT_QUEUE_LENGTH)
> + {
> + struct raw_input *head = LIST_ENTRY( list_head( ¤t->process->raw_inputs ), struct raw_input, entry );
> + list_remove( &head->entry );
> + current->process->raw_inputs_len -= 1;
> + free( head );
> + }
Looks like you need a circular buffer (an array of fixed size with head and
tail pointers) instead of a list here.
Vitaliy.
More information about the wine-devel
mailing list