108 if (xSettings.size() < 12)
110 char byteOrder = xSettings.at(0);
111 if (byteOrder != XCB_IMAGE_ORDER_LSB_FIRST && byteOrder != XCB_IMAGE_ORDER_MSB_FIRST) {
112 qWarning(
"ByteOrder byte %d not 0 or 1", byteOrder);
116#define ADJUST_BO(b, t, x)
117 ((b == XCB_IMAGE_ORDER_LSB_FIRST) ?
118 qFromLittleEndian<t>(x) :
119 qFromBigEndian<t>(x))
120#define VALIDATE_LENGTH(x)
121 if ((size_t)xSettings.length() < (offset + local_offset + 12
+ x)) {
122 qWarning("Length %d runs past end of data", x);
126 uint number_of_settings =
ADJUST_BO(byteOrder, quint32, xSettings.mid(8,4).constData());
127 const char *data = xSettings.constData() + 12;
129 for (uint i = 0; i < number_of_settings; i++) {
130 int local_offset = 0;
132 XSettingsType type =
static_cast<XSettingsType>(*
reinterpret_cast<
const quint8 *>(data + offset));
136 quint16 name_len =
ADJUST_BO(byteOrder, quint16, data + offset + local_offset);
140 QByteArray name(data + offset + local_offset, name_len);
144 int last_change_serial =
ADJUST_BO(byteOrder, qint32, data + offset + local_offset);
145 Q_UNUSED(last_change_serial);
149 if (type == XSettingsTypeString) {
151 int value_length =
ADJUST_BO(byteOrder, qint32, data + offset + local_offset);
154 QByteArray value_string(data + offset + local_offset, value_length);
155 value.setValue(value_string);
157 }
else if (type == XSettingsTypeInteger) {
159 int value_length =
ADJUST_BO(byteOrder, qint32, data + offset + local_offset);
161 value.setValue(value_length);
162 }
else if (type == XSettingsTypeColor) {
164 quint16 red =
ADJUST_BO(byteOrder, quint16, data + offset + local_offset);
166 quint16 green =
ADJUST_BO(byteOrder, quint16, data + offset + local_offset);
168 quint16 blue =
ADJUST_BO(byteOrder, quint16, data + offset + local_offset);
170 quint16 alpha=
ADJUST_BO(byteOrder, quint16, data + offset + local_offset);
172 QColor color_value(red,green,blue,alpha);
173 value.setValue(color_value);
175 offset += local_offset;
176 settings[name].updateValue(screen,name,value,last_change_serial);