ede/ewmconf/ewmconf.cpp
2007-07-18 18:20:04 +00:00

352 lines
11 KiB
C++

/*
* $Id$
*
* edewm (EDE Window Manager) settings
* Part of Equinox Desktop Environment (EDE).
* Copyright (c) 2000-2006 EDE Authors.
*
* This program is licenced under terms of the
* GNU General Public Licence version 2 or newer.
* See COPYING for details.
*/
#include "ewmconf.h"
#include "ewm.h"
#include <fltk/file_chooser.h>
#include <fltk/ColorChooser.h>
#include <fltk/run.h>
#include <fltk/ask.h>
#include <string.h>
#include <stdlib.h>
#include "../edelib2/NLS.h"
fltk::Button* titlebarLabelColorButton;
fltk::Button* titlebarColorButton;
fltk::Button* titlebarActiveLabelColorButton;
fltk::Button* titlebarActiveColorButton;
fltk::Choice* titlebarDrawGrad;
fltk::CheckButton* useThemeButton;
fltk::Input* themePathInput;
fltk::Button* browse_btn;
fltk::CheckButton* animateButton;
fltk::ValueSlider* animateSlider;
fltk::CheckButton* opaqueResize;
fltk::Button* applyButton;
bool conf_changed = false;
// Functions called by callbacks
void changeBoxColor(fltk::Button *box) {
fltk::Button *colorBox = box;
fltk::Color oldColor = colorBox->color();
fltk::Color defColor = oldColor;
fltk::color_chooser("Choose color", defColor);
if ( defColor != oldColor ) {
colorBox->color(defColor);
colorBox->redraw();
}
}
void confChanged() {
if (conf_changed) return;
conf_changed=true;
applyButton->activate();
}
// Callback functions
static void cb_Text(fltk::Choice* o, void*) {
title_align = (int)o->value();
confChanged();
}
static void cb_Height(fltk::ValueInput* o, void*) {
title_height = (int)o->value();
confChanged();
}
static void cb_titlebarLabelColorButton(fltk::Button*, void*) {
changeBoxColor(titlebarLabelColorButton);
title_normal_color_text = (int) titlebarLabelColorButton->color();
confChanged();
}
static void cb_titlebarColorButton(fltk::Button*, void*) {
changeBoxColor(titlebarColorButton);
title_normal_color = (int) titlebarColorButton->color();
confChanged();
}
static void cb_titlebarActiveLabelColorButton(fltk::Button*, void*) {
changeBoxColor(titlebarActiveLabelColorButton);
title_active_color_text = (int) titlebarActiveLabelColorButton->color();
confChanged();
}
static void cb_titlebarActiveColorButton(fltk::Button*, void*) {
changeBoxColor(titlebarActiveColorButton);
title_active_color = (int) titlebarActiveColorButton->color();
confChanged();
}
static void cb_titlebarDrawGrad(fltk::Choice*, void*) {
title_draw_grad = titlebarDrawGrad->value();
confChanged();
}
static void cb_useThemeButton(fltk::CheckButton*, void*) {
if (useThemeButton->value()) {
themePathInput->activate();
browse_btn->activate();
titlebarDrawGrad->deactivate();
titlebarColorButton->deactivate();
titlebarActiveColorButton->deactivate();
} else {
themePathInput->deactivate();
browse_btn->deactivate();
titlebarDrawGrad->activate();
titlebarColorButton->activate();
titlebarActiveColorButton->activate();
}
use_theme = useThemeButton->value();
confChanged();
}
static void cb_themePathInput(fltk::Input*, void*) {
theme_path = (char*)realloc(theme_path, strlen(themePathInput->value()));
strcpy(theme_path, themePathInput->value());
confChanged();
}
static void cb_browse_btn(fltk::Button*, void*) {
char *file_types = _("Themes (*.theme), *.theme, All files (*.*), *");
const char *fileName = fltk::file_chooser( "Themes...", file_types, themePathInput->value());
if (fileName) {
themePathInput->value(fileName);
strncpy(theme_path, fileName, strlen(fileName));
}
confChanged();
}
static void cb_animateButton(fltk::CheckButton*, void*) {
if (animateButton->value())
animateSlider->activate();
else
animateSlider->deactivate();
animate = animateButton->value();
confChanged();
}
static void cb_animateSlider(fltk::ValueSlider*, void*) {
animate_speed = (int)animateSlider->value();
confChanged();
}
static void cb_opaqueResize(fltk::CheckButton*, void*) {
opaque_resize = opaqueResize->value();
confChanged();
}
/*static void cb_OK(fltk::Button*, void*) {
writeConfiguration();
applyConfiguration();
exit(0);
}*/
static void cb_Apply(fltk::Button*, void*) {
writeConfiguration();
applyConfiguration();
conf_changed = false;
applyButton->deactivate();
}
static void cb_Close(fltk::Button*, void*) {
if (conf_changed) {
int answer = fltk::choice_alert(_("You have unsaved changes in this window!\nDo you want to close it anyway?"), 0, _("Go &Back"), _("&Discard Changes"));
if (answer == 1) return;
}
exit(0);
}
// Main window design
int main (int argc, char **argv) {
fltk::Window* w;
//fl_init_locale_support("ewmconf", PREFIX"/share/locale");
readConfiguration();
{fltk::Window* o = new fltk::Window(325, 385, _("Window manager settings"));
w = o;
o->set_vertical();
o->begin();
{fltk::TabGroup* o = new fltk::TabGroup(10, 10, 305, 330);
o->selection_color(o->color());
o->selection_textcolor(o->textcolor());
o->box(fltk::THIN_UP_BOX);
o->begin();
{fltk::Group* o = new fltk::Group(0, 25, 305, 305, _("&Titlebar"));
o->align(fltk::ALIGN_TOP|fltk::ALIGN_LEFT);
o->begin();
{fltk::Choice* o = new fltk::Choice(35, 30, 125, 25, _("Text align:"));
o->callback((fltk::Callback*)cb_Text);
o->align(fltk::ALIGN_TOP|fltk::ALIGN_LEFT);
o->begin();
new fltk::Item(_("Left"));
new fltk::Item(_("Right"));
new fltk::Item(_("Center"));
o->end();
o->value(title_align);
o->tooltip(_("Where will window title be placed on the title bar?"));
}
{fltk::ValueInput* o = new fltk::ValueInput(205, 30, 60, 25, _("Height:"));
o->align(fltk::ALIGN_TOP|fltk::ALIGN_LEFT);
o->minimum(10);
o->maximum(50);
o->step(1);
o->value(20);
o->callback((fltk::Callback*)cb_Height);
o->value(title_height);
o->tooltip(_("Height of titlebar (in pixels)"));
}
{fltk::Button* o = titlebarLabelColorButton = new fltk::Button(205, 75, 60, 20, _("Label color: "));
o->callback((fltk::Callback*)cb_titlebarLabelColorButton);
o->align(fltk::ALIGN_LEFT);
o->color((fltk::Color)title_normal_color_text);
o->tooltip(_("Text color of window title"));
}
{fltk::Button* o = titlebarActiveLabelColorButton = new fltk::Button(205, 105, 60, 20, _("Active label color: "));
o->callback((fltk::Callback*)cb_titlebarActiveLabelColorButton);
o->align(fltk::ALIGN_LEFT);
o->color((fltk::Color) title_active_color_text);
o->tooltip(_("Title text color of active (foremost) window"));
}
{fltk::Button* o = titlebarColorButton = new fltk::Button(205, 135, 60, 20, _("Titlebar color: "));
o->callback((fltk::Callback*)cb_titlebarColorButton);
o->align(fltk::ALIGN_LEFT);
o->color((fltk::Color) title_normal_color);
o->tooltip(_("Color of title bar"));
}
{fltk::Button* o = titlebarActiveColorButton = new fltk::Button(205, 165, 60, 20, _("Active titlebar color: "));
o->callback((fltk::Callback*)cb_titlebarActiveColorButton);
o->align(fltk::ALIGN_LEFT);
o->color((fltk::Color)title_active_color);
o->tooltip(_("Titlebar color of active (foremost) window"));
}
{fltk::Choice* o = titlebarDrawGrad = new fltk::Choice(120, 200, 145, 25, _("Effect type:"));
o->callback((fltk::Callback*)cb_titlebarDrawGrad);
o->align(fltk::ALIGN_LEFT|fltk::ALIGN_WRAP);
o->begin();
new fltk::Item(_("Flat"));
new fltk::Item(_("Horizontal shade"));
new fltk::Item(_("Thin down"));
new fltk::Item(_("Up box"));
new fltk::Item(_("Down box"));
new fltk::Item(_("Plastic"));
o->end();
o->value(title_draw_grad);
o->tooltip(_("Effect that will be used when drawing titlebar"));
}
{fltk::Divider* o = new fltk::Divider();
o->resize(10,235,285,2);
{fltk::CheckButton* o = useThemeButton = new fltk::CheckButton(10, 245, 300, 25, _("&Use theme"));
o->callback((fltk::Callback*)cb_useThemeButton);
o->value(use_theme);
o->tooltip(_("Choose titlebar theme below (some options will be disabled)"));
}
{fltk::Input* o = themePathInput = new fltk::Input(65, 270, 195, 25, _("Path:"));
o->callback((fltk::Callback*)cb_themePathInput);
o->deactivate();
themePathInput->value(theme_path);
o->tooltip(_("Enter filename for file where theme is stored"));
}
{fltk::Button* o = browse_btn = new fltk::Button(270, 270, 25, 25, "...");
o->callback((fltk::Callback*)cb_browse_btn);
o->deactivate();
o->tooltip(_("Click here to choose theme"));
}
// {fltk::Divider* o = new fltk::Divider();
// o->resize(10,100,300,2);
// }
}
o->end();
}
{fltk::Group* o = new fltk::Group(0, 25, 305, 305, "&Resizing");
o->align(fltk::ALIGN_TOP|fltk::ALIGN_LEFT);
o->hide();
o->begin();
{fltk::CheckButton* o = animateButton = new fltk::CheckButton(10, 15, 295, 25, _("Animate size changes"));
o->set();
o->callback((fltk::Callback*)cb_animateButton);
o->value(animate);
o->tooltip(_("If you enable this option, maximize/minimize operations will be animated"));
}
{fltk::ValueSlider* o = animateSlider = new fltk::ValueSlider(70, 40, 225, 25, _("Speed:"));
o->type(fltk::ValueSlider::TICK_ABOVE);
o->box(fltk::DOWN_BOX);
o->textsize(10);
o->minimum(5);
o->maximum(20);
o->step(1);
o->value(14);
o->slider_size(8);
o->callback((fltk::Callback*)cb_animateSlider);
o->align(fltk::ALIGN_LEFT);
o->value(animate_speed);
if(animate) o->activate(); else o->deactivate();
o->tooltip(_("Set speed for animation when maximizing / minimizing windows"));
}
{fltk::Divider* o = new fltk::Divider();
o->resize(10,75,285,2);
}
{fltk::CheckButton* o = opaqueResize = new fltk::CheckButton(10, 85, 285, 25, "Show window content while resizing");
o->callback((fltk::Callback*)cb_opaqueResize);
o->value(opaque_resize);
o->tooltip(_("Enable if you want contents of windows to be redrawn as you resize window"));
}
o->end();
}
o->end();
}
// {fltk::Button* o = new fltk::Button(67, 337, 80, 25, "&OK");
// o->shortcut(0xff0d);
// o->callback((fltk::Callback*)cb_OK);
// }
{fltk::Button* o = applyButton = new fltk::Button(125, 350, 90, 25, _("&Apply"));
o->callback((fltk::Callback*)cb_Apply);
o->tooltip(_("Apply changes"));
}
{fltk::Button* o = new fltk::Button(225, 350, 90, 25, _("&Close"));
o->shortcut(0xff1b);
o->callback((fltk::Callback*)cb_Close);
o->tooltip(_("Close this window"));
}
o->end();
}
// Make sure that "Use theme" is active and standalone buttons inactive
// if theme is set - and vice versa
if (!theme_path || strlen(theme_path) < 2) // possibly just 1 space
useThemeButton->value(false);
else
useThemeButton->value(true);
cb_useThemeButton(useThemeButton, 0);
// above will activate Apply button, so we need to change it back
applyButton->deactivate();
conf_changed=false;
//useThemeButton->do_callback(FL_DIALOG_BTN);
w->show(argc, argv);
return fltk::run();
}