/* Main, is well, main. It brings everything up and throws us into the mainloop of no return. */ int main (int argc, char ** argv) { g_type_init(); /* Setting up i18n and gettext. Apparently, we need all of these. */ setlocale (LC_ALL, ""); bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); textdomain (GETTEXT_PACKAGE); IndicatorService * service = indicator_service_new_version(INDICATOR_SESSION_DBUS_NAME, INDICATOR_SESSION_DBUS_VERSION); g_signal_connect(G_OBJECT(service), INDICATOR_SERVICE_SIGNAL_SHUTDOWN, G_CALLBACK(service_shutdown), NULL); session_dbus = session_dbus_new(); g_idle_add(lock_screen_setup, NULL); root_menuitem = dbusmenu_menuitem_new(); g_debug("Root ID: %d", dbusmenu_menuitem_get_id(root_menuitem)); dbus_interface = g_object_new (USERS_SERVICE_DBUS_TYPE, NULL); rebuild_items (root_menuitem, dbus_interface); g_signal_connect (G_OBJECT (dbus_interface), "user-added", G_CALLBACK (user_change), root_menuitem); g_signal_connect (G_OBJECT (dbus_interface), "user-removed", G_CALLBACK (user_change), root_menuitem); setup_restart_watch(); setup_up(); DbusmenuServer * server = dbusmenu_server_new(INDICATOR_SESSION_DBUS_OBJECT); dbusmenu_server_set_root(server, root_menuitem); mainloop = g_main_loop_new(NULL, FALSE); g_main_loop_run(mainloop); return 0; }
WndInfo *registerWindow(guint32 windowXid, jeventcallback handler) { // _info("register new window"); WndInfo *wi = (WndInfo *) malloc(sizeof(WndInfo)); memset(wi, 0, sizeof(WndInfo)); wi->xid = (guint32) windowXid; wi->menuPath = malloc(64); sprintf(wi->menuPath, "/com/canonical/menu/0x%x", windowXid); wi->menuroot = dbusmenu_menuitem_new(); if (wi->menuroot == NULL) { _error("can't create menuitem for new root"); _releaseWindow(wi); return NULL; } g_object_set_data(G_OBJECT(wi->menuroot), MENUITEM_JHANDLER_PROPERTY, handler); dbusmenu_menuitem_property_set(wi->menuroot, DBUSMENU_MENUITEM_PROP_LABEL, "DBusMenuRoot"); wi->server = dbusmenu_server_new(wi->menuPath); dbusmenu_server_set_root(wi->server, wi->menuroot); wi->registrar = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_NONE, NULL, DBUS_NAME, REG_OBJECT, REG_IFACE, NULL, NULL); if (wi->registrar == NULL) { // probably need to watch for registrar on dbus // guint watcher = g_bus_watch_name(G_BUS_TYPE_SESSION, DBUS_NAME, G_BUS_NAME_WATCHER_FLAGS_NONE, on_registrar_available, on_registrar_unavailable); _error("can't obtain registrar"); _releaseWindow(wi); return NULL; } char buf[1024]; _printWndInfo(wi, buf, 1024); _logmsg(LOG_LEVEL_INFO, "new window info: %s", buf); GError *error = NULL; g_dbus_proxy_call_sync( wi->registrar, "RegisterWindow", g_variant_new("(uo)", windowXid, wi->menuPath), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error); if (error != NULL) { _logmsg(LOG_LEVEL_ERROR, "Unable to register window, error: %s", error->message); g_error_free(error); _releaseWindow(wi); return NULL; } wi->jhandler = handler; g_signal_connect(wi->registrar, "notify::g-name-owner", G_CALLBACK(_onDbusOwnerChange), wi); return wi; }