/* * ask the user to press in the root with each button in succession */ static int verify_okay_to_kill(Display *dpy, int screenno) { unsigned char pointer_map[256]; int count = XGetPointerMapping (dpy, pointer_map, 256); int i; int button; static char *msg = "the root window"; Window root = RootWindow (dpy, screenno); int okay = 0; for (i = 0; i < count; i++) { button = (int) pointer_map[i]; if (button == 0) continue; /* disabled */ if (get_window_id (dpy, screenno, button, msg) != root) { okay = 0; break; } okay++; /* must have at least one button */ } if (okay) { return 1; } else { printf ("Aborting.\n"); return 0; } }
/* On realization, we read the desired geometry from the config, and set the window accordingly. */ static void realize (GtkWidget *wb) { PsppireConf *conf = psppire_conf_new (); psppire_conf_set_window_geometry (conf, get_window_id (wb), GTK_WINDOW (wb)); if (GTK_WIDGET_CLASS (psppire_window_base_parent_class)->realize) return GTK_WIDGET_CLASS (psppire_window_base_parent_class)->realize (wb) ; }
/* When the window is resized/repositioned, write the new geometry to the config. */ static gboolean configure_event (GtkWidget *wb, GdkEventConfigure *event) { if (gtk_widget_get_mapped (wb)) { PsppireConf *conf = psppire_conf_new (); psppire_conf_save_window_geometry (conf, get_window_id (wb), GTK_WINDOW (wb)); } if (GTK_WIDGET_CLASS (psppire_window_base_parent_class)->configure_event) return GTK_WIDGET_CLASS (psppire_window_base_parent_class)->configure_event (wb, event) ; return FALSE; }
void handle_events(void) { int i, wn; xcb_window_t *wc, wid = 0; xcb_generic_event_t *e; xcb_create_notify_event_t *ec; /* * We need to get notifed of window creations, no matter what, because * we need to register the event mask on all newly created windows */ register_events(scr->root, XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY); if (mask & XCB_EVENT_MASK_BUTTON_PRESS) { xcb_grab_button(conn, 0, scr->root, XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, scr->root, XCB_NONE, 1, XCB_NONE); } /* register the events on all mapped windows */ wn = get_windows(conn, scr->root, &wc); for (i=0; i<wn; i++) register_events(wc[i], mask); xcb_flush(conn); for(;;) { e = xcb_wait_for_event(conn); switch (e->response_type & ~0x80) { case XCB_CREATE_NOTIFY: ec = (xcb_create_notify_event_t*)e; register_events(ec->window, mask); default: wid = get_window_id(e); } if (wid > 0) { printf("%d:0x%08x\n", e->response_type, wid); fflush(stdout); } } }
int main(int argc, char *argv[]) { int i; /* iterator, temp variable */ char *displayname = NULL; /* name of server to contact */ int screenno; /* screen number of dpy */ XID id = None; /* resource to kill */ char *button_name = NULL; /* name of button for window select */ int button; /* button number or negative for all */ Bool kill_all = False; Bool top = False; ProgramName = argv[0]; button = SelectButtonFirst; for (i = 1; i < argc; i++) { char *arg = argv[i]; if (arg[0] == '-') { switch (arg[1]) { case 'd': /* -display displayname */ if (++i >= argc) usage (); displayname = argv[i]; continue; case 'i': /* -id resourceid */ if (++i >= argc) usage (); id = parse_id (argv[i]); continue; case 'b': /* -button number */ if (++i >= argc) usage (); button_name = argv[i]; continue; case 'f': /* -frame */ top = True; continue; case 'a': /* -all */ kill_all = True; continue; default: usage (); } } else { usage (); } } /* end for */ dpy = XOpenDisplay (displayname); if (!dpy) { fprintf (stderr, "%s: unable to open display \"%s\"\n", ProgramName, XDisplayName (displayname)); Exit (1); } screenno = DefaultScreen (dpy); if (kill_all) { if (verify_okay_to_kill (dpy, screenno)) kill_all_windows (dpy, screenno, top); Exit (0); } /* * if no id was given, we need to choose a window */ if (id == None) { if (!button_name) button_name = XGetDefault (dpy, ProgramName, "Button"); if (button_name && !parse_button (button_name, &button)) { fprintf (stderr, "%s: invalid button specification \"%s\"\n", ProgramName, button_name); Exit (1); } if (button >= 0 || button == SelectButtonFirst) { unsigned char pointer_map[256]; /* 8 bits of pointer num */ int count, j; unsigned int ub = (unsigned int) button; count = XGetPointerMapping (dpy, pointer_map, 256); if (count <= 0) { fprintf (stderr, "%s: no pointer mapping, can't select window\n", ProgramName); Exit (1); } if (button >= 0) { /* check button */ for (j = 0; j < count; j++) { if (ub == (unsigned int) pointer_map[j]) break; } if (j == count) { fprintf (stderr, "%s: no button number %u in pointer map, can't select window\n", ProgramName, ub); Exit (1); } } else { /* get first entry */ button = (int) ((unsigned int) pointer_map[0]); } } if ((id = get_window_id (dpy, screenno, button, "the window whose client you wish to kill"))) { if (id == RootWindow(dpy,screenno)) id = None; else if (!top) { XID indicated = id; if ((id = XmuClientWindow(dpy, indicated)) == indicated) { /* Try not to kill the window manager when the user * indicates an icon to xkill. */ if (! wm_state_set(dpy, id) && wm_running(dpy, screenno)) id = None; } } } } if (id != None) { printf ("%s: killing creator of resource 0x%lx\n", ProgramName, id); XSync (dpy, 0); /* give xterm a chance */ XKillClient (dpy, id); XSync (dpy, 0); } Exit (0); /*NOTREACHED*/ return 0; }