Added Remove(), Flush() and Set() D-Bus calls, related to XSETTINGS, in evoke.

Use Fl_Double_Window in ede-image-view, to prevent flickering when image gets resized.
This commit is contained in:
Sanel Zukan 2009-12-07 13:46:52 +00:00
parent 1915b1aca2
commit 31fbe5bc06
3 changed files with 135 additions and 21 deletions

View File

@ -11,7 +11,7 @@
*/ */
#include <Fl/Fl.H> #include <Fl/Fl.H>
#include <Fl/Fl_Window.H> #include <Fl/Fl_Double_Window.H>
#include <Fl/Fl_Button.H> #include <Fl/Fl_Button.H>
#include <Fl/Fl_Shared_Image.H> #include <Fl/Fl_Shared_Image.H>
#include <Fl/Fl_Scroll.H> #include <Fl/Fl_Scroll.H>
@ -46,7 +46,7 @@ const char* supported[] = {"bm","bmp","gif","jpg","pbm","pgm","png","ppm","xbm",
// Global variables used everywhere // Global variables used everywhere
char filename[FL_PATH_MAX], directory[FL_PATH_MAX]; char filename[FL_PATH_MAX], directory[FL_PATH_MAX];
Fl_Window* w; Fl_Double_Window* w;
float zoomfactor; float zoomfactor;
bool autozoom=false; bool autozoom=false;
Fl_Shared_Image *im; Fl_Shared_Image *im;
@ -404,7 +404,7 @@ int main (int argc, char **argv) {
// Main window // Main window
w = new Fl_Window(400, 200, _("View picture")); w = new Fl_Double_Window(400, 200, _("View picture"));
s = new ScrolledImage(0,0,400,200); s = new ScrolledImage(0,0,400,200);
s->color(33); s->color(33);
s->labelcolor(FL_WHITE); s->labelcolor(FL_WHITE);

View File

@ -172,6 +172,82 @@ static void handle_get_value(XSettingsData* mdata, const EdbusMessage* orig, Edb
} }
} }
static void handle_remove(Xsm* xsm, XSettingsData* mdata, const EdbusMessage* msg) {
if(msg->size() != 1)
return;
EdbusMessage::const_iterator it = msg->begin();
if(!(*it).is_string())
return;
/*
* just remove it, without reporting the status
* TODO: lock this
*/
xsettings_list_remove(&(mdata->settings), (*it).to_string());
xsm->notify();
}
static void handle_set(Xsm* xsm, XSettingsData* mdata, const EdbusMessage* orig, EdbusMessage& reply) {
if(orig->size() != 2) {
reply.create_error_reply(*orig, _("This function accepts two parameters"));
return;
}
EdbusMessage::const_iterator it = orig->begin();
if(!(*it).is_string()) {
reply.create_error_reply(*orig, _("First parameter must be a string"));
return;
}
const char* name = (*it).to_string();
/* figure out the type of second parameter and add it to the list */
++it;
if((*it).is_string()) {
xsm->set(name, (*it).to_string());
xsm->notify();
reply.create_reply(*orig);
reply << EdbusData::from_bool(true);
} else if((*it).is_int32()) {
xsm->set(name, (*it).to_int32());
xsm->notify();
reply.create_reply(*orig);
reply << EdbusData::from_bool(true);
} else if((*it).is_array()) {
EdbusList rgb_array = (*it).to_array();
/* RGBA array has 4 elements */
if(rgb_array.size() != 4) {
reply.create_error_reply(*orig, _("Color array must have 4 parameters"));
return;
}
EdbusList::const_iterator arr_it = rgb_array.begin();
unsigned short r, g, b, a;
r = g = b = a = 0;
r = (*arr_it).to_int32();
++arr_it;
g = (*arr_it).to_int32();
++arr_it;
b = (*arr_it).to_int32();
++arr_it;
a = (*arr_it).to_int32();
xsm->set(name, r, g, b, a);
xsm->notify();
reply.create_reply(*orig);
reply << EdbusData::from_bool(true);
} else {
reply.create_error_reply(*orig, _("Unknown value type. Only 3 types are allowed: string, int32 and array[int32]"));
}
}
static int xsettings_dbus_cb(const EdbusMessage* m, void* data) { static int xsettings_dbus_cb(const EdbusMessage* m, void* data) {
Xsm* x = (Xsm*)data; Xsm* x = (Xsm*)data;
XSettingsData* md = x->get_manager_data(); XSettingsData* md = x->get_manager_data();
@ -185,7 +261,7 @@ static int xsettings_dbus_cb(const EdbusMessage* m, void* data) {
return 1; return 1;
} }
/* string-array GetAll() */ /* string-array GetAll(void) */
if(strcmp(m->member(), "GetAll") == 0) { if(strcmp(m->member(), "GetAll") == 0) {
EdbusMessage reply; EdbusMessage reply;
handle_get_all(md, m, reply); handle_get_all(md, m, reply);
@ -195,7 +271,7 @@ static int xsettings_dbus_cb(const EdbusMessage* m, void* data) {
} }
/* [string|array|int] GetValue(string name) */ /* [string|array|int32] GetValue(string name) */
if(strcmp(m->member(), "GetValue") == 0) { if(strcmp(m->member(), "GetValue") == 0) {
EdbusMessage reply; EdbusMessage reply;
handle_get_value(md, m, reply); handle_get_value(md, m, reply);
@ -205,6 +281,27 @@ static int xsettings_dbus_cb(const EdbusMessage* m, void* data) {
} }
/* void Remove(string name) */
if(strcmp(m->member(), "Remove") == 0) {
handle_remove(x, md, m);
return 1;
}
/* void Flush(void) */
if(strcmp(m->member(), "Flush") == 0) {
x->save_serialized();
return 1;
}
/* bool Set(string name, [string|array|int32] value) */
if(strcmp(m->member(), "Set") == 0) {
EdbusMessage reply;
handle_set(x, md, m, reply);
x->get_dbus_connection()->send(reply);
return 1;
}
return 1; return 1;
} }
@ -235,19 +332,19 @@ Xsm::~Xsm() {
* workaround for missing functions to delete key/value pairs from xrdb (what was they thinking for??). * workaround for missing functions to delete key/value pairs from xrdb (what was they thinking for??).
*/ */
void Xsm::xresource_replace(void) { void Xsm::xresource_replace(void) {
// with inheritance we got manager_data /* with inheritance we got manager_data */
if(!manager_data->settings) if(!manager_data->settings)
return; return;
String home = dir_home(); String home = dir_home();
// try to open ~/.Xdefaults; if failed, X Resource will not complain /* try to open ~/.Xdefaults; if failed, X Resource will not complain */
String db_file = build_filename(home.c_str(), USER_XRESOURCE); String db_file = build_filename(home.c_str(), USER_XRESOURCE);
// initialize XResource manager /* initialize XResource manager */
XrmInitialize(); XrmInitialize();
// load XResource database /* load XResource database */
XrmDatabase db = XrmGetFileDatabase(db_file.c_str()); XrmDatabase db = XrmGetFileDatabase(db_file.c_str());
XSettingsSetting* s; XSettingsSetting* s;
@ -268,13 +365,13 @@ void Xsm::xresource_replace(void) {
if(!s) if(!s)
continue; continue;
// assure that XSETTINGS key is color type /* assure that XSETTINGS key is color type */
if(s->type != XSETTINGS_TYPE_COLOR) { if(s->type != XSETTINGS_TYPE_COLOR) {
E_WARNING(E_STRLOC ": Expected color type in %s, but it is not, skipping...\n", s->name); E_WARNING(E_STRLOC ": Expected color type in %s, but it is not, skipping...\n", s->name);
continue; continue;
} }
// check if resource is present /* check if resource is present */
status = XrmGetResource(db, resource_map[i].xresource_key, resource_map[i].xresource_klass, &type, &xrmv); status = XrmGetResource(db, resource_map[i].xresource_key, resource_map[i].xresource_klass, &type, &xrmv);
if(status && strcmp(type, "String") == 0) { if(status && strcmp(type, "String") == 0) {
@ -291,7 +388,7 @@ void Xsm::xresource_replace(void) {
int fltk_color = color_rgb_to_fltk(s->data.v_color.red, s->data.v_color.green, s->data.v_color.blue); int fltk_color = color_rgb_to_fltk(s->data.v_color.red, s->data.v_color.green, s->data.v_color.blue);
color_fltk_to_html(fltk_color, color_val); color_fltk_to_html(fltk_color, color_val);
// and save it /* and save it */
tmp.clear(); tmp.clear();
tmp.printf("%s.%s: %s", resource_map[i].xresource_klass, resource_map[i].xresource_key, color_val); tmp.printf("%s.%s: %s", resource_map[i].xresource_klass, resource_map[i].xresource_key, color_val);
XrmPutLineResource(&db, tmp.c_str()); XrmPutLineResource(&db, tmp.c_str());
@ -456,13 +553,17 @@ bool Xsm::save_serialized(void) {
int (*old_handler)(Display*, XErrorEvent*); int (*old_handler)(Display*, XErrorEvent*);
/* possible ? */ /* possible ? */
if(!manager_data->manager_win) E_RETURN_VAL_IF_FAIL(manager_data->manager_win, false);
return false;
/* manually fetch XSETTINGS encoded data, so we can pick whatever was externally set */
old_handler = XSetErrorHandler(ignore_xerrors); old_handler = XSetErrorHandler(ignore_xerrors);
result = XGetWindowProperty(manager_data->display, manager_data->manager_win, manager_data->xsettings_atom, result = XGetWindowProperty(manager_data->display,
0, LONG_MAX, False, manager_data->xsettings_atom, manager_data->manager_win,
&type, &format, &n_items, &bytes_after, (unsigned char**)&data); manager_data->xsettings_atom,
0, LONG_MAX, False,
manager_data->xsettings_atom,
&type, &format, &n_items, &bytes_after,
(unsigned char**)&data);
XSetErrorHandler(old_handler); XSetErrorHandler(old_handler);
if(result == Success && type != None) { if(result == Success && type != None) {
@ -475,8 +576,7 @@ bool Xsm::save_serialized(void) {
XFree(data); XFree(data);
} }
if(!settings) E_RETURN_VAL_IF_FAIL(settings, false);
return false;
#ifdef USE_LOCAL_CONFIG #ifdef USE_LOCAL_CONFIG
/* /*

View File

@ -8,7 +8,21 @@
# /org/freedesktop/Xsettings \ # /org/freedesktop/Xsettings \
# org.freedesktop.Xsettings.GetAll # org.freedesktop.Xsettings.GetAll
#dbus-send --session --print-reply --dest=org.equinoxproject.Xsettings \
# /org/freedesktop/Xsettings \
# org.freedesktop.Xsettings.GetValue \
# string:"Fltk/Background"
dbus-send --session --print-reply --dest=org.equinoxproject.Xsettings \ dbus-send --session --print-reply --dest=org.equinoxproject.Xsettings \
/org/freedesktop/Xsettings \ /org/freedesktop/Xsettings \
org.freedesktop.Xsettings.GetValue \ org.freedesktop.Xsettings.Set \
string:"Fltk/Background" string:"Sanel/Test" int32:34
#dbus-send --session --print-reply --dest=org.equinoxproject.Xsettings \
# /org/freedesktop/Xsettings \
# org.freedesktop.Xsettings.Flush
#dbus-send --session --print-reply --dest=org.equinoxproject.Xsettings \
# /org/freedesktop/Xsettings \
# org.freedesktop.Xsettings.Remove \
# string:"Bell/Pitch"