1
0
mirror of https://github.com/gryf/wmdocklib.git synced 2025-12-18 12:00:20 +01:00

Use XParseColor function form xlib rather than rgb.txt file.

This way it's possible to expose GetColor as pywmgeneral function.
This commit is contained in:
2025-06-08 17:42:34 +02:00
parent baae528274
commit f9869d2100
3 changed files with 34 additions and 53 deletions

View File

@@ -26,7 +26,6 @@ Some changes to handle the additional event handling in pywmgeneral
First workingish version
"""
import os
import re
from wmdocklib import pywmgeneral
@@ -36,11 +35,6 @@ charset_start = None
charset_width = None
MARKER = 'xxxxxxxxxxx'
RGB_FILE_LIST = ['/etc/X11/rgb.txt',
'/usr/lib/X11/rgb.txt',
'/usr/share/X11/rgb.txt',
'/usr/X11R6/lib/X11/rgb.txt',
'/usr/lib/X11/rgb.txt']
def get_font_char_size(font_name):
@@ -163,44 +157,12 @@ def get_event():
return pywmgeneral.check_for_events()
def get_color_code(color_name, rgb_fname=None):
"""Convert a color to rgb code usable in an xpm.
We use the file rgb_fname for looking up the colors. Return None if we
find no match. The rgb_fname should be like the one found in
/usr/lib/X11R6/rgb.txt on most systems.
"""
if color_name.startswith('#'):
return color_name
if rgb_fname is None:
for fn in RGB_FILE_LIST:
if os.access(fn, os.R_OK):
rgb_fname = fn
break
if rgb_fname is None:
raise ValueError('Cannot find RGB file')
with open(rgb_fname, 'r') as fobj:
lines = fobj.readlines()
for line in lines:
if line[0] != '!':
words = line.split()
if len(words) > 3:
name = ' '.join(words[3:])
if color_name.lower() == name.lower():
# Found the right color, get it's code
try:
r = int(words[0])
g = int(words[1])
b = int(words[2])
except ValueError:
continue
return f'#{r:02x}{g:02x}{b:02x}'
return None
def get_color_code(color_name):
"""Convert a color to rgb code usable in an xpm."""
color = pywmgeneral.get_color(color_name)
if color < 0:
return None
return f"#{color:06x}"
def get_unique_key(dict_to_check):

View File

@@ -61,6 +61,7 @@ GC NormalGC;
XpmIcon wmgen;
Pixmap pixmask;
Atom deleteAtom; /* Added 2003-06-24 for graceful shutdown. */
Display *display = NULL;
/*****************************************************************************/
/* The Python stuff */
@@ -245,6 +246,14 @@ pywmgeneral_checkForEvents(PyObject *self, PyObject *args) {
return Py_None;
}
static PyObject *
pywmgeneral_getColor(PyObject *self, PyObject *args) {
char *color_name;
if (!PyArg_ParseTuple(args, "s", &color_name))
return NULL;
return PyLong_FromLong((long) GetColor(color_name));
}
static PyMethodDef PyWmgeneralMethods[] = {
{"open_xwindow", pywmgeneral_openXwindow, METH_VARARGS,
"Open the X window containing everything."},
@@ -262,6 +271,8 @@ static PyMethodDef PyWmgeneralMethods[] = {
"Copy an area of the global XPM."},
{"check_for_events", pywmgeneral_checkForEvents, METH_VARARGS,
"Check for some Xevents"},
{"get_color", pywmgeneral_getColor, METH_VARARGS,
"Get X color code for the provided name."},
{NULL, NULL, 0, NULL}
};
@@ -446,7 +457,7 @@ MOUSE_REGION mouse_region[MAX_MOUSE_REGION];
/***********************/
static void GetXPM(XpmIcon *, char **);
static Pixel GetColor(char *);
unsigned long GetColor(char *);
void RedrawWindow(void);
void AddMouseRegion(int, int, int, int, int);
int CheckMouseRegion(int, int);
@@ -479,18 +490,25 @@ static void GetXPM(XpmIcon *wmgen, char *pixmap_bytes[]) {
|* GetColor *|
\*******************************************************************************/
static Pixel GetColor(char *name) {
unsigned long GetColor(char *name) {
XColor color;
XWindowAttributes attributes;
XColor color;
/* Open default display, if it is not opened already. This is needed for
* using this function before openXwindow is called, when display is
* initialized. This might select wrong X session, or segfault on not
* having DISPLAY env variable around, but meh. In context of this
* function this is best effort */
if (!display)
display = XOpenDisplay(NULL);
screen = DefaultScreen(display);
Colormap colormap = DefaultColormap(display, screen);
XGetWindowAttributes(display, Root, &attributes);
color.pixel = 0;
if (!XParseColor(display, attributes.colormap, name, &color)) {
if (!XParseColor(display, colormap, name, &color)) {
fprintf(stderr, "wm.app: can't parse %s.\n", name);
} else if (!XAllocColor(display, attributes.colormap, &color)) {
return -1;
} else if (!XAllocColor(display, colormap, &color)) {
fprintf(stderr, "wm.app: can't allocate %s.\n", name);
return -2;
}
return color.pixel;
}

View File

@@ -53,6 +53,7 @@ Display *display;
void AddMouseRegion(int index, int left, int top, int right, int bottom);
int CheckMouseRegion(int x, int y);
unsigned long GetColor(char *);
void openXwindow(int argc, char *argv[], char **, char *, int, int);
void RedrawWindow(void);