aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/devdraw
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/devdraw')
-rw-r--r--src/cmd/devdraw/devdraw.c5
-rw-r--r--src/cmd/devdraw/devdraw.h1
-rw-r--r--src/cmd/devdraw/mac-screen.m25
-rw-r--r--src/cmd/devdraw/srv.c25
-rw-r--r--src/cmd/devdraw/x11-inc.h1
-rw-r--r--src/cmd/devdraw/x11-screen.c22
6 files changed, 60 insertions, 19 deletions
diff --git a/src/cmd/devdraw/devdraw.c b/src/cmd/devdraw/devdraw.c
index 086574ef..b4c373ad 100644
--- a/src/cmd/devdraw/devdraw.c
+++ b/src/cmd/devdraw/devdraw.c
@@ -55,10 +55,7 @@ gfx_replacescreenimage(Client *c, Memimage *m)
_freememimage(om);
}
qunlock(&c->drawlk);
-
- qlock(&c->eventlk);
- c->mouse.resized = 1;
- qunlock(&c->eventlk);
+ gfx_mouseresized(c);
}
static void
diff --git a/src/cmd/devdraw/devdraw.h b/src/cmd/devdraw/devdraw.h
index 4980ed90..6829ab32 100644
--- a/src/cmd/devdraw/devdraw.h
+++ b/src/cmd/devdraw/devdraw.h
@@ -187,6 +187,7 @@ void gfx_keystroke(Client*, int);
void gfx_main(void);
void gfx_mousetrack(Client*, int, int, int, uint);
void gfx_replacescreenimage(Client*, Memimage*);
+void gfx_mouseresized(Client*);
void gfx_started(void);
// rpc_* routines are called on the RPC thread,
diff --git a/src/cmd/devdraw/mac-screen.m b/src/cmd/devdraw/mac-screen.m
index e02a2524..c6e58341 100644
--- a/src/cmd/devdraw/mac-screen.m
+++ b/src/cmd/devdraw/mac-screen.m
@@ -510,7 +510,7 @@ void
rpc_resizeimg(Client *c)
{
DrawView *view = (__bridge DrawView*)c->view;
- dispatch_sync(dispatch_get_main_queue(), ^(void){
+ dispatch_async(dispatch_get_main_queue(), ^(void){
[view resizeimg];
});
}
@@ -518,7 +518,6 @@ rpc_resizeimg(Client *c)
- (void)resizeimg {
[self initimg];
gfx_replacescreenimage(self.client, self.img);
- [self sendmouse:0];
}
- (void)windowDidResize:(NSNotification *)notification {
@@ -561,6 +560,10 @@ rpc_resizewindow(Client *c, Rectangle r)
[self sendmouse:0];
}
+- (void)windowDidResignKey:(id)arg {
+ gfx_abortcompose(self.client);
+}
+
- (void)mouseMoved:(NSEvent*)e{ [self getmouse:e];}
- (void)mouseDown:(NSEvent*)e{ [self getmouse:e];}
- (void)mouseDragged:(NSEvent*)e{ [self getmouse:e];}
@@ -930,6 +933,13 @@ rpc_setmouse(Client *c, Point p)
- (NSApplicationPresentationOptions)window:(id)arg
willUseFullScreenPresentationOptions:(NSApplicationPresentationOptions)proposedOptions {
+ // The default for full-screen is to auto-hide the dock and menu bar,
+ // but the menu bar in particular comes back when the cursor is just
+ // near the top of the screen, which makes acme's top tag line very difficult to use.
+ // Disable the menu bar entirely.
+ // In theory this code disables the dock entirely too, but if you drag the mouse
+ // down far enough off the bottom of the screen the dock still unhides.
+ // That's OK.
NSApplicationPresentationOptions o;
o = proposedOptions;
o &= ~(NSApplicationPresentationAutoHideDock | NSApplicationPresentationAutoHideMenuBar);
@@ -938,16 +948,21 @@ rpc_setmouse(Client *c, Point p)
}
- (void)windowWillEnterFullScreen:(NSNotification*)notification {
- // TODO: This should only be done if the window
- // is on the screen with the dock.
- // But how can you tell which window has the dock?
+ // This is a heavier-weight way to make sure the menu bar and dock go away,
+ // but this affects all screens even though the app is running on full screen
+ // on only one screen, so it's not great. The behavior from the
+ // willUseFullScreenPresentationOptions seems to be enough for now.
+ /*
[[NSApplication sharedApplication]
setPresentationOptions:NSApplicationPresentationHideMenuBar | NSApplicationPresentationHideDock];
+ */
}
- (void)windowDidExitFullScreen:(NSNotification*)notification {
+ /*
[[NSApplication sharedApplication]
setPresentationOptions:NSApplicationPresentationDefault];
+ */
}
@end
diff --git a/src/cmd/devdraw/srv.c b/src/cmd/devdraw/srv.c
index bfeb7c38..570091bc 100644
--- a/src/cmd/devdraw/srv.c
+++ b/src/cmd/devdraw/srv.c
@@ -37,6 +37,8 @@ usage(void)
void
threadmain(int argc, char **argv)
{
+ char *p;
+
ARGBEGIN{
case 'D': /* for good ps -a listings */
break;
@@ -52,6 +54,10 @@ threadmain(int argc, char **argv)
usage();
}ARGEND
+ fmtinstall('H', encodefmt);
+ if((p = getenv("DEVDRAWTRACE")) != nil)
+ trace = atoi(p);
+
if(srvname == nil) {
client0 = mallocz(sizeof(Client), 1);
if(client0 == nil){
@@ -395,11 +401,30 @@ matchmouse(Client *c)
}
void
+gfx_mouseresized(Client *c)
+{
+ gfx_mousetrack(c, -1, -1, -1, -1);
+}
+
+void
gfx_mousetrack(Client *c, int x, int y, int b, uint ms)
{
Mouse *m;
qlock(&c->eventlk);
+ if(x == -1 && y == -1 && b == -1 && ms == -1) {
+ Mouse *copy;
+ // repeat last mouse event for resize
+ if(c->mouse.ri == 0)
+ copy = &c->mouse.m[nelem(c->mouse.m)-1];
+ else
+ copy = &c->mouse.m[c->mouse.ri-1];
+ x = copy->xy.x;
+ y = copy->xy.y;
+ b = copy->buttons;
+ ms = copy->msec;
+ c->mouse.resized = 1;
+ }
if(x < c->mouserect.min.x)
x = c->mouserect.min.x;
if(x > c->mouserect.max.x)
diff --git a/src/cmd/devdraw/x11-inc.h b/src/cmd/devdraw/x11-inc.h
index dca3ebcd..ab4c2505 100644
--- a/src/cmd/devdraw/x11-inc.h
+++ b/src/cmd/devdraw/x11-inc.h
@@ -17,6 +17,7 @@
#include <X11/IntrinsicP.h>
#include <X11/StringDefs.h>
#ifdef SHOWEVENT
+#include <stdio.h>
#include "../rio/showevent/ShowEvent.c"
#endif
diff --git a/src/cmd/devdraw/x11-screen.c b/src/cmd/devdraw/x11-screen.c
index 8026e1e6..62f49f2f 100644
--- a/src/cmd/devdraw/x11-screen.c
+++ b/src/cmd/devdraw/x11-screen.c
@@ -44,7 +44,7 @@ static Xwin*
newxwin(Client *c)
{
Xwin *w;
-
+
w = mallocz(sizeof *w, 1);
if(w == nil)
sysfatal("out of memory");
@@ -59,7 +59,7 @@ static Xwin*
findxwin(XDrawable d)
{
Xwin *w, **l;
-
+
for(l=&_x.windows; (w=*l) != nil; l=&w->next) {
if(w->drawable == d) {
/* move to front */
@@ -550,8 +550,6 @@ xattach(Client *client, char *label, char *winsize)
havemin = 0;
}
w = newxwin(client);
- w->screenrect = Rect(0, 0, WidthOfScreen(xscreen), HeightOfScreen(xscreen));
- w->windowrect = r;
memset(&attr, 0, sizeof attr);
attr.colormap = _x.cmap;
@@ -658,7 +656,7 @@ xattach(Client *client, char *label, char *winsize)
_x.losefocus = XInternAtom(_x.display, "_9WM_LOSE_FOCUS", False);
_x.wmprotos = XInternAtom(_x.display, "WM_PROTOCOLS", False);
}
-
+
atoms[0] = _x.takefocus;
atoms[1] = _x.losefocus;
XChangeProperty(_x.display, w->drawable, _x.wmprotos, XA_ATOM, 32,
@@ -679,6 +677,8 @@ xattach(Client *client, char *label, char *winsize)
}
}else
fprint(2, "XGetWindowAttributes: bad attrs\n");
+ w->screenrect = Rect(0, 0, WidthOfScreen(xscreen), HeightOfScreen(xscreen));
+ w->windowrect = r;
/*
* Allocate our local backing store.
@@ -700,7 +700,7 @@ xattach(Client *client, char *label, char *winsize)
_x.gcsimplesrc = xgc(w->screenpm, FillStippled, -1);
_x.gczero = xgc(w->screenpm, -1, -1);
_x.gcreplsrc = xgc(w->screenpm, FillTiled, -1);
-
+
pmid = XCreatePixmap(_x.display, w->drawable, 1, 1, 1);
_x.gcfill0 = xgc(pmid, FillSolid, 0);
_x.gccopy0 = xgc(pmid, -1, -1);
@@ -729,7 +729,7 @@ rpc_setlabel(Client *client, char *label)
{
Xwin *w = (Xwin*)client->view;
XTextProperty name;
-
+
/*
* Label and other properties required by ICCCCM.
*/
@@ -1032,7 +1032,7 @@ _xreplacescreenimage(Client *client)
XDrawable pixmap;
Rectangle r;
Xwin *w;
-
+
w = (Xwin*)client->view;
r = w->newscreenr;
pixmap = XCreatePixmap(_x.display, w->drawable, Dx(r), Dy(r), _x.depth);
@@ -1042,7 +1042,9 @@ _xreplacescreenimage(Client *client)
w->nextscreenpm = pixmap;
w->screenr = r;
client->mouserect = r;
+ xunlock();
gfx_replacescreenimage(client, m);
+ xlock();
return 1;
}
@@ -1527,7 +1529,7 @@ __xputsnarf(char *data)
{
XButtonEvent e;
Xwin *w;
-
+
if(strlen(data) >= SnarfSize)
return;
qlock(&clip.lk);
@@ -1730,7 +1732,7 @@ rpc_bouncemouse(Client *c, Mouse m)
Xwin *w = (Xwin*)c->view;
XButtonEvent e;
XWindow dw;
-
+
xlock();
e.type = ButtonPress;
e.state = 0;