Artifact 0ec2281a60582b12961b35a7c384cc39d4baa3ccf8b8f740daaf9e8226344859:

  • File muswm.c — part of check-in [d20f3304c3] at 2018-06-15 14:22:26 on branch trunk — Added licensing back; testing markdown readme (user: jmcclure size: 2178)

0000: 2f 2a 20 4d 55 53 57 4d 2e 43 0a 20 2a 20 43 6f  /* MUSWM.C. * Co
0010: 70 79 72 69 67 68 74 20 28 63 29 20 32 30 31 35  pyright (c) 2015
0020: 2c 20 32 30 31 38 20 4a 65 73 73 65 20 4d 63 43  , 2018 Jesse McC
0030: 6c 75 72 65 20 3c 63 6f 64 65 40 6a 65 73 73 65  lure <code@jesse
0040: 6d 63 63 6c 75 72 65 2e 6f 72 67 3e 0a 20 2a 0a  mcclure.org>. *.
0050: 20 2a 20 50 65 72 6d 69 73 73 69 6f 6e 20 74 6f   * Permission to
0060: 20 75 73 65 2c 20 63 6f 70 79 2c 20 6d 6f 64 69   use, copy, modi
0070: 66 79 2c 20 61 6e 64 20 64 69 73 74 72 69 62 75  fy, and distribu
0080: 74 65 20 74 68 69 73 20 73 6f 66 74 77 61 72 65  te this software
0090: 20 66 6f 72 20 61 6e 79 0a 20 2a 20 70 75 72 70   for any. * purp
00a0: 6f 73 65 20 77 69 74 68 20 6f 72 20 77 69 74 68  ose with or with
00b0: 6f 75 74 20 66 65 65 20 69 73 20 68 65 72 65 62  out fee is hereb
00c0: 79 20 67 72 61 6e 74 65 64 2c 20 70 72 6f 76 69  y granted, provi
00d0: 64 65 64 20 74 68 61 74 20 74 68 65 20 61 62 6f  ded that the abo
00e0: 76 65 0a 20 2a 20 63 6f 70 79 72 69 67 68 74 20  ve. * copyright 
00f0: 6e 6f 74 69 63 65 20 61 6e 64 20 74 68 69 73 20  notice and this 
0100: 70 65 72 6d 69 73 73 69 6f 6e 20 6e 6f 74 69 63  permission notic
0110: 65 20 61 70 70 65 61 72 20 69 6e 20 61 6c 6c 20  e appear in all 
0120: 63 6f 70 69 65 73 2e 0a 20 2a 0a 20 2a 20 54 48  copies.. *. * TH
0130: 45 20 53 4f 46 54 57 41 52 45 20 49 53 20 50 52  E SOFTWARE IS PR
0140: 4f 56 49 44 45 44 20 22 41 53 20 49 53 22 20 41  OVIDED "AS IS" A
0150: 4e 44 20 54 48 45 20 41 55 54 48 4f 52 20 44 49  ND THE AUTHOR DI
0160: 53 43 4c 41 49 4d 53 20 41 4c 4c 20 57 41 52 52  SCLAIMS ALL WARR
0170: 41 4e 54 49 45 53 0a 20 2a 20 57 49 54 48 20 52  ANTIES. * WITH R
0180: 45 47 41 52 44 20 54 4f 20 54 48 49 53 20 53 4f  EGARD TO THIS SO
0190: 46 54 57 41 52 45 20 49 4e 43 4c 55 44 49 4e 47  FTWARE INCLUDING
01a0: 20 41 4c 4c 20 49 4d 50 4c 49 45 44 20 57 41 52   ALL IMPLIED WAR
01b0: 52 41 4e 54 49 45 53 20 4f 46 0a 20 2a 20 4d 45  RANTIES OF. * ME
01c0: 52 43 48 41 4e 54 41 42 49 4c 49 54 59 20 41 4e  RCHANTABILITY AN
01d0: 44 20 46 49 54 4e 45 53 53 2e 20 49 4e 20 4e 4f  D FITNESS. IN NO
01e0: 20 45 56 45 4e 54 20 53 48 41 4c 4c 20 54 48 45   EVENT SHALL THE
01f0: 20 41 55 54 48 4f 52 20 42 45 20 4c 49 41 42 4c   AUTHOR BE LIABL
0200: 45 20 46 4f 52 0a 20 2a 20 41 4e 59 20 53 50 45  E FOR. * ANY SPE
0210: 43 49 41 4c 2c 20 44 49 52 45 43 54 2c 20 49 4e  CIAL, DIRECT, IN
0220: 44 49 52 45 43 54 2c 20 4f 52 20 43 4f 4e 53 45  DIRECT, OR CONSE
0230: 51 55 45 4e 54 49 41 4c 20 44 41 4d 41 47 45 53  QUENTIAL DAMAGES
0240: 20 4f 52 20 41 4e 59 20 44 41 4d 41 47 45 53 0a   OR ANY DAMAGES.
0250: 20 2a 20 57 48 41 54 53 4f 45 56 45 52 20 52 45   * WHATSOEVER RE
0260: 53 55 4c 54 49 4e 47 20 46 52 4f 4d 20 4c 4f 53  SULTING FROM LOS
0270: 53 20 4f 46 20 55 53 45 2c 20 44 41 54 41 20 4f  S OF USE, DATA O
0280: 52 20 50 52 4f 46 49 54 53 2c 20 57 48 45 54 48  R PROFITS, WHETH
0290: 45 52 20 49 4e 20 41 4e 0a 20 2a 20 41 43 54 49  ER IN AN. * ACTI
02a0: 4f 4e 20 4f 46 20 43 4f 4e 54 52 41 43 54 2c 20  ON OF CONTRACT, 
02b0: 4e 45 47 4c 49 47 45 4e 43 45 20 4f 52 20 4f 54  NEGLIGENCE OR OT
02c0: 48 45 52 20 54 4f 52 54 49 4f 55 53 20 41 43 54  HER TORTIOUS ACT
02d0: 49 4f 4e 2c 20 41 52 49 53 49 4e 47 20 4f 55 54  ION, ARISING OUT
02e0: 20 4f 46 0a 20 2a 20 4f 52 20 49 4e 20 43 4f 4e   OF. * OR IN CON
02f0: 4e 45 43 54 49 4f 4e 20 57 49 54 48 20 54 48 45  NECTION WITH THE
0300: 20 55 53 45 20 4f 52 20 50 45 52 46 4f 52 4d 41   USE OR PERFORMA
0310: 4e 43 45 20 4f 46 20 54 48 49 53 20 53 4f 46 54  NCE OF THIS SOFT
0320: 57 41 52 45 2e 0a 20 2a 2f 0a 0a 23 69 6e 63 6c  WARE.. */..#incl
0330: 75 64 65 20 3c 58 31 31 2f 58 6c 69 62 2e 68 3e  ude <X11/Xlib.h>
0340: 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61  ..int main(int a
0350: 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rgc, const char 
0360: 2a 2a 61 72 67 76 29 20 7b 0a 09 44 69 73 70 6c  **argv) {..Displ
0370: 61 79 20 2a 64 70 79 3b 0a 09 69 66 28 21 28 64  ay *dpy;..if(!(d
0380: 70 79 20 3d 20 58 4f 70 65 6e 44 69 73 70 6c 61  py = XOpenDispla
0390: 79 28 30 78 30 29 29 29 20 72 65 74 75 72 6e 20  y(0x0))) return 
03a0: 31 3b 0a 09 57 69 6e 64 6f 77 20 72 6f 6f 74 20  1;..Window root 
03b0: 3d 20 44 65 66 61 75 6c 74 52 6f 6f 74 57 69 6e  = DefaultRootWin
03c0: 64 6f 77 28 64 70 79 29 3b 0a 09 58 47 72 61 62  dow(dpy);..XGrab
03d0: 42 75 74 74 6f 6e 28 64 70 79 2c 20 41 6e 79 42  Button(dpy, AnyB
03e0: 75 74 74 6f 6e 2c 20 4d 6f 64 34 4d 61 73 6b 2c  utton, Mod4Mask,
03f0: 20 72 6f 6f 74 2c 20 54 72 75 65 2c 20 42 75 74   root, True, But
0400: 74 6f 6e 50 72 65 73 73 4d 61 73 6b 2c 20 47 72  tonPressMask, Gr
0410: 61 62 4d 6f 64 65 41 73 79 6e 63 2c 20 47 72 61  abModeAsync, Gra
0420: 62 4d 6f 64 65 41 73 79 6e 63 2c 20 4e 6f 6e 65  bModeAsync, None
0430: 2c 20 4e 6f 6e 65 29 3b 0a 09 58 45 76 65 6e 74  , None);..XEvent
0440: 20 65 76 3b 0a 09 57 69 6e 64 6f 77 20 77 69 6e   ev;..Window win
0450: 3b 0a 09 69 6e 74 20 62 75 74 74 6f 6e 2c 20 65  ;..int button, e
0460: 78 2c 20 65 79 2c 20 73 77 2c 20 73 68 3b 0a 09  x, ey, sw, sh;..
0470: 73 77 20 3d 20 44 69 73 70 6c 61 79 57 69 64 74  sw = DisplayWidt
0480: 68 28 64 70 79 2c 20 44 65 66 61 75 6c 74 53 63  h(dpy, DefaultSc
0490: 72 65 65 6e 28 64 70 79 29 29 3b 0a 09 73 68 20  reen(dpy));..sh 
04a0: 3d 20 44 69 73 70 6c 61 79 48 65 69 67 68 74 28  = DisplayHeight(
04b0: 64 70 79 2c 20 44 65 66 61 75 6c 74 53 63 72 65  dpy, DefaultScre
04c0: 65 6e 28 64 70 79 29 29 3b 0a 09 58 57 69 6e 64  en(dpy));..XWind
04d0: 6f 77 41 74 74 72 69 62 75 74 65 73 20 77 61 3b  owAttributes wa;
04e0: 0a 09 77 68 69 6c 65 20 28 21 58 4e 65 78 74 45  ..while (!XNextE
04f0: 76 65 6e 74 28 64 70 79 2c 26 65 76 29 29 20 7b  vent(dpy,&ev)) {
0500: 0a 09 09 77 69 6e 20 3d 20 65 76 2e 78 62 75 74  ...win = ev.xbut
0510: 74 6f 6e 2e 73 75 62 77 69 6e 64 6f 77 3b 0a 09  ton.subwindow;..
0520: 09 69 66 20 28 65 76 2e 78 62 75 74 74 6f 6e 2e  .if (ev.xbutton.
0530: 62 75 74 74 6f 6e 29 20 62 75 74 74 6f 6e 20 3d  button) button =
0540: 20 65 76 2e 78 62 75 74 74 6f 6e 2e 62 75 74 74   ev.xbutton.butt
0550: 6f 6e 3b 0a 09 09 65 78 20 3d 20 65 76 2e 78 62  on;...ex = ev.xb
0560: 75 74 74 6f 6e 2e 78 5f 72 6f 6f 74 3b 0a 09 09  utton.x_root;...
0570: 65 79 20 3d 20 65 76 2e 78 62 75 74 74 6f 6e 2e  ey = ev.xbutton.
0580: 79 5f 72 6f 6f 74 3b 0a 09 09 69 66 20 28 62 75  y_root;...if (bu
0590: 74 74 6f 6e 20 3d 3d 20 32 29 0a 09 09 09 58 4d  tton == 2)....XM
05a0: 6f 76 65 52 65 73 69 7a 65 57 69 6e 64 6f 77 28  oveResizeWindow(
05b0: 64 70 79 2c 20 77 69 6e 2c 20 30 2c 20 30 2c 20  dpy, win, 0, 0, 
05c0: 73 77 2c 20 73 68 29 3b 0a 09 09 65 6c 73 65 20  sw, sh);...else 
05d0: 69 66 20 28 62 75 74 74 6f 6e 20 3c 20 34 29 20  if (button < 4) 
05e0: 73 77 69 74 63 68 20 28 65 76 2e 74 79 70 65 29  switch (ev.type)
05f0: 20 7b 0a 09 09 63 61 73 65 20 42 75 74 74 6f 6e   {...case Button
0600: 50 72 65 73 73 3a 0a 09 09 09 58 47 72 61 62 50  Press:....XGrabP
0610: 6f 69 6e 74 65 72 28 64 70 79 2c 20 65 76 2e 78  ointer(dpy, ev.x
0620: 62 75 74 74 6f 6e 2e 73 75 62 77 69 6e 64 6f 77  button.subwindow
0630: 2c 20 54 72 75 65 2c 20 50 6f 69 6e 74 65 72 4d  , True, PointerM
0640: 6f 74 69 6f 6e 4d 61 73 6b 7c 42 75 74 74 6f 6e  otionMask|Button
0650: 52 65 6c 65 61 73 65 4d 61 73 6b 2c 0a 09 09 09  ReleaseMask,....
0660: 09 47 72 61 62 4d 6f 64 65 41 73 79 6e 63 2c 20  .GrabModeAsync, 
0670: 47 72 61 62 4d 6f 64 65 41 73 79 6e 63 2c 20 4e  GrabModeAsync, N
0680: 6f 6e 65 2c 20 4e 6f 6e 65 2c 20 43 75 72 72 65  one, None, Curre
0690: 6e 74 54 69 6d 65 29 3b 0a 09 09 09 58 47 65 74  ntTime);....XGet
06a0: 57 69 6e 64 6f 77 41 74 74 72 69 62 75 74 65 73  WindowAttributes
06b0: 28 64 70 79 2c 20 65 76 2e 78 62 75 74 74 6f 6e  (dpy, ev.xbutton
06c0: 2e 73 75 62 77 69 6e 64 6f 77 2c 20 26 77 61 29  .subwindow, &wa)
06d0: 3b 0a 09 09 09 77 61 2e 78 20 2d 3d 20 65 78 3b  ;....wa.x -= ex;
06e0: 20 77 61 2e 77 69 64 74 68 20 2d 3d 20 65 78 3b   wa.width -= ex;
06f0: 0a 09 09 09 77 61 2e 79 20 2d 3d 20 65 79 3b 20  ....wa.y -= ey; 
0700: 77 61 2e 68 65 69 67 68 74 20 2d 3d 20 65 79 3b  wa.height -= ey;
0710: 0a 09 09 09 62 75 74 74 6f 6e 20 3d 20 65 76 2e  ....button = ev.
0720: 78 62 75 74 74 6f 6e 2e 62 75 74 74 6f 6e 3b 0a  xbutton.button;.
0730: 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
0740: 20 42 75 74 74 6f 6e 52 65 6c 65 61 73 65 3a 0a   ButtonRelease:.
0750: 09 09 09 58 55 6e 67 72 61 62 50 6f 69 6e 74 65  ...XUngrabPointe
0760: 72 28 64 70 79 2c 20 43 75 72 72 65 6e 74 54 69  r(dpy, CurrentTi
0770: 6d 65 29 3b 0a 09 09 63 61 73 65 20 4d 6f 74 69  me);...case Moti
0780: 6f 6e 4e 6f 74 69 66 79 3a 0a 09 09 09 77 68 69  onNotify:....whi
0790: 6c 65 20 28 58 43 68 65 63 6b 54 79 70 65 64 45  le (XCheckTypedE
07a0: 76 65 6e 74 28 64 70 79 2c 20 4d 6f 74 69 6f 6e  vent(dpy, Motion
07b0: 4e 6f 74 69 66 79 2c 20 26 65 76 29 29 3b 0a 09  Notify, &ev));..
07c0: 09 09 69 66 20 28 62 75 74 74 6f 6e 20 3d 3d 20  ..if (button == 
07d0: 31 29 20 58 4d 6f 76 65 57 69 6e 64 6f 77 28 64  1) XMoveWindow(d
07e0: 70 79 2c 20 65 76 2e 78 6d 6f 74 69 6f 6e 2e 77  py, ev.xmotion.w
07f0: 69 6e 64 6f 77 2c 20 77 61 2e 78 20 2b 20 65 78  indow, wa.x + ex
0800: 2c 20 77 61 2e 79 20 2b 20 65 79 29 3b 0a 09 09  , wa.y + ey);...
0810: 09 65 6c 73 65 20 69 66 20 28 62 75 74 74 6f 6e  .else if (button
0820: 20 3d 3d 20 33 29 20 58 52 65 73 69 7a 65 57 69   == 3) XResizeWi
0830: 6e 64 6f 77 28 64 70 79 2c 20 65 76 2e 78 6d 6f  ndow(dpy, ev.xmo
0840: 74 69 6f 6e 2e 77 69 6e 64 6f 77 2c 20 77 61 2e  tion.window, wa.
0850: 77 69 64 74 68 20 2b 20 65 78 2c 20 77 61 2e 68  width + ex, wa.h
0860: 65 69 67 68 74 20 2b 20 65 79 29 3b 0a 09 09 7d  eight + ey);...}
0870: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 30 3b 0a 7d  ..}..return 0;.}
0880: 0a 0a                                            ..