mirror of
https://github.com/edeproject/ede.git
synced 2023-08-10 21:13:03 +03:00
Application icon support in taskbar button
This commit is contained in:
parent
8711d6c593
commit
bd5dbb7ed9
@ -3,6 +3,9 @@
|
|||||||
#include <FL/Fl.H>
|
#include <FL/Fl.H>
|
||||||
#include <FL/Fl_Pixmap.H>
|
#include <FL/Fl_Pixmap.H>
|
||||||
#include <FL/fl_draw.H>
|
#include <FL/fl_draw.H>
|
||||||
|
#include <FL/x.H>
|
||||||
|
#include <FL/Fl_RGB_Image.H>
|
||||||
|
|
||||||
#include <edelib/Debug.h>
|
#include <edelib/Debug.h>
|
||||||
#include <edelib/Nls.h>
|
#include <edelib/Nls.h>
|
||||||
#include <edelib/MenuItem.h>
|
#include <edelib/MenuItem.h>
|
||||||
@ -13,6 +16,9 @@
|
|||||||
#include "Taskbar.h"
|
#include "Taskbar.h"
|
||||||
#include "icons/window.xpm"
|
#include "icons/window.xpm"
|
||||||
|
|
||||||
|
#define TASKBUTTON_ICON_W 16
|
||||||
|
#define TASKBUTTON_ICON_H 16
|
||||||
|
|
||||||
EDELIB_NS_USING(MenuItem)
|
EDELIB_NS_USING(MenuItem)
|
||||||
EDELIB_NS_USING(IconLoader)
|
EDELIB_NS_USING(IconLoader)
|
||||||
EDELIB_NS_USING(ICON_SIZE_TINY)
|
EDELIB_NS_USING(ICON_SIZE_TINY)
|
||||||
@ -87,6 +93,7 @@ TaskButton::TaskButton(int X, int Y, int W, int H, const char *l) : Fl_Button(X,
|
|||||||
menu_[3].image((Fl_Image*)img);
|
menu_[3].image((Fl_Image*)img);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
net_wm_icon = XInternAtom(fl_display, "_NET_WM_ICON", False);
|
||||||
image(image_window);
|
image(image_window);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -161,3 +168,77 @@ void TaskButton::update_title_from_xid(void) {
|
|||||||
free(title);
|
free(title);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* stolen from pekwm */
|
||||||
|
void TaskButton::update_image_from_xid(void) {
|
||||||
|
E_RETURN_IF_FAIL(xid >= 0);
|
||||||
|
|
||||||
|
Atom real;
|
||||||
|
int format;
|
||||||
|
unsigned long n, extra;
|
||||||
|
unsigned char *prop = 0;
|
||||||
|
long len = 2;
|
||||||
|
|
||||||
|
int status = XGetWindowProperty(fl_display, xid,
|
||||||
|
net_wm_icon , 0L, len, False, XA_CARDINAL, &real, &format, &n, &extra, (unsigned char**)&prop);
|
||||||
|
|
||||||
|
if((status != Success) || (real != XA_CARDINAL)) {
|
||||||
|
if(prop) XFree(prop);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
long *data = (long*)prop;
|
||||||
|
unsigned int width, height;
|
||||||
|
|
||||||
|
width = data[0];
|
||||||
|
height = data[1];
|
||||||
|
XFree(prop);
|
||||||
|
|
||||||
|
len += width * height;
|
||||||
|
|
||||||
|
format = 0;
|
||||||
|
prop = 0;
|
||||||
|
real = 0;
|
||||||
|
|
||||||
|
status = XGetWindowProperty(fl_display, xid,
|
||||||
|
net_wm_icon , 0L, len, False, XA_CARDINAL, &real, &format, &n, &extra, (unsigned char**)&prop);
|
||||||
|
|
||||||
|
if((status != Success) || (real != XA_CARDINAL)) {
|
||||||
|
if(prop) XFree(prop);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
data = (long*)prop;
|
||||||
|
|
||||||
|
unsigned char *img_data = new unsigned char[width * height * 4];
|
||||||
|
unsigned char *ptr = img_data;
|
||||||
|
int pixel;
|
||||||
|
|
||||||
|
for(int i = 2; i < len; i++) {
|
||||||
|
pixel = data[i];
|
||||||
|
|
||||||
|
*ptr++ = pixel >> 16 & 0xff;
|
||||||
|
*ptr++ = pixel >> 8 & 0xff;
|
||||||
|
*ptr++ = pixel & 0xff;
|
||||||
|
*ptr++ = pixel >> 24 & 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
XFree(prop);
|
||||||
|
|
||||||
|
Fl_RGB_Image *img = new Fl_RGB_Image(img_data, width, height, 4);
|
||||||
|
img->alloc_array = 1;
|
||||||
|
|
||||||
|
/* some safety, scale it if needed */
|
||||||
|
if((width > TASKBUTTON_ICON_W) || (height > TASKBUTTON_ICON_H)) {
|
||||||
|
width = (width > TASKBUTTON_ICON_W) ? TASKBUTTON_ICON_W : width;
|
||||||
|
height = (height > TASKBUTTON_ICON_H) ? TASKBUTTON_ICON_H : height;
|
||||||
|
|
||||||
|
/* safe casting */
|
||||||
|
Fl_RGB_Image *scaled = (Fl_RGB_Image*)img->copy(width, height);
|
||||||
|
delete img;
|
||||||
|
|
||||||
|
img = scaled;
|
||||||
|
}
|
||||||
|
|
||||||
|
image(img);
|
||||||
|
}
|
||||||
|
@ -8,6 +8,7 @@ class TaskButton : public Fl_Button {
|
|||||||
private:
|
private:
|
||||||
/* window ID this button handles */
|
/* window ID this button handles */
|
||||||
Window xid;
|
Window xid;
|
||||||
|
Atom net_wm_icon;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TaskButton(int X, int Y, int W, int H, const char *l = 0);
|
TaskButton(int X, int Y, int W, int H, const char *l = 0);
|
||||||
@ -19,6 +20,7 @@ public:
|
|||||||
Window get_window_xid(void) { return xid; }
|
Window get_window_xid(void) { return xid; }
|
||||||
|
|
||||||
void update_title_from_xid(void);
|
void update_title_from_xid(void);
|
||||||
|
void update_image_from_xid(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -119,6 +119,7 @@ void Taskbar::create_task_buttons(void) {
|
|||||||
b = new TaskButton(0, 0, DEFAULT_CHILD_W, 25);
|
b = new TaskButton(0, 0, DEFAULT_CHILD_W, 25);
|
||||||
b->set_window_xid(wins[i]);
|
b->set_window_xid(wins[i]);
|
||||||
b->update_title_from_xid();
|
b->update_title_from_xid();
|
||||||
|
b->update_image_from_xid();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* catch the name changes
|
* catch the name changes
|
||||||
|
Loading…
x
Reference in New Issue
Block a user