tint2conf: Checksum files to identify and back up manually edited configs
This commit is contained in:
parent
2ecb1c4ef4
commit
89e2057a8e
1 changed files with 50 additions and 13 deletions
|
@ -86,7 +86,7 @@ void config_write_color(FILE *fp, char *name, GdkColor color, int opacity)
|
||||||
|
|
||||||
void config_write_backgrounds(FILE *fp)
|
void config_write_backgrounds(FILE *fp)
|
||||||
{
|
{
|
||||||
fprintf(fp, "#--------------------------------\n");
|
fprintf(fp, "#-------------------------------------\n");
|
||||||
fprintf(fp, "# Backgrounds\n");
|
fprintf(fp, "# Backgrounds\n");
|
||||||
|
|
||||||
int index;
|
int index;
|
||||||
|
@ -128,7 +128,7 @@ void config_write_backgrounds(FILE *fp)
|
||||||
|
|
||||||
void config_write_panel(FILE *fp)
|
void config_write_panel(FILE *fp)
|
||||||
{
|
{
|
||||||
fprintf(fp, "#--------------------------------\n");
|
fprintf(fp, "#-------------------------------------\n");
|
||||||
fprintf(fp, "# Panel\n");
|
fprintf(fp, "# Panel\n");
|
||||||
char *items = get_panel_items();
|
char *items = get_panel_items();
|
||||||
fprintf(fp, "panel_items = %s\n", items);
|
fprintf(fp, "panel_items = %s\n", items);
|
||||||
|
@ -219,7 +219,7 @@ void config_write_panel(FILE *fp)
|
||||||
|
|
||||||
void config_write_taskbar(FILE *fp)
|
void config_write_taskbar(FILE *fp)
|
||||||
{
|
{
|
||||||
fprintf(fp, "#--------------------------------\n");
|
fprintf(fp, "#-------------------------------------\n");
|
||||||
fprintf(fp, "# Taskbar\n");
|
fprintf(fp, "# Taskbar\n");
|
||||||
|
|
||||||
fprintf(fp,
|
fprintf(fp,
|
||||||
|
@ -309,7 +309,7 @@ void config_write_task_background(FILE *fp, char *name, GtkWidget *task_backgrou
|
||||||
|
|
||||||
void config_write_task(FILE *fp)
|
void config_write_task(FILE *fp)
|
||||||
{
|
{
|
||||||
fprintf(fp, "#--------------------------------\n");
|
fprintf(fp, "#-------------------------------------\n");
|
||||||
fprintf(fp, "# Task\n");
|
fprintf(fp, "# Task\n");
|
||||||
|
|
||||||
fprintf(fp, "task_text = %d\n", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(task_show_text)) ? 1 : 0);
|
fprintf(fp, "task_text = %d\n", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(task_show_text)) ? 1 : 0);
|
||||||
|
@ -398,7 +398,7 @@ void config_write_task(FILE *fp)
|
||||||
|
|
||||||
void config_write_systray(FILE *fp)
|
void config_write_systray(FILE *fp)
|
||||||
{
|
{
|
||||||
fprintf(fp, "#--------------------------------\n");
|
fprintf(fp, "#-------------------------------------\n");
|
||||||
fprintf(fp, "# System tray (notification area)\n");
|
fprintf(fp, "# System tray (notification area)\n");
|
||||||
|
|
||||||
fprintf(fp,
|
fprintf(fp,
|
||||||
|
@ -436,7 +436,7 @@ void config_write_systray(FILE *fp)
|
||||||
|
|
||||||
void config_write_launcher(FILE *fp)
|
void config_write_launcher(FILE *fp)
|
||||||
{
|
{
|
||||||
fprintf(fp, "#--------------------------------\n");
|
fprintf(fp, "#-------------------------------------\n");
|
||||||
fprintf(fp, "# Launcher\n");
|
fprintf(fp, "# Launcher\n");
|
||||||
|
|
||||||
fprintf(fp,
|
fprintf(fp,
|
||||||
|
@ -495,7 +495,7 @@ void config_write_launcher(FILE *fp)
|
||||||
|
|
||||||
void config_write_clock(FILE *fp)
|
void config_write_clock(FILE *fp)
|
||||||
{
|
{
|
||||||
fprintf(fp, "#--------------------------------\n");
|
fprintf(fp, "#-------------------------------------\n");
|
||||||
fprintf(fp, "# Clock\n");
|
fprintf(fp, "# Clock\n");
|
||||||
|
|
||||||
fprintf(fp, "time1_format = %s\n", gtk_entry_get_text(GTK_ENTRY(clock_format_line1)));
|
fprintf(fp, "time1_format = %s\n", gtk_entry_get_text(GTK_ENTRY(clock_format_line1)));
|
||||||
|
@ -527,7 +527,7 @@ void config_write_clock(FILE *fp)
|
||||||
|
|
||||||
void config_write_battery(FILE *fp)
|
void config_write_battery(FILE *fp)
|
||||||
{
|
{
|
||||||
fprintf(fp, "#--------------------------------\n");
|
fprintf(fp, "#-------------------------------------\n");
|
||||||
fprintf(fp, "# Battery\n");
|
fprintf(fp, "# Battery\n");
|
||||||
|
|
||||||
fprintf(fp, "battery_low_status = %g\n", gtk_spin_button_get_value(GTK_SPIN_BUTTON(battery_alert_if_lower)));
|
fprintf(fp, "battery_low_status = %g\n", gtk_spin_button_get_value(GTK_SPIN_BUTTON(battery_alert_if_lower)));
|
||||||
|
@ -552,7 +552,7 @@ void config_write_battery(FILE *fp)
|
||||||
|
|
||||||
void config_write_tooltip(FILE *fp)
|
void config_write_tooltip(FILE *fp)
|
||||||
{
|
{
|
||||||
fprintf(fp, "#--------------------------------\n");
|
fprintf(fp, "#-------------------------------------\n");
|
||||||
fprintf(fp, "# Tooltip\n");
|
fprintf(fp, "# Tooltip\n");
|
||||||
|
|
||||||
fprintf(fp, "tooltip_show_timeout = %g\n", gtk_spin_button_get_value(GTK_SPIN_BUTTON(tooltip_show_after)));
|
fprintf(fp, "tooltip_show_timeout = %g\n", gtk_spin_button_get_value(GTK_SPIN_BUTTON(tooltip_show_after)));
|
||||||
|
@ -575,14 +575,38 @@ void config_write_tooltip(FILE *fp)
|
||||||
fprintf(fp, "\n");
|
fprintf(fp, "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Similar to BSD checksum, except we skip the first line (metadata)
|
||||||
|
unsigned short checksum_txt(FILE *f)
|
||||||
|
{
|
||||||
|
unsigned int checksum = 0;
|
||||||
|
fseek(f, 0, SEEK_SET);
|
||||||
|
|
||||||
|
// Skip the first line
|
||||||
|
int c;
|
||||||
|
do {
|
||||||
|
c = getc(f);
|
||||||
|
} while (c != EOF && c != '\n');
|
||||||
|
|
||||||
|
while ((c = getc(f)) != EOF) {
|
||||||
|
// Rotate right
|
||||||
|
checksum = (checksum >> 1) + ((checksum & 1) << 15);
|
||||||
|
// Update checksum
|
||||||
|
checksum += c;
|
||||||
|
// Truncate to 16 bits
|
||||||
|
checksum &= 0xffff;
|
||||||
|
}
|
||||||
|
return checksum;
|
||||||
|
}
|
||||||
|
|
||||||
void config_save_file(const char *path) {
|
void config_save_file(const char *path) {
|
||||||
printf("config_save_file : %s\n", path);
|
printf("config_save_file : %s\n", path);
|
||||||
|
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
if ((fp = fopen(path, "wt")) == NULL)
|
if ((fp = fopen(path, "w+t")) == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fprintf(fp, "#---- Generated by tint2conf ----\n");
|
unsigned short checksum = 0;
|
||||||
|
fprintf(fp, "#---- Generated by tint2conf %04x ----\n", checksum);
|
||||||
|
|
||||||
config_write_backgrounds(fp);
|
config_write_backgrounds(fp);
|
||||||
config_write_panel(fp);
|
config_write_panel(fp);
|
||||||
|
@ -594,6 +618,11 @@ void config_save_file(const char *path) {
|
||||||
config_write_battery(fp);
|
config_write_battery(fp);
|
||||||
config_write_tooltip(fp);
|
config_write_tooltip(fp);
|
||||||
|
|
||||||
|
checksum = checksum_txt(fp);
|
||||||
|
fseek(fp, 0, SEEK_SET);
|
||||||
|
fflush(fp);
|
||||||
|
fprintf(fp, "#---- Generated by tint2conf %04x ----\n", checksum);
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -608,8 +637,16 @@ gboolean config_is_manual(const char *path)
|
||||||
|
|
||||||
result = TRUE;
|
result = TRUE;
|
||||||
if (fgets(line, sizeof(line), fp) != NULL) {
|
if (fgets(line, sizeof(line), fp) != NULL) {
|
||||||
if (g_str_equal(line, "#---- Generated by tint2conf ----\n")) {
|
if (!g_regex_match_simple("^#---- Generated by tint2conf [0-9a-f][0-9a-f][0-9a-f][0-9a-f] ----\n$", line, 0, 0)) {
|
||||||
result = FALSE;
|
result = TRUE;
|
||||||
|
} else {
|
||||||
|
unsigned short checksum1 = checksum_txt(fp);
|
||||||
|
unsigned short checksum2 = 0;
|
||||||
|
if (sscanf(line, "#---- Generated by tint2conf %hxu", &checksum2) == 1) {
|
||||||
|
result = checksum1 != checksum2;
|
||||||
|
} else {
|
||||||
|
result = TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|
Loading…
Reference in a new issue