Interacting with the /pps/services/launcher/control object

Your window manager interacts with the /pps/services/launcher/control object to start and stop applications.

To manage the interactions with this control object, you'll need to:

Create a thread to handle object interactions

You can create a thread from your window manager to manage all your interactions with the PPS object.

window_manager_t window_manager;
memset(&window_manager, 0, sizeof(window_manager_t));
window_manager_t *winmgr = &window_manager;
...
int  pps_tid;                               /* PPS thread ID */
void *pps_thread(void *arg);
rc = (pthread_create(NULL, NULL, pps_thread, (void*)win_mgr) < 0)
pthread_setname_np(screen_tid = pthread_self(), "pps");

Open the object for publishing and subscribing

Simply call open() with O_RDWR from your PPS thread to publish and subscribe to the /pps/services/launcher/control object.

Make sure to open the object in delta mode and wait mode.

With delta mode, a subscriber will receive only the changes to this object's attributes. The wait mode option opens the object so that any read() calls to the object will block until the object changes or a delta appears.

int     pps_fd;
...
pps_fd = open ("/pps/services/launcher/control?wait,delta", O_RDWR);

Handle messages

In your window manager's PPS thread, parse the PPS message received and then handle each message type accordingly. Refer to "PPS API reference" in the Persistent Publish/Subscribe Developer's Guide for PPS API constants and functions.

Here's an example of how you could implement handling PPS messages:

char buf[1024];
int nread = -1;
while(1){
...
while (nread == -1){
...
    nread = read(fd, buf, sizeof(buf)-1);
    if (nread > 1){
        buf[nread] = '\0';
        /* Declare variables to store PPS API attribute and status*/
        pps_attrib_t    info;
        pps_status_t    rc;
        /* Call PPS API function ppsparse() to parse
         * the message received
         */
        while((rc = ppsparse(&buf, NULL, NULL, &info, 0)) != PPS_END) {
            /* Handle each PPS message type accordingly */
            switch(rc) {
            case PPS_OBJECT_CREATED:
                win_mgr->objname = info.obj_name;
                win_mgr->ptype = PPS_EVENT_OBJECT_CREATED;
            break;
            
            case PPS_OBJECT_TRUNCATED:
            case PPS_OBJECT_DELETED:
            nav->objname = info.obj_name;
            nav->ptype = PPS_EVENT_OBJECT_DELETED;
            break;

            case PPS_OBJECT:
            if(info.obj_name[0] != '@') {
                exit;
            }
            win_mgr->objname = info.obj_name;
            win_mgr->ptype = PPS_EVENT_OBJECT_CHANGED;
            break;

            case PPS_ATTRIBUTE_DELETED: {
            --info.attr_name;
            /* Handle when there is an attributed deleted */
            int err = pps_parse_attr(nav, &info);
            if(err != EOK)
                return;
            }

            case PPS_ATTRIBUTE: {
            /* Handle when there is an attributed updated */
            int err = pps_parse_attr(nav, &info);
            if(err != EOK)
                return;
            break;
            }

            case PPS_ERROR:
            default:
                SLOG_WARNING("We got a parsing error.");
                return;
            }
        }
        /* Update any necessary information such as appending
         * or deleting from your application list based on the
         * PPS message received and parsed. In this case, we
         * are calling a helper function, launcher_pps() to
         * perform any updates to the window manager.
         * 
         */
        launcher_pps(win_mgr);
     }
}
}