/* Object initialization * Create private structure and set up default values */ static void xfdashboard_plugins_manager_init(XfdashboardPluginsManager *self) { XfdashboardPluginsManagerPrivate *priv; priv=self->priv=XFDASHBOARD_PLUGINS_MANAGER_GET_PRIVATE(self); /* Set default values */ priv->isInited=FALSE; priv->searchPaths=NULL; priv->plugins=NULL; priv->xfconfChannel=xfdashboard_application_get_xfconf_channel(NULL); priv->application=xfdashboard_application_get_default(); /* Connect signal to get notified about changed of enabled-plugins * property in Xfconf. */ g_signal_connect_swapped(priv->xfconfChannel, "property-changed::"ENABLED_PLUGINS_XFCONF_PROP, G_CALLBACK(_xfdashboard_plugins_manager_on_enabled_plugins_changed), self); /* Connect signal to get notified when application is fully initialized * to enable loaded plugins. */ priv->applicationInitializedSignalID= g_signal_connect_swapped(priv->application, "initialized", G_CALLBACK(_xfdashboard_plugins_manager_on_application_initialized), self); }
/* Create cache hashtable if not already set up */ static void _xfdashboard_image_content_create_cache(void) { XfdashboardApplication *application; /* Cache was already set up */ if(_xfdashboard_image_content_cache) return; /* Create create hashtable */ _xfdashboard_image_content_cache=g_hash_table_new(g_str_hash, g_str_equal); g_debug("Created image cache hashtable"); /* Connect to "shutdown" signal of application to * clean up hashtable */ application=xfdashboard_application_get_default(); _xfdashboard_image_content_cache_shutdownSignalID=g_signal_connect(application, "shutdown-final", G_CALLBACK(_xfdashboard_image_content_destroy_cache), NULL); }
/* Destroy cache hashtable */ static void _xfdashboard_image_content_destroy_cache(void) { XfdashboardApplication *application; gint cacheSize; /* Only an existing cache can be destroyed */ if(!_xfdashboard_image_content_cache) return; /* Disconnect application "shutdown" signal handler */ application=xfdashboard_application_get_default(); g_signal_handler_disconnect(application, _xfdashboard_image_content_cache_shutdownSignalID); _xfdashboard_image_content_cache_shutdownSignalID=0; /* Destroy cache hashtable */ cacheSize=g_hash_table_size(_xfdashboard_image_content_cache); if(cacheSize>0) g_warning(_("Destroying image cache still containing %d images."), cacheSize); g_debug("Destroying image cache hashtable"); g_hash_table_destroy(_xfdashboard_image_content_cache); _xfdashboard_image_content_cache=NULL; }
/* Object initialization * Create private structure and set up default values */ void xfdashboard_hot_corner_init(XfdashboardHotCorner *self) { XfdashboardHotCornerPrivate *priv; GdkScreen *screen; GdkDisplay *display; self->priv=priv=XFDASHBOARD_HOT_CORNER_GET_PRIVATE(self); /* Set up default values */ priv->application=xfdashboard_application_get_default(); priv->windowTracker=xfdashboard_window_tracker_get_default(); priv->rootWindow=NULL; #if GTK_CHECK_VERSION(3, 20, 0) priv->seat=NULL; #else priv->deviceManager=NULL; #endif priv->timeoutID=0; priv->enteredTime=NULL; priv->wasHandledRecently=FALSE; /* Set up settings */ priv->settings=xfdashboard_hot_corner_settings_new(); /* Get device manager for polling pointer position */ if(xfdashboard_application_is_daemonized(priv->application)) { screen=gdk_screen_get_default(); priv->rootWindow=gdk_screen_get_root_window(screen); if(priv->rootWindow) { display=gdk_window_get_display(priv->rootWindow); #if GTK_CHECK_VERSION(3, 20, 0) priv->seat=gdk_display_get_default_seat(display); #else priv->deviceManager=gdk_display_get_device_manager(display); #endif } else { g_critical(_("Disabling hot-corner plugin because the root window to determine pointer position could not be found.")); } #if GTK_CHECK_VERSION(3, 20, 0) if(priv->seat) #else if(priv->deviceManager) #endif { /* Start polling pointer position */ priv->timeoutID=g_timeout_add(POLL_POINTER_POSITION_INTERVAL, (GSourceFunc)_xfdashboard_hot_corner_check_hot_corner, self); } else { g_critical(_("Disabling hot-corner plugin because the device manager to determine pointer position could not be found.")); } } else { g_warning(_("Disabling hot-corner plugin because application is not running as daemon.")); } }
/* Main entry point */ int main(int argc, char **argv) { XfdashboardApplication *app=NULL; gint status; #ifdef ENABLE_NLS /* Set up localization */ xfce_textdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8"); #endif #if !GLIB_CHECK_VERSION(2, 36, 0) /* Initialize GObject type system */ g_type_init(); #endif #if CLUTTER_CHECK_VERSION(1, 16, 0) /* Enforce X11 backend in Clutter. This function must be called before any * other Clutter API function. */ clutter_set_windowing_backend("x11"); #endif /* Tell clutter to try to initialize an RGBA visual */ clutter_x11_set_use_argb_visual(TRUE); /* Initialize GTK+ and Clutter */ gtk_init(&argc, &argv); if(!clutter_init(&argc, &argv)) { g_error(_("Initializing clutter failed!")); return(1); } /* Notify that application has started and main loop will be entered */ gdk_notify_startup_complete(); /* Start application as primary or remote instace */ app=xfdashboard_application_get_default(); if(!app) { g_warning(_("Failed to create application instance")); return(XFDASHBOARD_APPLICATION_ERROR_FAILED); } status=g_application_run(G_APPLICATION(app), argc, argv); if(status==XFDASHBOARD_APPLICATION_ERROR_RESTART && g_application_get_is_remote(G_APPLICATION(app))) { /* Wait for existing primary instance to quit */ if(_restart(app)) { g_debug("Reached clean state to restart application"); /* Destroy remote instance application object for restart */ g_object_unref(app); app=NULL; /* Create new application instance which should become * the new primary instance. */ app=xfdashboard_application_get_default(); if(!app) { g_warning(_("Failed to create application instance")); return(XFDASHBOARD_APPLICATION_ERROR_FAILED); } g_debug("Starting new primary instance"); status=g_application_run(G_APPLICATION(app), argc, argv); } else { g_warning(_("Could not restart application because existing instance seems still to be running.")); } } /* Clean up, release allocated resources */ g_object_unref(app); return(status); }
/* Main entry point */ int main(int argc, char **argv) { XfdashboardApplication *app=NULL; GError *error=NULL; gint status; #if !defined(GLIB_CHECK_VERSION) || !GLIB_CHECK_VERSION(2, 36, 0) /* Initialize GObject type system */ g_type_init(); #endif /* Check for running instance (keep only one instance) */ app=xfdashboard_application_get_default(); g_application_register(G_APPLICATION(app), NULL, &error); if(error!=NULL) { g_warning(_("Unable to register application: %s"), error->message); g_error_free(error); error=NULL; return(XFDASHBOARD_APPLICATION_ERROR_FAILED); } if(g_application_get_is_remote(G_APPLICATION(app))==TRUE) { /* Handle command-line on primary instance of application * and activate primary instance if handling command-line * was successful */ status=g_application_run(G_APPLICATION(app), argc, argv); switch(status) { case XFDASHBOARD_APPLICATION_ERROR_NONE: case XFDASHBOARD_APPLICATION_ERROR_QUIT: /* Do nothing at remote instance */ break; default: g_error(_("Initializing application failed with status code %d"), status); break; } /* Exit this instance of application */ g_object_unref(app); return(status); } /* Tell clutter to try to initialize an RGBA visual */ clutter_x11_set_use_argb_visual(TRUE); /* Initialize GTK+ and Clutter */ gtk_init(&argc, &argv); if(!clutter_init(&argc, &argv)) { g_error(_("Initializing clutter failed!")); return(1); } /* Handle command-line on primary instance */ status=g_application_run(G_APPLICATION(app), argc, argv); if(status!=XFDASHBOARD_APPLICATION_ERROR_NONE) { g_object_unref(app); return(status); } /* Start main loop */ clutter_main(); /* Clean up, release allocated resources */ g_object_unref(app); return(XFDASHBOARD_APPLICATION_ERROR_NONE); }
/* The current selection of a focusable actor (if focussed or not) is not available anymore * (e.g. hidden or destroyed). So move selection at focusable actor to next available and * selectable item. */ static void _xfdashboard_focusable_on_selection_unavailable(XfdashboardFocusable *self, gpointer inUserData) { XfdashboardFocusableInterface *iface; ClutterActor *oldSelection; ClutterActor *newSelection; gboolean success; XfdashboardApplication *application; g_return_if_fail(XFDASHBOARD_IS_FOCUSABLE(self)); g_return_if_fail(CLUTTER_IS_ACTOR(inUserData)); iface=XFDASHBOARD_FOCUSABLE_GET_IFACE(self); oldSelection=CLUTTER_ACTOR(inUserData); newSelection=NULL; success=FALSE; /* If application is not quitting then call virtual function to set selection * which have to be available because this signal handler was set in * xfdashboard_focusable_set_selection() when this virtual function was available * and successfully called. * If setting new selection was unsuccessful we set selection to nothing (NULL); */ application=xfdashboard_application_get_default(); if(!xfdashboard_application_is_quitting(application)) { /* Get next selection */ newSelection=xfdashboard_focusable_find_selection(self, oldSelection, XFDASHBOARD_SELECTION_TARGET_NEXT); /* Set new selection */ success=iface->set_selection(self, newSelection); if(!success) { success=iface->set_selection(self, newSelection); if(!success) { g_critical(_("Old selection %s at %s is unavailable but setting new selection either to %s or nothing failed!"), G_OBJECT_TYPE_NAME(oldSelection), G_OBJECT_TYPE_NAME(self), newSelection ? G_OBJECT_TYPE_NAME(newSelection) : "<nil>"); } /* Now reset new selection to NULL regardless if setting selection at * focusable actor was successful or not. A critical warning was displayed * if is was unsuccessful because setting nothing (NULL) must succeed usually. */ newSelection=NULL; } } /* Regardless if setting selection was successful, remove signal handlers * and styles from old selection. */ if(oldSelection) { /* Remove signal handlers at old selection*/ g_signal_handlers_disconnect_by_func(oldSelection, G_CALLBACK(_xfdashboard_focusable_on_selection_unavailable), self); /* Remove style from old selection */ if(XFDASHBOARD_IS_STYLABLE(oldSelection)) { xfdashboard_stylable_remove_pseudo_class(XFDASHBOARD_STYLABLE(oldSelection), "selected"); } } /* If setting selection was successful, set up signal handlers and styles at new selection */ if(success && newSelection) { /* Set up signal handlers to get notified if new selection * is going to be unavailable (e.g. hidden or destroyed) */ g_signal_connect_swapped(newSelection, "destroy", G_CALLBACK(_xfdashboard_focusable_on_selection_unavailable), self); g_signal_connect_swapped(newSelection, "hide", G_CALLBACK(_xfdashboard_focusable_on_selection_unavailable), self); /* Check if this focusable actor has the focus because if it has * the have to style new selection. */ if(_xfdashboard_focusable_has_focus(self) && XFDASHBOARD_IS_STYLABLE(newSelection)) { xfdashboard_stylable_add_pseudo_class(XFDASHBOARD_STYLABLE(newSelection), "selected"); } } /* Emit signal because at least old selection has changed */ g_signal_emit(self, XfdashboardFocusableSignals[SIGNAL_SELECTION_CHANGED], 0, oldSelection, newSelection); }