Hi everyone, I'd like to propose that there be selection owners for docks and panels much like there is for window managers, compositors and decorators right now. The reason for this is because it doesn't make sense to be running multiple docks at the same which which all provide methods of setting _NET_WM_ICON_GEOMETRY. It also means that when switching between some of the new shells such as gnome-shell and unity-shell that the old docks and panels are able to quit appropriately and this is standardized amongst all docks and panels.
Something like this should probably suffice: Display *xdisplay = XOpenDisplay (NULL); const char *name = "mydock" XEvent event; XSetWindowAttributes attr; Window current_dock_sn_owner, new_dock_sn_owner; Atom dock_sn_atom; Atom manager_atom; Atom dock_name_atom; Atom utf8_string_atom; Time dock_sn_timestamp; char buf[128]; manager_atom = XInternAtom (xdisplay, "MANAGER", FALSE); dock_name_atom = XInternAtom (xdisplay, "_DOCK_NAME", 0); utf8_string_atom = XInternAtom (xdisplay, "UTF8_STRING", 0); sprintf (buf, "_DOCK_S%d", screen); dock_sn_atom = XInternAtom (xdisplay, buf, 0); current_dock_sn_owner = XGetSelectionOwner (xdisplay, dock_sn_atom); if (current_dock_sn_owner != None) { if (!replace_current_dock) printf ("Another dock already running, use --replace to get rid of it"); XSelectInput (xdisplay, current_dock_sn_owner, StructureNotifyMask); } attr.override_redirect = TRUE; attr.event_mask = PropertyChangeMask; new_dock_sn_owner = XCreateWindow (xdisplay, XRootWindow (xdisplay, screen), -100, -100, 1, 1, 0, CopyFromParent, CopyFromParent, CopyFromParent, CWOverrideRedirect | CWEventMask, &attr); XChangeProperty (xdisplay, new_dock_sn_owner, dock_name_atom, utf8_string_atom, 8, PropModeReplace, (unsigned char *) name, strlen (name)); XWindowEvent (xdisplay, new_dm_sn_owner, PropertyChangeMask, &event); dock_sn_timestamp = event.xproperty.time; XSetSelectionOwner (xdisplay, dock_sn_atom, new_dock_sn_owner, dock_sn_timestamp); if (XGetSelectionOwner (xdisplay, dock_sn_atom) != new_dock_sn_owner) { XDestroyWindow (xdisplay, new_dock_sn_owner); /* Failed */ return 1; } /* Send client message indicating that we are now the dock */ event.xclient.type = ClientMessage; event.xclient.window = XRootWindow (xdisplay, screen); event.xclient.message_type = manager_atom; event.xclient.format = 32; event.xclient.data.l[0] = dock_sn_timestamp; event.xclient.data.l[1] = dock_sn_atom; event.xclient.data.l[2] = 0; event.xclient.data.l[3] = 0; event.xclient.data.l[4] = 0; XSendEvent (xdisplay, XRootWindow (xdisplay, screen), 0, StructureNotifyMask, &event); /* Wait for old dock to go away */ if (current_dock_sn_owner != None) { do { XWindowEvent (xdisplay, current_dock_sn_owner, StructureNotifyMask, &event); } while (event.type != DestroyNotify); } (inspired by the decoration manager selection code in compiz / libdecoration/decoration.c) So in effect you'd have the following atoms on the root window _DOCK_NAME: utf8 string with the dock name (eg "mydock) _DOCK_S(screen number): Selection for the dock on the screen number specified I don't know exactly what would be the right name for this, considering that we might not want to be replacing entire docks (indeed, just the tasklist portion is the problematic part), so maybe it might be appropriate to have a selection method for entire docks (where 2 docks doesn't make sense, eg docks / panels / anything with unity / gnome-shell) and one for tasklists (where two docks can logically co-exist) Cheers -- Sam Spilsbury _______________________________________________ wm-spec-list mailing list wm-spec-list@gnome.org http://mail.gnome.org/mailman/listinfo/wm-spec-list