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 PPS object, you need to:
  1. Create a thread to handle object interactions.
  2. Open the object for publishing and subscribing.
  3. Handle messages.

Create a thread to handle object interactions

You can create a thread in your window manager to manage 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);
if (rc = pthread_create(NULL, NULL, pps_thread, (void*)win_mgr) < 0)
{ /* error-handling code goes here */ }
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 receives only the changes to the object attributes. The wait mode means that any read() calls to the object 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);
     }
}
}