mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-27 11:52:03 +00:00
Avoid yet another X11 stack overflow.
This commit is contained in:
parent
46cfcf550f
commit
dd4afdf4eb
2 changed files with 36 additions and 1 deletions
|
@ -26,6 +26,11 @@ struct Mousectl
|
||||||
int pid; /* of slave proc */
|
int pid; /* of slave proc */
|
||||||
Display *display;
|
Display *display;
|
||||||
/*Image* image; / * of associated window/display */
|
/*Image* image; / * of associated window/display */
|
||||||
|
|
||||||
|
/* clumsy hack for X11 */
|
||||||
|
struct Channel *ccursor;
|
||||||
|
struct Channel *ccursorwait;
|
||||||
|
QLock cursorlock;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Menu
|
struct Menu
|
||||||
|
|
|
@ -46,6 +46,28 @@ readmouse(Mousectl *mc)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is necessary because some X libraries (e.g., on FC3)
|
||||||
|
* use an inordinate amount of stack space to do _xsetcursor.
|
||||||
|
* Perhaps instead there should be a generic "run this X routine"
|
||||||
|
* stack that you send a function and argument to.
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
void
|
||||||
|
_cursorproc(void *arg)
|
||||||
|
{
|
||||||
|
Mousectl *mc;
|
||||||
|
Cursor *c;
|
||||||
|
|
||||||
|
mc = arg;
|
||||||
|
threadsetname("cursorproc (sigh)");
|
||||||
|
for(;;){
|
||||||
|
c = recvp(mc->ccursor);
|
||||||
|
_xsetcursor(c);
|
||||||
|
sendp(mc->ccursorwait, nil);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
void
|
void
|
||||||
_ioproc(void *arg)
|
_ioproc(void *arg)
|
||||||
|
@ -141,14 +163,22 @@ initmouse(char *file, Image *i)
|
||||||
chansetname(mc->c, "mousec");
|
chansetname(mc->c, "mousec");
|
||||||
mc->resizec = chancreate(sizeof(int), 2);
|
mc->resizec = chancreate(sizeof(int), 2);
|
||||||
chansetname(mc->resizec, "resizec");
|
chansetname(mc->resizec, "resizec");
|
||||||
|
mc->ccursor = chancreate(sizeof(void*), 0);
|
||||||
|
chansetname(mc->ccursor, "ccursor");
|
||||||
|
mc->ccursorwait = chancreate(sizeof(void*), 0);
|
||||||
|
chansetname(mc->ccursor, "ccursorwait");
|
||||||
proccreate(_ioproc, mc, 256*1024);
|
proccreate(_ioproc, mc, 256*1024);
|
||||||
|
proccreate(_cursorproc, mc, 256*1024); /* sigh */
|
||||||
return mc;
|
return mc;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
setcursor(Mousectl *mc, Cursor *c)
|
setcursor(Mousectl *mc, Cursor *c)
|
||||||
{
|
{
|
||||||
_xsetcursor(c);
|
qlock(&mc->cursorlock);
|
||||||
|
sendp(mc->ccursor, c);
|
||||||
|
recvp(mc->ccursorwait);
|
||||||
|
qunlock(&mc->cursorlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue