int main( int argc, char *argv[] ) { // Initialize GTK+ gtk_init( &argc, &argv ); g_set_application_name( PACKAGE_NAME ); g_log_set_handler( "Wnck", G_LOG_LEVEL_WARNING, (GLogFunc)gtk_false , NULL ); const struct option longopts[] = { { 0, 0, 0, 'v' }, { 0, 0, 0, 'h' }, { 0, 0, 0, 0 }, }; int index = 0; int iarg = 0; // turn off getopt error message opterr = 0; while( iarg != -1 ) { iarg = getopt_long( argc, argv, "s:vh", longopts, &index ); switch( iarg ) { case 'v': g_fprintf( stderr, "%s version %s\n", PACKAGE_NAME, PACKAGE_VERSION ); g_fprintf( stderr, "Features:\n" ); #ifdef HAVE_APPINDICATOR g_fprintf( stderr, "AppIndicator support - Yes\n" ); #else g_fprintf( stderr, "AppIndicator support - No\n" ); #endif g_fprintf( stderr, "Icon cache - Yes\n" ); return 0; break; case 'h': g_fprintf( stderr, "%s\n\n%s\n%s\n%s\n", "Usage: gxkb [arguments]", "Options:", "-v \t Display gxkb's version number.", "-h \t Show this help." ); return 0; break; } } gchar *config_file = xkb_util_get_config_file(); gboolean first_run = FALSE; t_xkb_settings *xkb = xkb_new(); if( !xkb_load_config( xkb, config_file ) ) { first_run = TRUE; xkb->group_policy = GROUP_POLICY_PER_APPLICATION; } if( !xkb_config_initialize( xkb, xkb_state_changed, xkb ) ) { g_fprintf( stderr, "Can't get instance of the X display.\n" ); return 1; } if( first_run ) xkb_save_config( xkb, config_file ); statusicon_new(); // Save original config t_xkb_settings *orig_config = g_new0( t_xkb_settings, 1 ); xkb_load_config( orig_config, config_file ); /* Enter the main loop */ gtk_main(); // Load config and check if it was not changed t_xkb_settings *last_config = g_new0( t_xkb_settings, 1 ); xkb_load_config( last_config, config_file ); gboolean is_diff = xkb_is_config_changed( orig_config, last_config ); if( is_diff ) g_warning("Config file was changed. Saving skipped.\n"); else if( xkb->never_modify_config ) g_warning("Saving skipped by your configuration.\n"); else xkb_save_config( xkb, config_file ); g_free( orig_config ); g_free( last_config ); g_free( config_file ); xkb_free( xkb ); statusicon_free(); return 0; }
static t_xkb * xkb_new (XfcePanelPlugin *plugin) { t_xkb *xkb; gchar *filename; WnckScreen *wnck_screen; xkb = panel_slice_new0 (t_xkb); xkb->plugin = plugin; filename = xfce_panel_plugin_lookup_rc_file (plugin); if ((!filename) || (!xkb_load_config (xkb, filename))) { xkb_load_default (xkb); } g_free (filename); xkb->btn = gtk_button_new (); gtk_button_set_relief (GTK_BUTTON (xkb->btn), GTK_RELIEF_NONE); gtk_container_add (GTK_CONTAINER (xkb->plugin), xkb->btn); xfce_panel_plugin_add_action_widget (xkb->plugin, xkb->btn); xkb->button_state = GTK_STATE_NORMAL; gtk_widget_show (xkb->btn); g_signal_connect (xkb->btn, "clicked", G_CALLBACK (xkb_plugin_button_clicked), xkb); g_signal_connect (xkb->btn, "scroll-event", G_CALLBACK (xkb_plugin_button_scrolled), NULL); g_object_set (G_OBJECT (xkb->btn), "has-tooltip", TRUE, NULL); g_signal_connect (xkb->btn, "query-tooltip", G_CALLBACK (xkb_plugin_set_tooltip), xkb); g_signal_connect (G_OBJECT (xkb->btn), "enter-notify-event", G_CALLBACK (xkb_plugin_button_entered), xkb); g_signal_connect (G_OBJECT (xkb->btn), "leave-notify-event", G_CALLBACK (xkb_plugin_button_left), xkb); g_signal_connect (G_OBJECT (xkb->btn), "size-allocate", G_CALLBACK (xkb_plugin_button_size_allocated), xkb); xkb->layout_image = gtk_image_new (); gtk_container_add (GTK_CONTAINER (xkb->btn), xkb->layout_image); g_signal_connect (G_OBJECT (xkb->layout_image), "expose-event", G_CALLBACK (xkb_plugin_layout_image_exposed), xkb); gtk_widget_show (GTK_WIDGET (xkb->layout_image)); if (xkb_config_initialize (xkb->group_policy, xkb_state_changed, xkb)) { xkb_refresh_gui (xkb); xkb_populate_popup_menu (xkb); } wnck_screen = wnck_screen_get_default (); g_signal_connect (G_OBJECT (wnck_screen), "active-window-changed", G_CALLBACK (xkb_plugin_active_window_changed), xkb); g_signal_connect (G_OBJECT (wnck_screen), "window-closed", G_CALLBACK (xkb_plugin_window_closed), xkb); g_signal_connect (G_OBJECT (wnck_screen), "application-closed", G_CALLBACK (xkb_plugin_application_closed), xkb); return xkb; }