1
0
mirror of https://github.com/gryf/wmaker.git synced 2026-01-06 13:54:12 +01:00

- added WMRemoveFromArrayMatching(array, match, cdata), which will remove the

first element in the array that is matched by match(item, cdata)==True.
- added WMArrayFirst(), WMArrayLast(), WMArrayNext() and WMArrayPrevious()
  functions and also WM_ITERATE_ARRAY() and WM_ETARETI_ARRAY() macros, to make
  interfaces to WMBag and WMArray similar and to make life a little simpler
  when iterating through all elements of an array.
- replaced bags with arrays wherever appropriate. This will improve
  performance a bit.
- replaced some recursive code with iterative code in WINGs/selection.c
- some code cleanup is src/
This commit is contained in:
dan
2001-04-15 01:22:56 +00:00
parent a41b8993e5
commit 046403dbbb
27 changed files with 581 additions and 662 deletions

View File

@@ -71,13 +71,13 @@ WMCreateEventHandler(WMView *view, unsigned long mask, WMEventProc *eventProc,
{
W_EventHandler *handler, *ptr;
unsigned long eventMask;
WMBagIterator iter;
WMArrayIterator iter;
handler = NULL;
eventMask = mask;
WM_ITERATE_BAG(view->eventHandlers, ptr, iter) {
WM_ITERATE_ARRAY(view->eventHandlers, ptr, iter) {
if (ptr->clientData == clientData && ptr->proc == eventProc) {
handler = ptr;
eventMask |= ptr->eventMask;
@@ -86,7 +86,7 @@ WMCreateEventHandler(WMView *view, unsigned long mask, WMEventProc *eventProc,
if (!handler) {
handler = wmalloc(sizeof(W_EventHandler));
WMPutInBag(view->eventHandlers, handler);
WMAddToArray(view->eventHandlers, handler);
}
/* select events for window */
handler->eventMask = eventMask;
@@ -95,6 +95,17 @@ WMCreateEventHandler(WMView *view, unsigned long mask, WMEventProc *eventProc,
}
static int
matchHandler(void *item, void *cdata)
{
#define H1 ((W_EventHandler*)item)
#define H2 ((W_EventHandler*)cdata)
return (H1->eventMask==H2->eventMask && H1->proc==H2->proc &&
H1->clientData==H2->clientData);
}
/*
* WMDeleteEventHandler--
* Delete event handler matching arguments from windows
@@ -105,42 +116,15 @@ void
WMDeleteEventHandler(WMView *view, unsigned long mask, WMEventProc *eventProc,
void *clientData)
{
W_EventHandler *handler, *ptr;
WMBagIterator iter;
handler = NULL;
WM_ITERATE_BAG(view->eventHandlers, ptr, iter) {
if (ptr->eventMask == mask && ptr->proc == eventProc
&& ptr->clientData == clientData) {
handler = ptr;
break;
}
}
if (!handler)
return;
WMRemoveFromBag(view->eventHandlers, handler);
W_EventHandler tmp;
wfree(handler);
tmp.eventMask = mask;
tmp.proc = eventProc;
tmp.clientData = clientData;
WMRemoveFromArrayMatching(view->eventHandlers, matchHandler, (void*)&tmp);
}
void
W_CleanUpEvents(WMView *view)
{
W_EventHandler *ptr;
WMBagIterator iter;
WM_ITERATE_BAG(view->eventHandlers, ptr, iter) {
wfree(ptr);
}
}
static Time
getEventTime(WMScreen *screen, XEvent *event)
{
@@ -174,14 +158,15 @@ void
W_CallDestroyHandlers(W_View *view)
{
XEvent event;
WMBagIterator iter;
WMArrayIterator iter;
W_EventHandler *hPtr;
event.type = DestroyNotify;
event.xdestroywindow.window = view->window;
event.xdestroywindow.event = view->window;
WM_ITERATE_BAG(view->eventHandlers, hPtr, iter) {
WM_ITERATE_ARRAY(view->eventHandlers, hPtr, iter) {
if (hPtr->eventMask & StructureNotifyMask) {
(*hPtr->proc)(&event, hPtr->clientData);
}
@@ -208,9 +193,9 @@ WMRelayToNextResponder(WMView *view, XEvent *event)
if (view->nextResponder) {
WMView *next = view->nextResponder;
W_EventHandler *hPtr;
WMBagIterator iter;
WMArrayIterator iter;
WM_ITERATE_BAG(next->eventHandlers, hPtr, iter) {
WM_ITERATE_ARRAY(next->eventHandlers, hPtr, iter) {
if ((hPtr->eventMask & mask)) {
(*hPtr->proc)(event, hPtr->clientData);
}
@@ -226,7 +211,7 @@ WMHandleEvent(XEvent *event)
W_View *view, *vPtr, *toplevel;
unsigned long mask;
Window window;
WMBagIterator iter;
WMArrayIterator iter;
if (event->type == MappingNotify) {
XRefreshKeyboardMapping(&event->xmapping);
@@ -318,7 +303,7 @@ WMHandleEvent(XEvent *event)
* might destroy the widget. */
W_RetainView(toplevel);
WM_ITERATE_BAG(view->eventHandlers, hPtr, iter) {
WM_ITERATE_ARRAY(view->eventHandlers, hPtr, iter) {
if ((hPtr->eventMask & mask)) {
(*hPtr->proc)(event, hPtr->clientData);
}
@@ -331,7 +316,7 @@ WMHandleEvent(XEvent *event)
while (vPtr->parent != NULL)
vPtr = vPtr->parent;
WM_ITERATE_BAG(vPtr->eventHandlers, hPtr, iter) {
WM_ITERATE_ARRAY(vPtr->eventHandlers, hPtr, iter) {
if (hPtr->eventMask & mask) {
(*hPtr->proc)(event, hPtr->clientData);
}