mirror of
https://github.com/edeproject/ede.git
synced 2023-08-10 21:13:03 +03:00
Added D-Bus interface for querying XSETTINGS data.
This commit is contained in:
parent
1031cdb68e
commit
1915b1aca2
158
evoke/Xsm.cpp
158
evoke/Xsm.cpp
@ -25,6 +25,8 @@
|
|||||||
#include <edelib/XSettingsCommon.h>
|
#include <edelib/XSettingsCommon.h>
|
||||||
#include <edelib/File.h>
|
#include <edelib/File.h>
|
||||||
#include <edelib/Resource.h>
|
#include <edelib/Resource.h>
|
||||||
|
#include <edelib/Nls.h>
|
||||||
|
#include <edelib/EdbusList.h>
|
||||||
|
|
||||||
#include "Xsm.h"
|
#include "Xsm.h"
|
||||||
|
|
||||||
@ -38,6 +40,11 @@ EDELIB_NS_USING(String)
|
|||||||
EDELIB_NS_USING(Resource)
|
EDELIB_NS_USING(Resource)
|
||||||
EDELIB_NS_USING(XSettingsSetting)
|
EDELIB_NS_USING(XSettingsSetting)
|
||||||
EDELIB_NS_USING(XSettingsList)
|
EDELIB_NS_USING(XSettingsList)
|
||||||
|
|
||||||
|
EDELIB_NS_USING(EdbusMessage)
|
||||||
|
EDELIB_NS_USING(EdbusData)
|
||||||
|
EDELIB_NS_USING(EdbusList)
|
||||||
|
|
||||||
EDELIB_NS_USING(dir_home)
|
EDELIB_NS_USING(dir_home)
|
||||||
EDELIB_NS_USING(file_remove)
|
EDELIB_NS_USING(file_remove)
|
||||||
EDELIB_NS_USING(file_rename)
|
EDELIB_NS_USING(file_rename)
|
||||||
@ -51,6 +58,7 @@ EDELIB_NS_USING(color_fltk_to_html)
|
|||||||
EDELIB_NS_USING(XSETTINGS_TYPE_COLOR)
|
EDELIB_NS_USING(XSETTINGS_TYPE_COLOR)
|
||||||
EDELIB_NS_USING(XSETTINGS_TYPE_INT)
|
EDELIB_NS_USING(XSETTINGS_TYPE_INT)
|
||||||
EDELIB_NS_USING(XSETTINGS_TYPE_STRING)
|
EDELIB_NS_USING(XSETTINGS_TYPE_STRING)
|
||||||
|
EDELIB_NS_USING(EDBUS_SESSION)
|
||||||
|
|
||||||
struct ResourceMap {
|
struct ResourceMap {
|
||||||
const char* name;
|
const char* name;
|
||||||
@ -75,11 +83,134 @@ static int ignore_xerrors(Display* display, XErrorEvent* xev) {
|
|||||||
return True;
|
return True;
|
||||||
}
|
}
|
||||||
|
|
||||||
Xsm::Xsm() {
|
static void handle_get_type(XSettingsData* mdata, const EdbusMessage* orig, EdbusMessage& reply) {
|
||||||
|
if(orig->size() != 1) {
|
||||||
|
reply.create_error_reply(*orig, _("This function accepts only one parameter"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
EdbusMessage::const_iterator it = orig->begin();
|
||||||
|
if(!(*it).is_string()) {
|
||||||
|
reply.create_error_reply(*orig, _("Parameter must be a string"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
XSettingsSetting* s = xsettings_list_find(mdata->settings, (*it).to_string());
|
||||||
|
if(!s) {
|
||||||
|
reply.create_error_reply(*orig, _("Requested setting wasn't found"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
reply.create_reply(*orig);
|
||||||
|
switch(s->type) {
|
||||||
|
case XSETTINGS_TYPE_STRING:
|
||||||
|
reply << EdbusData::from_string("string");
|
||||||
|
break;
|
||||||
|
case XSETTINGS_TYPE_INT:
|
||||||
|
reply << EdbusData::from_string("int");
|
||||||
|
break;
|
||||||
|
case XSETTINGS_TYPE_COLOR:
|
||||||
|
reply << EdbusData::from_string("color");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
E_FATAL("Received unknown XSETTINGS type!\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void handle_get_all(XSettingsData* mdata, const EdbusMessage* orig, EdbusMessage& reply) {
|
||||||
|
reply.create_reply(*orig);
|
||||||
|
|
||||||
|
EdbusList array = EdbusList::create_array();
|
||||||
|
XSettingsList* iter = mdata->settings;
|
||||||
|
|
||||||
|
while(iter) {
|
||||||
|
array << EdbusData::from_string(iter->setting->name);
|
||||||
|
iter = iter->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
reply << EdbusData::from_array(array);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void handle_get_value(XSettingsData* mdata, const EdbusMessage* orig, EdbusMessage& reply) {
|
||||||
|
if(orig->size() != 1) {
|
||||||
|
reply.create_error_reply(*orig, _("This function accepts only one parameter"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
EdbusMessage::const_iterator it = orig->begin();
|
||||||
|
if(!(*it).is_string()) {
|
||||||
|
reply.create_error_reply(*orig, _("Parameter must be a string"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
XSettingsSetting* s = xsettings_list_find(mdata->settings, (*it).to_string());
|
||||||
|
if(!s) {
|
||||||
|
reply.create_error_reply(*orig, _("Requested setting wasn't found"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
reply.create_reply(*orig);
|
||||||
|
switch(s->type) {
|
||||||
|
case XSETTINGS_TYPE_STRING:
|
||||||
|
reply << EdbusData::from_string(s->data.v_string);
|
||||||
|
break;
|
||||||
|
case XSETTINGS_TYPE_INT:
|
||||||
|
reply << EdbusData::from_int32(s->data.v_int);
|
||||||
|
break;
|
||||||
|
case XSETTINGS_TYPE_COLOR: {
|
||||||
|
EdbusList rgb_array = EdbusList::create_array();
|
||||||
|
rgb_array << EdbusData::from_int32(s->data.v_color.red);
|
||||||
|
rgb_array << EdbusData::from_int32(s->data.v_color.green);
|
||||||
|
rgb_array << EdbusData::from_int32(s->data.v_color.blue);
|
||||||
|
rgb_array << EdbusData::from_int32(s->data.v_color.alpha);
|
||||||
|
|
||||||
|
reply << EdbusData::from_array(rgb_array);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
E_FATAL("Received unknown XSETTINGS type!\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int xsettings_dbus_cb(const EdbusMessage* m, void* data) {
|
||||||
|
Xsm* x = (Xsm*)data;
|
||||||
|
XSettingsData* md = x->get_manager_data();
|
||||||
|
|
||||||
|
/* string GetType(string name) */
|
||||||
|
if(strcmp(m->member(), "GetType") == 0) {
|
||||||
|
EdbusMessage reply;
|
||||||
|
handle_get_type(md, m, reply);
|
||||||
|
|
||||||
|
x->get_dbus_connection()->send(reply);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* string-array GetAll() */
|
||||||
|
if(strcmp(m->member(), "GetAll") == 0) {
|
||||||
|
EdbusMessage reply;
|
||||||
|
handle_get_all(md, m, reply);
|
||||||
|
|
||||||
|
x->get_dbus_connection()->send(reply);
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* [string|array|int] GetValue(string name) */
|
||||||
|
if(strcmp(m->member(), "GetValue") == 0) {
|
||||||
|
EdbusMessage reply;
|
||||||
|
handle_get_value(md, m, reply);
|
||||||
|
|
||||||
|
x->get_dbus_connection()->send(reply);
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Xsm::~Xsm() {
|
Xsm::~Xsm() {
|
||||||
E_DEBUG(E_STRLOC ": Xsm::~Xsm()\n");
|
E_DEBUG(E_STRLOC ": Xsm::~Xsm()\n");
|
||||||
|
delete dbus_conn;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -201,6 +332,30 @@ void Xsm::xresource_undo(void) {
|
|||||||
file_remove(db_file.c_str());
|
file_remove(db_file.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Xsm::xsettings_dbus_serve(void) {
|
||||||
|
E_RETURN_IF_FAIL(!dbus_conn);
|
||||||
|
|
||||||
|
EdbusConnection* d = new EdbusConnection;
|
||||||
|
|
||||||
|
if(!d->connect(EDBUS_SESSION)) {
|
||||||
|
E_WARNING(E_STRLOC ": Unable to connecto to session bus. XSETTINGS will not be served via D-Bus\n");
|
||||||
|
delete d;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!d->request_name("org.equinoxproject.Xsettings")) {
|
||||||
|
E_WARNING(E_STRLOC ": Unable to request 'org.equinoxproject.Xsettings' name\n");
|
||||||
|
delete d;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
d->register_object("/org/equinoxproject/Xsettings");
|
||||||
|
d->method_callback(xsettings_dbus_cb, this);
|
||||||
|
|
||||||
|
d->setup_listener_with_fltk();
|
||||||
|
dbus_conn = d;
|
||||||
|
}
|
||||||
|
|
||||||
bool Xsm::load_serialized(void) {
|
bool Xsm::load_serialized(void) {
|
||||||
#ifdef USE_LOCAL_CONFIG
|
#ifdef USE_LOCAL_CONFIG
|
||||||
/*
|
/*
|
||||||
@ -286,6 +441,7 @@ bool Xsm::load_serialized(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
xresource_replace();
|
xresource_replace();
|
||||||
|
xsettings_dbus_serve();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
36
evoke/Xsm.h
36
evoke/Xsm.h
@ -14,23 +14,39 @@
|
|||||||
#define __XSM_H__
|
#define __XSM_H__
|
||||||
|
|
||||||
#include <edelib/XSettingsManager.h>
|
#include <edelib/XSettingsManager.h>
|
||||||
|
#include <edelib/EdbusConnection.h>
|
||||||
|
|
||||||
/*
|
EDELIB_NS_USING(EdbusConnection)
|
||||||
* XSETTINGS manager with serialization capability.
|
EDELIB_NS_USING(XSettingsData)
|
||||||
* Also it will write/undo to xrdb (X Resource database).
|
|
||||||
*/
|
/* XSETTINGS manager with serialization capability. Also it will write/undo to xrdb (X Resource database). */
|
||||||
class Xsm : public edelib::XSettingsManager {
|
class Xsm : public edelib::XSettingsManager {
|
||||||
public:
|
private:
|
||||||
Xsm();
|
EdbusConnection* dbus_conn;
|
||||||
~Xsm();
|
|
||||||
|
|
||||||
bool load_serialized(void);
|
|
||||||
bool save_serialized(void);
|
|
||||||
|
|
||||||
/* replace XResource values from one from XSETTINGS */
|
/* replace XResource values from one from XSETTINGS */
|
||||||
void xresource_replace(void);
|
void xresource_replace(void);
|
||||||
|
|
||||||
/* undo old XResource values */
|
/* undo old XResource values */
|
||||||
void xresource_undo(void);
|
void xresource_undo(void);
|
||||||
|
|
||||||
|
/* serve XSETTINGS via D-Bus */
|
||||||
|
void xsettings_dbus_serve(void);
|
||||||
|
public:
|
||||||
|
Xsm() : dbus_conn(NULL) { }
|
||||||
|
~Xsm();
|
||||||
|
|
||||||
|
/* return loaded D-Bus connection */
|
||||||
|
EdbusConnection* get_dbus_connection(void) { return dbus_conn; }
|
||||||
|
|
||||||
|
/* access to manager content */
|
||||||
|
XSettingsData* get_manager_data(void) { return manager_data; }
|
||||||
|
|
||||||
|
/* load stored settings */
|
||||||
|
bool load_serialized(void);
|
||||||
|
|
||||||
|
/* store known settings */
|
||||||
|
bool save_serialized(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
14
evoke/test-dbus.sh
Normal file
14
evoke/test-dbus.sh
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
#dbus-send --session --print-reply --dest=org.equinoxproject.Xsettings \
|
||||||
|
# /org/freedesktop/Xsettings \
|
||||||
|
# org.freedesktop.Xsettings.GetType \
|
||||||
|
# string:"Gtk/CanChangeAccels"
|
||||||
|
|
||||||
|
#dbus-send --session --print-reply --dest=org.equinoxproject.Xsettings \
|
||||||
|
# /org/freedesktop/Xsettings \
|
||||||
|
# org.freedesktop.Xsettings.GetAll
|
||||||
|
|
||||||
|
dbus-send --session --print-reply --dest=org.equinoxproject.Xsettings \
|
||||||
|
/org/freedesktop/Xsettings \
|
||||||
|
org.freedesktop.Xsettings.GetValue \
|
||||||
|
string:"Fltk/Background"
|
Loading…
Reference in New Issue
Block a user