1461 lines
58 KiB
C
1461 lines
58 KiB
C
/**************************************************************************
|
|
*
|
|
* Tint2 : read/write config file
|
|
*
|
|
* Copyright (C) 2007 Pål Staurland (staura@gmail.com)
|
|
* Modified (C) 2008 thierry lorthiois (lorthiois@bbsoft.fr) from Omega distribution
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License version 2
|
|
* as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
**************************************************************************/
|
|
|
|
#include <sys/stat.h>
|
|
#include <sys/time.h>
|
|
#include <unistd.h>
|
|
#include <cairo.h>
|
|
#include <cairo-xlib.h>
|
|
#include <X11/Xlib.h>
|
|
#include <X11/Xutil.h>
|
|
#include <X11/Xatom.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
#include <glib/gstdio.h>
|
|
#include <pango/pango-font.h>
|
|
#include <Imlib2.h>
|
|
|
|
#include "config.h"
|
|
|
|
#ifndef TINT2CONF
|
|
|
|
#include "tint2rc.h"
|
|
#include "common.h"
|
|
#include "server.h"
|
|
#include "strnatcmp.h"
|
|
#include "panel.h"
|
|
#include "task.h"
|
|
#include "taskbar.h"
|
|
#include "taskbarname.h"
|
|
#include "systraybar.h"
|
|
#include "launcher.h"
|
|
#include "clock.h"
|
|
#include "window.h"
|
|
#include "tooltip.h"
|
|
#include "timer.h"
|
|
#include "separator.h"
|
|
#include "execplugin.h"
|
|
|
|
#ifdef ENABLE_BATTERY
|
|
#include "battery.h"
|
|
#endif
|
|
|
|
#endif
|
|
|
|
// global path
|
|
char *config_path = NULL;
|
|
char *snapshot_path = NULL;
|
|
|
|
#ifndef TINT2CONF
|
|
|
|
// --------------------------------------------------
|
|
// backward compatibility
|
|
// detect if it's an old config file (==1)
|
|
static gboolean new_config_file;
|
|
|
|
static gboolean read_bg_color_hover;
|
|
static gboolean read_border_color_hover;
|
|
static gboolean read_bg_color_press;
|
|
static gboolean read_border_color_press;
|
|
static gboolean read_panel_position;
|
|
|
|
void default_config()
|
|
{
|
|
config_path = NULL;
|
|
snapshot_path = NULL;
|
|
new_config_file = FALSE;
|
|
read_panel_position = FALSE;
|
|
}
|
|
|
|
void cleanup_config()
|
|
{
|
|
free(config_path);
|
|
config_path = NULL;
|
|
free(snapshot_path);
|
|
snapshot_path = NULL;
|
|
}
|
|
|
|
void get_action(char *event, MouseAction *action)
|
|
{
|
|
if (strcmp(event, "none") == 0)
|
|
*action = NONE;
|
|
else if (strcmp(event, "close") == 0)
|
|
*action = CLOSE;
|
|
else if (strcmp(event, "toggle") == 0)
|
|
*action = TOGGLE;
|
|
else if (strcmp(event, "iconify") == 0)
|
|
*action = ICONIFY;
|
|
else if (strcmp(event, "shade") == 0)
|
|
*action = SHADE;
|
|
else if (strcmp(event, "toggle_iconify") == 0)
|
|
*action = TOGGLE_ICONIFY;
|
|
else if (strcmp(event, "maximize_restore") == 0)
|
|
*action = MAXIMIZE_RESTORE;
|
|
else if (strcmp(event, "desktop_left") == 0)
|
|
*action = DESKTOP_LEFT;
|
|
else if (strcmp(event, "desktop_right") == 0)
|
|
*action = DESKTOP_RIGHT;
|
|
else if (strcmp(event, "next_task") == 0)
|
|
*action = NEXT_TASK;
|
|
else if (strcmp(event, "prev_task") == 0)
|
|
*action = PREV_TASK;
|
|
else
|
|
fprintf(stderr, "tint2: Error: unrecognized action '%s'. Please fix your config file.\n", event);
|
|
}
|
|
|
|
int get_task_status(char *status)
|
|
{
|
|
if (strcmp(status, "active") == 0)
|
|
return TASK_ACTIVE;
|
|
if (strcmp(status, "iconified") == 0)
|
|
return TASK_ICONIFIED;
|
|
if (strcmp(status, "urgent") == 0)
|
|
return TASK_URGENT;
|
|
return -1;
|
|
}
|
|
|
|
int config_get_monitor(char *monitor)
|
|
{
|
|
if (strcmp(monitor, "primary") == 0) {
|
|
for (int i = 0; i < server.num_monitors; ++i) {
|
|
if (server.monitors[i].primary)
|
|
return i;
|
|
}
|
|
return 0;
|
|
}
|
|
if (strcmp(monitor, "all") == 0) {
|
|
return -1;
|
|
}
|
|
char *endptr;
|
|
int ret_int = strtol(monitor, &endptr, 10);
|
|
if (*endptr == 0)
|
|
return ret_int - 1;
|
|
else {
|
|
// monitor specified by name, not by index
|
|
int i, j;
|
|
for (i = 0; i < server.num_monitors; ++i) {
|
|
if (server.monitors[i].names == 0)
|
|
// xrandr can't identify monitors
|
|
continue;
|
|
j = 0;
|
|
while (server.monitors[i].names[j] != 0) {
|
|
if (strcmp(monitor, server.monitors[i].names[j++]) == 0)
|
|
return i;
|
|
}
|
|
}
|
|
}
|
|
|
|
// monitor not found or xrandr can't identify monitors => all
|
|
return -1;
|
|
}
|
|
|
|
static gint compare_strings(gconstpointer a, gconstpointer b)
|
|
{
|
|
return strnatcasecmp((const char *)a, (const char *)b);
|
|
}
|
|
|
|
void load_launcher_app_dir(const char *path)
|
|
{
|
|
GList *subdirs = NULL;
|
|
GList *files = NULL;
|
|
|
|
GDir *d = g_dir_open(path, 0, NULL);
|
|
if (d) {
|
|
const gchar *name;
|
|
while ((name = g_dir_read_name(d))) {
|
|
gchar *file = g_build_filename(path, name, NULL);
|
|
if (!g_file_test(file, G_FILE_TEST_IS_DIR) && g_str_has_suffix(file, ".desktop")) {
|
|
files = g_list_append(files, file);
|
|
} else if (g_file_test(file, G_FILE_TEST_IS_DIR)) {
|
|
subdirs = g_list_append(subdirs, file);
|
|
} else {
|
|
g_free(file);
|
|
}
|
|
}
|
|
g_dir_close(d);
|
|
}
|
|
|
|
subdirs = g_list_sort(subdirs, compare_strings);
|
|
GList *l;
|
|
for (l = subdirs; l; l = g_list_next(l)) {
|
|
gchar *dir = (gchar *)l->data;
|
|
load_launcher_app_dir(dir);
|
|
g_free(dir);
|
|
}
|
|
g_list_free(subdirs);
|
|
|
|
files = g_list_sort(files, compare_strings);
|
|
for (l = files; l; l = g_list_next(l)) {
|
|
gchar *file = (gchar *)l->data;
|
|
panel_config.launcher.list_apps = g_slist_append(panel_config.launcher.list_apps, strdup(file));
|
|
g_free(file);
|
|
}
|
|
g_list_free(files);
|
|
}
|
|
|
|
Separator *get_or_create_last_separator()
|
|
{
|
|
if (!panel_config.separator_list) {
|
|
fprintf(stderr, "tint2: Warning: separator items should shart with 'separator = new'\n");
|
|
panel_config.separator_list = g_list_append(panel_config.separator_list, create_separator());
|
|
}
|
|
return (Separator *)g_list_last(panel_config.separator_list)->data;
|
|
}
|
|
|
|
Execp *get_or_create_last_execp()
|
|
{
|
|
if (!panel_config.execp_list) {
|
|
fprintf(stderr, "tint2: Warning: execp items should start with 'execp = new'\n");
|
|
panel_config.execp_list = g_list_append(panel_config.execp_list, create_execp());
|
|
}
|
|
return (Execp *)g_list_last(panel_config.execp_list)->data;
|
|
}
|
|
|
|
Button *get_or_create_last_button()
|
|
{
|
|
if (!panel_config.button_list) {
|
|
fprintf(stderr, "tint2: Warning: button items should start with 'button = new'\n");
|
|
panel_config.button_list = g_list_append(panel_config.button_list, create_button());
|
|
}
|
|
return (Button *)g_list_last(panel_config.button_list)->data;
|
|
}
|
|
|
|
void add_entry(char *key, char *value)
|
|
{
|
|
char *value1 = 0, *value2 = 0, *value3 = 0;
|
|
|
|
/* Background and border */
|
|
if (strcmp(key, "scale_relative_to_dpi") == 0) {
|
|
ui_scale_dpi_ref = atof(value);
|
|
} else if (strcmp(key, "scale_relative_to_screen_height") == 0) {
|
|
ui_scale_monitor_size_ref = atof(value);
|
|
} else if (strcmp(key, "rounded") == 0) {
|
|
// 'rounded' is the first parameter => alloc a new background
|
|
if (backgrounds->len > 0) {
|
|
Background *bg = &g_array_index(backgrounds, Background, backgrounds->len - 1);
|
|
if (!read_bg_color_hover)
|
|
memcpy(&bg->fill_color_hover, &bg->fill_color, sizeof(Color));
|
|
if (!read_border_color_hover)
|
|
memcpy(&bg->border_color_hover, &bg->border, sizeof(Color));
|
|
if (!read_bg_color_press)
|
|
memcpy(&bg->fill_color_pressed, &bg->fill_color_hover, sizeof(Color));
|
|
if (!read_border_color_press)
|
|
memcpy(&bg->border_color_pressed, &bg->border_color_hover, sizeof(Color));
|
|
}
|
|
Background bg;
|
|
init_background(&bg);
|
|
bg.border.radius = atoi(value);
|
|
g_array_append_val(backgrounds, bg);
|
|
read_bg_color_hover = FALSE;
|
|
read_border_color_hover = FALSE;
|
|
read_bg_color_press = FALSE;
|
|
read_border_color_press = FALSE;
|
|
} else if (strcmp(key, "border_width") == 0) {
|
|
g_array_index(backgrounds, Background, backgrounds->len - 1).border.width = atoi(value);
|
|
} else if (strcmp(key, "border_sides") == 0) {
|
|
Background *bg = &g_array_index(backgrounds, Background, backgrounds->len - 1);
|
|
bg->border.mask = 0;
|
|
if (strchr(value, 'l') || strchr(value, 'L'))
|
|
bg->border.mask |= BORDER_LEFT;
|
|
if (strchr(value, 'r') || strchr(value, 'R'))
|
|
bg->border.mask |= BORDER_RIGHT;
|
|
if (strchr(value, 't') || strchr(value, 'T'))
|
|
bg->border.mask |= BORDER_TOP;
|
|
if (strchr(value, 'b') || strchr(value, 'B'))
|
|
bg->border.mask |= BORDER_BOTTOM;
|
|
if (!bg->border.mask)
|
|
bg->border.width = 0;
|
|
} else if (strcmp(key, "background_color") == 0) {
|
|
Background *bg = &g_array_index(backgrounds, Background, backgrounds->len - 1);
|
|
extract_values(value, &value1, &value2, &value3);
|
|
get_color(value1, bg->fill_color.rgb);
|
|
if (value2)
|
|
bg->fill_color.alpha = (atoi(value2) / 100.0);
|
|
else
|
|
bg->fill_color.alpha = 0.5;
|
|
} else if (strcmp(key, "border_color") == 0) {
|
|
Background *bg = &g_array_index(backgrounds, Background, backgrounds->len - 1);
|
|
extract_values(value, &value1, &value2, &value3);
|
|
get_color(value1, bg->border.color.rgb);
|
|
if (value2)
|
|
bg->border.color.alpha = (atoi(value2) / 100.0);
|
|
else
|
|
bg->border.color.alpha = 0.5;
|
|
} else if (strcmp(key, "background_color_hover") == 0) {
|
|
Background *bg = &g_array_index(backgrounds, Background, backgrounds->len - 1);
|
|
extract_values(value, &value1, &value2, &value3);
|
|
get_color(value1, bg->fill_color_hover.rgb);
|
|
if (value2)
|
|
bg->fill_color_hover.alpha = (atoi(value2) / 100.0);
|
|
else
|
|
bg->fill_color_hover.alpha = 0.5;
|
|
read_bg_color_hover = 1;
|
|
} else if (strcmp(key, "border_color_hover") == 0) {
|
|
Background *bg = &g_array_index(backgrounds, Background, backgrounds->len - 1);
|
|
extract_values(value, &value1, &value2, &value3);
|
|
get_color(value1, bg->border_color_hover.rgb);
|
|
if (value2)
|
|
bg->border_color_hover.alpha = (atoi(value2) / 100.0);
|
|
else
|
|
bg->border_color_hover.alpha = 0.5;
|
|
read_border_color_hover = 1;
|
|
} else if (strcmp(key, "background_color_pressed") == 0) {
|
|
Background *bg = &g_array_index(backgrounds, Background, backgrounds->len - 1);
|
|
extract_values(value, &value1, &value2, &value3);
|
|
get_color(value1, bg->fill_color_pressed.rgb);
|
|
if (value2)
|
|
bg->fill_color_pressed.alpha = (atoi(value2) / 100.0);
|
|
else
|
|
bg->fill_color_pressed.alpha = 0.5;
|
|
read_bg_color_press = 1;
|
|
} else if (strcmp(key, "border_color_pressed") == 0) {
|
|
Background *bg = &g_array_index(backgrounds, Background, backgrounds->len - 1);
|
|
extract_values(value, &value1, &value2, &value3);
|
|
get_color(value1, bg->border_color_pressed.rgb);
|
|
if (value2)
|
|
bg->border_color_pressed.alpha = (atoi(value2) / 100.0);
|
|
else
|
|
bg->border_color_pressed.alpha = 0.5;
|
|
read_border_color_press = 1;
|
|
} else if (strcmp(key, "gradient_id") == 0) {
|
|
Background *bg = &g_array_index(backgrounds, Background, backgrounds->len - 1);
|
|
int id = atoi(value);
|
|
id = (id < gradients->len && id >= 0) ? id : -1;
|
|
if (id >= 0)
|
|
bg->gradients[MOUSE_NORMAL] = &g_array_index(gradients, GradientClass, id);
|
|
} else if (strcmp(key, "gradient_id_hover") == 0 || strcmp(key, "hover_gradient_id") == 0) {
|
|
Background *bg = &g_array_index(backgrounds, Background, backgrounds->len - 1);
|
|
int id = atoi(value);
|
|
id = (id < gradients->len && id >= 0) ? id : -1;
|
|
if (id >= 0)
|
|
bg->gradients[MOUSE_OVER] = &g_array_index(gradients, GradientClass, id);
|
|
} else if (strcmp(key, "gradient_id_pressed") == 0 || strcmp(key, "pressed_gradient_id") == 0) {
|
|
Background *bg = &g_array_index(backgrounds, Background, backgrounds->len - 1);
|
|
int id = atoi(value);
|
|
id = (id < gradients->len && id >= 0) ? id : -1;
|
|
if (id >= 0)
|
|
bg->gradients[MOUSE_DOWN] = &g_array_index(gradients, GradientClass, id);
|
|
} else if (strcmp(key, "border_content_tint_weight") == 0) {
|
|
Background *bg = &g_array_index(backgrounds, Background, backgrounds->len - 1);
|
|
bg->border_content_tint_weight = MAX(0.0, MIN(1.0, atoi(value) / 100.));
|
|
} else if (strcmp(key, "background_content_tint_weight") == 0) {
|
|
Background *bg = &g_array_index(backgrounds, Background, backgrounds->len - 1);
|
|
bg->fill_content_tint_weight = MAX(0.0, MIN(1.0, atoi(value) / 100.));
|
|
}
|
|
|
|
/* Gradients */
|
|
else if (strcmp(key, "gradient") == 0) {
|
|
// Create a new gradient
|
|
GradientClass g;
|
|
init_gradient(&g, gradient_type_from_string(value));
|
|
g_array_append_val(gradients, g);
|
|
} else if (strcmp(key, "start_color") == 0) {
|
|
GradientClass *g = &g_array_index(gradients, GradientClass, gradients->len - 1);
|
|
extract_values(value, &value1, &value2, &value3);
|
|
get_color(value1, g->start_color.rgb);
|
|
if (value2)
|
|
g->start_color.alpha = (atoi(value2) / 100.0);
|
|
else
|
|
g->start_color.alpha = 0.5;
|
|
} else if (strcmp(key, "end_color") == 0) {
|
|
GradientClass *g = &g_array_index(gradients, GradientClass, gradients->len - 1);
|
|
extract_values(value, &value1, &value2, &value3);
|
|
get_color(value1, g->end_color.rgb);
|
|
if (value2)
|
|
g->end_color.alpha = (atoi(value2) / 100.0);
|
|
else
|
|
g->end_color.alpha = 0.5;
|
|
} else if (strcmp(key, "color_stop") == 0) {
|
|
GradientClass *g = &g_array_index(gradients, GradientClass, gradients->len - 1);
|
|
extract_values(value, &value1, &value2, &value3);
|
|
ColorStop *color_stop = (ColorStop *)calloc(1, sizeof(ColorStop));
|
|
color_stop->offset = atof(value1) / 100.0;
|
|
get_color(value2, color_stop->color.rgb);
|
|
if (value3)
|
|
color_stop->color.alpha = (atoi(value3) / 100.0);
|
|
else
|
|
color_stop->color.alpha = 0.5;
|
|
g->extra_color_stops = g_list_append(g->extra_color_stops, color_stop);
|
|
}
|
|
|
|
/* Panel */
|
|
else if (strcmp(key, "panel_monitor") == 0) {
|
|
panel_config.monitor = config_get_monitor(value);
|
|
} else if (strcmp(key, "panel_shrink") == 0) {
|
|
panel_shrink = atoi(value);
|
|
} else if (strcmp(key, "panel_size") == 0) {
|
|
extract_values(value, &value1, &value2, &value3);
|
|
|
|
char *b;
|
|
if ((b = strchr(value1, '%'))) {
|
|
b[0] = '\0';
|
|
panel_config.fractional_width = TRUE;
|
|
}
|
|
panel_config.area.width = atoi(value1);
|
|
if (panel_config.area.width == 0) {
|
|
// full width mode
|
|
panel_config.area.width = 100;
|
|
panel_config.fractional_width = TRUE;
|
|
}
|
|
if (value2) {
|
|
if ((b = strchr(value2, '%'))) {
|
|
b[0] = '\0';
|
|
panel_config.fractional_height = 1;
|
|
}
|
|
panel_config.area.height = atoi(value2);
|
|
}
|
|
} else if (strcmp(key, "panel_items") == 0) {
|
|
new_config_file = TRUE;
|
|
free_and_null(panel_items_order);
|
|
panel_items_order = strdup(value);
|
|
systray_enabled = 0;
|
|
launcher_enabled = 0;
|
|
#ifdef ENABLE_BATTERY
|
|
battery_enabled = 0;
|
|
#endif
|
|
clock_enabled = 0;
|
|
taskbar_enabled = 0;
|
|
for (int j = 0; j < strlen(panel_items_order); j++) {
|
|
if (panel_items_order[j] == 'L')
|
|
launcher_enabled = 1;
|
|
if (panel_items_order[j] == 'T')
|
|
taskbar_enabled = 1;
|
|
if (panel_items_order[j] == 'B') {
|
|
#ifdef ENABLE_BATTERY
|
|
battery_enabled = 1;
|
|
#else
|
|
fprintf(stderr, "tint2: tint2 has been compiled without battery support\n");
|
|
#endif
|
|
}
|
|
if (panel_items_order[j] == 'S') {
|
|
// systray disabled in snapshot mode
|
|
if (snapshot_path == 0)
|
|
systray_enabled = 1;
|
|
}
|
|
if (panel_items_order[j] == 'C')
|
|
clock_enabled = 1;
|
|
}
|
|
} else if (strcmp(key, "panel_margin") == 0) {
|
|
extract_values(value, &value1, &value2, &value3);
|
|
panel_config.marginx = atoi(value1);
|
|
if (value2)
|
|
panel_config.marginy = atoi(value2);
|
|
} else if (strcmp(key, "panel_padding") == 0) {
|
|
extract_values(value, &value1, &value2, &value3);
|
|
panel_config.area.paddingxlr = panel_config.area.paddingx = atoi(value1);
|
|
if (value2)
|
|
panel_config.area.paddingy = atoi(value2);
|
|
if (value3)
|
|
panel_config.area.paddingx = atoi(value3);
|
|
} else if (strcmp(key, "panel_position") == 0) {
|
|
read_panel_position = TRUE;
|
|
extract_values(value, &value1, &value2, &value3);
|
|
if (strcmp(value1, "top") == 0)
|
|
panel_position = TOP;
|
|
else {
|
|
if (strcmp(value1, "bottom") == 0)
|
|
panel_position = BOTTOM;
|
|
else
|
|
panel_position = CENTER;
|
|
}
|
|
|
|
if (!value2)
|
|
panel_position |= CENTER;
|
|
else {
|
|
if (strcmp(value2, "left") == 0)
|
|
panel_position |= LEFT;
|
|
else {
|
|
if (strcmp(value2, "right") == 0)
|
|
panel_position |= RIGHT;
|
|
else
|
|
panel_position |= CENTER;
|
|
}
|
|
}
|
|
if (!value3)
|
|
panel_horizontal = 1;
|
|
else {
|
|
if (strcmp(value3, "vertical") == 0)
|
|
panel_horizontal = 0;
|
|
else
|
|
panel_horizontal = 1;
|
|
}
|
|
} else if (strcmp(key, "font_shadow") == 0)
|
|
panel_config.font_shadow = atoi(value);
|
|
else if (strcmp(key, "panel_background_id") == 0) {
|
|
int id = atoi(value);
|
|
id = (id < backgrounds->len && id >= 0) ? id : 0;
|
|
panel_config.area.bg = &g_array_index(backgrounds, Background, id);
|
|
} else if (strcmp(key, "wm_menu") == 0)
|
|
wm_menu = atoi(value);
|
|
else if (strcmp(key, "panel_dock") == 0)
|
|
panel_dock = atoi(value);
|
|
else if (strcmp(key, "urgent_nb_of_blink") == 0)
|
|
max_tick_urgent = atoi(value);
|
|
else if (strcmp(key, "panel_layer") == 0) {
|
|
if (strcmp(value, "bottom") == 0)
|
|
panel_layer = BOTTOM_LAYER;
|
|
else if (strcmp(value, "top") == 0)
|
|
panel_layer = TOP_LAYER;
|
|
else
|
|
panel_layer = NORMAL_LAYER;
|
|
} else if (strcmp(key, "disable_transparency") == 0) {
|
|
server.disable_transparency = atoi(value);
|
|
} else if (strcmp(key, "panel_window_name") == 0) {
|
|
if (strlen(value) > 0) {
|
|
free(panel_window_name);
|
|
panel_window_name = strdup(value);
|
|
}
|
|
}
|
|
|
|
/* Battery */
|
|
else if (strcmp(key, "battery_low_status") == 0) {
|
|
#ifdef ENABLE_BATTERY
|
|
battery_low_status = atoi(value);
|
|
if (battery_low_status < 0 || battery_low_status > 100)
|
|
battery_low_status = 0;
|
|
#endif
|
|
} else if (strcmp(key, "battery_lclick_command") == 0) {
|
|
#ifdef ENABLE_BATTERY
|
|
if (strlen(value) > 0)
|
|
battery_lclick_command = strdup(value);
|
|
#endif
|
|
} else if (strcmp(key, "battery_mclick_command") == 0) {
|
|
#ifdef ENABLE_BATTERY
|
|
if (strlen(value) > 0)
|
|
battery_mclick_command = strdup(value);
|
|
#endif
|
|
} else if (strcmp(key, "battery_rclick_command") == 0) {
|
|
#ifdef ENABLE_BATTERY
|
|
if (strlen(value) > 0)
|
|
battery_rclick_command = strdup(value);
|
|
#endif
|
|
} else if (strcmp(key, "battery_uwheel_command") == 0) {
|
|
#ifdef ENABLE_BATTERY
|
|
if (strlen(value) > 0)
|
|
battery_uwheel_command = strdup(value);
|
|
#endif
|
|
} else if (strcmp(key, "battery_dwheel_command") == 0) {
|
|
#ifdef ENABLE_BATTERY
|
|
if (strlen(value) > 0)
|
|
battery_dwheel_command = strdup(value);
|
|
#endif
|
|
} else if (strcmp(key, "battery_low_cmd") == 0) {
|
|
#ifdef ENABLE_BATTERY
|
|
if (strlen(value) > 0)
|
|
battery_low_cmd = strdup(value);
|
|
#endif
|
|
} else if (strcmp(key, "battery_full_cmd") == 0) {
|
|
#ifdef ENABLE_BATTERY
|
|
if (strlen(value) > 0)
|
|
battery_full_cmd = strdup(value);
|
|
#endif
|
|
} else if (strcmp(key, "ac_connected_cmd") == 0) {
|
|
#ifdef ENABLE_BATTERY
|
|
if (strlen(value) > 0)
|
|
ac_connected_cmd = strdup(value);
|
|
#endif
|
|
} else if (strcmp(key, "ac_disconnected_cmd") == 0) {
|
|
#ifdef ENABLE_BATTERY
|
|
if (strlen(value) > 0)
|
|
ac_disconnected_cmd = strdup(value);
|
|
#endif
|
|
} else if (strcmp(key, "bat1_font") == 0) {
|
|
#ifdef ENABLE_BATTERY
|
|
bat1_font_desc = pango_font_description_from_string(value);
|
|
bat1_has_font = TRUE;
|
|
#endif
|
|
} else if (strcmp(key, "bat2_font") == 0) {
|
|
#ifdef ENABLE_BATTERY
|
|
bat2_font_desc = pango_font_description_from_string(value);
|
|
bat2_has_font = TRUE;
|
|
#endif
|
|
} else if (strcmp(key, "bat1_format") == 0) {
|
|
#ifdef ENABLE_BATTERY
|
|
if (strlen(value) > 0) {
|
|
free(bat1_format);
|
|
bat1_format = strdup(value);
|
|
battery_enabled = 1;
|
|
}
|
|
#endif
|
|
} else if (strcmp(key, "bat2_format") == 0) {
|
|
#ifdef ENABLE_BATTERY
|
|
if (strlen(value) > 0) {
|
|
free(bat2_format);
|
|
bat2_format = strdup(value);
|
|
}
|
|
#endif
|
|
} else if (strcmp(key, "battery_font_color") == 0) {
|
|
#ifdef ENABLE_BATTERY
|
|
extract_values(value, &value1, &value2, &value3);
|
|
get_color(value1, panel_config.battery.font_color.rgb);
|
|
if (value2)
|
|
panel_config.battery.font_color.alpha = (atoi(value2) / 100.0);
|
|
else
|
|
panel_config.battery.font_color.alpha = 0.5;
|
|
#endif
|
|
} else if (strcmp(key, "battery_padding") == 0) {
|
|
#ifdef ENABLE_BATTERY
|
|
extract_values(value, &value1, &value2, &value3);
|
|
panel_config.battery.area.paddingxlr = panel_config.battery.area.paddingx = atoi(value1);
|
|
if (value2)
|
|
panel_config.battery.area.paddingy = atoi(value2);
|
|
if (value3)
|
|
panel_config.battery.area.paddingx = atoi(value3);
|
|
#endif
|
|
} else if (strcmp(key, "battery_background_id") == 0) {
|
|
#ifdef ENABLE_BATTERY
|
|
int id = atoi(value);
|
|
id = (id < backgrounds->len && id >= 0) ? id : 0;
|
|
panel_config.battery.area.bg = &g_array_index(backgrounds, Background, id);
|
|
#endif
|
|
} else if (strcmp(key, "battery_hide") == 0) {
|
|
#ifdef ENABLE_BATTERY
|
|
percentage_hide = atoi(value);
|
|
if (percentage_hide == 0)
|
|
percentage_hide = 101;
|
|
#endif
|
|
} else if (strcmp(key, "battery_tooltip") == 0) {
|
|
#ifdef ENABLE_BATTERY
|
|
battery_tooltip_enabled = atoi(value);
|
|
#endif
|
|
}
|
|
|
|
/* Separator */
|
|
else if (strcmp(key, "separator") == 0) {
|
|
panel_config.separator_list = g_list_append(panel_config.separator_list, create_separator());
|
|
} else if (strcmp(key, "separator_background_id") == 0) {
|
|
Separator *separator = get_or_create_last_separator();
|
|
int id = atoi(value);
|
|
id = (id < backgrounds->len && id >= 0) ? id : 0;
|
|
separator->area.bg = &g_array_index(backgrounds, Background, id);
|
|
} else if (strcmp(key, "separator_color") == 0) {
|
|
Separator *separator = get_or_create_last_separator();
|
|
extract_values(value, &value1, &value2, &value3);
|
|
get_color(value1, separator->color.rgb);
|
|
if (value2)
|
|
separator->color.alpha = (atoi(value2) / 100.0);
|
|
else
|
|
separator->color.alpha = 0.5;
|
|
} else if (strcmp(key, "separator_style") == 0) {
|
|
Separator *separator = get_or_create_last_separator();
|
|
if (g_str_equal(value, "empty"))
|
|
separator->style = SEPARATOR_EMPTY;
|
|
else if (g_str_equal(value, "line"))
|
|
separator->style = SEPARATOR_LINE;
|
|
else if (g_str_equal(value, "dots"))
|
|
separator->style = SEPARATOR_DOTS;
|
|
else
|
|
fprintf(stderr, RED "tint2: Invalid separator_style value: %s" RESET "\n", value);
|
|
} else if (strcmp(key, "separator_size") == 0) {
|
|
Separator *separator = get_or_create_last_separator();
|
|
separator->thickness = atoi(value);
|
|
} else if (strcmp(key, "separator_padding") == 0) {
|
|
Separator *separator = get_or_create_last_separator();
|
|
extract_values(value, &value1, &value2, &value3);
|
|
separator->area.paddingxlr = separator->area.paddingx = atoi(value1);
|
|
if (value2)
|
|
separator->area.paddingy = atoi(value2);
|
|
if (value3)
|
|
separator->area.paddingx = atoi(value3);
|
|
}
|
|
|
|
/* Execp */
|
|
else if (strcmp(key, "execp") == 0) {
|
|
panel_config.execp_list = g_list_append(panel_config.execp_list, create_execp());
|
|
} else if (strcmp(key, "execp_command") == 0) {
|
|
Execp *execp = get_or_create_last_execp();
|
|
free_and_null(execp->backend->command);
|
|
if (strlen(value) > 0)
|
|
execp->backend->command = strdup(value);
|
|
} else if (strcmp(key, "execp_interval") == 0) {
|
|
Execp *execp = get_or_create_last_execp();
|
|
execp->backend->interval = 0;
|
|
int v = atoi(value);
|
|
if (v < 0) {
|
|
fprintf(stderr, "tint2: execp_interval must be an integer >= 0\n");
|
|
} else {
|
|
execp->backend->interval = v;
|
|
}
|
|
} else if (strcmp(key, "execp_has_icon") == 0) {
|
|
Execp *execp = get_or_create_last_execp();
|
|
execp->backend->has_icon = atoi(value);
|
|
} else if (strcmp(key, "execp_continuous") == 0) {
|
|
Execp *execp = get_or_create_last_execp();
|
|
execp->backend->continuous = atoi(value);
|
|
} else if (strcmp(key, "execp_markup") == 0) {
|
|
Execp *execp = get_or_create_last_execp();
|
|
execp->backend->has_markup = atoi(value);
|
|
} else if (strcmp(key, "execp_cache_icon") == 0) {
|
|
Execp *execp = get_or_create_last_execp();
|
|
execp->backend->cache_icon = atoi(value);
|
|
} else if (strcmp(key, "execp_tooltip") == 0) {
|
|
Execp *execp = get_or_create_last_execp();
|
|
free_and_null(execp->backend->tooltip);
|
|
execp->backend->tooltip = strdup(value);
|
|
execp->backend->has_user_tooltip = TRUE;
|
|
} else if (strcmp(key, "execp_font") == 0) {
|
|
Execp *execp = get_or_create_last_execp();
|
|
pango_font_description_free(execp->backend->font_desc);
|
|
execp->backend->font_desc = pango_font_description_from_string(value);
|
|
execp->backend->has_font = TRUE;
|
|
} else if (strcmp(key, "execp_font_color") == 0) {
|
|
Execp *execp = get_or_create_last_execp();
|
|
extract_values(value, &value1, &value2, &value3);
|
|
get_color(value1, execp->backend->font_color.rgb);
|
|
if (value2)
|
|
execp->backend->font_color.alpha = atoi(value2) / 100.0;
|
|
else
|
|
execp->backend->font_color.alpha = 0.5;
|
|
} else if (strcmp(key, "execp_padding") == 0) {
|
|
Execp *execp = get_or_create_last_execp();
|
|
extract_values(value, &value1, &value2, &value3);
|
|
execp->backend->paddingxlr = execp->backend->paddingx = atoi(value1);
|
|
if (value2)
|
|
execp->backend->paddingy = atoi(value2);
|
|
else
|
|
execp->backend->paddingy = 0;
|
|
if (value3)
|
|
execp->backend->paddingx = atoi(value3);
|
|
} else if (strcmp(key, "execp_background_id") == 0) {
|
|
Execp *execp = get_or_create_last_execp();
|
|
int id = atoi(value);
|
|
id = (id < backgrounds->len && id >= 0) ? id : 0;
|
|
execp->backend->bg = &g_array_index(backgrounds, Background, id);
|
|
} else if (strcmp(key, "execp_centered") == 0) {
|
|
Execp *execp = get_or_create_last_execp();
|
|
execp->backend->centered = atoi(value);
|
|
} else if (strcmp(key, "execp_icon_w") == 0) {
|
|
Execp *execp = get_or_create_last_execp();
|
|
int v = atoi(value);
|
|
if (v < 0) {
|
|
fprintf(stderr, "tint2: execp_icon_w must be an integer >= 0\n");
|
|
} else {
|
|
execp->backend->icon_w = v;
|
|
}
|
|
} else if (strcmp(key, "execp_icon_h") == 0) {
|
|
Execp *execp = get_or_create_last_execp();
|
|
int v = atoi(value);
|
|
if (v < 0) {
|
|
fprintf(stderr, "tint2: execp_icon_h must be an integer >= 0\n");
|
|
} else {
|
|
execp->backend->icon_h = v;
|
|
}
|
|
} else if (strcmp(key, "execp_lclick_command") == 0) {
|
|
Execp *execp = get_or_create_last_execp();
|
|
free_and_null(execp->backend->lclick_command);
|
|
if (strlen(value) > 0)
|
|
execp->backend->lclick_command = strdup(value);
|
|
} else if (strcmp(key, "execp_mclick_command") == 0) {
|
|
Execp *execp = get_or_create_last_execp();
|
|
free_and_null(execp->backend->mclick_command);
|
|
if (strlen(value) > 0)
|
|
execp->backend->mclick_command = strdup(value);
|
|
} else if (strcmp(key, "execp_rclick_command") == 0) {
|
|
Execp *execp = get_or_create_last_execp();
|
|
free_and_null(execp->backend->rclick_command);
|
|
if (strlen(value) > 0)
|
|
execp->backend->rclick_command = strdup(value);
|
|
} else if (strcmp(key, "execp_uwheel_command") == 0) {
|
|
Execp *execp = get_or_create_last_execp();
|
|
free_and_null(execp->backend->uwheel_command);
|
|
if (strlen(value) > 0)
|
|
execp->backend->uwheel_command = strdup(value);
|
|
} else if (strcmp(key, "execp_dwheel_command") == 0) {
|
|
Execp *execp = get_or_create_last_execp();
|
|
free_and_null(execp->backend->dwheel_command);
|
|
if (strlen(value) > 0)
|
|
execp->backend->dwheel_command = strdup(value);
|
|
}
|
|
|
|
/* Button */
|
|
else if (strcmp(key, "button") == 0) {
|
|
panel_config.button_list = g_list_append(panel_config.button_list, create_button());
|
|
} else if (strcmp(key, "button_icon") == 0) {
|
|
if (strlen(value)) {
|
|
Button *button = get_or_create_last_button();
|
|
button->backend->icon_name = strdup(value);
|
|
}
|
|
} else if (strcmp(key, "button_text") == 0) {
|
|
if (strlen(value)) {
|
|
Button *button = get_or_create_last_button();
|
|
free_and_null(button->backend->text);
|
|
button->backend->text = strdup(value);
|
|
}
|
|
} else if (strcmp(key, "button_tooltip") == 0) {
|
|
if (strlen(value)) {
|
|
Button *button = get_or_create_last_button();
|
|
free_and_null(button->backend->tooltip);
|
|
button->backend->tooltip = strdup(value);
|
|
}
|
|
} else if (strcmp(key, "button_font") == 0) {
|
|
Button *button = get_or_create_last_button();
|
|
pango_font_description_free(button->backend->font_desc);
|
|
button->backend->font_desc = pango_font_description_from_string(value);
|
|
button->backend->has_font = TRUE;
|
|
} else if (strcmp(key, "button_font_color") == 0) {
|
|
Button *button = get_or_create_last_button();
|
|
extract_values(value, &value1, &value2, &value3);
|
|
get_color(value1, button->backend->font_color.rgb);
|
|
if (value2)
|
|
button->backend->font_color.alpha = atoi(value2) / 100.0;
|
|
else
|
|
button->backend->font_color.alpha = 0.5;
|
|
} else if (strcmp(key, "button_padding") == 0) {
|
|
Button *button = get_or_create_last_button();
|
|
extract_values(value, &value1, &value2, &value3);
|
|
button->backend->paddingxlr = button->backend->paddingx = atoi(value1);
|
|
if (value2)
|
|
button->backend->paddingy = atoi(value2);
|
|
else
|
|
button->backend->paddingy = 0;
|
|
if (value3)
|
|
button->backend->paddingx = atoi(value3);
|
|
} else if (strcmp(key, "button_max_icon_size") == 0) {
|
|
Button *button = get_or_create_last_button();
|
|
extract_values(value, &value1, &value2, &value3);
|
|
button->backend->max_icon_size = MAX(0, atoi(value));
|
|
} else if (strcmp(key, "button_background_id") == 0) {
|
|
Button *button = get_or_create_last_button();
|
|
int id = atoi(value);
|
|
id = (id < backgrounds->len && id >= 0) ? id : 0;
|
|
button->backend->bg = &g_array_index(backgrounds, Background, id);
|
|
} else if (strcmp(key, "button_centered") == 0) {
|
|
Button *button = get_or_create_last_button();
|
|
button->backend->centered = atoi(value);
|
|
} else if (strcmp(key, "button_lclick_command") == 0) {
|
|
Button *button = get_or_create_last_button();
|
|
free_and_null(button->backend->lclick_command);
|
|
if (strlen(value) > 0)
|
|
button->backend->lclick_command = strdup(value);
|
|
} else if (strcmp(key, "button_mclick_command") == 0) {
|
|
Button *button = get_or_create_last_button();
|
|
free_and_null(button->backend->mclick_command);
|
|
if (strlen(value) > 0)
|
|
button->backend->mclick_command = strdup(value);
|
|
} else if (strcmp(key, "button_rclick_command") == 0) {
|
|
Button *button = get_or_create_last_button();
|
|
free_and_null(button->backend->rclick_command);
|
|
if (strlen(value) > 0)
|
|
button->backend->rclick_command = strdup(value);
|
|
} else if (strcmp(key, "button_uwheel_command") == 0) {
|
|
Button *button = get_or_create_last_button();
|
|
free_and_null(button->backend->uwheel_command);
|
|
if (strlen(value) > 0)
|
|
button->backend->uwheel_command = strdup(value);
|
|
} else if (strcmp(key, "button_dwheel_command") == 0) {
|
|
Button *button = get_or_create_last_button();
|
|
free_and_null(button->backend->dwheel_command);
|
|
if (strlen(value) > 0)
|
|
button->backend->dwheel_command = strdup(value);
|
|
}
|
|
|
|
/* Clock */
|
|
else if (strcmp(key, "time1_format") == 0) {
|
|
if (!new_config_file) {
|
|
clock_enabled = TRUE;
|
|
if (panel_items_order) {
|
|
gchar *tmp = g_strconcat(panel_items_order, "C", NULL);
|
|
free(panel_items_order);
|
|
panel_items_order = strdup(tmp);
|
|
g_free(tmp);
|
|
} else {
|
|
panel_items_order = strdup("C");
|
|
}
|
|
}
|
|
if (strlen(value) > 0) {
|
|
time1_format = strdup(value);
|
|
clock_enabled = TRUE;
|
|
}
|
|
} else if (strcmp(key, "time2_format") == 0) {
|
|
if (strlen(value) > 0)
|
|
time2_format = strdup(value);
|
|
} else if (strcmp(key, "time1_font") == 0) {
|
|
time1_font_desc = pango_font_description_from_string(value);
|
|
time1_has_font = TRUE;
|
|
} else if (strcmp(key, "time1_timezone") == 0) {
|
|
if (strlen(value) > 0)
|
|
time1_timezone = strdup(value);
|
|
} else if (strcmp(key, "time2_timezone") == 0) {
|
|
if (strlen(value) > 0)
|
|
time2_timezone = strdup(value);
|
|
} else if (strcmp(key, "time2_font") == 0) {
|
|
time2_font_desc = pango_font_description_from_string(value);
|
|
time2_has_font = TRUE;
|
|
} else if (strcmp(key, "clock_font_color") == 0) {
|
|
extract_values(value, &value1, &value2, &value3);
|
|
get_color(value1, panel_config.clock.font.rgb);
|
|
if (value2)
|
|
panel_config.clock.font.alpha = (atoi(value2) / 100.0);
|
|
else
|
|
panel_config.clock.font.alpha = 0.5;
|
|
} else if (strcmp(key, "clock_padding") == 0) {
|
|
extract_values(value, &value1, &value2, &value3);
|
|
panel_config.clock.area.paddingxlr = panel_config.clock.area.paddingx = atoi(value1);
|
|
if (value2)
|
|
panel_config.clock.area.paddingy = atoi(value2);
|
|
if (value3)
|
|
panel_config.clock.area.paddingx = atoi(value3);
|
|
} else if (strcmp(key, "clock_background_id") == 0) {
|
|
int id = atoi(value);
|
|
id = (id < backgrounds->len && id >= 0) ? id : 0;
|
|
panel_config.clock.area.bg = &g_array_index(backgrounds, Background, id);
|
|
} else if (strcmp(key, "clock_tooltip") == 0) {
|
|
if (strlen(value) > 0)
|
|
time_tooltip_format = strdup(value);
|
|
} else if (strcmp(key, "clock_tooltip_timezone") == 0) {
|
|
if (strlen(value) > 0)
|
|
time_tooltip_timezone = strdup(value);
|
|
} else if (strcmp(key, "clock_lclick_command") == 0) {
|
|
if (strlen(value) > 0)
|
|
clock_lclick_command = strdup(value);
|
|
} else if (strcmp(key, "clock_mclick_command") == 0) {
|
|
if (strlen(value) > 0)
|
|
clock_mclick_command = strdup(value);
|
|
} else if (strcmp(key, "clock_rclick_command") == 0) {
|
|
if (strlen(value) > 0)
|
|
clock_rclick_command = strdup(value);
|
|
} else if (strcmp(key, "clock_uwheel_command") == 0) {
|
|
if (strlen(value) > 0)
|
|
clock_uwheel_command = strdup(value);
|
|
} else if (strcmp(key, "clock_dwheel_command") == 0) {
|
|
if (strlen(value) > 0)
|
|
clock_dwheel_command = strdup(value);
|
|
}
|
|
|
|
/* Taskbar */
|
|
else if (strcmp(key, "taskbar_mode") == 0) {
|
|
if (strcmp(value, "multi_desktop") == 0)
|
|
taskbar_mode = MULTI_DESKTOP;
|
|
else
|
|
taskbar_mode = SINGLE_DESKTOP;
|
|
} else if (strcmp(key, "taskbar_distribute_size") == 0) {
|
|
taskbar_distribute_size = atoi(value);
|
|
} else if (strcmp(key, "taskbar_padding") == 0) {
|
|
extract_values(value, &value1, &value2, &value3);
|
|
panel_config.g_taskbar.area.paddingxlr = panel_config.g_taskbar.area.paddingx = atoi(value1);
|
|
if (value2)
|
|
panel_config.g_taskbar.area.paddingy = atoi(value2);
|
|
if (value3)
|
|
panel_config.g_taskbar.area.paddingx = atoi(value3);
|
|
} else if (strcmp(key, "taskbar_background_id") == 0) {
|
|
int id = atoi(value);
|
|
id = (id < backgrounds->len && id >= 0) ? id : 0;
|
|
panel_config.g_taskbar.background[TASKBAR_NORMAL] = &g_array_index(backgrounds, Background, id);
|
|
if (panel_config.g_taskbar.background[TASKBAR_ACTIVE] == 0)
|
|
panel_config.g_taskbar.background[TASKBAR_ACTIVE] = panel_config.g_taskbar.background[TASKBAR_NORMAL];
|
|
} else if (strcmp(key, "taskbar_active_background_id") == 0) {
|
|
int id = atoi(value);
|
|
id = (id < backgrounds->len && id >= 0) ? id : 0;
|
|
panel_config.g_taskbar.background[TASKBAR_ACTIVE] = &g_array_index(backgrounds, Background, id);
|
|
} else if (strcmp(key, "taskbar_name") == 0) {
|
|
taskbarname_enabled = atoi(value);
|
|
} else if (strcmp(key, "taskbar_name_padding") == 0) {
|
|
extract_values(value, &value1, &value2, &value3);
|
|
panel_config.g_taskbar.area_name.paddingxlr = panel_config.g_taskbar.area_name.paddingx = atoi(value1);
|
|
if (value2)
|
|
panel_config.g_taskbar.area_name.paddingy = atoi(value2);
|
|
} else if (strcmp(key, "taskbar_name_background_id") == 0) {
|
|
int id = atoi(value);
|
|
id = (id < backgrounds->len && id >= 0) ? id : 0;
|
|
panel_config.g_taskbar.background_name[TASKBAR_NORMAL] = &g_array_index(backgrounds, Background, id);
|
|
if (panel_config.g_taskbar.background_name[TASKBAR_ACTIVE] == 0)
|
|
panel_config.g_taskbar.background_name[TASKBAR_ACTIVE] =
|
|
panel_config.g_taskbar.background_name[TASKBAR_NORMAL];
|
|
} else if (strcmp(key, "taskbar_name_active_background_id") == 0) {
|
|
int id = atoi(value);
|
|
id = (id < backgrounds->len && id >= 0) ? id : 0;
|
|
panel_config.g_taskbar.background_name[TASKBAR_ACTIVE] = &g_array_index(backgrounds, Background, id);
|
|
} else if (strcmp(key, "taskbar_name_font") == 0) {
|
|
panel_config.taskbarname_font_desc = pango_font_description_from_string(value);
|
|
panel_config.taskbarname_has_font = TRUE;
|
|
} else if (strcmp(key, "taskbar_name_font_color") == 0) {
|
|
extract_values(value, &value1, &value2, &value3);
|
|
get_color(value1, taskbarname_font.rgb);
|
|
if (value2)
|
|
taskbarname_font.alpha = (atoi(value2) / 100.0);
|
|
else
|
|
taskbarname_font.alpha = 0.5;
|
|
} else if (strcmp(key, "taskbar_name_active_font_color") == 0) {
|
|
extract_values(value, &value1, &value2, &value3);
|
|
get_color(value1, taskbarname_active_font.rgb);
|
|
if (value2)
|
|
taskbarname_active_font.alpha = (atoi(value2) / 100.0);
|
|
else
|
|
taskbarname_active_font.alpha = 0.5;
|
|
} else if (strcmp(key, "taskbar_hide_inactive_tasks") == 0) {
|
|
hide_inactive_tasks = atoi(value);
|
|
} else if (strcmp(key, "taskbar_hide_different_monitor") == 0) {
|
|
hide_task_diff_monitor = atoi(value);
|
|
} else if (strcmp(key, "taskbar_hide_different_desktop") == 0) {
|
|
hide_task_diff_desktop = atoi(value);
|
|
} else if (strcmp(key, "taskbar_hide_if_empty") == 0) {
|
|
hide_taskbar_if_empty = atoi(value);
|
|
} else if (strcmp(key, "taskbar_always_show_all_desktop_tasks") == 0) {
|
|
always_show_all_desktop_tasks = atoi(value);
|
|
} else if (strcmp(key, "taskbar_sort_order") == 0) {
|
|
if (strcmp(value, "center") == 0) {
|
|
taskbar_sort_method = TASKBAR_SORT_CENTER;
|
|
} else if (strcmp(value, "title") == 0) {
|
|
taskbar_sort_method = TASKBAR_SORT_TITLE;
|
|
} else if (strcmp(value, "application") == 0) {
|
|
taskbar_sort_method = TASKBAR_SORT_APPLICATION;
|
|
} else if (strcmp(value, "lru") == 0) {
|
|
taskbar_sort_method = TASKBAR_SORT_LRU;
|
|
} else if (strcmp(value, "mru") == 0) {
|
|
taskbar_sort_method = TASKBAR_SORT_MRU;
|
|
} else {
|
|
taskbar_sort_method = TASKBAR_NOSORT;
|
|
}
|
|
} else if (strcmp(key, "task_align") == 0) {
|
|
if (strcmp(value, "center") == 0) {
|
|
taskbar_alignment = ALIGN_CENTER;
|
|
} else if (strcmp(value, "right") == 0) {
|
|
taskbar_alignment = ALIGN_RIGHT;
|
|
} else {
|
|
taskbar_alignment = ALIGN_LEFT;
|
|
}
|
|
}
|
|
|
|
/* Task */
|
|
else if (strcmp(key, "task_text") == 0)
|
|
panel_config.g_task.has_text = atoi(value);
|
|
else if (strcmp(key, "task_icon") == 0)
|
|
panel_config.g_task.has_icon = atoi(value);
|
|
else if (strcmp(key, "task_centered") == 0)
|
|
panel_config.g_task.centered = atoi(value);
|
|
else if (strcmp(key, "task_width") == 0) {
|
|
// old parameter : just for backward compatibility
|
|
panel_config.g_task.maximum_width = atoi(value);
|
|
panel_config.g_task.maximum_height = 30;
|
|
} else if (strcmp(key, "task_maximum_size") == 0) {
|
|
extract_values(value, &value1, &value2, &value3);
|
|
panel_config.g_task.maximum_width = atoi(value1);
|
|
if (value2)
|
|
panel_config.g_task.maximum_height = atoi(value2);
|
|
else
|
|
panel_config.g_task.maximum_height = panel_config.g_task.maximum_width;
|
|
} else if (strcmp(key, "task_padding") == 0) {
|
|
extract_values(value, &value1, &value2, &value3);
|
|
panel_config.g_task.area.paddingxlr = panel_config.g_task.area.paddingx = atoi(value1);
|
|
if (value2)
|
|
panel_config.g_task.area.paddingy = atoi(value2);
|
|
if (value3)
|
|
panel_config.g_task.area.paddingx = atoi(value3);
|
|
} else if (strcmp(key, "task_font") == 0) {
|
|
panel_config.g_task.font_desc = pango_font_description_from_string(value);
|
|
panel_config.g_task.has_font = TRUE;
|
|
} else if (g_regex_match_simple("task.*_font_color", key, 0, 0)) {
|
|
gchar **split = g_regex_split_simple("_", key, 0, 0);
|
|
int status = g_strv_length(split) == 3 ? TASK_NORMAL : get_task_status(split[1]);
|
|
g_strfreev(split);
|
|
if (status >= 0) {
|
|
extract_values(value, &value1, &value2, &value3);
|
|
float alpha = 1;
|
|
if (value2)
|
|
alpha = (atoi(value2) / 100.0);
|
|
get_color(value1, panel_config.g_task.font[status].rgb);
|
|
panel_config.g_task.font[status].alpha = alpha;
|
|
panel_config.g_task.config_font_mask |= (1 << status);
|
|
}
|
|
} else if (g_regex_match_simple("task.*_icon_asb", key, 0, 0)) {
|
|
gchar **split = g_regex_split_simple("_", key, 0, 0);
|
|
int status = g_strv_length(split) == 3 ? TASK_NORMAL : get_task_status(split[1]);
|
|
g_strfreev(split);
|
|
if (status >= 0) {
|
|
extract_values(value, &value1, &value2, &value3);
|
|
panel_config.g_task.alpha[status] = atoi(value1);
|
|
panel_config.g_task.saturation[status] = atoi(value2);
|
|
panel_config.g_task.brightness[status] = atoi(value3);
|
|
panel_config.g_task.config_asb_mask |= (1 << status);
|
|
}
|
|
} else if (g_regex_match_simple("task.*_background_id", key, 0, 0)) {
|
|
gchar **split = g_regex_split_simple("_", key, 0, 0);
|
|
int status = g_strv_length(split) == 3 ? TASK_NORMAL : get_task_status(split[1]);
|
|
g_strfreev(split);
|
|
if (status >= 0) {
|
|
int id = atoi(value);
|
|
id = (id < backgrounds->len && id >= 0) ? id : 0;
|
|
panel_config.g_task.background[status] = &g_array_index(backgrounds, Background, id);
|
|
panel_config.g_task.config_background_mask |= (1 << status);
|
|
if (status == TASK_NORMAL)
|
|
panel_config.g_task.area.bg = panel_config.g_task.background[TASK_NORMAL];
|
|
if (panel_config.g_task.background[status]->border_content_tint_weight > 0 ||
|
|
panel_config.g_task.background[status]->fill_content_tint_weight > 0)
|
|
panel_config.g_task.has_content_tint = TRUE;
|
|
}
|
|
}
|
|
// "tooltip" is deprecated but here for backwards compatibility
|
|
else if (strcmp(key, "task_tooltip") == 0 || strcmp(key, "tooltip") == 0)
|
|
panel_config.g_task.tooltip_enabled = atoi(value);
|
|
else if (strcmp(key, "task_thumbnail") == 0)
|
|
panel_config.g_task.thumbnail_enabled = atoi(value);
|
|
else if (strcmp(key, "task_thumbnail_size") == 0)
|
|
panel_config.g_task.thumbnail_width = MAX(8, atoi(value));
|
|
|
|
/* Systray */
|
|
else if (strcmp(key, "systray_padding") == 0) {
|
|
if (!new_config_file && systray_enabled == 0) {
|
|
systray_enabled = TRUE;
|
|
if (panel_items_order) {
|
|
gchar *tmp = g_strconcat(panel_items_order, "S", NULL);
|
|
free(panel_items_order);
|
|
panel_items_order = strdup(tmp);
|
|
g_free(tmp);
|
|
} else
|
|
panel_items_order = strdup("S");
|
|
}
|
|
extract_values(value, &value1, &value2, &value3);
|
|
systray.area.paddingxlr = systray.area.paddingx = atoi(value1);
|
|
if (value2)
|
|
systray.area.paddingy = atoi(value2);
|
|
if (value3)
|
|
systray.area.paddingx = atoi(value3);
|
|
} else if (strcmp(key, "systray_background_id") == 0) {
|
|
int id = atoi(value);
|
|
id = (id < backgrounds->len && id >= 0) ? id : 0;
|
|
systray.area.bg = &g_array_index(backgrounds, Background, id);
|
|
} else if (strcmp(key, "systray_sort") == 0) {
|
|
if (strcmp(value, "descending") == 0)
|
|
systray.sort = SYSTRAY_SORT_DESCENDING;
|
|
else if (strcmp(value, "ascending") == 0)
|
|
systray.sort = SYSTRAY_SORT_ASCENDING;
|
|
else if (strcmp(value, "left2right") == 0)
|
|
systray.sort = SYSTRAY_SORT_LEFT2RIGHT;
|
|
else if (strcmp(value, "right2left") == 0)
|
|
systray.sort = SYSTRAY_SORT_RIGHT2LEFT;
|
|
} else if (strcmp(key, "systray_icon_size") == 0) {
|
|
systray_max_icon_size = atoi(value);
|
|
} else if (strcmp(key, "systray_icon_asb") == 0) {
|
|
extract_values(value, &value1, &value2, &value3);
|
|
systray.alpha = atoi(value1);
|
|
systray.saturation = atoi(value2);
|
|
systray.brightness = atoi(value3);
|
|
} else if (strcmp(key, "systray_monitor") == 0) {
|
|
systray_monitor = MAX(0, config_get_monitor(value));
|
|
} else if (strcmp(key, "systray_name_filter") == 0) {
|
|
if (systray_hide_name_filter) {
|
|
fprintf(stderr, "tint2: Error: duplicate option 'systray_name_filter'. Please use it only once. See "
|
|
"https://gitlab.com/o9000/tint2/issues/652\n");
|
|
free(systray_hide_name_filter);
|
|
}
|
|
systray_hide_name_filter = strdup(value);
|
|
}
|
|
|
|
/* Launcher */
|
|
else if (strcmp(key, "launcher_padding") == 0) {
|
|
extract_values(value, &value1, &value2, &value3);
|
|
panel_config.launcher.area.paddingxlr = panel_config.launcher.area.paddingx = atoi(value1);
|
|
if (value2)
|
|
panel_config.launcher.area.paddingy = atoi(value2);
|
|
if (value3)
|
|
panel_config.launcher.area.paddingx = atoi(value3);
|
|
} else if (strcmp(key, "launcher_background_id") == 0) {
|
|
int id = atoi(value);
|
|
id = (id < backgrounds->len && id >= 0) ? id : 0;
|
|
panel_config.launcher.area.bg = &g_array_index(backgrounds, Background, id);
|
|
} else if (strcmp(key, "launcher_icon_background_id") == 0) {
|
|
int id = atoi(value);
|
|
id = (id < backgrounds->len && id >= 0) ? id : 0;
|
|
launcher_icon_bg = &g_array_index(backgrounds, Background, id);
|
|
} else if (strcmp(key, "launcher_icon_size") == 0) {
|
|
launcher_max_icon_size = atoi(value);
|
|
} else if (strcmp(key, "launcher_item_app") == 0) {
|
|
char *app = expand_tilde(value);
|
|
panel_config.launcher.list_apps = g_slist_append(panel_config.launcher.list_apps, app);
|
|
} else if (strcmp(key, "launcher_apps_dir") == 0) {
|
|
char *path = expand_tilde(value);
|
|
load_launcher_app_dir(path);
|
|
free(path);
|
|
} else if (strcmp(key, "launcher_icon_theme") == 0) {
|
|
// if XSETTINGS manager running, tint2 use it.
|
|
if (icon_theme_name_config)
|
|
free(icon_theme_name_config);
|
|
icon_theme_name_config = strdup(value);
|
|
} else if (strcmp(key, "launcher_icon_theme_override") == 0) {
|
|
launcher_icon_theme_override = atoi(value);
|
|
} else if (strcmp(key, "launcher_icon_asb") == 0) {
|
|
extract_values(value, &value1, &value2, &value3);
|
|
launcher_alpha = atoi(value1);
|
|
launcher_saturation = atoi(value2);
|
|
launcher_brightness = atoi(value3);
|
|
} else if (strcmp(key, "launcher_tooltip") == 0) {
|
|
launcher_tooltip_enabled = atoi(value);
|
|
} else if (strcmp(key, "startup_notifications") == 0) {
|
|
startup_notifications = atoi(value);
|
|
}
|
|
|
|
/* Tooltip */
|
|
else if (strcmp(key, "tooltip_show_timeout") == 0) {
|
|
int timeout_msec = 1000 * atof(value);
|
|
g_tooltip.show_timeout_msec = timeout_msec;
|
|
} else if (strcmp(key, "tooltip_hide_timeout") == 0) {
|
|
int timeout_msec = 1000 * atof(value);
|
|
g_tooltip.hide_timeout_msec = timeout_msec;
|
|
} else if (strcmp(key, "tooltip_padding") == 0) {
|
|
extract_values(value, &value1, &value2, &value3);
|
|
if (value1)
|
|
g_tooltip.paddingx = atoi(value1);
|
|
if (value2)
|
|
g_tooltip.paddingy = atoi(value2);
|
|
} else if (strcmp(key, "tooltip_background_id") == 0) {
|
|
int id = atoi(value);
|
|
id = (id < backgrounds->len && id >= 0) ? id : 0;
|
|
g_tooltip.bg = &g_array_index(backgrounds, Background, id);
|
|
} else if (strcmp(key, "tooltip_font_color") == 0) {
|
|
extract_values(value, &value1, &value2, &value3);
|
|
get_color(value1, g_tooltip.font_color.rgb);
|
|
if (value2)
|
|
g_tooltip.font_color.alpha = (atoi(value2) / 100.0);
|
|
else
|
|
g_tooltip.font_color.alpha = 0.1;
|
|
} else if (strcmp(key, "tooltip_font") == 0) {
|
|
g_tooltip.font_desc = pango_font_description_from_string(value);
|
|
}
|
|
|
|
/* Mouse actions */
|
|
else if (strcmp(key, "mouse_left") == 0)
|
|
get_action(value, &mouse_left);
|
|
else if (strcmp(key, "mouse_middle") == 0)
|
|
get_action(value, &mouse_middle);
|
|
else if (strcmp(key, "mouse_right") == 0)
|
|
get_action(value, &mouse_right);
|
|
else if (strcmp(key, "mouse_scroll_up") == 0)
|
|
get_action(value, &mouse_scroll_up);
|
|
else if (strcmp(key, "mouse_scroll_down") == 0)
|
|
get_action(value, &mouse_scroll_down);
|
|
else if (strcmp(key, "mouse_effects") == 0)
|
|
panel_config.mouse_effects = atoi(value);
|
|
else if (strcmp(key, "mouse_hover_icon_asb") == 0) {
|
|
extract_values(value, &value1, &value2, &value3);
|
|
panel_config.mouse_over_alpha = atoi(value1);
|
|
panel_config.mouse_over_saturation = atoi(value2);
|
|
panel_config.mouse_over_brightness = atoi(value3);
|
|
} else if (strcmp(key, "mouse_pressed_icon_asb") == 0) {
|
|
extract_values(value, &value1, &value2, &value3);
|
|
panel_config.mouse_pressed_alpha = atoi(value1);
|
|
panel_config.mouse_pressed_saturation = atoi(value2);
|
|
panel_config.mouse_pressed_brightness = atoi(value3);
|
|
}
|
|
|
|
/* autohide options */
|
|
else if (strcmp(key, "autohide") == 0)
|
|
panel_autohide = atoi(value);
|
|
else if (strcmp(key, "autohide_show_timeout") == 0)
|
|
panel_autohide_show_timeout = 1000 * atof(value);
|
|
else if (strcmp(key, "autohide_hide_timeout") == 0)
|
|
panel_autohide_hide_timeout = 1000 * atof(value);
|
|
else if (strcmp(key, "strut_policy") == 0) {
|
|
if (strcmp(value, "follow_size") == 0)
|
|
panel_strut_policy = STRUT_FOLLOW_SIZE;
|
|
else if (strcmp(value, "none") == 0)
|
|
panel_strut_policy = STRUT_NONE;
|
|
else
|
|
panel_strut_policy = STRUT_MINIMUM;
|
|
} else if (strcmp(key, "autohide_height") == 0) {
|
|
panel_autohide_height = atoi(value);
|
|
if (panel_autohide_height == 0) {
|
|
// autohide need height > 0
|
|
panel_autohide_height = 1;
|
|
}
|
|
}
|
|
|
|
// old config option
|
|
else if (strcmp(key, "systray") == 0) {
|
|
if (!new_config_file) {
|
|
systray_enabled = atoi(value);
|
|
if (systray_enabled) {
|
|
if (panel_items_order) {
|
|
gchar *tmp = g_strconcat(panel_items_order, "S", NULL);
|
|
free(panel_items_order);
|
|
panel_items_order = strdup(tmp);
|
|
g_free(tmp);
|
|
} else
|
|
panel_items_order = strdup("S");
|
|
}
|
|
}
|
|
}
|
|
#ifdef ENABLE_BATTERY
|
|
else if (strcmp(key, "battery") == 0) {
|
|
if (!new_config_file) {
|
|
battery_enabled = atoi(value);
|
|
if (battery_enabled) {
|
|
if (panel_items_order) {
|
|
gchar *tmp = g_strconcat(panel_items_order, "B", NULL);
|
|
free(panel_items_order);
|
|
panel_items_order = strdup(tmp);
|
|
g_free(tmp);
|
|
} else
|
|
panel_items_order = strdup("B");
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
else if (strcmp(key, "primary_monitor_first") == 0) {
|
|
fprintf(stderr,
|
|
"tint2: deprecated config option \"%s\"\n"
|
|
" Please see the documentation regarding the alternatives.\n",
|
|
key);
|
|
} else
|
|
fprintf(stderr, "tint2: invalid option \"%s\",\n upgrade tint2 or correct your config file\n", key);
|
|
|
|
if (value1)
|
|
free(value1);
|
|
if (value2)
|
|
free(value2);
|
|
if (value3)
|
|
free(value3);
|
|
}
|
|
|
|
gboolean config_read_file(const char *path)
|
|
{
|
|
fprintf(stderr, "tint2: Loading config file: %s\n", path);
|
|
|
|
FILE *fp = fopen(path, "r");
|
|
if (!fp)
|
|
return FALSE;
|
|
|
|
char *line = NULL;
|
|
size_t line_size = 0;
|
|
while (getline(&line, &line_size, fp) >= 0) {
|
|
char *key, *value;
|
|
if (parse_line(line, &key, &value)) {
|
|
add_entry(key, value);
|
|
free(key);
|
|
free(value);
|
|
}
|
|
}
|
|
free(line);
|
|
fclose(fp);
|
|
|
|
if (!read_panel_position) {
|
|
panel_horizontal = TRUE;
|
|
panel_position = BOTTOM;
|
|
}
|
|
|
|
// append Taskbar item
|
|
if (!new_config_file) {
|
|
taskbar_enabled = TRUE;
|
|
if (panel_items_order) {
|
|
gchar *tmp = g_strconcat("T", panel_items_order, NULL);
|
|
free(panel_items_order);
|
|
panel_items_order = strdup(tmp);
|
|
g_free(tmp);
|
|
} else {
|
|
panel_items_order = strdup("T");
|
|
}
|
|
}
|
|
|
|
if (backgrounds->len > 0) {
|
|
Background *bg = &g_array_index(backgrounds, Background, backgrounds->len - 1);
|
|
if (!read_bg_color_hover)
|
|
memcpy(&bg->fill_color_hover, &bg->fill_color, sizeof(Color));
|
|
if (!read_border_color_hover)
|
|
memcpy(&bg->border_color_hover, &bg->border, sizeof(Color));
|
|
if (!read_bg_color_press)
|
|
memcpy(&bg->fill_color_pressed, &bg->fill_color_hover, sizeof(Color));
|
|
if (!read_border_color_press)
|
|
memcpy(&bg->border_color_pressed, &bg->border_color_hover, sizeof(Color));
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
gboolean config_read_default_path()
|
|
{
|
|
const gchar *const *system_dirs;
|
|
gchar *path1;
|
|
|
|
// follow XDG specification
|
|
// check tint2rc in user directory
|
|
path1 = g_build_filename(g_get_user_config_dir(), "tint2", "tint2rc", NULL);
|
|
if (g_file_test(path1, G_FILE_TEST_EXISTS)) {
|
|
gboolean result = config_read_file(path1);
|
|
config_path = strdup(path1);
|
|
g_free(path1);
|
|
return result;
|
|
}
|
|
g_free(path1);
|
|
|
|
// copy tint2rc from system directory to user directory
|
|
|
|
fprintf(stderr, "tint2: could not find a config file! Creating a default one.\n");
|
|
// According to the XDG Base Directory Specification
|
|
// (https://specifications.freedesktop.org/basedir-spec/basedir-spec-0.6.html)
|
|
// if the user's config directory does not exist, we should create it with permissions set to 0700.
|
|
if (!g_file_test(g_get_user_config_dir(), G_FILE_TEST_IS_DIR))
|
|
g_mkdir_with_parents(g_get_user_config_dir(), 0700);
|
|
|
|
gchar *path2 = 0;
|
|
system_dirs = g_get_system_config_dirs();
|
|
for (int i = 0; system_dirs[i]; i++) {
|
|
path2 = g_build_filename(system_dirs[i], "tint2", "tint2rc", NULL);
|
|
|
|
if (g_file_test(path2, G_FILE_TEST_EXISTS))
|
|
break;
|
|
g_free(path2);
|
|
path2 = 0;
|
|
}
|
|
|
|
if (path2) {
|
|
// copy file in user directory (path1)
|
|
gchar *dir = g_build_filename(g_get_user_config_dir(), "tint2", NULL);
|
|
if (!g_file_test(dir, G_FILE_TEST_IS_DIR))
|
|
g_mkdir_with_parents(dir, 0700);
|
|
g_free(dir);
|
|
|
|
path1 = g_build_filename(g_get_user_config_dir(), "tint2", "tint2rc", NULL);
|
|
copy_file(path2, path1);
|
|
g_free(path2);
|
|
|
|
gboolean result = config_read_file(path1);
|
|
config_path = strdup(path1);
|
|
g_free(path1);
|
|
return result;
|
|
}
|
|
|
|
// generate config file
|
|
gchar *dir = g_build_filename(g_get_user_config_dir(), "tint2", NULL);
|
|
if (!g_file_test(dir, G_FILE_TEST_IS_DIR))
|
|
g_mkdir_with_parents(dir, 0700);
|
|
g_free(dir);
|
|
|
|
path1 = g_build_filename(g_get_user_config_dir(), "tint2", "tint2rc", NULL);
|
|
FILE *f = fopen(path1, "w");
|
|
if (f) {
|
|
fwrite(themes_tint2rc, 1, themes_tint2rc_len, f);
|
|
fclose(f);
|
|
}
|
|
|
|
gboolean result = config_read_file(path1);
|
|
config_path = strdup(path1);
|
|
g_free(path1);
|
|
return result;
|
|
}
|
|
|
|
gboolean config_read()
|
|
{
|
|
if (config_path)
|
|
return config_read_file(config_path);
|
|
return config_read_default_path();
|
|
}
|
|
|
|
#endif
|