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

Reply via email to