WPrefs.app: HotCornerShortcuts.c X11-free (RImage quadrant extraction)

Replaced XCreatePixmap/XCopyArea/XCreateGC/XFreeGC/XFreePixmap with
RImage-based quadrant extraction: RLoadImage → RGetSubImage for each
corner → WMCreatePixmapFromRImage → WMSetLabelImage.

panel->quarter[] changed from WMNativePixmap to WMPixmap*.
Cleanup uses WMReleasePixmap instead of XFreePixmap.
This commit is contained in:
Window Maker 2026-05-24 13:28:11 +02:00
parent f8a2ff12d0
commit fabf6c01b2
1 changed files with 33 additions and 44 deletions

View File

@ -32,7 +32,7 @@ typedef struct _Panel {
WMWidget *parent;
WMPixmap *icon;
WMNativePixmap quarter[4];
WMPixmap *quarter[4];
WMFrame *hcF;
WMButton *hcB;
@ -207,7 +207,7 @@ static void createPanel(Panel * p)
RImage *xis = NULL;
WMScreen *scr = WMWidgetScreen(panel->parent);
RContext *rc = WMScreenRContext(scr);
GC gc = XCreateGC(scr->display, WMWidgetXID(panel->parent), 0, NULL);
path = LocateImage(ICON_FILE);
if (path) {
@ -350,15 +350,19 @@ static void createPanel(Panel * p)
CreateImages(scr, rc, xis, ICON_FILE, &panel->icon, NULL);
if (panel->icon)
{
WMPixmap *nicon;
char *iconpath = LocateImage(ICON_FILE);
RImage *iconimg = iconpath ? RLoadImage(rc, iconpath, 0) : NULL;
if (iconpath) wfree(iconpath);
panel->quarter[0] = XCreatePixmap(scr->display, WMWidgetXID(panel->parent), panel->icon->width/2, panel->icon->height/2, WMScreenDepth(scr));
XCopyArea(scr->display, WMGetPixmapXID(panel->icon), panel->quarter[0], gc, 0, 0, panel->icon->width/2, panel->icon->height/2, 0, 0);
nicon = WMCreatePixmapFromXPixmaps(scr, panel->quarter[0], WMGetPixmapMaskXID(panel->icon),
panel->icon->width/2, panel->icon->height/2, WMScreenDepth(scr));
WMSetLabelImage(panel->icornerL, nicon);
WMReleasePixmap(nicon);
}
if (iconimg) {
int hw = iconimg->width / 2;
int hh = iconimg->height / 2;
RImage *q;
q = RGetSubImage(iconimg, 0, 0, hw, hh);
panel->quarter[0] = q ? WMCreatePixmapFromRImage(scr, q, 128) : NULL;
if (q) RReleaseImage(q);
WMSetLabelImage(panel->icornerL, panel->quarter[0]);
panel->hcactionsT[0] = WMCreateTextField(panel->hcactionsF);
WMResizeWidget(panel->hcactionsT[0], 180, 20);
@ -368,17 +372,11 @@ static void createPanel(Panel * p)
WMResizeWidget(panel->icornerL, 24, 24);
WMMoveWidget(panel->icornerL, 10, 48);
WMSetLabelImagePosition(panel->icornerL, WIPImageOnly);
if (panel->icon)
{
WMPixmap *nicon;
panel->quarter[1] = XCreatePixmap(scr->display, WMWidgetXID(panel->parent), panel->icon->width/2, panel->icon->height/2, WMScreenDepth(scr));
XCopyArea(scr->display, WMGetPixmapXID(panel->icon), panel->quarter[1], gc, panel->icon->width/2, 0, panel->icon->width/2, panel->icon->height/2, 0, 0);
nicon = WMCreatePixmapFromXPixmaps(scr, panel->quarter[1], WMGetPixmapMaskXID(panel->icon),
panel->icon->width/2, panel->icon->height/2, WMScreenDepth(scr));
WMSetLabelImage(panel->icornerL, nicon);
WMReleasePixmap(nicon);
}
q = RGetSubImage(iconimg, hw, 0, hw, hh);
panel->quarter[1] = q ? WMCreatePixmapFromRImage(scr, q, 128) : NULL;
if (q) RReleaseImage(q);
WMSetLabelImage(panel->icornerL, panel->quarter[1]);
panel->hcactionsT[1] = WMCreateTextField(panel->hcactionsF);
WMResizeWidget(panel->hcactionsT[1], 180, 20);
@ -388,17 +386,12 @@ static void createPanel(Panel * p)
WMResizeWidget(panel->icornerL, 24, 24);
WMMoveWidget(panel->icornerL, 10, 78);
WMSetLabelImagePosition(panel->icornerL, WIPImageOnly);
if (panel->icon)
{
WMPixmap *nicon;
panel->quarter[2] = XCreatePixmap(scr->display, WMWidgetXID(panel->parent), panel->icon->width/2, panel->icon->height/2, WMScreenDepth(scr));
XCopyArea(scr->display, WMGetPixmapXID(panel->icon), panel->quarter[2], gc, 0, panel->icon->height/2, panel->icon->width/2, panel->icon->height/2, 0, 0);
nicon = WMCreatePixmapFromXPixmaps(scr, panel->quarter[2], WMGetPixmapMaskXID(panel->icon),
panel->icon->width/2, panel->icon->height/2, WMScreenDepth(scr));
WMSetLabelImage(panel->icornerL, nicon);
WMReleasePixmap(nicon);
}
q = RGetSubImage(iconimg, 0, hh, hw, hh);
panel->quarter[2] = q ? WMCreatePixmapFromRImage(scr, q, 128) : NULL;
if (q) RReleaseImage(q);
WMSetLabelImage(panel->icornerL, panel->quarter[2]);
panel->hcactionsT[2] = WMCreateTextField(panel->hcactionsF);
WMResizeWidget(panel->hcactionsT[2], 180, 20);
WMMoveWidget(panel->hcactionsT[2], 50, 80);
@ -407,27 +400,24 @@ static void createPanel(Panel * p)
WMResizeWidget(panel->icornerL, 24, 24);
WMMoveWidget(panel->icornerL, 10, 108);
WMSetLabelImagePosition(panel->icornerL, WIPImageOnly);
if (panel->icon)
{
WMPixmap *nicon;
panel->quarter[3] = XCreatePixmap(scr->display, WMWidgetXID(panel->parent), panel->icon->width/2, panel->icon->height/2, WMScreenDepth(scr));
XCopyArea(scr->display, WMGetPixmapXID(panel->icon), panel->quarter[3], gc, panel->icon->width/2, panel->icon->height/2, panel->icon->width/2, panel->icon->height/2, 0, 0);
nicon = WMCreatePixmapFromXPixmaps(scr, panel->quarter[3], WMGetPixmapMaskXID(panel->icon),
panel->icon->width/2, panel->icon->height/2, WMScreenDepth(scr));
WMSetLabelImage(panel->icornerL, nicon);
WMReleasePixmap(nicon);
}
q = RGetSubImage(iconimg, hw, hh, hw, hh);
panel->quarter[3] = q ? WMCreatePixmapFromRImage(scr, q, 128) : NULL;
if (q) RReleaseImage(q);
WMSetLabelImage(panel->icornerL, panel->quarter[3]);
panel->hcactionsT[3] = WMCreateTextField(panel->hcactionsF);
WMResizeWidget(panel->hcactionsT[3], 180, 20);
WMMoveWidget(panel->hcactionsT[3], 50, 107);
RReleaseImage(iconimg);
}
}
WMMapSubwidgets(panel->hcactionsF);
if (xis)
RReleaseImage(xis);
XFreeGC(scr->display, gc);
WMRealizeWidget(panel->box);
WMMapSubwidgets(panel->box);
@ -437,11 +427,10 @@ static void createPanel(Panel * p)
static void prepareForClose(_Panel *panel)
{
int i;
WMScreen *scr = WMWidgetScreen(panel->parent);
WMReleasePixmap(panel->icon);
for (i = 0; i < sizeof(panel->quarter) / sizeof(WMNativePixmap); i++)
XFreePixmap(scr->display, panel->quarter[i]);
for (i = 0; i < 4; i++)
if (panel->quarter[i]) WMReleasePixmap(panel->quarter[i]);
}
Panel *InitHotCornerShortcuts(WMWidget *parent)