/* This will write out the current state of the config file to the disk. * It's use is generally discouraged, since config_free() will also write * out the configuration to disk. */ gint config_write (const gchar *config_file) { DEBUG_FUNCTION ("config_write"); DEBUG_ASSERT (config_file != NULL); gint ret = 0; FILE *fp; char *temp_config_file = g_strdup_printf ("%s.tmp", config_file); fp = fopen(temp_config_file, "w"); if (fp != NULL) { config_mutex_lock (); cfg_print (tc, fp); config_mutex_unlock (); if (fsync (fileno(fp))) { // Error occurred during sync TILDA_PERROR (); DEBUG_ERROR ("Unable to sync file"); g_printerr (_("Unable to sync the config file to disk\n")); ret = 2; } if (fclose (fp)) { // An error occurred TILDA_PERROR (); DEBUG_ERROR ("Unable to close config file"); g_printerr (_("Unable to close the config file\n")); ret = 3; } if (rename(temp_config_file, config_file)) { TILDA_PERROR (); DEBUG_ERROR ("Unable to rename temporary config file to final config file."); } } else { TILDA_PERROR (); DEBUG_ERROR ("Unable to write config file"); g_printerr (_("Unable to write the config file to %s\n"), config_file); ret = 4; } return ret; }
/* This will write out the current state of the config file to the disk. * It's use is generally discouraged, since config_free() will also write * out the configuration to disk. */ gint config_write (const gchar *config_file) { DEBUG_FUNCTION ("config_write"); DEBUG_ASSERT (config_file != NULL); gint ret = 0; FILE *fp; /* Check to see if writing is disabled. Leave early if it is. */ if (config_writing_disabled) return 1; fp = fopen(config_file, "w"); if (fp != NULL) { config_mutex_lock (); cfg_print (tc, fp); config_mutex_unlock (); if (fsync (fileno(fp))) { // Error occurred during sync TILDA_PERROR (); DEBUG_ERROR ("Unable to sync file"); g_printerr (_("Unable to sync the config file to disk\n")); ret = 2; } if (fclose (fp)) { // An error occurred TILDA_PERROR (); DEBUG_ERROR ("Unable to close config file"); g_printerr (_("Unable to close the config file\n")); ret = 3; } } else { TILDA_PERROR (); DEBUG_ERROR ("Unable to write config file"); g_printerr (_("Unable to write the config file to %s\n"), config_file); ret = 4; } return ret; }
static int button_press_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) { DEBUG_FUNCTION ("button_press_cb"); DEBUG_ASSERT (data != NULL); VteTerminal *terminal; tilda_term *tt; gchar *match; gint tag; gint xpad, ypad; gchar *cmd; gchar *web_browser_cmd; gboolean ret = FALSE; tt = TILDA_TERM(data); switch (event->button) { case 3: /* Right Click */ popup_menu (tt->tw, tt); break; case 2: /* Middle Click */ break; case 1: /* Left Click */ terminal = VTE_TERMINAL(tt->vte_term); GtkBorder border; gtk_widget_style_get (GTK_WIDGET (terminal), "inner-border", &border, NULL); xpad = border.left; ypad = border.bottom; match = vte_terminal_match_check (terminal, (event->x - ypad) / vte_terminal_get_char_width (terminal), (event->y - ypad) / vte_terminal_get_char_height (terminal), &tag); /* Check if we can launch a web browser, and do so if possible */ if ((event->state & GDK_CONTROL_MASK) && match != NULL) { #if DEBUG g_print ("Got a Ctrl+Left Click -- Matched: `%s' (%d)\n", match, tag); #endif web_browser_cmd = g_strescape (config_getstr ("web_browser"), NULL); cmd = g_strdup_printf ("%s %s", web_browser_cmd, match); #if DEBUG g_print ("Launching command: `%s'\n", cmd); #endif ret = g_spawn_command_line_async(cmd, NULL); /* Check that the command launched */ if (!ret) { g_printerr (_("Failed to launch the web browser. The command was `%s'\n"), cmd); TILDA_PERROR (); } g_free (cmd); } /* Always free match if it is non NULL */ if (match) g_free (match); break; default: break; } return FALSE; }