static void cmdmenu(Win *w, Mousectl *mc) { enum { CUT, PASTE, SNARF, }; static char *ms[] = { [CUT] "cut", [PASTE] "paste", [SNARF] "snarf", nil, }; static Menu m = {ms}; switch(menuhit(2, mc, &m, nil)){ case CUT: if(tosnarf(w, w->toprune + w->fr.p0, w->toprune + w->fr.p1) >= 0) cmddel(w, w->toprune + w->fr.p0, w->toprune + w->fr.p1); break; case SNARF: tosnarf(w, w->toprune + w->fr.p0, w->toprune + w->fr.p1); break; case PASTE: if(w->fr.p0 < w->fr.p1) cmddel(w, w->toprune + w->fr.p0, w->toprune + w->fr.p1); fromsnarf(w, w->toprune + w->fr.p0); break; } }
static int rmb(void) { static Menu menu = {nil, menugen}; int n; Win *w; File *f; if(actw != nil && actw->tab->rmb != nil && actw->tab->rmb(actw, mc) >= 0) return 0; n = menuhit(3, mc, &menu, nil); if(n < 0) return 0; switch(n){ case ZEROX: w = winsel(mc, 3); if(w != nil) winzerox(w, mc); return 0; case CLOSE: w = winsel(mc, 3); if(w != nil) winclose(w); return 0; case RESIZE: winresize(winsel(mc, 3), mc); return 0; case WRITE: w = winsel(mc, 3); if(w != nil) winwrite(w, nil); return 0; case QUIT: return quit(); } if(n < WIN) sysfatal("rmb: no action for n=%d", n); if(n == 0){ setfocus(cmdw); return 0; } n -= WIN; for(f = flist.next; f != &flist; f = f->next) if(--n == 0){ if(f->wins.wnext == &f->wins){ newwinsel(f->type, mc, f); return 0; } for(w = f->wins.wnext; w != &f->wins && w != actw; w = w->wnext) ; if(w->wnext == &f->wins) w = w->wnext; setfocus(w->wnext); return 0; } return 0; }
void mousethread(void *v) { Point p; Mouse m; int i, n, prev; char buf[100]; ulong rgb; prev = -1; while(readmouse(mousectl) >= 0){ m = mousectl->m; switch(m.buttons){ case 1: while(m.buttons){ if(screen->depth > 8) n = 256; else n = 1<<screen->depth; for(i=0; i!=n; i++) if(i!=prev && ptinrect(m.xy, crect[i])){ if(ramp) rgb = grey(i); else rgb = cmap2rgb(i); sprint(buf, fmt, i, (rgb>>16)&0xFF, (rgb>>8)&0xFF, rgb&0xFF, (rgb<<8) | 0xFF); p = addpt(screen->r.min, Pt(2,2)); draw(screen, Rpt(p, addpt(p, stringsize(font, buf))), display->white, nil, p); string(screen, p, display->black, ZP, font, buf); prev=i; break; } readmouse(mousectl); m = mousectl->m; } break; case 4: switch(menuhit(3, mousectl, &menu, nil)){ case 0: threadexitsall(0); } } } }
void menu2hit(void) { Text *t=(Text *)which->user1; int w = which-t->l; int m; m = menuhit(2, &mouse, t==&cmd? &menu2c : &menu2); if(lock || t->lock) return; switch(m){ case Cut: cut(t, w, true, true); break; case Paste: paste(t, w); break; case Snarf: snarf(t, w); break; case Exch: snarf(t, w); outT0(Tstartsnarf); setlock(); break; case Look: outTsll(Tlook, t->tag, which->p0, which->p1); setlock(); break; case Search: outcmd(); if(t==&cmd) outTsll(Tsend, 0 /*ignored*/, which->p0, which->p1); else outT0(Tsearch); setlock(); break; } }
void menu3hit(void) { Rectangle r; Flayer *l; int m, i; Text *t; mw = -1; switch(m = menuhit(3, &mouse, &menu3)){ case -1: break; case New: if(!lock) sweeptext(1, 0); break; case Xerox: case Reshape: if(!lock){ cursorswitch(&bullseye); buttons(Down); if((mouse.buttons&4) && (l = flwhich(mouse.xy)) && getr(&r)) duplicate(l, r, l->f.font, m==Reshape); else cursorswitch(cursor); buttons(Up); } break; case Close: if(!lock){ cursorswitch(&bullseye); buttons(Down); if((mouse.buttons&4) && (l = flwhich(mouse.xy)) && !lock){ t=(Text *)l->user1; if (t->nwin>1) closeup(l); else if(t!=&cmd) { outTs(Tclose, t->tag); setlock(); } } cursorswitch(cursor); buttons(Up); } break; case Write: if(!lock){ cursorswitch(&bullseye); buttons(Down); if((mouse.buttons&4) && (l = flwhich(mouse.xy))){ outTs(Twrite, ((Text *)l->user1)->tag); setlock(); }else cursorswitch(cursor); buttons(Up); } break; default: if(t = text[m-NMENU3]){ i = t->front; if(t->nwin==0 || t->l[i].textfn==0) return; /* not ready yet; try again later */ if(t->nwin>1 && which==&t->l[i]) do if(++i==NL) i = 0; while(i!=t->front && t->l[i].textfn==0); current(&t->l[i]); }else if(!lock) sweeptext(0, tag[m-NMENU3]); break; } }
void button(XButtonEvent * e) { int n, shift; Client *c; Window dw; ScreenInfo *s; curtime = e->time; s = getscreen(e->root); if (s == 0) return; c = getclient(e->window, 0); if (c) { e->x += c->x - BORDER + 1; e->y += c->y - BORDER + 1; } else if (e->window != e->root) XTranslateCoordinates(dpy, e->window, s->root, e->x, e->y, &e->x, &e->y, &dw); switch (e->button) { case Button1: if (c) { XMapRaised(dpy, c->parent); top(c); active(c); } return; case Button2: if ((e->state & (ShiftMask | ControlMask)) == (ShiftMask | ControlMask)) { menuhit(e, &egg); } else { spawn(s, "9wm-mm"); } return; default: return; case Button3: break; } if (current && current->screen == s) cmapnofocus(s); switch (n = menuhit(e, &b3menu)) { case 0: /* New */ spawn(s, termprog); break; case 1: /* Reshape */ reshape(selectwin(1, 0, s)); break; case 2: /* Move */ move(selectwin(0, 0, s)); break; case 3: /* Delete */ shift = 0; c = selectwin(1, &shift, s); delete(c, shift); break; case 4: /* Hide */ hide(selectwin(1, 0, s)); break; default: /* unhide window */ unhide(n - B3FIXED, 1); break; case -1: /* nothing */ break; } if (current && current->screen == s) cmapfocus(current); }
void button(XButtonEvent *e) { int n, shift; Client *c; Window dw; ScreenInfo *s; curtime = e->time; s = getscreen(e->root); if(s == 0) return; c = getclient(e->window, 0); if(c) { if(debug) fprintf(stderr, "but: e x=%d y=%d c x=%d y=%d dx=%d dy=%d BORDR %d\n", e->x, e->y, c->x, c->y, c->dx, c->dy, BORDER); if(borderorient(c, e->x, e->y) != BorderUnknown) { switch (e->button) { case Button1: case Button2: reshape(c, e->button, pull, e); return; case Button3: move(c, Button3); return; default: return; } } e->x += c->x - BORDER; e->y += c->y - BORDER; } else if(e->window != e->root) { if(debug) fprintf(stderr, "but no client: e x=%d y=%d\n", e->x, e->y); XTranslateCoordinates(dpy, e->window, s->root, e->x, e->y, &e->x, &e->y, &dw); } switch (e->button) { case Button1: if(c) { XMapRaised(dpy, c->parent); top(c); active(c); } return; case Button2: if(c) { XMapRaised(dpy, c->parent); active(c); XAllowEvents (dpy, ReplayPointer, curtime); } else if((e->state&(ShiftMask|ControlMask))==(ShiftMask|ControlMask)) { menuhit(e, &egg); } else if(numvirtuals > 1 && (n = menuhit(e, &b2menu)) > -1) button2(n); return; case Button3: break; case Button4: /* scroll up changes to previous virtual screen */ if(!c && e->type == ButtonPress) if(numvirtuals > 1 && virt > 0) switch_to(virt - 1); return; case Button5: /* scroll down changes to next virtual screen */ if(!c && e->type == ButtonPress) if(numvirtuals > 1 && virt < numvirtuals - 1) switch_to(virt + 1); return; default: return; } if(current && current->screen == s) cmapnofocus(s); switch (n = menuhit(e, &b3menu)) { case New: spawn(s, termFn); break; case Acme: spawn(s, editorFn); break; case Launcher: spawn(s, launcherFn); break; case Reshape: reshape(selectwin(1, 0, s), Button3, sweep, 0); break; case Move: move(selectwin(0, 0, s), Button3); break; case Delete: shift = 0; c = selectwin(1, &shift, s); delete(c, shift); break; case Hide: hide(selectwin(1, 0, s)); break; default: /* unhide window */ unhide(n - B3FIXED, 1); break; case -1: /* nothing */ break; } if(current && current->screen == s) cmapfocus(current); }