Commit babda8e2 authored by lorthiois@bbsoft.fr's avatar lorthiois@bbsoft.fr

support skip_taskbar by Andreas.Fink85

git-svn-id: http://tint2.googlecode.com/svn/trunk@169 121b4492-b84c-0410-8b4c-0d4edfb3f3cc
parent a17b62f7
2009-09-07
- fixed issue 117 : support skip_taskbar by Andreas.Fink85
- cleanup : switch space to tab
2009-09-01
- fixed segfault
......
......@@ -94,9 +94,9 @@ void init_battery()
}
FILE *fp;
Panel *panel;
Battery *battery;
int i, bat_percentage_height, bat_percentage_height_ink, bat_time_height, bat_time_height_ink;
Panel *panel;
Battery *battery;
int i, bat_percentage_height, bat_percentage_height_ink, bat_time_height, bat_time_height_ink;
for (i=0 ; i < nb_panel ; i++) {
panel = &panel1[i];
......@@ -268,7 +268,7 @@ void draw_battery (void *obj, cairo_t *c, int active)
void resize_battery(void *obj)
{
Battery *battery = obj;
Battery *battery = obj;
PangoLayout *layout;
int percentage_width, time_width, new_width;
......
......@@ -56,9 +56,9 @@ void init_precision()
void init_clock()
{
Panel *panel;
Clock *clock;
int i, time_height, time_height_ink, date_height, date_height_ink;
Panel *panel;
Clock *clock;
int i, time_height, time_height_ink, date_height, date_height_ink;
init_precision();
// update clock to force update (-time_precision)
......@@ -68,8 +68,8 @@ void init_clock()
time_clock.tv_sec -= time_clock.tv_sec % time_precision;
for (i=0 ; i < nb_panel ; i++) {
panel = &panel1[i];
clock = &panel->clock;
panel = &panel1[i];
clock = &panel->clock;
if (!clock->area.on_screen) continue;
......@@ -114,64 +114,64 @@ void init_clock()
void draw_clock (void *obj, cairo_t *c, int active)
{
Clock *clock = obj;
PangoLayout *layout;
Clock *clock = obj;
PangoLayout *layout;
layout = pango_cairo_create_layout (c);
layout = pango_cairo_create_layout (c);
// draw layout
pango_layout_set_font_description (layout, time1_font_desc);
pango_layout_set_width (layout, clock->area.width * PANGO_SCALE);
pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
pango_layout_set_text (layout, buf_time, strlen(buf_time));
// draw layout
pango_layout_set_font_description (layout, time1_font_desc);
pango_layout_set_width (layout, clock->area.width * PANGO_SCALE);
pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
pango_layout_set_text (layout, buf_time, strlen(buf_time));
cairo_set_source_rgba (c, clock->font.color[0], clock->font.color[1], clock->font.color[2], clock->font.alpha);
cairo_set_source_rgba (c, clock->font.color[0], clock->font.color[1], clock->font.color[2], clock->font.alpha);
pango_cairo_update_layout (c, layout);
cairo_move_to (c, 0, clock->time1_posy);
pango_cairo_show_layout (c, layout);
pango_cairo_update_layout (c, layout);
cairo_move_to (c, 0, clock->time1_posy);
pango_cairo_show_layout (c, layout);
if (time2_format) {
pango_layout_set_font_description (layout, time2_font_desc);
pango_layout_set_indent(layout, 0);
pango_layout_set_text (layout, buf_date, strlen(buf_date));
pango_layout_set_width (layout, clock->area.width * PANGO_SCALE);
if (time2_format) {
pango_layout_set_font_description (layout, time2_font_desc);
pango_layout_set_indent(layout, 0);
pango_layout_set_text (layout, buf_date, strlen(buf_date));
pango_layout_set_width (layout, clock->area.width * PANGO_SCALE);
pango_cairo_update_layout (c, layout);
cairo_move_to (c, 0, clock->time2_posy);
pango_cairo_show_layout (c, layout);
}
pango_cairo_update_layout (c, layout);
cairo_move_to (c, 0, clock->time2_posy);
pango_cairo_show_layout (c, layout);
}
g_object_unref (layout);
g_object_unref (layout);
}
void resize_clock (void *obj)
{
Clock *clock = obj;
PangoLayout *layout;
int time_width, date_width, new_width;
Clock *clock = obj;
PangoLayout *layout;
int time_width, date_width, new_width;
clock->area.redraw = 1;
time_width = date_width = 0;
strftime(buf_time, sizeof(buf_time), time1_format, localtime(&time_clock.tv_sec));
if (time2_format)
strftime(buf_date, sizeof(buf_date), time2_format, localtime(&time_clock.tv_sec));
clock->area.redraw = 1;
time_width = date_width = 0;
strftime(buf_time, sizeof(buf_time), time1_format, localtime(&time_clock.tv_sec));
if (time2_format)
strftime(buf_date, sizeof(buf_date), time2_format, localtime(&time_clock.tv_sec));
// vertical panel doen't adjust width
if (!panel_horizontal) return;
//printf(" resize_clock\n");
cairo_surface_t *cs;
cairo_t *c;
//printf(" resize_clock\n");
cairo_surface_t *cs;
cairo_t *c;
Pixmap pmap;
pmap = XCreatePixmap (server.dsp, server.root_win, clock->area.width, clock->area.height, server.depth);
cs = cairo_xlib_surface_create (server.dsp, pmap, server.visual, clock->area.width, clock->area.height);
c = cairo_create (cs);
layout = pango_cairo_create_layout (c);
cs = cairo_xlib_surface_create (server.dsp, pmap, server.visual, clock->area.width, clock->area.height);
c = cairo_create (cs);
layout = pango_cairo_create_layout (c);
// check width
// check width
pango_layout_set_font_description (layout, time1_font_desc);
pango_layout_set_indent(layout, 0);
pango_layout_set_text (layout, buf_time, strlen(buf_time));
......@@ -187,28 +187,28 @@ void resize_clock (void *obj)
else new_width = date_width;
new_width += (2*clock->area.paddingxlr) + (2*clock->area.pix.border.width);
if (new_width > clock->area.width || new_width < (clock->area.width-6)) {
Panel *panel = ((Area*)obj)->panel;
if (new_width > clock->area.width || new_width < (clock->area.width-6)) {
Panel *panel = ((Area*)obj)->panel;
// resize clock
// we try to limit the number of resize
// printf("clock_width %d, new_width %d\n", clock->area.width, new_width);
// resize clock
// we try to limit the number of resize
// printf("clock_width %d, new_width %d\n", clock->area.width, new_width);
clock->area.width = new_width + 1;
clock->area.posx = panel->area.width - clock->area.width - panel->area.paddingxlr - panel->area.pix.border.width;
// resize other objects on panel
// resize other objects on panel
panel->area.resize = 1;
#ifdef ENABLE_BATTERY
panel->battery.area.resize = 1;
#endif
systray.area.resize = 1;
panel_refresh = 1;
}
}
g_object_unref (layout);
cairo_destroy (c);
cairo_surface_destroy (cs);
XFreePixmap (server.dsp, pmap);
g_object_unref (layout);
cairo_destroy (c);
cairo_surface_destroy (cs);
XFreePixmap (server.dsp, pmap);
}
......
This diff is collapsed.
......@@ -69,21 +69,21 @@ void init_panel()
p->area.parent = p;
p->area.panel = p;
p->area.on_screen = 1;
p->area.resize = 1;
p->area.resize = 1;
p->area._resize = resize_panel;
p->g_taskbar.parent = p;
p->g_taskbar.panel = p;
p->g_task.area.panel = p;
// add childs
if (p->clock.area.on_screen)
if (p->clock.area.on_screen)
p->area.list = g_slist_append(p->area.list, &p->clock);
#ifdef ENABLE_BATTERY
if (p->battery.area.on_screen)
p->area.list = g_slist_append(p->area.list, &p->battery);
#endif
// systray only on first panel
if (systray.area.on_screen && i == 0)
// systray only on first panel
if (systray.area.on_screen && i == 0)
p->area.list = g_slist_append(p->area.list, &systray);
// full width mode
......@@ -168,12 +168,12 @@ void cleanup_panel()
task_drag = 0;
task_urgent = 0;
cleanup_systray();
cleanup_taskbar();
cleanup_taskbar();
// font allocated once
if (panel1[0].g_task.font_desc) {
pango_font_description_free(panel1[0].g_task.font_desc);
panel1[0].g_task.font_desc = 0;
if (panel1[0].g_task.font_desc) {
pango_font_description_free(panel1[0].g_task.font_desc);
panel1[0].g_task.font_desc = 0;
}
int i;
......@@ -182,8 +182,8 @@ void cleanup_panel()
p = &panel1[i];
free_area(&p->area);
free_area(&p->g_task.area);
free_area(&p->g_taskbar);
free_area(&p->g_task.area);
free_area(&p->g_taskbar);
if (p->temp_pmap) {
XFreePixmap(server.dsp, p->temp_pmap);
......@@ -195,17 +195,17 @@ void cleanup_panel()
}
}
if (panel1) free(panel1);
panel1 = 0;
if (panel1) free(panel1);
panel1 = 0;
}
void resize_panel(void *obj)
{
Panel *panel = (Panel*)obj;
Panel *panel = (Panel*)obj;
if (panel_horizontal) {
int taskbar_width, modulo_width = 0;
int taskbar_width, modulo_width = 0;
taskbar_width = panel->area.width - (2 * panel->area.paddingxlr) - (2 * panel->area.pix.border.width);
if (panel->clock.area.on_screen && panel->clock.area.width)
......@@ -241,7 +241,7 @@ void resize_panel(void *obj)
}
}
else {
int taskbar_height, modulo_height = 0;
int taskbar_height, modulo_height = 0;
int i, posy;
taskbar_height = panel->area.height - (2 * panel->area.paddingxlr) - (2 * panel->area.pix.border.width);
......@@ -280,8 +280,8 @@ void resize_panel(void *obj)
void visible_object()
{
Panel *panel;
int i, j;
Panel *panel;
int i, j;
for (i=0 ; i < nb_panel ; i++) {
panel = &panel1[i];
......@@ -304,22 +304,22 @@ void visible_object()
void set_panel_properties(Panel *p)
{
XStoreName (server.dsp, p->main_win, "tint2");
// TODO: check if the name is really needed for a panel/taskbar ?
gsize len;
gchar *name = g_locale_to_utf8("tint2", -1, NULL, &len, NULL);
if (name != NULL) {
XChangeProperty(server.dsp, p->main_win, server.atom._NET_WM_NAME, server.atom.UTF8_STRING, 8, PropModeReplace, (unsigned char *) name, (int) len);
g_free(name);
}
// Dock
long val = server.atom._NET_WM_WINDOW_TYPE_DOCK;
XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_WINDOW_TYPE, XA_ATOM, 32, PropModeReplace, (unsigned char *) &val, 1);
// Reserved space
long struts [12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
XStoreName (server.dsp, p->main_win, "tint2");
// TODO: check if the name is really needed for a panel/taskbar ?
gsize len;
gchar *name = g_locale_to_utf8("tint2", -1, NULL, &len, NULL);
if (name != NULL) {
XChangeProperty(server.dsp, p->main_win, server.atom._NET_WM_NAME, server.atom.UTF8_STRING, 8, PropModeReplace, (unsigned char *) name, (int) len);
g_free(name);
}
// Dock
long val = server.atom._NET_WM_WINDOW_TYPE_DOCK;
XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_WINDOW_TYPE, XA_ATOM, 32, PropModeReplace, (unsigned char *) &val, 1);
// Reserved space
long struts [12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
if (panel_horizontal) {
if (panel_position & TOP) {
struts[2] = p->area.height + p->marginy;
......@@ -348,69 +348,69 @@ void set_panel_properties(Panel *p)
struts[7] = p->posy + p->area.height - 1;
}
}
// Old specification : fluxbox need _NET_WM_STRUT.
XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_STRUT, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &struts, 4);
XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_STRUT_PARTIAL, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &struts, 12);
// Sticky and below other window
val = 0xFFFFFFFF;
XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_DESKTOP, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &val, 1);
Atom state[4];
state[0] = server.atom._NET_WM_STATE_SKIP_PAGER;
state[1] = server.atom._NET_WM_STATE_SKIP_TASKBAR;
state[2] = server.atom._NET_WM_STATE_STICKY;
state[3] = server.atom._NET_WM_STATE_BELOW;
XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_STATE, XA_ATOM, 32, PropModeReplace, (unsigned char *) state, 4);
// Fixed position
XSizeHints size_hints;
size_hints.flags = PPosition;
XChangeProperty (server.dsp, p->main_win, XA_WM_NORMAL_HINTS, XA_WM_SIZE_HINTS, 32, PropModeReplace, (unsigned char *) &size_hints, sizeof (XSizeHints) / 4);
// Unfocusable
XWMHints wmhints;
wmhints.flags = InputHint;
wmhints.input = False;
XChangeProperty (server.dsp, p->main_win, XA_WM_HINTS, XA_WM_HINTS, 32, PropModeReplace, (unsigned char *) &wmhints, sizeof (XWMHints) / 4);
// Undecorated
long prop[5] = { 2, 0, 0, 0, 0 };
XChangeProperty(server.dsp, p->main_win, server.atom._MOTIF_WM_HINTS, server.atom._MOTIF_WM_HINTS, 32, PropModeReplace, (unsigned char *) prop, 5);
// Old specification : fluxbox need _NET_WM_STRUT.
XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_STRUT, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &struts, 4);
XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_STRUT_PARTIAL, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &struts, 12);
// Sticky and below other window
val = 0xFFFFFFFF;
XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_DESKTOP, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &val, 1);
Atom state[4];
state[0] = server.atom._NET_WM_STATE_SKIP_PAGER;
state[1] = server.atom._NET_WM_STATE_SKIP_TASKBAR;
state[2] = server.atom._NET_WM_STATE_STICKY;
state[3] = server.atom._NET_WM_STATE_BELOW;
XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_STATE, XA_ATOM, 32, PropModeReplace, (unsigned char *) state, 4);
// Fixed position
XSizeHints size_hints;
size_hints.flags = PPosition;
XChangeProperty (server.dsp, p->main_win, XA_WM_NORMAL_HINTS, XA_WM_SIZE_HINTS, 32, PropModeReplace, (unsigned char *) &size_hints, sizeof (XSizeHints) / 4);
// Unfocusable
XWMHints wmhints;
wmhints.flags = InputHint;
wmhints.input = False;
XChangeProperty (server.dsp, p->main_win, XA_WM_HINTS, XA_WM_HINTS, 32, PropModeReplace, (unsigned char *) &wmhints, sizeof (XWMHints) / 4);
// Undecorated
long prop[5] = { 2, 0, 0, 0, 0 };
XChangeProperty(server.dsp, p->main_win, server.atom._MOTIF_WM_HINTS, server.atom._MOTIF_WM_HINTS, 32, PropModeReplace, (unsigned char *) prop, 5);
}
void set_panel_background(Panel *p)
{
get_root_pixmap();
get_root_pixmap();
if (p->area.pix.pmap) XFreePixmap (server.dsp, p->area.pix.pmap);
p->area.pix.pmap = XCreatePixmap (server.dsp, server.root_win, p->area.width, p->area.height, server.depth);
if (p->area.pix.pmap) XFreePixmap (server.dsp, p->area.pix.pmap);
p->area.pix.pmap = XCreatePixmap (server.dsp, server.root_win, p->area.width, p->area.height, server.depth);
// copy background (server.root_pmap) in panel.area.pix.pmap
Window dummy;
int x, y;
XTranslateCoordinates(server.dsp, p->main_win, server.root_win, 0, 0, &x, &y, &dummy);
XSetTSOrigin(server.dsp, server.gc, -x, -y) ;
XFillRectangle(server.dsp, p->area.pix.pmap, server.gc, 0, 0, p->area.width, p->area.height);
// copy background (server.root_pmap) in panel.area.pix.pmap
Window dummy;
int x, y;
XTranslateCoordinates(server.dsp, p->main_win, server.root_win, 0, 0, &x, &y, &dummy);
XSetTSOrigin(server.dsp, server.gc, -x, -y) ;
XFillRectangle(server.dsp, p->area.pix.pmap, server.gc, 0, 0, p->area.width, p->area.height);
// draw background panel
cairo_surface_t *cs;
cairo_t *c;
cs = cairo_xlib_surface_create (server.dsp, p->area.pix.pmap, server.visual, p->area.width, p->area.height);
c = cairo_create (cs);
// draw background panel
cairo_surface_t *cs;
cairo_t *c;
cs = cairo_xlib_surface_create (server.dsp, p->area.pix.pmap, server.visual, p->area.width, p->area.height);
c = cairo_create (cs);
draw_background(&p->area, c, 0);
draw_background(&p->area, c, 0);
cairo_destroy (c);
cairo_surface_destroy (cs);
cairo_destroy (c);
cairo_surface_destroy (cs);
// redraw panel's object
GSList *l0;
Area *a;
GSList *l0;
Area *a;
for (l0 = p->area.list; l0 ; l0 = l0->next) {
a = l0->data;
set_redraw(a);
}
a = l0->data;
set_redraw(a);
}
}
......
This diff is collapsed.
......@@ -78,14 +78,14 @@ void init_systray()
void cleanup_systray()
{
if (systray.list_icons) {
if (systray.list_icons) {
// remove_icon change systray.list_icons
while(systray.list_icons)
remove_icon((TrayWindow*)systray.list_icons->data);
g_slist_free(systray.list_icons);
systray.list_icons = 0;
}
g_slist_free(systray.list_icons);
systray.list_icons = 0;
}
free_area(&systray.area);
cleanup_net();
......@@ -199,7 +199,7 @@ int init_net()
}
// init systray protocol
net_sel_win = XCreateSimpleWindow(server.dsp, server.root_win, -1, -1, 1, 1, 0, 0, 0);
net_sel_win = XCreateSimpleWindow(server.dsp, server.root_win, -1, -1, 1, 1, 0, 0, 0);
// v0.2 trayer specification. tint2 always orizontal.
// TODO : vertical panel ??
......@@ -210,11 +210,11 @@ int init_net()
if (XGetSelectionOwner(server.dsp, server.atom._NET_SYSTEM_TRAY_SCREEN) != net_sel_win) {
fprintf(stderr, "tint2 : can't get systray manager\n");
return 0;
}
}
XClientMessageEvent ev;
XClientMessageEvent ev;
ev.type = ClientMessage;
ev.window = server.root_win;
ev.window = server.root_win;
ev.message_type = server.atom.MANAGER;
ev.format = 32;
ev.data.l[0] = CurrentTime;
......@@ -230,8 +230,8 @@ int init_net()
void cleanup_net()
{
if (net_sel_win != None) {
XDestroyWindow(server.dsp, net_sel_win);
net_sel_win = None;
XDestroyWindow(server.dsp, net_sel_win);
net_sel_win = None;
}
}
......@@ -319,9 +319,9 @@ gboolean add_icon(Window id)
traywin = g_new0(TrayWindow, 1);
traywin->id = id;
// systray.list_icons = g_slist_prepend(systray.list_icons, traywin);
// systray.list_icons = g_slist_prepend(systray.list_icons, traywin);
systray.list_icons = g_slist_insert_sorted(systray.list_icons, traywin, compare_traywindows);
systray.area.resize = 1;
systray.area.resize = 1;
systray.area.redraw = 1;
//printf("add_icon id %lx, %d\n", id, g_slist_length(systray.list_icons));
......@@ -346,7 +346,7 @@ void remove_icon(TrayWindow *traywin)
// remove from our list
systray.list_icons = g_slist_remove(systray.list_icons, traywin);
g_free(traywin);
systray.area.resize = 1;
systray.area.resize = 1;
systray.area.redraw = 1;
//printf("remove_icon id %lx, %d\n", traywin->id);
......
......@@ -204,11 +204,11 @@ void get_icon (Task *tsk)
#endif
}
XFree (data);
}
else {
// get Pixmap icon
XWMHints *hints = XGetWMHints(server.dsp, tsk->win);
if (!hints) return;
}
else {
// get Pixmap icon
XWMHints *hints = XGetWMHints(server.dsp, tsk->win);
if (!hints) return;
if (hints->flags & IconPixmapHint && hints->icon_pixmap != 0) {
// get width, height and depth for the pixmap
Window root;
......@@ -235,7 +235,7 @@ void get_icon (Task *tsk)
imlib_free_image();
}
XFree(hints);
}
}
if (tsk->icon_data) {
tsk->icon_data_active = malloc (tsk->icon_width * tsk->icon_height * sizeof (DATA32));
......
......@@ -36,8 +36,8 @@
void init_taskbar()
{
Panel *panel;
int i, j;
Panel *panel;
int i, j;
for (i=0 ; i < nb_panel ; i++) {
panel = &panel1[i];
......@@ -115,9 +115,9 @@ void init_taskbar()
void cleanup_taskbar()
{
Panel *panel;
Panel *panel;
Taskbar *tskbar;
int i, j;
int i, j;
GSList *l0;
Task *tsk;
......@@ -152,11 +152,11 @@ void cleanup_taskbar()
Task *task_get_task (Window win)
{
Task *tsk;
GSList *l0;
int i, j;
Task *tsk;
GSList *l0;
int i, j;
for (i=0 ; i < nb_panel ; i++) {
for (i=0 ; i < nb_panel ; i++) {
for (j=0 ; j < panel1[i].nb_desktop ; j++) {
for (l0 = panel1[i].taskbar[j].area.list; l0 ; l0 = l0->next) {
tsk = l0->data;
......@@ -164,23 +164,23 @@ Task *task_get_task (Window win)
return tsk;
}
}
}
return 0;
}
return 0;
}
void task_refresh_tasklist ()
{
Window *win, active_win;
int num_results, i, j, k;
GSList *l0;
Task *tsk;
Window *win, active_win;
int num_results, i, j, k;
GSList *l0;
Task *tsk;
win = server_get_property (server.root_win, server.atom._NET_CLIENT_LIST, XA_WINDOW, &num_results);
if (!win) return;
win = server_get_property (server.root_win, server.atom._NET_CLIENT_LIST, XA_WINDOW, &num_results);
if (!win) return;
// Remove any old and set active win
active_win = window_get_active ();
// Remove any old and set active win
active_win = window_get_active ();
if (task_active) {
task_active->area.is_active = 0;
task_active = 0;
......@@ -205,28 +205,28 @@ void task_refresh_tasklist ()
if (k == num_results) remove_task (tsk);
}
}
}
}
// Add any new
for (i = 0; i < num_results; i++)
if (!task_get_task (win[i]))
add_task (win[i]);
// Add any new
for (i = 0; i < num_results; i++)
if (!task_get_task (win[i]))
add_task (win[i]);
XFree (win);
XFree (win);
}
void resize_taskbar(void *obj)
{
Taskbar *taskbar = (Taskbar*)obj;
Panel *panel = (Panel*)taskbar->area.panel;
Task *tsk;
GSList *l;
Panel *panel = (Panel*)taskbar->area.panel;
Task *tsk;
GSList *l;
int task_count;
//printf("resize_taskbar : posx et width des taches\n");
//printf("resize_taskbar : posx et width des taches\n");
taskbar->area.redraw = 1;
taskbar->area.redraw = 1;
if (panel_horizontal) {
int pixel_width, modulo_width=0;
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -21,6 +21,7 @@ int window_is_iconified (Window win);
int window_is_urgent (Window win);
int window_is_hidden (Window win);
int window_is_active (Window win);
int window_is_skip_taskbar (Window win);
int get_icon_count (long *data, int num);
long *get_best_icon (long *data, int icon_count, int num, int *iw, int *ih, int best_icon_size);
void window_maximize_restore (Window win);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment