Implemented some extended window manager hints
This commit is contained in:
parent
e0f316b8dc
commit
7b1ad45d84
140
src/framer.c
140
src/framer.c
|
@ -35,15 +35,19 @@
|
||||||
typedef enum _FramerAtom
|
typedef enum _FramerAtom
|
||||||
{
|
{
|
||||||
FA_NET_CURRENT_DESKTOP = 0,
|
FA_NET_CURRENT_DESKTOP = 0,
|
||||||
|
FA_NET_DESKTOP_GEOMETRY,
|
||||||
|
FA_NET_DESKTOP_VIEWPORT,
|
||||||
FA_NET_NUMBER_OF_DESKTOPS,
|
FA_NET_NUMBER_OF_DESKTOPS,
|
||||||
FA_NET_SHOWING_DESKTOP,
|
FA_NET_SHOWING_DESKTOP,
|
||||||
FA_NET_WM_WINDOW_TYPE,
|
FA_NET_WM_WINDOW_TYPE,
|
||||||
|
FA_NET_WM_WINDOW_TYPE_DESKTOP,
|
||||||
FA_NET_WM_WINDOW_TYPE_DOCK,
|
FA_NET_WM_WINDOW_TYPE_DOCK,
|
||||||
FA_NET_WM_WINDOW_TYPE_NORMAL
|
FA_NET_WM_WINDOW_TYPE_NORMAL,
|
||||||
|
FA_NET_WORKAREA
|
||||||
} FramerAtom;
|
} FramerAtom;
|
||||||
#define FA_LAST FA_NET_WM_WINDOW_TYPE_NORMAL
|
#define FA_LAST FA_NET_WORKAREA
|
||||||
#define FA_COUNT (FA_LAST + 1)
|
#define FA_COUNT (FA_LAST + 1)
|
||||||
#define FA_NET_WM_WINDOW_TYPE_FIRST FA_NET_WM_WINDOW_TYPE_DOCK
|
#define FA_NET_WM_WINDOW_TYPE_FIRST FA_NET_WM_WINDOW_TYPE_DESKTOP
|
||||||
#define FA_NET_WM_WINDOW_TYPE_LAST FA_NET_WM_WINDOW_TYPE_NORMAL
|
#define FA_NET_WM_WINDOW_TYPE_LAST FA_NET_WM_WINDOW_TYPE_NORMAL
|
||||||
|
|
||||||
struct _Framer
|
struct _Framer
|
||||||
|
@ -61,11 +65,15 @@ struct _Framer
|
||||||
static char const * _framer_atom[FA_COUNT] =
|
static char const * _framer_atom[FA_COUNT] =
|
||||||
{
|
{
|
||||||
"_NET_CURRENT_DESKTOP",
|
"_NET_CURRENT_DESKTOP",
|
||||||
|
"_NET_DESKTOP_GEOMETRY",
|
||||||
|
"_NET_DESKTOP_VIEWPORT",
|
||||||
"_NET_NUMBER_OF_DESKTOPS",
|
"_NET_NUMBER_OF_DESKTOPS",
|
||||||
"_NET_SHOWING_DESKTOP",
|
"_NET_SHOWING_DESKTOP",
|
||||||
"_NET_WM_WINDOW_TYPE",
|
"_NET_WM_WINDOW_TYPE",
|
||||||
|
"_NET_WM_WINDOW_TYPE_DESKTOP",
|
||||||
"_NET_WM_WINDOW_TYPE_DOCK",
|
"_NET_WM_WINDOW_TYPE_DOCK",
|
||||||
"_NET_WM_WINDOW_TYPE_NORMAL"
|
"_NET_WM_WINDOW_TYPE_NORMAL",
|
||||||
|
"_NET_WORKAREA"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -83,12 +91,11 @@ static GdkFilterReturn _framer_filter(GdkXEvent * xevent, GdkEvent * event,
|
||||||
/* public */
|
/* public */
|
||||||
/* functions */
|
/* functions */
|
||||||
/* framer_new */
|
/* framer_new */
|
||||||
|
static void _new_ewmh(Framer * framer);
|
||||||
|
|
||||||
Framer * framer_new(void)
|
Framer * framer_new(void)
|
||||||
{
|
{
|
||||||
Framer * framer;
|
Framer * framer;
|
||||||
int i;
|
|
||||||
long cnt = 1;
|
|
||||||
long cur = 0;
|
|
||||||
|
|
||||||
if((framer = malloc(sizeof(*framer))) == NULL)
|
if((framer = malloc(sizeof(*framer))) == NULL)
|
||||||
{
|
{
|
||||||
|
@ -105,19 +112,7 @@ Framer * framer_new(void)
|
||||||
framer->root = gdk_screen_get_root_window(framer->screen);
|
framer->root = gdk_screen_get_root_window(framer->screen);
|
||||||
framer->width = gdk_screen_get_width(framer->screen);
|
framer->width = gdk_screen_get_width(framer->screen);
|
||||||
framer->height = gdk_screen_get_height(framer->screen);
|
framer->height = gdk_screen_get_height(framer->screen);
|
||||||
/* atoms */
|
_new_ewmh(framer);
|
||||||
for(i = 0; i < FA_COUNT; i++)
|
|
||||||
framer->atom[i] = gdk_x11_get_xatom_by_name_for_display(
|
|
||||||
framer->display, _framer_atom[i]);
|
|
||||||
/* NETWM compliance */
|
|
||||||
XChangeProperty(GDK_DISPLAY_XDISPLAY(framer->display),
|
|
||||||
GDK_WINDOW_XWINDOW(framer->root),
|
|
||||||
framer->atom[FA_NET_NUMBER_OF_DESKTOPS], XA_CARDINAL,
|
|
||||||
32, PropModeReplace, (unsigned char *)&cnt, 1);
|
|
||||||
XChangeProperty(GDK_DISPLAY_XDISPLAY(framer->display),
|
|
||||||
GDK_WINDOW_XWINDOW(framer->root),
|
|
||||||
framer->atom[FA_NET_CURRENT_DESKTOP], XA_CARDINAL,
|
|
||||||
32, PropModeReplace, (unsigned char *)&cur, 1);
|
|
||||||
/* register as window manager */
|
/* register as window manager */
|
||||||
XSelectInput(gdk_x11_display_get_xdisplay(framer->display),
|
XSelectInput(gdk_x11_display_get_xdisplay(framer->display),
|
||||||
GDK_WINDOW_XWINDOW(framer->root), NoEventMask
|
GDK_WINDOW_XWINDOW(framer->root), NoEventMask
|
||||||
|
@ -126,6 +121,51 @@ Framer * framer_new(void)
|
||||||
return framer;
|
return framer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _new_ewmh(Framer * framer)
|
||||||
|
{
|
||||||
|
long data[4];
|
||||||
|
size_t i;
|
||||||
|
long cnt = 0;
|
||||||
|
|
||||||
|
memset(&data, 0, sizeof(data));
|
||||||
|
for(i = 0; i < FA_COUNT; i++)
|
||||||
|
{
|
||||||
|
framer->atom[i] = gdk_x11_get_xatom_by_name_for_display(
|
||||||
|
framer->display, _framer_atom[i]);
|
||||||
|
switch(i)
|
||||||
|
{
|
||||||
|
case FA_NET_CURRENT_DESKTOP:
|
||||||
|
cnt = 1;
|
||||||
|
break;
|
||||||
|
case FA_NET_NUMBER_OF_DESKTOPS:
|
||||||
|
data[0] = 1;
|
||||||
|
cnt = 1;
|
||||||
|
break;
|
||||||
|
case FA_NET_DESKTOP_GEOMETRY:
|
||||||
|
data[0] = framer->width;
|
||||||
|
data[1] = framer->height;
|
||||||
|
cnt = 2;
|
||||||
|
break;
|
||||||
|
case FA_NET_DESKTOP_VIEWPORT:
|
||||||
|
cnt = 2;
|
||||||
|
break;
|
||||||
|
case FA_NET_WORKAREA:
|
||||||
|
data[2] = framer->width;
|
||||||
|
data[3] = max(framer->height - 64, 1);
|
||||||
|
cnt = 4;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
XChangeProperty(GDK_DISPLAY_XDISPLAY(framer->display),
|
||||||
|
GDK_WINDOW_XWINDOW(framer->root),
|
||||||
|
framer->atom[i], XA_CARDINAL, 32,
|
||||||
|
PropModeReplace, (unsigned char *)&data, cnt);
|
||||||
|
cnt = 0;
|
||||||
|
memset(&data, 0, sizeof(data));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* framer_delete */
|
/* framer_delete */
|
||||||
void framer_delete(Framer * framer)
|
void framer_delete(Framer * framer)
|
||||||
|
@ -140,9 +180,20 @@ void framer_delete(Framer * framer)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* accessors */
|
||||||
|
/* framer_set_show_desktop */
|
||||||
|
void framer_set_show_desktop(Framer * framer, gboolean shown)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "DEBUG: %s(%s)\n", __func__, shown ? "TRUE" : "FALSE");
|
||||||
|
#endif
|
||||||
|
/* FIXME implement */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* private */
|
/* private */
|
||||||
/* functions */
|
/* functions */
|
||||||
/* framer error */
|
/* framer_error */
|
||||||
static int _framer_error(char const * message, int ret)
|
static int _framer_error(char const * message, int ret)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "%s: %s\n", PACKAGE, message);
|
fprintf(stderr, "%s: %s\n", PACKAGE, message);
|
||||||
|
@ -161,7 +212,7 @@ static int _framer_get_window_property(Framer * framer, Window window,
|
||||||
unsigned long bytes;
|
unsigned long bytes;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr, "DEBUG: %s(framer, window, %s, %lu)\n", __func__,
|
fprintf(stderr, "DEBUG: %s(window, %s, %lu)\n", __func__,
|
||||||
_framer_atom[property], atom);
|
_framer_atom[property], atom);
|
||||||
#endif
|
#endif
|
||||||
gdk_error_trap_push();
|
gdk_error_trap_push();
|
||||||
|
@ -232,8 +283,10 @@ static GdkFilterReturn _framer_filter(GdkXEvent * xevent, GdkEvent * event,
|
||||||
case UnmapNotify:
|
case UnmapNotify:
|
||||||
return _filter_unmap_notify(&xev->xunmap);
|
return _filter_unmap_notify(&xev->xunmap);
|
||||||
default:
|
default:
|
||||||
|
#ifdef DEBUG
|
||||||
fprintf(stderr, "DEBUG: %s() type=%d\n", __func__,
|
fprintf(stderr, "DEBUG: %s() type=%d\n", __func__,
|
||||||
xev->type);
|
xev->type);
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return GDK_FILTER_CONTINUE;
|
return GDK_FILTER_CONTINUE;
|
||||||
|
@ -243,25 +296,36 @@ static GdkFilterReturn _filter_client_message(XClientMessageEvent * xclient,
|
||||||
Framer * framer)
|
Framer * framer)
|
||||||
{
|
{
|
||||||
GdkAtom atom;
|
GdkAtom atom;
|
||||||
int i;
|
size_t i;
|
||||||
char * name;
|
char const * name;
|
||||||
|
char * p = NULL;
|
||||||
|
|
||||||
for(i = 0; i < FA_COUNT; i++)
|
for(i = 0; i < FA_COUNT; i++)
|
||||||
if(xclient->message_type == framer->atom[i])
|
if(xclient->message_type == framer->atom[i])
|
||||||
{
|
break;
|
||||||
/* FIXME implement each message */
|
switch(i)
|
||||||
#ifdef DEBUG
|
{
|
||||||
fprintf(stderr, "DEBUG: %s() %s\n", __func__,
|
case FA_NET_SHOWING_DESKTOP:
|
||||||
_framer_atom[i]);
|
framer_set_show_desktop(framer, TRUE);
|
||||||
#endif
|
break;
|
||||||
return GDK_FILTER_REMOVE;
|
default:
|
||||||
}
|
if(i < FA_COUNT)
|
||||||
atom = gdk_x11_xatom_to_atom_for_display(framer->display,
|
name = _framer_atom[i];
|
||||||
xclient->message_type);
|
else
|
||||||
name = gdk_atom_name(atom);
|
{
|
||||||
fprintf(stderr, "%s: %s: %s\n", PACKAGE, name, "Unsupported atom");
|
atom = gdk_x11_xatom_to_atom_for_display(
|
||||||
g_free(name);
|
framer->display,
|
||||||
return GDK_FILTER_CONTINUE;
|
xclient->message_type);
|
||||||
|
p = gdk_atom_name(atom);
|
||||||
|
name = p;
|
||||||
|
}
|
||||||
|
fprintf(stderr, "%s: %s: %s\n", PACKAGE, name,
|
||||||
|
"Unsupported message");
|
||||||
|
if(p != NULL)
|
||||||
|
g_free(p);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return GDK_FILTER_REMOVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GdkFilterReturn _filter_configure_notify(XConfigureEvent * xconfigure)
|
static GdkFilterReturn _filter_configure_notify(XConfigureEvent * xconfigure)
|
||||||
|
|
|
@ -28,4 +28,7 @@ typedef struct _Framer Framer;
|
||||||
Framer * framer_new(void);
|
Framer * framer_new(void);
|
||||||
void framer_delete(Framer * framer);
|
void framer_delete(Framer * framer);
|
||||||
|
|
||||||
|
/* accessors */
|
||||||
|
void framer_set_show_desktop(Framer * framer, gboolean shown);
|
||||||
|
|
||||||
#endif /* !FRAMER_FRAMER_H */
|
#endif /* !FRAMER_FRAMER_H */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user