1
0
mirror of https://github.com/gryf/wmaker.git synced 2026-02-14 21:15:50 +01:00

- Added xdnd v3 support in WINGs (Sylvain Reynal <sreynal@nerim.net>)

- CVS should compile again
This commit is contained in:
dan
2004-04-07 02:50:52 +00:00
parent 791bb6a444
commit e7d0c5d9e9
23 changed files with 4372 additions and 3734 deletions

View File

@@ -14,10 +14,10 @@ char *WMViewRealizedNotification = "WMViewRealizedNotification";
#define EVENT_MASK \
KeyPressMask|KeyReleaseMask|ButtonPressMask|ButtonReleaseMask| \
EnterWindowMask|LeaveWindowMask|PointerMotionMask|ExposureMask| \
VisibilityChangeMask|FocusChangeMask|PropertyChangeMask|\
SubstructureNotifyMask|SubstructureRedirectMask
KeyPressMask|KeyReleaseMask|ButtonPressMask|ButtonReleaseMask| \
EnterWindowMask|LeaveWindowMask|PointerMotionMask|ExposureMask| \
VisibilityChangeMask|FocusChangeMask|PropertyChangeMask|\
SubstructureNotifyMask|SubstructureRedirectMask
static XSetWindowAttributes defAtts= {
@@ -26,21 +26,21 @@ static XSetWindowAttributes defAtts= {
CopyFromParent, /* border_pixmap */
0, /* border_pixel */
ForgetGravity, /* bit_gravity */
ForgetGravity, /* win_gravity */
ForgetGravity, /* win_gravity */
NotUseful, /* backing_store */
(unsigned) ~0, /* backing_planes */
0, /* backing_pixel */
False, /* save_under */
EVENT_MASK, /* event_mask */
EVENT_MASK, /* event_mask */
0, /* do_not_propagate_mask */
False, /* override_redirect */
None, /* colormap */
None, /* colormap */
None /* cursor */
};
static XContext ViewContext=0; /* context for views */
static XContext ViewContext=0; /* context for views */
@@ -49,9 +49,9 @@ W_View*
W_GetViewForXWindow(Display *display, Window window)
{
W_View *view;
if (XFindContext(display, window, ViewContext, (XPointer*)&view)==0) {
return view;
return view;
}
return NULL;
}
@@ -63,20 +63,20 @@ unparentView(W_View *view)
{
/* remove from parent's children list */
if (view->parent!=NULL) {
W_View *ptr;
ptr = view->parent->childrenList;
if (ptr == view) {
view->parent->childrenList = view->nextSister;
} else {
while (ptr!=NULL) {
if (ptr->nextSister == view) {
ptr->nextSister = view->nextSister;
break;
}
ptr = ptr->nextSister;
}
}
W_View *ptr;
ptr = view->parent->childrenList;
if (ptr == view) {
view->parent->childrenList = view->nextSister;
} else {
while (ptr!=NULL) {
if (ptr->nextSister == view) {
ptr->nextSister = view->nextSister;
break;
}
ptr = ptr->nextSister;
}
}
}
view->parent = NULL;
}
@@ -89,14 +89,14 @@ adoptChildView(W_View *view, W_View *child)
/* add to end of children list of parent */
if (view->childrenList == NULL) {
view->childrenList = child;
view->childrenList = child;
} else {
W_View *ptr;
ptr = view->childrenList;
while (ptr->nextSister!=NULL)
ptr = ptr->nextSister;
ptr->nextSister = child;
W_View *ptr;
ptr = view->childrenList;
while (ptr->nextSister!=NULL)
ptr = ptr->nextSister;
ptr->nextSister = child;
}
child->parent = view;
}
@@ -108,26 +108,26 @@ createView(W_Screen *screen, W_View *parent)
W_View *view;
if (ViewContext==0)
ViewContext = XUniqueContext();
ViewContext = XUniqueContext();
view = wmalloc(sizeof(W_View));
memset(view, 0, sizeof(W_View));
view->screen = screen;
if (parent!=NULL) {
/* attributes are not valid for root window */
view->attribFlags = CWEventMask|CWBitGravity;
view->attribs = defAtts;
/* attributes are not valid for root window */
view->attribFlags = CWEventMask|CWBitGravity;
view->attribs = defAtts;
view->attribFlags |= CWBackPixel|CWColormap|CWBorderPixel;
view->attribs.background_pixel = W_PIXEL(screen->gray);
view->attribs.border_pixel = W_PIXEL(screen->black);
view->attribs.colormap = screen->colormap;
view->attribFlags |= CWBackPixel|CWColormap|CWBorderPixel;
view->attribs.background_pixel = W_PIXEL(screen->gray);
view->attribs.border_pixel = W_PIXEL(screen->black);
view->attribs.colormap = screen->colormap;
view->backColor = WMRetainColor(screen->gray);
view->backColor = WMRetainColor(screen->gray);
adoptChildView(parent, view);
adoptChildView(parent, view);
}
view->refCount = 1;
@@ -150,19 +150,19 @@ W_View*
W_CreateRootView(W_Screen *screen)
{
W_View *view;
view = createView(screen, NULL);
view->window = screen->rootWin;
view->flags.realized = 1;
view->flags.mapped = 1;
view->flags.root = 1;
view->size.width =
WidthOfScreen(ScreenOfDisplay(screen->display, screen->screen));
view->size.width =
WidthOfScreen(ScreenOfDisplay(screen->display, screen->screen));
view->size.height =
HeightOfScreen(ScreenOfDisplay(screen->display, screen->screen));
HeightOfScreen(ScreenOfDisplay(screen->display, screen->screen));
return view;
}
@@ -172,10 +172,10 @@ W_View*
W_CreateTopView(W_Screen *screen)
{
W_View *view;
view = createView(screen, screen->rootView);
if (!view)
return NULL;
return NULL;
view->flags.topLevel = 1;
view->attribs.event_mask |= StructureNotifyMask;
@@ -188,10 +188,10 @@ W_View*
W_CreateUnmanagedTopView(W_Screen *screen)
{
W_View *view;
view = createView(screen, screen->rootView);
if (!view)
return NULL;
return NULL;
view->flags.topLevel = 1;
view->attribs.event_mask |= StructureNotifyMask;
@@ -215,36 +215,36 @@ W_RealizeView(W_View *view)
if (view->parent && !view->parent->flags.realized) {
wwarning("trying to realize widget of unrealized parent");
return;
wwarning("trying to realize widget of unrealized parent");
return;
}
if (!view->flags.realized) {
parentWID = view->parent->window;
view->window = XCreateWindow(dpy, parentWID, view->pos.x, view->pos.y,
view->size.width, view->size.height, 0,
view->screen->depth, InputOutput,
view->screen->visual, view->attribFlags,
&view->attribs);
parentWID = view->parent->window;
view->window = XCreateWindow(dpy, parentWID, view->pos.x, view->pos.y,
view->size.width, view->size.height, 0,
view->screen->depth, InputOutput,
view->screen->visual, view->attribFlags,
&view->attribs);
XSaveContext(dpy, view->window, ViewContext, (XPointer)view);
XSaveContext(dpy, view->window, ViewContext, (XPointer)view);
view->flags.realized = 1;
view->flags.realized = 1;
if (view->flags.mapWhenRealized) {
W_MapView(view);
view->flags.mapWhenRealized = 0;
}
if (view->flags.mapWhenRealized) {
W_MapView(view);
view->flags.mapWhenRealized = 0;
}
WMPostNotificationName(WMViewRealizedNotification, view, NULL);
WMPostNotificationName(WMViewRealizedNotification, view, NULL);
}
/* realize children */
ptr = view->childrenList;
while (ptr!=NULL) {
W_RealizeView(ptr);
W_RealizeView(ptr);
ptr = ptr->nextSister;
ptr = ptr->nextSister;
}
}
@@ -260,14 +260,14 @@ W_ReparentView(W_View *view, W_View *newParent, int x, int y)
adoptChildView(newParent, view);
if (view->flags.realized) {
if (newParent->flags.realized) {
XReparentWindow(dpy, view->window, newParent->window, x, y);
} else {
wwarning("trying to reparent realized view to unrealized parent");
return;
}
if (newParent->flags.realized) {
XReparentWindow(dpy, view->window, newParent->window, x, y);
} else {
wwarning("trying to reparent realized view to unrealized parent");
return;
}
}
view->pos.x = x;
view->pos.y = y;
}
@@ -277,7 +277,7 @@ void
W_RaiseView(W_View *view)
{
if (W_VIEW_REALIZED(view))
XRaiseWindow(W_VIEW_DISPLAY(view), W_VIEW_DRAWABLE(view));
XRaiseWindow(W_VIEW_DISPLAY(view), W_VIEW_DRAWABLE(view));
}
@@ -286,7 +286,7 @@ void
W_LowerView(W_View *view)
{
if (W_VIEW_REALIZED(view))
XLowerWindow(W_VIEW_DISPLAY(view), W_VIEW_DRAWABLE(view));
XLowerWindow(W_VIEW_DISPLAY(view), W_VIEW_DRAWABLE(view));
}
@@ -295,13 +295,13 @@ void
W_MapView(W_View *view)
{
if (!view->flags.mapped) {
if (view->flags.realized) {
XMapRaised(view->screen->display, view->window);
XFlush(view->screen->display);
view->flags.mapped = 1;
} else {
view->flags.mapWhenRealized = 1;
}
if (view->flags.realized) {
XMapRaised(view->screen->display, view->window);
XFlush(view->screen->display);
view->flags.mapped = 1;
} else {
view->flags.mapWhenRealized = 1;
}
}
}
@@ -315,12 +315,12 @@ W_MapSubviews(W_View *view)
{
XMapSubwindows(view->screen->display, view->window);
XFlush(view->screen->display);
view = view->childrenList;
while (view) {
view->flags.mapped = 1;
view->flags.mapWhenRealized = 0;
view = view->nextSister;
view->flags.mapped = 1;
view->flags.mapWhenRealized = 0;
view = view->nextSister;
}
}
@@ -331,12 +331,12 @@ W_UnmapSubviews(W_View *view)
{
XUnmapSubwindows(view->screen->display, view->window);
XFlush(view->screen->display);
view = view->childrenList;
while (view) {
view->flags.mapped = 0;
view->flags.mapWhenRealized = 0;
view = view->nextSister;
view->flags.mapped = 0;
view->flags.mapWhenRealized = 0;
view = view->nextSister;
}
}
@@ -347,7 +347,7 @@ W_UnmapView(W_View *view)
{
view->flags.mapWhenRealized = 0;
if (!view->flags.mapped)
return;
return;
XUnmapWindow(view->screen->display, view->window);
XFlush(view->screen->display);
@@ -360,11 +360,11 @@ W_View*
W_TopLevelOfView(W_View *view)
{
W_View *toplevel;
for (toplevel=view;
toplevel && !toplevel->flags.topLevel;
toplevel=toplevel->parent);
toplevel && !toplevel->flags.topLevel;
toplevel=toplevel->parent);
return toplevel;
}
@@ -375,8 +375,8 @@ destroyView(W_View *view)
W_View *ptr;
if (view->flags.alreadyDead)
return;
view->flags.alreadyDead = 1;
return;
view->flags.alreadyDead = 1;
/* delete the balloon text for the view, if there's any */
WMSetBalloonTextForView(NULL, view);
@@ -388,78 +388,67 @@ destroyView(W_View *view)
/* Do not leave focus in a inexisting control */
if (W_FocusedViewOfToplevel(W_TopLevelOfView(view))==view)
W_SetFocusOfTopLevel(W_TopLevelOfView(view), NULL);
W_SetFocusOfTopLevel(W_TopLevelOfView(view), NULL);
if (view->flags.topLevel) {
W_FocusInfo *info = view->screen->focusInfo;
/* remove focus information associated to this toplevel */
if (info) {
if (info->toplevel==view) {
view->screen->focusInfo = info->next;
wfree(info);
} else {
while (info->next) {
if (info->next->toplevel == view)
break;
info = info->next;
}
if (info->next) {
W_FocusInfo *next = info->next->next;
wfree(info->next);
info->next = next;
}
/* else the toplevel did not have any focused subview */
}
}
W_FocusInfo *info = view->screen->focusInfo;
/* remove focus information associated to this toplevel */
if (info) {
if (info->toplevel==view) {
view->screen->focusInfo = info->next;
wfree(info);
} else {
while (info->next) {
if (info->next->toplevel == view)
break;
info = info->next;
}
if (info->next) {
W_FocusInfo *next = info->next->next;
wfree(info->next);
info->next = next;
}
/* else the toplevel did not have any focused subview */
}
}
}
/* destroy children recursively */
while (view->childrenList!=NULL) {
ptr = view->childrenList;
ptr->flags.parentDying = 1;
ptr = view->childrenList;
ptr->flags.parentDying = 1;
W_DestroyView(ptr);
W_DestroyView(ptr);
if (ptr == view->childrenList) {
view->childrenList = ptr->nextSister;
ptr->parent = NULL;
}
if (ptr == view->childrenList) {
view->childrenList = ptr->nextSister;
ptr->parent = NULL;
}
}
W_CallDestroyHandlers(view);
if (view->flags.realized) {
XDeleteContext(view->screen->display,
view->window, ViewContext);
/* if parent is being destroyed, it will die naturaly */
if (!view->flags.parentDying || view->flags.topLevel)
XDestroyWindow(view->screen->display, view->window);
XDeleteContext(view->screen->display,
view->window, ViewContext);
/* if parent is being destroyed, it will die naturaly */
if (!view->flags.parentDying || view->flags.topLevel)
XDestroyWindow(view->screen->display, view->window);
}
/* remove self from parent's children list */
unparentView(view);
/* the array has a wfree() destructor that will be called automatically */
WMFreeArray(view->eventHandlers);
view->eventHandlers = NULL;
WMUnregisterViewDraggedTypes(view);
WMRemoveNotificationObserver(view);
#if 0
if (view->dragSourceProcs)
wfree(view->dragSourceProcs);
if (view->dragDestinationProcs)
wfree(view->dragDestinationProcs);
if (scr->dragInfo.destView == view) {
scr->dragInfo.destView = NULL;
}
#endif
WMRemoveNotificationObserver(view);
W_FreeViewXdndPart(view);
wfree(view);
}
@@ -483,20 +472,20 @@ W_MoveView(W_View *view, int x, int y)
assert(view->flags.root==0);
if (view->delegate && view->delegate->willMove) {
(*view->delegate->willMove)(view->delegate, view, &x, &y);
(*view->delegate->willMove)(view->delegate, view, &x, &y);
}
if (view->pos.x == x && view->pos.y == y)
return;
return;
if (view->flags.realized) {
XMoveWindow(view->screen->display, view->window, x, y);
XMoveWindow(view->screen->display, view->window, x, y);
}
view->pos.x = x;
view->pos.y = y;
if (view->delegate && view->delegate->didMove) {
(*view->delegate->didMove)(view->delegate, view);
(*view->delegate->didMove)(view->delegate, view);
}
}
@@ -507,30 +496,30 @@ W_ResizeView(W_View *view, unsigned int width, unsigned int height)
/*int shrinked;*/
if (view->delegate && view->delegate->willResize) {
(*view->delegate->willResize)(view->delegate, view, &width, &height);
(*view->delegate->willResize)(view->delegate, view, &width, &height);
}
assert(width > 0);
assert(height > 0);
if (view->size.width == width && view->size.height == height)
return;
return;
/*shrinked = width < view->size.width || height < view->size.height;*/
if (view->flags.realized) {
XResizeWindow(view->screen->display, view->window, width, height);
XResizeWindow(view->screen->display, view->window, width, height);
}
view->size.width = width;
view->size.height = height;
if (view->delegate && view->delegate->didResize) {
(*view->delegate->didResize)(view->delegate, view);
(*view->delegate->didResize)(view->delegate, view);
}
/* // TODO. replace in WINGs code, with the didResize delegate */
if (view->flags.notifySizeChanged)
WMPostNotificationName(WMViewSizeDidChangeNotification, view, NULL);
WMPostNotificationName(WMViewSizeDidChangeNotification, view, NULL);
}
@@ -538,10 +527,10 @@ void
W_RedisplayView(W_View *view)
{
XEvent ev;
if (!view->flags.mapped)
return;
return;
ev.xexpose.type = Expose;
ev.xexpose.display = view->screen->display;
ev.xexpose.window = view->window;
@@ -557,28 +546,28 @@ void
W_SetViewBackgroundColor(W_View *view, WMColor *color)
{
if (view->backColor)
WMReleaseColor(view->backColor);
WMReleaseColor(view->backColor);
view->backColor = WMRetainColor(color);
view->attribFlags |= CWBackPixel;
view->attribs.background_pixel = W_PIXEL(color);
if (view->flags.realized) {
XSetWindowBackground(view->screen->display, view->window,
W_PIXEL(color));
XClearWindow(view->screen->display, view->window);
XSetWindowBackground(view->screen->display, view->window,
W_PIXEL(color));
XClearWindow(view->screen->display, view->window);
}
}
void
void
W_SetViewCursor(W_View *view, Cursor cursor)
{
view->cursor = cursor;
if (W_VIEW_REALIZED(view)) {
XDefineCursor(W_VIEW_DISPLAY(view), W_VIEW_DRAWABLE(view), cursor);
XDefineCursor(W_VIEW_DISPLAY(view), W_VIEW_DRAWABLE(view), cursor);
} else {
view->attribFlags |= CWCursor;
view->attribs.cursor = cursor;
view->attribFlags |= CWCursor;
view->attribs.cursor = cursor;
}
}
@@ -588,14 +577,14 @@ W_FocusedViewOfToplevel(W_View *view)
{
WMScreen *scr = view->screen;
W_FocusInfo *info;
for (info = scr->focusInfo; info!=NULL; info = info->next)
if (view == info->toplevel)
break;
if (view == info->toplevel)
break;
if (!info)
return NULL;
return NULL;
return info->focused;
}
@@ -606,61 +595,61 @@ W_SetFocusOfTopLevel(W_View *toplevel, W_View *view)
WMScreen *scr = toplevel->screen;
XEvent event;
W_FocusInfo *info;
for (info = scr->focusInfo; info!=NULL; info = info->next)
if (toplevel == info->toplevel)
break;
if (toplevel == info->toplevel)
break;
if (!info) {
info = wmalloc(sizeof(W_FocusInfo));
info->toplevel = toplevel;
info->focused = view;
info->next = scr->focusInfo;
scr->focusInfo = info;
info = wmalloc(sizeof(W_FocusInfo));
info->toplevel = toplevel;
info->focused = view;
info->next = scr->focusInfo;
scr->focusInfo = info;
} else {
event.xfocus.mode = NotifyNormal;
event.xfocus.detail = NotifyDetailNone;
if (info->focused) {
/* simulate FocusOut event */
event.xfocus.type = FocusOut;
W_DispatchMessage(info->focused, &event);
}
info->focused = view;
event.xfocus.mode = NotifyNormal;
event.xfocus.detail = NotifyDetailNone;
if (info->focused) {
/* simulate FocusOut event */
event.xfocus.type = FocusOut;
W_DispatchMessage(info->focused, &event);
}
info->focused = view;
}
if (view) {
/* simulate FocusIn event */
event.xfocus.type = FocusIn;
W_DispatchMessage(view, &event);
/* simulate FocusIn event */
event.xfocus.type = FocusIn;
W_DispatchMessage(view, &event);
}
}
void
void
W_BroadcastMessage(W_View *targetParent, XEvent *event)
{
W_View *target;
target = targetParent->childrenList;
while (target!=NULL) {
W_DispatchMessage(target, event);
target = target->nextSister;
W_DispatchMessage(target, event);
target = target->nextSister;
}
}
void
void
W_DispatchMessage(W_View *target, XEvent *event)
{
if (target->window==None)
return;
return;
event->xclient.window = target->window;
event->xclient.display = target->screen->display;
WMHandleEvent(event);
/*
XSendEvent(target->screen->display, target->window, False,
SubstructureNotifyMask, event);
XSendEvent(target->screen->display, target->window, False,
SubstructureNotifyMask, event);
*/
}
@@ -681,7 +670,7 @@ W_ReleaseView(WMView *view)
view->refCount--;
if (view->refCount < 1) {
destroyView(view);
destroyView(view);
}
}
@@ -693,13 +682,13 @@ WMWidgetOfView(WMView *view)
}
WMSize
WMSize
WMGetViewSize(WMView *view)
{
return view->size;
}
WMPoint
WMPoint
WMGetViewPosition(WMView *view)
{
return view->pos;
@@ -738,7 +727,7 @@ WMGetViewScreenPosition(WMView *view)
}
XTranslateCoordinates(scr->display, W_VIEW_DRAWABLE(view),
scr->rootWin, 0, 0, &x, &y, &foo);
scr->rootWin, 0, 0, &x, &y, &foo);
return wmkpoint(x-topX, y-topY);
}
@@ -752,13 +741,13 @@ resizedParent(void *self, WMNotification *notif)
W_MoveView(view, view->leftOffs, view->topOffs);
W_ResizeView(view, size.width - (view->leftOffs + view->rightOffs),
size.height - (view->topOffs + view->bottomOffs));
size.height - (view->topOffs + view->bottomOffs));
}
void
WMSetViewExpandsToParent(WMView *view, int leftOffs, int topOffs,
int rightOffs, int bottomOffs)
WMSetViewExpandsToParent(WMView *view, int leftOffs, int topOffs,
int rightOffs, int bottomOffs)
{
WMSize size = view->parent->size;
@@ -766,15 +755,15 @@ WMSetViewExpandsToParent(WMView *view, int leftOffs, int topOffs,
view->bottomOffs = bottomOffs;
view->leftOffs = leftOffs;
view->rightOffs = rightOffs;
WMAddNotificationObserver(resizedParent, view,
WMViewSizeDidChangeNotification,
view->parent);
WMViewSizeDidChangeNotification,
view->parent);
WMSetViewNotifySizeChanges(view->parent, True);
W_MoveView(view, leftOffs, topOffs);
W_ResizeView(view, size.width - (leftOffs + rightOffs),
size.height - (topOffs + bottomOffs));
W_ResizeView(view, size.width - (leftOffs + rightOffs),
size.height - (topOffs + bottomOffs));
}