st_embedder_x.c (1062B)
1 static Window embed; 2 3 void 4 createnotify(XEvent *e) 5 { 6 XWindowChanges wc; 7 8 if (embed || e->xcreatewindow.override_redirect) 9 return; 10 11 embed = e->xcreatewindow.window; 12 13 XReparentWindow(xw.dpy, embed, xw.win, 0, 0); 14 XSelectInput(xw.dpy, embed, PropertyChangeMask | StructureNotifyMask | EnterWindowMask); 15 16 XMapWindow(xw.dpy, embed); 17 sendxembed(XEMBED_EMBEDDED_NOTIFY, 0, xw.win, 0); 18 19 wc.width = win.w; 20 wc.height = win.h; 21 XConfigureWindow(xw.dpy, embed, CWWidth | CWHeight, &wc); 22 23 XSetInputFocus(xw.dpy, embed, RevertToParent, CurrentTime); 24 } 25 26 void 27 destroynotify(XEvent *e) 28 { 29 visibility(e); 30 if (embed == e->xdestroywindow.window) { 31 focus(e); 32 } 33 } 34 35 void 36 sendxembed(long msg, long detail, long d1, long d2) 37 { 38 XEvent e = { 0 }; 39 40 e.xclient.window = embed; 41 e.xclient.type = ClientMessage; 42 e.xclient.message_type = xw.xembed; 43 e.xclient.format = 32; 44 e.xclient.data.l[0] = CurrentTime; 45 e.xclient.data.l[1] = msg; 46 e.xclient.data.l[2] = detail; 47 e.xclient.data.l[3] = d1; 48 e.xclient.data.l[4] = d2; 49 XSendEvent(xw.dpy, embed, False, NoEventMask, &e); 50 }