wibox: merge statusbar and titlebar types

Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
Julien Danjou 2008-09-21 10:13:21 +02:00
parent 24d6341c39
commit 34fe130307
21 changed files with 197 additions and 186 deletions

View File

@ -55,6 +55,7 @@ set(AWE_SRCS
${SOURCE_DIR}/screen.c ${SOURCE_DIR}/screen.c
${SOURCE_DIR}/stack.c ${SOURCE_DIR}/stack.c
${SOURCE_DIR}/statusbar.c ${SOURCE_DIR}/statusbar.c
${SOURCE_DIR}/wibox.c
${SOURCE_DIR}/systray.c ${SOURCE_DIR}/systray.c
${SOURCE_DIR}/tag.c ${SOURCE_DIR}/tag.c
${SOURCE_DIR}/titlebar.c ${SOURCE_DIR}/titlebar.c

View File

@ -36,6 +36,7 @@
#include "mouse.h" #include "mouse.h"
#include "systray.h" #include "systray.h"
#include "statusbar.h" #include "statusbar.h"
#include "wibox.h"
#include "property.h" #include "property.h"
#include "layouts/floating.h" #include "layouts/floating.h"
#include "common/markup.h" #include "common/markup.h"
@ -333,7 +334,7 @@ client_stack(void)
for(screen = 0; screen < globalconf.nscreen; screen++) for(screen = 0; screen < globalconf.nscreen; screen++)
for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++) for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++)
{ {
statusbar_t *sb = globalconf.screens[screen].statusbars.tab[i]; wibox_t *sb = globalconf.screens[screen].statusbars.tab[i];
xcb_configure_window(globalconf.connection, xcb_configure_window(globalconf.connection,
sb->sw.window, sb->sw.window,
XCB_CONFIG_WINDOW_SIBLING | XCB_CONFIG_WINDOW_STACK_MODE, XCB_CONFIG_WINDOW_SIBLING | XCB_CONFIG_WINDOW_STACK_MODE,
@ -818,7 +819,7 @@ client_unmanage(client_t *c)
if(c->titlebar) if(c->titlebar)
{ {
xcb_unmap_window(globalconf.connection, c->titlebar->sw.window); xcb_unmap_window(globalconf.connection, c->titlebar->sw.window);
titlebar_unref(&c->titlebar); wibox_unref(&c->titlebar);
c->titlebar = NULL; c->titlebar = NULL;
} }
@ -833,7 +834,7 @@ client_unmanage(client_t *c)
for(int screen = 0; screen < globalconf.nscreen; screen++) for(int screen = 0; screen < globalconf.nscreen; screen++)
for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++) for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++)
{ {
statusbar_t *s = globalconf.screens[screen].statusbars.tab[i]; wibox_t *s = globalconf.screens[screen].statusbars.tab[i];
statusbar_position_update(s); statusbar_position_update(s);
} }
@ -1202,7 +1203,7 @@ luaA_client_newindex(lua_State *L)
bool b; bool b;
double d; double d;
int i; int i;
titlebar_t **t = NULL; wibox_t **t = NULL;
image_t **image; image_t **image;
if((*c)->invalid) if((*c)->invalid)
@ -1291,7 +1292,7 @@ luaA_client_newindex(lua_State *L)
if((*c)->titlebar) if((*c)->titlebar)
{ {
xcb_unmap_window(globalconf.connection, (*c)->titlebar->sw.window); xcb_unmap_window(globalconf.connection, (*c)->titlebar->sw.window);
titlebar_unref(&(*c)->titlebar); wibox_unref(&(*c)->titlebar);
(*c)->titlebar = NULL; (*c)->titlebar = NULL;
client_need_arrange(*c); client_need_arrange(*c);
} }
@ -1299,7 +1300,7 @@ luaA_client_newindex(lua_State *L)
if(t) if(t)
{ {
/* Attach titlebar to client */ /* Attach titlebar to client */
(*c)->titlebar = titlebar_ref(t); (*c)->titlebar = wibox_ref(t);
titlebar_init(*c); titlebar_init(*c);
} }
client_stack(); client_stack();

10
event.c
View File

@ -140,7 +140,7 @@ event_handle_button(void *data, xcb_connection_t *connection, xcb_button_press_e
for(screen = 0; screen < globalconf.nscreen; screen++) for(screen = 0; screen < globalconf.nscreen; screen++)
for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++) for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++)
{ {
statusbar_t *statusbar = globalconf.screens[screen].statusbars.tab[i]; wibox_t *statusbar = globalconf.screens[screen].statusbars.tab[i];
if(statusbar->sw.window == ev->event || statusbar->sw.window == ev->child) if(statusbar->sw.window == ev->event || statusbar->sw.window == ev->child)
{ {
/* If the statusbar is child, then x,y are /* If the statusbar is child, then x,y are
@ -225,7 +225,7 @@ event_handle_configurerequest(void *data __attribute__ ((unused)),
for(int screen = 0; screen < globalconf.nscreen; screen++) for(int screen = 0; screen < globalconf.nscreen; screen++)
for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++) for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++)
{ {
statusbar_t *s = globalconf.screens[screen].statusbars.tab[i]; wibox_t *s = globalconf.screens[screen].statusbars.tab[i];
statusbar_position_update(s); statusbar_position_update(s);
} }
} }
@ -381,7 +381,7 @@ event_handle_motionnotify(void *data __attribute__ ((unused)),
xcb_connection_t *connection, xcb_connection_t *connection,
xcb_motion_notify_event_t *ev) xcb_motion_notify_event_t *ev)
{ {
statusbar_t *statusbar = statusbar_getbywin(ev->event); wibox_t *statusbar = statusbar_getbywin(ev->event);
client_t *c; client_t *c;
widget_node_t *w; widget_node_t *w;
@ -419,7 +419,7 @@ event_handle_leavenotify(void *data __attribute__ ((unused)),
xcb_connection_t *connection, xcb_connection_t *connection,
xcb_leave_notify_event_t *ev) xcb_leave_notify_event_t *ev)
{ {
statusbar_t *statusbar = statusbar_getbywin(ev->event); wibox_t *statusbar = statusbar_getbywin(ev->event);
client_t *c; client_t *c;
if(statusbar) if(statusbar)
@ -500,7 +500,7 @@ event_handle_expose(void *data __attribute__ ((unused)),
for(int screen = 0; screen < globalconf.nscreen; screen++) for(int screen = 0; screen < globalconf.nscreen; screen++)
for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++) for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++)
{ {
statusbar_t *statusbar = globalconf.screens[screen].statusbars.tab[i]; wibox_t *statusbar = globalconf.screens[screen].statusbars.tab[i];
if(statusbar->sw.window == ev->window) if(statusbar->sw.window == ev->window)
{ {
simplewindow_refresh_pixmap_partial(&statusbar->sw, simplewindow_refresh_pixmap_partial(&statusbar->sw,

2
ewmh.c
View File

@ -536,7 +536,7 @@ ewmh_client_strut_update(client_t *c, xcb_get_property_reply_t *strut_r)
for(int screen = 0; screen < globalconf.nscreen; screen++) for(int screen = 0; screen < globalconf.nscreen; screen++)
for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++) for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++)
{ {
statusbar_t *s = globalconf.screens[screen].statusbars.tab[i]; wibox_t *s = globalconf.screens[screen].statusbars.tab[i];
statusbar_position_update(s); statusbar_position_update(s);
} }
} }

View File

@ -162,7 +162,7 @@ screen_getbycoord(int screen, int x, int y)
* \return The screen area. * \return The screen area.
*/ */
area_t area_t
screen_area_get(int screen, statusbar_array_t *statusbars, screen_area_get(int screen, wibox_array_t *statusbars,
padding_t *padding, bool strut) padding_t *padding, bool strut)
{ {
area_t area = globalconf.screens[screen].geometry; area_t area = globalconf.screens[screen].geometry;
@ -218,7 +218,7 @@ screen_area_get(int screen, statusbar_array_t *statusbars,
if(statusbars) if(statusbars)
for(int i = 0; i < statusbars->len; i++) for(int i = 0; i < statusbars->len; i++)
{ {
statusbar_t *sb = statusbars->tab[i]; wibox_t *sb = statusbars->tab[i];
switch(sb->position) switch(sb->position)
{ {
case Top: case Top:
@ -253,7 +253,7 @@ screen_area_get(int screen, statusbar_array_t *statusbars,
* \return The display area. * \return The display area.
*/ */
area_t area_t
display_area_get(int phys_screen, statusbar_array_t *statusbars, padding_t *padding) display_area_get(int phys_screen, wibox_array_t *statusbars, padding_t *padding)
{ {
xcb_screen_t *s = xutil_screen_get(globalconf.connection, phys_screen); xcb_screen_t *s = xutil_screen_get(globalconf.connection, phys_screen);
area_t area = { .x = 0, area_t area = { .x = 0,
@ -264,7 +264,7 @@ display_area_get(int phys_screen, statusbar_array_t *statusbars, padding_t *padd
if(statusbars) if(statusbars)
for(int i = 0; i < statusbars->len; i++) for(int i = 0; i < statusbars->len; i++)
{ {
statusbar_t *sb = statusbars->tab[i]; wibox_t *sb = statusbars->tab[i];
area.y += sb->position == Top ? sb->height : 0; area.y += sb->position == Top ? sb->height : 0;
area.height -= (sb->position == Top || sb->position == Bottom) ? sb->height : 0; area.height -= (sb->position == Top || sb->position == Bottom) ? sb->height : 0;
} }

View File

@ -28,8 +28,8 @@
void screen_scan(void); void screen_scan(void);
int screen_getbycoord(int, int, int); int screen_getbycoord(int, int, int);
area_t screen_area_get(int, statusbar_array_t *, padding_t *, bool); area_t screen_area_get(int, wibox_array_t *, padding_t *, bool);
area_t display_area_get(int, statusbar_array_t *, padding_t *); area_t display_area_get(int, wibox_array_t *, padding_t *);
int screen_virttophys(int); int screen_virttophys(int);
void screen_client_moveto(client_t *, int, bool, bool); void screen_client_moveto(client_t *, int, bool, bool);

View File

@ -25,13 +25,14 @@
#include "statusbar.h" #include "statusbar.h"
#include "screen.h" #include "screen.h"
#include "widget.h" #include "widget.h"
#include "wibox.h"
#include "ewmh.h" #include "ewmh.h"
extern awesome_t globalconf; extern awesome_t globalconf;
DO_LUA_NEW(extern, statusbar_t, statusbar, "statusbar", statusbar_ref) DO_LUA_NEW(extern, wibox_t, statusbar, "statusbar", wibox_ref)
DO_LUA_GC(statusbar_t, statusbar, "statusbar", statusbar_unref) DO_LUA_GC(wibox_t, statusbar, "statusbar", wibox_unref)
DO_LUA_EQ(statusbar_t, statusbar, "statusbar") DO_LUA_EQ(wibox_t, statusbar, "statusbar")
/** Kick out systray windows. /** Kick out systray windows.
* \param phys_screen Physical screen number. * \param phys_screen Physical screen number.
@ -52,7 +53,7 @@ statusbar_systray_kickout(int phys_screen)
} }
static void static void
statusbar_systray_refresh(statusbar_t *statusbar) statusbar_systray_refresh(wibox_t *statusbar)
{ {
widget_node_t *systray; widget_node_t *systray;
@ -215,7 +216,7 @@ statusbar_systray_refresh(statusbar_t *statusbar)
* \param statusbar The statusbar to draw. * \param statusbar The statusbar to draw.
*/ */
static void static void
statusbar_draw(statusbar_t *statusbar) statusbar_draw(wibox_t *statusbar)
{ {
statusbar->need_update = false; statusbar->need_update = false;
@ -236,13 +237,13 @@ statusbar_draw(statusbar_t *statusbar)
* \param w The window id. * \param w The window id.
* \return A statusbar if found, NULL otherwise. * \return A statusbar if found, NULL otherwise.
*/ */
statusbar_t * wibox_t *
statusbar_getbywin(xcb_window_t w) statusbar_getbywin(xcb_window_t w)
{ {
for(int screen = 0; screen < globalconf.nscreen; screen++) for(int screen = 0; screen < globalconf.nscreen; screen++)
for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++) for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++)
{ {
statusbar_t *s = globalconf.screens[screen].statusbars.tab[i]; wibox_t *s = globalconf.screens[screen].statusbars.tab[i];
if(s->sw.window == w) if(s->sw.window == w)
return s; return s;
} }
@ -257,7 +258,7 @@ statusbar_refresh(void)
for(int screen = 0; screen < globalconf.nscreen; screen++) for(int screen = 0; screen < globalconf.nscreen; screen++)
for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++) for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++)
{ {
statusbar_t *s = globalconf.screens[screen].statusbars.tab[i]; wibox_t *s = globalconf.screens[screen].statusbars.tab[i];
if(s->need_update) if(s->need_update)
statusbar_draw(s); statusbar_draw(s);
} }
@ -268,7 +269,7 @@ statusbar_refresh(void)
* \param statusbar The statusbar. * \param statusbar The statusbar.
*/ */
void void
statusbar_position_update(statusbar_t *statusbar) statusbar_position_update(wibox_t *statusbar)
{ {
area_t area, wingeometry; area_t area, wingeometry;
bool ignore = false; bool ignore = false;
@ -284,10 +285,10 @@ statusbar_position_update(statusbar_t *statusbar)
area = screen_area_get(statusbar->screen, NULL, area = screen_area_get(statusbar->screen, NULL,
&globalconf.screens[statusbar->screen].padding, true); &globalconf.screens[statusbar->screen].padding, true);
/* Top and Bottom statusbar_t have prio */ /* Top and Bottom wibox_t have prio */
for(int i = 0; i < globalconf.screens[statusbar->screen].statusbars.len; i++) for(int i = 0; i < globalconf.screens[statusbar->screen].statusbars.len; i++)
{ {
statusbar_t *sb = globalconf.screens[statusbar->screen].statusbars.tab[i]; wibox_t *sb = globalconf.screens[statusbar->screen].statusbars.tab[i];
/* Ignore every statusbar after me that is in the same position */ /* Ignore every statusbar after me that is in the same position */
if(statusbar == sb) if(statusbar == sb)
{ {
@ -482,7 +483,7 @@ statusbar_position_update(statusbar_t *statusbar)
static int static int
luaA_statusbar_tostring(lua_State *L) luaA_statusbar_tostring(lua_State *L)
{ {
statusbar_t **p = luaA_checkudata(L, 1, "statusbar"); wibox_t **p = luaA_checkudata(L, 1, "statusbar");
lua_pushfstring(L, "[statusbar udata(%p) name(%s)]", *p, (*p)->name); lua_pushfstring(L, "[statusbar udata(%p) name(%s)]", *p, (*p)->name);
return 1; return 1;
} }
@ -498,7 +499,7 @@ luaA_statusbar_tostring(lua_State *L)
static int static int
luaA_statusbar_new(lua_State *L) luaA_statusbar_new(lua_State *L)
{ {
statusbar_t *sb; wibox_t *sb;
const char *buf; const char *buf;
size_t len; size_t len;
xcolor_init_request_t reqs[2]; xcolor_init_request_t reqs[2];
@ -509,7 +510,7 @@ luaA_statusbar_new(lua_State *L)
if(!(buf = luaA_getopt_string(L, 2, "name", NULL))) if(!(buf = luaA_getopt_string(L, 2, "name", NULL)))
luaL_error(L, "object statusbar must have a name"); luaL_error(L, "object statusbar must have a name");
sb = p_new(statusbar_t, 1); sb = p_new(wibox_t, 1);
sb->name = a_strdup(buf); sb->name = a_strdup(buf);
@ -555,7 +556,7 @@ static int
luaA_statusbar_index(lua_State *L) luaA_statusbar_index(lua_State *L)
{ {
size_t len; size_t len;
statusbar_t **statusbar = luaA_checkudata(L, 1, "statusbar"); wibox_t **statusbar = luaA_checkudata(L, 1, "statusbar");
const char *attr = luaL_checklstring(L, 2, &len); const char *attr = luaL_checklstring(L, 2, &len);
if(luaA_usemetatable(L, 1, 2)) if(luaA_usemetatable(L, 1, 2))
@ -597,7 +598,7 @@ luaA_statusbar_index(lua_State *L)
static int static int
luaA_statusbar_widgets(lua_State *L) luaA_statusbar_widgets(lua_State *L)
{ {
statusbar_t **statusbar = luaA_checkudata(L, 1, "statusbar"); wibox_t **statusbar = luaA_checkudata(L, 1, "statusbar");
if(lua_gettop(L) == 2) if(lua_gettop(L) == 2)
{ {
@ -613,7 +614,7 @@ luaA_statusbar_widgets(lua_State *L)
* \param statusbar Statusbar to detach from screen. * \param statusbar Statusbar to detach from screen.
*/ */
static void static void
statusbar_remove(statusbar_t *statusbar) statusbar_remove(wibox_t *statusbar)
{ {
if(statusbar->screen != SCREEN_UNDEF) if(statusbar->screen != SCREEN_UNDEF)
{ {
@ -633,12 +634,12 @@ statusbar_remove(statusbar_t *statusbar)
for(int i = 0; i < globalconf.screens[statusbar->screen].statusbars.len; i++) for(int i = 0; i < globalconf.screens[statusbar->screen].statusbars.len; i++)
if(globalconf.screens[statusbar->screen].statusbars.tab[i] == statusbar) if(globalconf.screens[statusbar->screen].statusbars.tab[i] == statusbar)
{ {
statusbar_array_take(&globalconf.screens[statusbar->screen].statusbars, i); wibox_array_take(&globalconf.screens[statusbar->screen].statusbars, i);
break; break;
} }
globalconf.screens[statusbar->screen].need_arrange = true; globalconf.screens[statusbar->screen].need_arrange = true;
statusbar->screen = SCREEN_UNDEF; statusbar->screen = SCREEN_UNDEF;
statusbar_unref(&statusbar); wibox_unref(&statusbar);
} }
} }
@ -650,7 +651,7 @@ static int
luaA_statusbar_newindex(lua_State *L) luaA_statusbar_newindex(lua_State *L)
{ {
size_t len; size_t len;
statusbar_t **statusbar = luaA_checkudata(L, 1, "statusbar"); wibox_t **statusbar = luaA_checkudata(L, 1, "statusbar");
const char *buf, *attr = luaL_checklstring(L, 2, &len); const char *buf, *attr = luaL_checklstring(L, 2, &len);
position_t p; position_t p;
int screen; int screen;
@ -673,7 +674,7 @@ luaA_statusbar_newindex(lua_State *L)
/* Check for uniq name and id. */ /* Check for uniq name and id. */
for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++) for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++)
{ {
statusbar_t *s = globalconf.screens[screen].statusbars.tab[i]; wibox_t *s = globalconf.screens[screen].statusbars.tab[i];
if(!a_strcmp(s->name, (*statusbar)->name)) if(!a_strcmp(s->name, (*statusbar)->name))
luaL_error(L, "a statusbar with that name is already on screen %d\n", luaL_error(L, "a statusbar with that name is already on screen %d\n",
screen + 1); screen + 1);
@ -683,13 +684,12 @@ luaA_statusbar_newindex(lua_State *L)
(*statusbar)->screen = screen; (*statusbar)->screen = screen;
statusbar_array_append(&globalconf.screens[screen].statusbars, *statusbar); wibox_array_append(&globalconf.screens[screen].statusbars, wibox_ref(statusbar));
statusbar_ref(statusbar);
/* All the other statusbar and ourselves need to be repositioned */ /* All the other statusbar and ourselves need to be repositioned */
for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++) for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++)
{ {
statusbar_t *s = globalconf.screens[screen].statusbars.tab[i]; wibox_t *s = globalconf.screens[screen].statusbars.tab[i];
statusbar_position_update(s); statusbar_position_update(s);
} }
@ -729,7 +729,7 @@ luaA_statusbar_newindex(lua_State *L)
{ {
for(int i = 0; i < globalconf.screens[(*statusbar)->screen].statusbars.len; i++) for(int i = 0; i < globalconf.screens[(*statusbar)->screen].statusbars.len; i++)
{ {
statusbar_t *s = globalconf.screens[(*statusbar)->screen].statusbars.tab[i]; wibox_t *s = globalconf.screens[(*statusbar)->screen].statusbars.tab[i];
statusbar_position_update(s); statusbar_position_update(s);
} }
ewmh_update_workarea(screen_virttophys((*statusbar)->screen)); ewmh_update_workarea(screen_virttophys((*statusbar)->screen));

View File

@ -1,5 +1,5 @@
/* /*
* statusbar.h - statusbar functions header * wibox.h - wibox functions header
* *
* Copyright © 2007-2008 Julien Danjou <julien@danjou.info> * Copyright © 2007-2008 Julien Danjou <julien@danjou.info>
* *
@ -19,30 +19,18 @@
* *
*/ */
#ifndef AWESOME_STATUSBAR_H #ifndef AWESOME_WIBOX_H
#define AWESOME_STATUSBAR_H #define AWESOME_WIBOX_H
#include "structs.h" #include "structs.h"
#include "swindow.h" #include "swindow.h"
#include "common/refcount.h" #include "common/refcount.h"
static inline void wibox_t * statusbar_getbywin(xcb_window_t);
statusbar_delete(statusbar_t **statusbar)
{
simplewindow_wipe(&(*statusbar)->sw);
widget_node_list_wipe(&(*statusbar)->widgets);
p_delete(&(*statusbar)->name);
p_delete(statusbar);
}
statusbar_t * statusbar_getbywin(xcb_window_t);
void statusbar_refresh(void); void statusbar_refresh(void);
void statusbar_position_update(statusbar_t *); void statusbar_position_update(wibox_t *);
int luaA_statusbar_userdata_new(lua_State *, statusbar_t *); int luaA_statusbar_userdata_new(lua_State *, wibox_t *);
DO_RCNT(statusbar_t, statusbar, statusbar_delete)
ARRAY_FUNCS(statusbar_t *, statusbar, statusbar_unref)
#endif #endif
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80 // vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80

125
structs.h
View File

@ -69,9 +69,7 @@ enum
typedef struct button_t button_t; typedef struct button_t button_t;
typedef struct widget_t widget_t; typedef struct widget_t widget_t;
typedef struct widget_node_t widget_node_t; typedef struct widget_node_t widget_node_t;
typedef struct statusbar_t statusbar_t;
typedef struct client_t client_t; typedef struct client_t client_t;
typedef struct titlebar_t titlebar_t;
typedef struct client_node_t client_node_t; typedef struct client_node_t client_node_t;
typedef struct _tag_t tag_t; typedef struct _tag_t tag_t;
typedef struct tag_client_node_t tag_client_node_t; typedef struct tag_client_node_t tag_client_node_t;
@ -79,6 +77,42 @@ typedef widget_t *(widget_constructor_t)(alignment_t);
typedef void (widget_destructor_t)(widget_t *); typedef void (widget_destructor_t)(widget_t *);
typedef struct awesome_t awesome_t; typedef struct awesome_t awesome_t;
/** Wibox type */
typedef struct
{
/** Ref count */
int refcount;
/** Window */
simple_window_t sw;
/** Wibox name */
char *name;
/** Box width and height */
int width, height;
/** Box position */
position_t position;
/** Alignment */
alignment_t align;
/** Screen */
int screen;
/** Widget list */
widget_node_t *widgets;
/** Widget the mouse is over */
widget_node_t *mouse_over;
/** Need update */
bool need_update;
/** Default colors */
struct
{
xcolor_t fg, bg;
} colors;
struct
{
xcolor_t color;
uint16_t width;
} border;
} wibox_t;
ARRAY_TYPE(wibox_t *, wibox)
/** Mouse buttons bindings */ /** Mouse buttons bindings */
struct button_t struct button_t
{ {
@ -109,15 +143,15 @@ struct widget_t
/** Widget destructor */ /** Widget destructor */
widget_destructor_t *destructor; widget_destructor_t *destructor;
/** Widget detach function */ /** Widget detach function */
void (*detach)(widget_t *, void *); void (*detach)(widget_t *, wibox_t *);
/** Draw function */ /** Draw function */
int (*draw)(draw_context_t *, int, widget_node_t *, int, int, void *, awesome_type_t); int (*draw)(draw_context_t *, int, widget_node_t *, int, int, wibox_t *, awesome_type_t);
/** Index function */ /** Index function */
int (*index)(lua_State *, awesome_token_t); int (*index)(lua_State *, awesome_token_t);
/** Newindex function */ /** Newindex function */
int (*newindex)(lua_State *, awesome_token_t); int (*newindex)(lua_State *, awesome_token_t);
/** Button event handler */ /** Button event handler */
void (*button)(widget_node_t *, xcb_button_press_event_t *, int, void *, awesome_type_t); void (*button)(widget_node_t *, xcb_button_press_event_t *, int, wibox_t *, awesome_type_t);
/** Mouse over event handler */ /** Mouse over event handler */
luaA_ref mouse_enter, mouse_leave; luaA_ref mouse_enter, mouse_leave;
/** Alignement */ /** Alignement */
@ -169,83 +203,6 @@ widget_node_delete(widget_node_t **node)
DO_SLIST(widget_node_t, widget_node, widget_node_delete) DO_SLIST(widget_node_t, widget_node, widget_node_delete)
/** Titlebar template structure */
struct titlebar_t
{
/** Ref count */
int refcount;
/** Position */
position_t position;
/** Alignment on window */
alignment_t align;
/** Widgets */
widget_node_t *widgets;
/** Widget the mouse is over */
widget_node_t *mouse_over;
/** Width and height */
int width, height;
/** Titlebar window */
simple_window_t sw;
/** Default colors */
struct
{
xcolor_t fg, bg;
} colors;
/** Border */
struct
{
xcolor_t color;
int width;
} border;
/** Need update */
bool need_update;
};
/** Delete a titlebar structure.
* \param t The titlebar to destroy.
*/
static inline void
titlebar_delete(titlebar_t **t)
{
widget_node_list_wipe(&(*t)->widgets);
p_delete(t);
}
DO_RCNT(titlebar_t, titlebar, titlebar_delete)
/** Status bar */
struct statusbar_t
{
/** Ref count */
int refcount;
/** Window */
simple_window_t sw;
/** statusbar_t name */
char *name;
/** Bar width */
int width;
/** Bar height */
int height;
/** Bar position */
position_t position;
/** Alignment */
alignment_t align;
/** Screen */
int screen;
/** Widget list */
widget_node_t *widgets;
/** Need update */
bool need_update;
/** Default colors */
struct
{
xcolor_t fg, bg;
} colors;
/** Widget the mouse is over */
widget_node_t *mouse_over;
};
ARRAY_TYPE(statusbar_t *, statusbar)
/* Strut */ /* Strut */
typedef struct typedef struct
{ {
@ -318,7 +275,7 @@ struct client_t
/** Path to an icon */ /** Path to an icon */
char *icon_path; char *icon_path;
/** Titlebar */ /** Titlebar */
titlebar_t *titlebar; wibox_t *titlebar;
/** Button bindings */ /** Button bindings */
button_array_t buttons; button_array_t buttons;
/** Icon */ /** Icon */
@ -399,7 +356,7 @@ typedef struct
/** Tag list */ /** Tag list */
tag_array_t tags; tag_array_t tags;
/** Statusbars */ /** Statusbars */
statusbar_array_t statusbars; wibox_array_t statusbars;
/** Padding */ /** Padding */
padding_t padding; padding_t padding;
/** Window that contains the systray */ /** Window that contains the systray */

View File

@ -24,19 +24,20 @@
#include "titlebar.h" #include "titlebar.h"
#include "client.h" #include "client.h"
#include "widget.h" #include "widget.h"
#include "wibox.h"
extern awesome_t globalconf; extern awesome_t globalconf;
DO_LUA_NEW(extern, titlebar_t, titlebar, "titlebar", titlebar_ref) DO_LUA_NEW(extern, wibox_t, titlebar, "titlebar", wibox_ref)
DO_LUA_GC(titlebar_t, titlebar, "titlebar", titlebar_unref) DO_LUA_GC(wibox_t, titlebar, "titlebar", wibox_unref)
DO_LUA_EQ(titlebar_t, titlebar, "titlebar") DO_LUA_EQ(wibox_t, titlebar, "titlebar")
/** Get a client by its titlebar. /** Get a client by its titlebar.
* \param titlebar The titlebar. * \param titlebar The titlebar.
* \return A client. * \return A client.
*/ */
client_t * client_t *
client_getbytitlebar(titlebar_t *titlebar) client_getbytitlebar(wibox_t *titlebar)
{ {
client_t *c; client_t *c;
@ -253,7 +254,7 @@ titlebar_init(client_t *c)
static int static int
luaA_titlebar_new(lua_State *L) luaA_titlebar_new(lua_State *L)
{ {
titlebar_t *tb; wibox_t *tb;
const char *buf; const char *buf;
size_t len; size_t len;
xcolor_init_request_t reqs[3]; xcolor_init_request_t reqs[3];
@ -261,7 +262,7 @@ luaA_titlebar_new(lua_State *L)
luaA_checktable(L, 2); luaA_checktable(L, 2);
tb = p_new(titlebar_t, 1); tb = p_new(wibox_t, 1);
buf = luaA_getopt_lstring(L, 2, "align", "left", &len); buf = luaA_getopt_lstring(L, 2, "align", "left", &len);
tb->align = draw_align_fromstr(buf, len); tb->align = draw_align_fromstr(buf, len);
@ -303,7 +304,7 @@ static int
luaA_titlebar_newindex(lua_State *L) luaA_titlebar_newindex(lua_State *L)
{ {
size_t len; size_t len;
titlebar_t **titlebar = luaA_checkudata(L, 1, "titlebar"); wibox_t **titlebar = luaA_checkudata(L, 1, "titlebar");
const char *buf, *attr = luaL_checklstring(L, 2, &len); const char *buf, *attr = luaL_checklstring(L, 2, &len);
client_t *c = NULL; client_t *c = NULL;
int i; int i;
@ -318,11 +319,10 @@ luaA_titlebar_newindex(lua_State *L)
if((*newc)->titlebar) if((*newc)->titlebar)
{ {
xcb_unmap_window(globalconf.connection, (*newc)->titlebar->sw.window); xcb_unmap_window(globalconf.connection, (*newc)->titlebar->sw.window);
titlebar_unref(&(*newc)->titlebar); wibox_unref(&(*newc)->titlebar);
} }
/* Attach titlebar to client */ /* Attach titlebar to client */
(*newc)->titlebar = *titlebar; (*newc)->titlebar = wibox_ref(titlebar);
titlebar_ref(titlebar);
titlebar_init(*newc); titlebar_init(*newc);
c = *newc; c = *newc;
} }
@ -330,7 +330,7 @@ luaA_titlebar_newindex(lua_State *L)
{ {
xcb_unmap_window(globalconf.connection, (*titlebar)->sw.window); xcb_unmap_window(globalconf.connection, (*titlebar)->sw.window);
/* unref and NULL the ref */ /* unref and NULL the ref */
titlebar_unref(&c->titlebar); wibox_unref(&c->titlebar);
c->titlebar = NULL; c->titlebar = NULL;
client_need_arrange(c); client_need_arrange(c);
} }
@ -405,7 +405,7 @@ static int
luaA_titlebar_index(lua_State *L) luaA_titlebar_index(lua_State *L)
{ {
size_t len; size_t len;
titlebar_t **titlebar = luaA_checkudata(L, 1, "titlebar"); wibox_t **titlebar = luaA_checkudata(L, 1, "titlebar");
const char *attr = luaL_checklstring(L, 2, &len); const char *attr = luaL_checklstring(L, 2, &len);
client_t *c; client_t *c;
@ -447,7 +447,7 @@ luaA_titlebar_index(lua_State *L)
static int static int
luaA_titlebar_widgets(lua_State *L) luaA_titlebar_widgets(lua_State *L)
{ {
titlebar_t **titlebar = luaA_checkudata(L, 1, "titlebar"); wibox_t **titlebar = luaA_checkudata(L, 1, "titlebar");
if(lua_gettop(L) == 2) if(lua_gettop(L) == 2)
{ {
@ -469,7 +469,7 @@ luaA_titlebar_widgets(lua_State *L)
static int static int
luaA_titlebar_tostring(lua_State *L) luaA_titlebar_tostring(lua_State *L)
{ {
titlebar_t **p = luaA_checkudata(L, 1, "titlebar"); wibox_t **p = luaA_checkudata(L, 1, "titlebar");
lua_pushfstring(L, "[titlebar udata(%p)]", *p); lua_pushfstring(L, "[titlebar udata(%p)]", *p);
return 1; return 1;
} }

View File

@ -24,14 +24,14 @@
#include "structs.h" #include "structs.h"
client_t * client_getbytitlebar(titlebar_t *); client_t * client_getbytitlebar(wibox_t *);
client_t * client_getbytitlebarwin(xcb_window_t); client_t * client_getbytitlebarwin(xcb_window_t);
void titlebar_geometry_compute(client_t *, area_t, area_t *); void titlebar_geometry_compute(client_t *, area_t, area_t *);
void titlebar_draw(client_t *); void titlebar_draw(client_t *);
void titlebar_init(client_t *); void titlebar_init(client_t *);
void titlebar_refresh(void); void titlebar_refresh(void);
int luaA_titlebar_userdata_new(lua_State *, titlebar_t *); int luaA_titlebar_userdata_new(lua_State *, wibox_t *);
/** Add the titlebar geometry and border to a geometry. /** Add the titlebar geometry and border to a geometry.
* \param t The titlebar * \param t The titlebar
@ -40,7 +40,7 @@ int luaA_titlebar_userdata_new(lua_State *, titlebar_t *);
* \return A new geometry bigger if the titlebar is visible. * \return A new geometry bigger if the titlebar is visible.
*/ */
static inline area_t static inline area_t
titlebar_geometry_add(titlebar_t *t, int border, area_t geometry) titlebar_geometry_add(wibox_t *t, int border, area_t geometry)
{ {
if(t) if(t)
switch(t->position) switch(t->position)
@ -82,7 +82,7 @@ titlebar_geometry_add(titlebar_t *t, int border, area_t geometry)
* \return A new geometry smaller if the titlebar is visible. * \return A new geometry smaller if the titlebar is visible.
*/ */
static inline area_t static inline area_t
titlebar_geometry_remove(titlebar_t *t, int border, area_t geometry) titlebar_geometry_remove(wibox_t *t, int border, area_t geometry)
{ {
if(t) if(t)
switch(t->position) switch(t->position)

22
wibox.c Normal file
View File

@ -0,0 +1,22 @@
/*
* wibox.c - statusbar functions
*
* Copyright © 2008 Julien Danjou <julien@danjou.info>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*/
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80

44
wibox.h Normal file
View File

@ -0,0 +1,44 @@
/*
* statusbar.h - statusbar functions header
*
* Copyright © 2007-2008 Julien Danjou <julien@danjou.info>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*/
#ifndef AWESOME_STATUSBAR_H
#define AWESOME_STATUSBAR_H
#include "widget.h"
#include "swindow.h"
#include "common/util.h"
#include "common/refcount.h"
#include "common/array.h"
static inline void
wibox_delete(wibox_t **wibox)
{
simplewindow_wipe(&(*wibox)->sw);
widget_node_list_wipe(&(*wibox)->widgets);
p_delete(&(*wibox)->name);
p_delete(wibox);
}
DO_RCNT(wibox_t, wibox, wibox_delete)
ARRAY_FUNCS(wibox_t *, wibox, wibox_unref)
#endif
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80

View File

@ -67,7 +67,7 @@ static void
widget_common_button(widget_node_t *w, widget_common_button(widget_node_t *w,
xcb_button_press_event_t *ev, xcb_button_press_event_t *ev,
int screen __attribute__ ((unused)), int screen __attribute__ ((unused)),
void *p, wibox_t *p,
awesome_type_t type) awesome_type_t type)
{ {
button_array_t *b = &w->widget->buttons; button_array_t *b = &w->widget->buttons;
@ -212,7 +212,7 @@ widget_invalidate_cache(int screen, int flags)
{ {
for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++) for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++)
{ {
statusbar_t *statusbar = globalconf.screens[screen].statusbars.tab[i]; wibox_t *statusbar = globalconf.screens[screen].statusbars.tab[i];
widget_node_t *widget; widget_node_t *widget;
for(widget = statusbar->widgets; widget; widget = widget->next) for(widget = statusbar->widgets; widget; widget = widget->next)
@ -238,7 +238,7 @@ widget_invalidate_bywidget(widget_t *widget)
for(screen = 0; screen < globalconf.nscreen; screen++) for(screen = 0; screen < globalconf.nscreen; screen++)
for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++) for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++)
{ {
statusbar_t *statusbar = globalconf.screens[screen].statusbars.tab[i]; wibox_t *statusbar = globalconf.screens[screen].statusbars.tab[i];
if(!statusbar->need_update) if(!statusbar->need_update)
for(witer = statusbar->widgets; witer; witer = witer->next) for(witer = statusbar->widgets; witer; witer = witer->next)

View File

@ -145,7 +145,7 @@ graph_draw(draw_context_t *ctx,
widget_node_t *w, widget_node_t *w,
int offset, int offset,
int used __attribute__ ((unused)), int used __attribute__ ((unused)),
void *p __attribute__ ((unused)), wibox_t *p __attribute__ ((unused)),
awesome_type_t type) awesome_type_t type)
{ {
int margin_top, y; int margin_top, y;

View File

@ -45,7 +45,7 @@ static int
imagebox_draw(draw_context_t *ctx, int screen __attribute__ ((unused)), imagebox_draw(draw_context_t *ctx, int screen __attribute__ ((unused)),
widget_node_t *w, widget_node_t *w,
int offset, int used, int offset, int used,
void *p, awesome_type_t type) wibox_t *p, awesome_type_t type)
{ {
imagebox_data_t *d = w->widget->data; imagebox_data_t *d = w->widget->data;

View File

@ -129,7 +129,7 @@ progressbar_draw(draw_context_t *ctx,
widget_node_t *w, widget_node_t *w,
int offset, int offset,
int used __attribute__ ((unused)), int used __attribute__ ((unused)),
void *p __attribute__ ((unused)), wibox_t *p __attribute__ ((unused)),
awesome_type_t type) awesome_type_t type)
{ {
/* pb_.. values points to the widget inside a potential border */ /* pb_.. values points to the widget inside a potential border */

View File

@ -37,12 +37,10 @@ systray_draw(draw_context_t *ctx,
int screen __attribute__ ((unused)), int screen __attribute__ ((unused)),
widget_node_t *w, widget_node_t *w,
int offset, int used __attribute__ ((unused)), int offset, int used __attribute__ ((unused)),
void *p, wibox_t *p,
awesome_type_t type) awesome_type_t type)
{ {
uint32_t orient; uint32_t orient;
/* p is always a statusbar, titlebars are forbidden */
statusbar_t *sb = (statusbar_t *) p;
/* we are on a statusbar */ /* we are on a statusbar */
assert(type == AWESOME_TYPE_STATUSBAR); assert(type == AWESOME_TYPE_STATUSBAR);
@ -54,7 +52,7 @@ systray_draw(draw_context_t *ctx,
int i = 0; int i = 0;
xembed_window_t *em; xembed_window_t *em;
for(em = globalconf.embedded; em; em = em->next) for(em = globalconf.embedded; em; em = em->next)
if(em->phys_screen == sb->sw.ctx.phys_screen) if(em->phys_screen == p->sw.ctx.phys_screen)
i++; i++;
/** \todo use clas hints */ /** \todo use clas hints */
w->area.width = MIN(i * ctx->height, ctx->width - used); w->area.width = MIN(i * ctx->height, ctx->width - used);
@ -68,7 +66,7 @@ systray_draw(draw_context_t *ctx,
w->widget->align); w->widget->align);
w->area.y = 0; w->area.y = 0;
switch(sb->position) switch(p->position)
{ {
case Right: case Right:
case Left: case Left:
@ -82,7 +80,7 @@ systray_draw(draw_context_t *ctx,
/* set statusbar orientation */ /* set statusbar orientation */
/** \todo stop setting that property on each redraw */ /** \todo stop setting that property on each redraw */
xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE,
globalconf.screens[sb->sw.ctx.phys_screen].systray.window, globalconf.screens[p->sw.ctx.phys_screen].systray.window,
_NET_SYSTEM_TRAY_ORIENTATION, CARDINAL, 32, 1, &orient); _NET_SYSTEM_TRAY_ORIENTATION, CARDINAL, 32, 1, &orient);
return w->area.width; return w->area.width;

View File

@ -33,7 +33,7 @@ extern awesome_t globalconf;
typedef struct taglist_drawn_area_t taglist_drawn_area_t; typedef struct taglist_drawn_area_t taglist_drawn_area_t;
struct taglist_drawn_area_t struct taglist_drawn_area_t
{ {
void *object; wibox_t *object;
area_array_t areas; area_array_t areas;
taglist_drawn_area_t *next, *prev; taglist_drawn_area_t *next, *prev;
}; };
@ -58,7 +58,7 @@ typedef struct
} taglist_data_t; } taglist_data_t;
static taglist_drawn_area_t * static taglist_drawn_area_t *
taglist_drawn_area_getbyobj(taglist_drawn_area_t *list, void *p) taglist_drawn_area_getbyobj(taglist_drawn_area_t *list, wibox_t *p)
{ {
taglist_drawn_area_t *t; taglist_drawn_area_t *t;
@ -83,7 +83,7 @@ static int
taglist_draw(draw_context_t *ctx, int screen, widget_node_t *w, taglist_draw(draw_context_t *ctx, int screen, widget_node_t *w,
int offset, int offset,
int used __attribute__ ((unused)), int used __attribute__ ((unused)),
void *object, wibox_t *object,
awesome_type_t type) awesome_type_t type)
{ {
taglist_data_t *data = w->widget->data; taglist_data_t *data = w->widget->data;
@ -168,7 +168,7 @@ static void
taglist_button(widget_node_t *w, taglist_button(widget_node_t *w,
xcb_button_press_event_t *ev, xcb_button_press_event_t *ev,
int screen, int screen,
void *object, wibox_t *object,
awesome_type_t type) awesome_type_t type)
{ {
tag_array_t *tags = &globalconf.screens[screen].tags; tag_array_t *tags = &globalconf.screens[screen].tags;
@ -265,7 +265,7 @@ taglist_destructor(widget_t *widget)
* \param object The object we are leaving. * \param object The object we are leaving.
*/ */
static void static void
taglist_detach(widget_t *widget, void *object) taglist_detach(widget_t *widget, wibox_t *object)
{ {
taglist_data_t *d = widget->data; taglist_data_t *d = widget->data;
taglist_drawn_area_t *tda; taglist_drawn_area_t *tda;

View File

@ -55,7 +55,7 @@ typedef struct tasklist_object_data_t tasklist_object_data_t;
struct tasklist_object_data_t struct tasklist_object_data_t
{ {
/** The object */ /** The object */
void *object; wibox_t *object;
/** The box width for each client */ /** The box width for each client */
int box_width; int box_width;
/** The client label array for the object */ /** The client label array for the object */
@ -88,7 +88,7 @@ typedef struct
* \return A object data or NULL if not found. * \return A object data or NULL if not found.
*/ */
static tasklist_object_data_t * static tasklist_object_data_t *
tasklist_object_data_getbyobj(tasklist_object_data_t *od, void *p) tasklist_object_data_getbyobj(tasklist_object_data_t *od, wibox_t *p)
{ {
tasklist_object_data_t *o; tasklist_object_data_t *o;
@ -178,7 +178,7 @@ tasklist_draw_item(draw_context_t *ctx,
static int static int
tasklist_draw(draw_context_t *ctx, int screen, tasklist_draw(draw_context_t *ctx, int screen,
widget_node_t *w, widget_node_t *w,
int offset, int used, void *p, int offset, int used, wibox_t *p,
awesome_type_t type) awesome_type_t type)
{ {
client_t *c; client_t *c;
@ -279,7 +279,7 @@ static void
tasklist_button(widget_node_t *w, tasklist_button(widget_node_t *w,
xcb_button_press_event_t *ev, xcb_button_press_event_t *ev,
int screen, int screen,
void *object, wibox_t *object,
awesome_type_t type) awesome_type_t type)
{ {
tasklist_data_t *d = w->widget->data; tasklist_data_t *d = w->widget->data;
@ -388,7 +388,7 @@ tasklist_destructor(widget_t *widget)
* \param object The object we are leaving. * \param object The object we are leaving.
*/ */
static void static void
tasklist_detach(widget_t *widget, void *object) tasklist_detach(widget_t *widget, wibox_t *object)
{ {
tasklist_data_t *d = widget->data; tasklist_data_t *d = widget->data;
tasklist_object_data_t *od; tasklist_object_data_t *od;

View File

@ -53,7 +53,7 @@ static int
textbox_draw(draw_context_t *ctx, int screen __attribute__ ((unused)), textbox_draw(draw_context_t *ctx, int screen __attribute__ ((unused)),
widget_node_t *w, widget_node_t *w,
int offset, int used, int offset, int used,
void *p __attribute__ ((unused)), wibox_t *p __attribute__ ((unused)),
awesome_type_t type) awesome_type_t type)
{ {
textbox_data_t *d = w->widget->data; textbox_data_t *d = w->widget->data;