mirror of
https://github.com/X11Libre/xserver.git
synced 2026-09-27 21:22:26 +00:00
Merge remote-tracking branch 'whot/for-keith'
This commit is contained in:
commit
522f8bcc03
25 changed files with 894 additions and 276 deletions
|
|
@ -339,6 +339,7 @@ extern _X_EXPORT void NoticeEventTime(InternalEvent *ev);
|
|||
extern void EnqueueEvent(
|
||||
InternalEvent * /* ev */,
|
||||
DeviceIntPtr /* device */);
|
||||
extern void PlayReleasedEvents(void);
|
||||
|
||||
extern void ActivatePointerGrab(
|
||||
DeviceIntPtr /* mouse */,
|
||||
|
|
|
|||
|
|
@ -31,6 +31,10 @@ struct _GrabParameters;
|
|||
extern void PrintDeviceGrabInfo(DeviceIntPtr dev);
|
||||
extern void UngrabAllDevices(Bool kill_client);
|
||||
|
||||
extern GrabPtr AllocGrab(void);
|
||||
extern void FreeGrab(GrabPtr grab);
|
||||
extern Bool CopyGrab(GrabPtr dst, const GrabPtr src);
|
||||
|
||||
extern GrabPtr CreateGrab(
|
||||
int /* client */,
|
||||
DeviceIntPtr /* device */,
|
||||
|
|
|
|||
|
|
@ -205,6 +205,7 @@ extern _X_EXPORT KeybdCtrl defaultKeyboardControl;
|
|||
extern _X_EXPORT PtrCtrl defaultPointerControl;
|
||||
|
||||
typedef struct _InputOption InputOption;
|
||||
typedef struct _XI2Mask XI2Mask;
|
||||
|
||||
typedef struct _InputAttributes {
|
||||
char *product;
|
||||
|
|
|
|||
|
|
@ -118,7 +118,7 @@ typedef struct _InputClients {
|
|||
XID resource; /**< id for putting into resource manager */
|
||||
Mask mask[EMASKSIZE]; /**< Actual XI event mask, deviceid is index */
|
||||
/** XI2 event masks. One per device, each bit is a mask of (1 << type) */
|
||||
unsigned char xi2mask[EMASKSIZE][XI2MASKSIZE];
|
||||
struct _XI2Mask *xi2mask;
|
||||
} InputClients;
|
||||
|
||||
/**
|
||||
|
|
@ -148,7 +148,7 @@ typedef struct _OtherInputMasks {
|
|||
/** The clients that selected for events */
|
||||
InputClientsPtr inputClients;
|
||||
/* XI2 event masks. One per device, each bit is a mask of (1 << type) */
|
||||
unsigned char xi2mask[EMASKSIZE][XI2MASKSIZE];
|
||||
struct _XI2Mask *xi2mask;
|
||||
} OtherInputMasks;
|
||||
|
||||
/*
|
||||
|
|
@ -176,7 +176,7 @@ typedef enum {
|
|||
union _GrabMask {
|
||||
Mask core;
|
||||
Mask xi;
|
||||
char xi2mask[EMASKSIZE][XI2MASKSIZE];
|
||||
struct _XI2Mask *xi2mask;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -210,7 +210,7 @@ typedef struct _GrabRec {
|
|||
Mask eventMask;
|
||||
Mask deviceMask;
|
||||
/* XI2 event masks. One per device, each bit is a mask of (1 << type) */
|
||||
unsigned char xi2mask[EMASKSIZE][XI2MASKSIZE];
|
||||
struct _XI2Mask *xi2mask;
|
||||
} GrabRec;
|
||||
|
||||
/**
|
||||
|
|
@ -451,7 +451,7 @@ typedef struct _GrabInfoRec {
|
|||
TimeStamp grabTime;
|
||||
Bool fromPassiveGrab; /* true if from passive grab */
|
||||
Bool implicitGrab; /* implicit from ButtonPress */
|
||||
GrabRec activeGrab;
|
||||
GrabPtr activeGrab;
|
||||
GrabPtr grab;
|
||||
CARD8 activatingKey;
|
||||
void (*ActivateGrab) (
|
||||
|
|
@ -575,7 +575,7 @@ extern _X_EXPORT InputInfo inputInfo;
|
|||
/* for keeping the events for devices grabbed synchronously */
|
||||
typedef struct _QdEvent *QdEventPtr;
|
||||
typedef struct _QdEvent {
|
||||
QdEventPtr next;
|
||||
struct list next;
|
||||
DeviceIntPtr device;
|
||||
ScreenPtr pScreen; /* what screen the pointer was on */
|
||||
unsigned long months; /* milliseconds is in the event */
|
||||
|
|
@ -591,8 +591,8 @@ typedef struct _QdEvent {
|
|||
* replayed and processed as if they would come from the device directly.
|
||||
*/
|
||||
typedef struct _EventSyncInfo {
|
||||
QdEventPtr pending, /**< list of queued events */
|
||||
*pendtail; /**< last event in list */
|
||||
struct list pending;
|
||||
|
||||
/** The device to replay events for. Only set in AllowEvents(), in which
|
||||
* case it is set to the device specified in the request. */
|
||||
DeviceIntPtr replayDev; /* kludgy rock to put flag for */
|
||||
|
|
@ -622,4 +622,10 @@ static inline WindowPtr DeepestSpriteWin(SpritePtr sprite)
|
|||
return sprite->spriteTrace[sprite->spriteTraceGood - 1];
|
||||
}
|
||||
|
||||
struct _XI2Mask {
|
||||
unsigned char **masks; /* event mask in masks[deviceid][event type byte] */
|
||||
size_t nmasks; /* number of masks */
|
||||
size_t mask_size; /* size of each mask in bytes */
|
||||
};
|
||||
|
||||
#endif /* INPUTSTRUCT_H */
|
||||
|
|
|
|||
|
|
@ -46,4 +46,16 @@ FP1616 double_to_fp1616(double in);
|
|||
double fp1616_to_double(FP1616 in);
|
||||
double fp3232_to_double(FP3232 in);
|
||||
|
||||
|
||||
XI2Mask* xi2mask_new(void);
|
||||
XI2Mask* xi2mask_new_with_size(size_t, size_t); /* don't use it */
|
||||
void xi2mask_free(XI2Mask** mask);
|
||||
Bool xi2mask_isset(XI2Mask* mask, const DeviceIntPtr dev, int event_type);
|
||||
void xi2mask_set(XI2Mask *mask, int deviceid, int event_type);
|
||||
void xi2mask_zero(XI2Mask *mask, int deviceid);
|
||||
void xi2mask_merge(XI2Mask *dest, const XI2Mask *source);
|
||||
size_t xi2mask_num_masks(const XI2Mask *mask);
|
||||
size_t xi2mask_mask_size(const XI2Mask *mask);
|
||||
void xi2mask_set_one_mask(XI2Mask *xi2mask, int deviceid, const unsigned char *mask, size_t mask_size);
|
||||
const unsigned char* xi2mask_get_one_mask(const XI2Mask *xi2mask, int deviceid);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
|
||||
/**
|
||||
* @file Classic doubly-link circular list implementation.
|
||||
* For real usage examples of the linked list, see the file test/list.c
|
||||
*
|
||||
* Example:
|
||||
* We need to keep a list of struct foo in the parent struct bar, i.e. what
|
||||
|
|
@ -35,16 +36,16 @@
|
|||
*
|
||||
* struct bar {
|
||||
* ...
|
||||
* struct foo *foos; -----> struct foo {}, struct foo {}, struct foo{}
|
||||
* struct foo *list_of_foos; -----> struct foo {}, struct foo {}, struct foo{}
|
||||
* ...
|
||||
* }
|
||||
*
|
||||
* We need one list head in bar and a list element in all foos (both are of
|
||||
* We need one list head in bar and a list element in all list_of_foos (both are of
|
||||
* data type 'struct list').
|
||||
*
|
||||
* struct bar {
|
||||
* ...
|
||||
* struct list foos;
|
||||
* struct list list_of_foos;
|
||||
* ...
|
||||
* }
|
||||
*
|
||||
|
|
@ -58,27 +59,27 @@
|
|||
*
|
||||
* struct bar bar;
|
||||
* ...
|
||||
* list_init(&bar.foos);
|
||||
* list_init(&bar.list_of_foos);
|
||||
*
|
||||
* Then we create the first element and add it to this list:
|
||||
*
|
||||
* struct foo *foo = malloc(...);
|
||||
* ....
|
||||
* list_add(&foo->entry, &bar.foos);
|
||||
* list_add(&foo->entry, &bar.list_of_foos);
|
||||
*
|
||||
* Repeat the above for each element you want to add to the list. Deleting
|
||||
* works with the element itself.
|
||||
* list_del(&foo->entry);
|
||||
* free(foo);
|
||||
*
|
||||
* Note: calling list_del(&bar.foos) will set bar.foos to an empty
|
||||
* Note: calling list_del(&bar.list_of_foos) will set bar.list_of_foos to an empty
|
||||
* list again.
|
||||
*
|
||||
* Looping through the list requires a 'struct foo' as iterator and the
|
||||
* name of the field the subnodes use.
|
||||
*
|
||||
* struct foo *iterator;
|
||||
* list_for_each_entry(iterator, &bar.foos, entry) {
|
||||
* list_for_each_entry(iterator, &bar.list_of_foos, entry) {
|
||||
* if (iterator->something == ...)
|
||||
* ...
|
||||
* }
|
||||
|
|
@ -87,7 +88,7 @@
|
|||
* loop. You need to run the safe for-each loop instead:
|
||||
*
|
||||
* struct foo *iterator, *next;
|
||||
* list_for_each_entry_safe(iterator, next, &bar.foos, entry) {
|
||||
* list_for_each_entry_safe(iterator, next, &bar.list_of_foos, entry) {
|
||||
* if (...)
|
||||
* list_del(&iterator->entry);
|
||||
* }
|
||||
|
|
@ -96,14 +97,8 @@
|
|||
|
||||
/**
|
||||
* The linkage struct for list nodes. This struct must be part of your
|
||||
* to-be-linked struct.
|
||||
*
|
||||
* Example:
|
||||
* struct foo {
|
||||
* int a;
|
||||
* void *b;
|
||||
* struct list *mylist;
|
||||
* }
|
||||
* to-be-linked struct. struct list is required for both the head of the
|
||||
* list and for each list node.
|
||||
*
|
||||
* Position and name of the struct list field is irrelevant.
|
||||
* There are no requirements that elements of a list are of the same type.
|
||||
|
|
@ -118,7 +113,7 @@ struct list {
|
|||
* Initialize the list as an empty list.
|
||||
*
|
||||
* Example:
|
||||
* list_init(&foo->mylist);
|
||||
* list_init(&bar->list_of_foos);
|
||||
*
|
||||
* @param The list to initialized.
|
||||
*/
|
||||
|
|
@ -140,7 +135,8 @@ __list_add(struct list *entry,
|
|||
}
|
||||
|
||||
/**
|
||||
* Insert a new element after the given list head.
|
||||
* Insert a new element after the given list head. The new element does not
|
||||
* need to be initialised as empty list.
|
||||
* The list changes from:
|
||||
* head → some element → ...
|
||||
* to
|
||||
|
|
@ -148,7 +144,7 @@ __list_add(struct list *entry,
|
|||
*
|
||||
* Example:
|
||||
* struct foo *newfoo = malloc(...);
|
||||
* list_add(&newfoo->mylist, &foo->mylist);
|
||||
* list_add(&newfoo->entry, &bar->list_of_foos);
|
||||
*
|
||||
* @param entry The new element to prepend to the list.
|
||||
* @param head The existing list.
|
||||
|
|
@ -159,6 +155,28 @@ list_add(struct list *entry, struct list *head)
|
|||
__list_add(entry, head, head->next);
|
||||
}
|
||||
|
||||
/**
|
||||
* Append a new element to the end of the list given with this list head.
|
||||
*
|
||||
* The list changes from:
|
||||
* head → some element → ... → lastelement
|
||||
* to
|
||||
* head → some element → ... → lastelement → new element
|
||||
*
|
||||
* Example:
|
||||
* struct foo *newfoo = malloc(...);
|
||||
* list_append(&newfoo->entry, &bar->list_of_foos);
|
||||
*
|
||||
* @param entry The new element to prepend to the list.
|
||||
* @param head The existing list.
|
||||
*/
|
||||
static inline void
|
||||
list_append(struct list *entry, struct list *head)
|
||||
{
|
||||
__list_add(entry, head->prev, head);
|
||||
}
|
||||
|
||||
|
||||
static inline void
|
||||
__list_del(struct list *prev, struct list *next)
|
||||
{
|
||||
|
|
@ -176,7 +194,7 @@ __list_del(struct list *prev, struct list *next)
|
|||
* the list but rather reset the list as empty list.
|
||||
*
|
||||
* Example:
|
||||
* list_del(&newfoo->mylist);
|
||||
* list_del(&foo->entry);
|
||||
*
|
||||
* @param entry The element to remove.
|
||||
*/
|
||||
|
|
@ -191,7 +209,7 @@ list_del(struct list *entry)
|
|||
* Check if the list is empty.
|
||||
*
|
||||
* Example:
|
||||
* list_is_empty(&foo->mylist);
|
||||
* list_is_empty(&bar->list_of_foos);
|
||||
*
|
||||
* @return True if the list contains one or more elements or False otherwise.
|
||||
*/
|
||||
|
|
@ -206,7 +224,7 @@ list_is_empty(struct list *head)
|
|||
*
|
||||
* Example:
|
||||
* struct foo* f;
|
||||
* f = container_of(&foo->mylist, struct foo, mylist);
|
||||
* f = container_of(&foo->entry, struct foo, entry);
|
||||
* assert(f == foo);
|
||||
*
|
||||
* @param ptr Pointer to the struct list.
|
||||
|
|
@ -230,7 +248,7 @@ list_is_empty(struct list *head)
|
|||
*
|
||||
* Example:
|
||||
* struct foo *first;
|
||||
* first = list_first_entry(&foo->mylist, struct foo, mylist);
|
||||
* first = list_first_entry(&bar->list_of_foos, struct foo, list_of_foos);
|
||||
*
|
||||
* @param ptr The list head
|
||||
* @param type Data type of the list element to retrieve
|
||||
|
|
@ -240,6 +258,21 @@ list_is_empty(struct list *head)
|
|||
#define list_first_entry(ptr, type, member) \
|
||||
list_entry((ptr)->next, type, member)
|
||||
|
||||
/**
|
||||
* Retrieve the last list entry for the given listpointer.
|
||||
*
|
||||
* Example:
|
||||
* struct foo *first;
|
||||
* first = list_last_entry(&bar->list_of_foos, struct foo, list_of_foos);
|
||||
*
|
||||
* @param ptr The list head
|
||||
* @param type Data type of the list element to retrieve
|
||||
* @param member Member name of the struct list field in the list element.
|
||||
* @return A pointer to the last list element.
|
||||
*/
|
||||
#define list_last_entry(ptr, type, member) \
|
||||
list_entry((ptr)->prev, type, member)
|
||||
|
||||
#define __container_of(ptr, sample, member) \
|
||||
(void *)((char *)(ptr) \
|
||||
- ((char *)&(sample)->member - (char *)(sample)))
|
||||
|
|
@ -248,7 +281,7 @@ list_is_empty(struct list *head)
|
|||
*
|
||||
* Example:
|
||||
* struct foo *iterator;
|
||||
* list_for_each_entry(iterator, &foo->mylist, mylist) {
|
||||
* list_for_each_entry(iterator, &bar->list_of_foos, entry) {
|
||||
* [modify iterator]
|
||||
* }
|
||||
*
|
||||
|
|
|
|||
|
|
@ -359,11 +359,18 @@ typedef struct _CharInfo *CharInfoPtr; /* also in fonts/include/font.h */
|
|||
extern _X_EXPORT unsigned long globalSerialNumber;
|
||||
extern _X_EXPORT unsigned long serverGeneration;
|
||||
|
||||
#define BUG_WARN(cond) \
|
||||
/* Don't use this directly, use BUG_WARN or BUG_WARN_MSG instead */
|
||||
#define __BUG_WARN_MSG(cond, with_msg, ...) \
|
||||
do { if (cond) { \
|
||||
ErrorF("BUG: triggered 'if (" #cond ")'\nBUG: %s:%d in %s()\n", \
|
||||
__FILE__, __LINE__, __func__); \
|
||||
if (with_msg) ErrorF(__VA_ARGS__); \
|
||||
xorg_backtrace(); \
|
||||
} } while(0)
|
||||
|
||||
#define BUG_WARN_MSG(cond, msg, ...) \
|
||||
__BUG_WARN_MSG(cond, 1, msg, __VA_ARGS__)
|
||||
|
||||
#define BUG_WARN(cond) __BUG_WARN_MSG(cond, 0, NULL)
|
||||
|
||||
#endif /* MISC_H */
|
||||
|
|
|
|||
Loading…
Reference in a new issue