Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
116 changes: 86 additions & 30 deletions lemonbar.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,17 @@ enum {
GC_MAX
};

enum {
NET_WM_WINDOW_TYPE,
NET_WM_WINDOW_TYPE_DOCK,
NET_WM_DESKTOP,
NET_WM_STRUT_PARTIAL,
NET_WM_STRUT,
NET_WM_STATE,
NET_WM_STATE_STICKY,
NET_WM_STATE_ABOVE,
};
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's just add a NET_WM_ATOM_MAX to avoid the sizeof/sizeof repeated twice.


#define MAX_FONT_COUNT 5

static xcb_connection_t *c;
Expand All @@ -100,6 +111,18 @@ static int bu = 1; // Underline height
static rgba_t fgc, bgc, ugc;
static rgba_t dfgc, dbgc, dugc;
static area_stack_t area_stack;
static const char *atom_names[] = {
"_NET_WM_WINDOW_TYPE",
"_NET_WM_WINDOW_TYPE_DOCK",
"_NET_WM_DESKTOP",
"_NET_WM_STRUT_PARTIAL",
"_NET_WM_STRUT",
"_NET_WM_STATE",
// Leave those at the end since are batch-set
"_NET_WM_STATE_STICKY",
"_NET_WM_STATE_ABOVE",
};
static xcb_atom_t atom_list[sizeof(atom_names) / sizeof(char *)];

void
update_gc (void)
Expand Down Expand Up @@ -342,7 +365,6 @@ set_attribute (const char modifier, const char attribute)
}
}


area_t *
area_get (xcb_window_t win, const int btn, const int x)
{
Expand Down Expand Up @@ -416,7 +438,7 @@ area_add (char *str, const char *optend, char **end, monitor_t *mon, const int x
}

if (area_stack.at + 1 > area_stack.max) {
fprintf(stderr, "Cannot add any more clickable areas (used %d/%d)\n",
fprintf(stderr, "Cannot add any more clickable areas (used %d/%d)\n",
area_stack.at, area_stack.max);
return false;
}
Expand Down Expand Up @@ -703,34 +725,11 @@ font_load (const char *pattern)
font_list[font_count++] = ret;
}

enum {
NET_WM_WINDOW_TYPE,
NET_WM_WINDOW_TYPE_DOCK,
NET_WM_DESKTOP,
NET_WM_STRUT_PARTIAL,
NET_WM_STRUT,
NET_WM_STATE,
NET_WM_STATE_STICKY,
NET_WM_STATE_ABOVE,
};

void
set_ewmh_atoms (void)
{
const char *atom_names[] = {
"_NET_WM_WINDOW_TYPE",
"_NET_WM_WINDOW_TYPE_DOCK",
"_NET_WM_DESKTOP",
"_NET_WM_STRUT_PARTIAL",
"_NET_WM_STRUT",
"_NET_WM_STATE",
// Leave those at the end since are batch-set
"_NET_WM_STATE_STICKY",
"_NET_WM_STATE_ABOVE",
};
const int atoms = sizeof(atom_names)/sizeof(char *);
const int atoms = sizeof(atom_names) / sizeof(char *);
xcb_intern_atom_cookie_t atom_cookie[atoms];
xcb_atom_t atom_list[atoms];
xcb_intern_atom_reply_t *atom_reply;

// As suggested fetch all the cookies first (yum!) and then retrieve the
Expand Down Expand Up @@ -768,6 +767,44 @@ set_ewmh_atoms (void)
}
}

void
update_ewmh_atoms (void)
{
// Only desktops that support EWMH should continue
if (!atom_list[0])
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is a xcb_atom_t type nullable?

return;

// Update struts
for (monitor_t *mon = monhead; mon; mon = mon->next) {
int strut[12] = {0};
if (topbar) {
strut[2] = bh;
strut[8] = mon->x;
strut[9] = mon->x + mon->width - 1;
} else {
strut[3] = bh;
strut[10] = mon->x;
strut[11] = mon->x + mon->width - 1;
}

xcb_change_property(c, XCB_PROP_MODE_REPLACE, mon->window, atom_list[NET_WM_STRUT_PARTIAL], XCB_ATOM_CARDINAL, 32, 12, strut);
xcb_change_property(c, XCB_PROP_MODE_REPLACE, mon->window, atom_list[NET_WM_STRUT], XCB_ATOM_CARDINAL, 32, 4, strut);
}
}

void
create_pixmap (monitor_t *mon)
{
if (mon->pixmap) {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No brackets on 1-line ifs.

xcb_free_pixmap(c, mon->pixmap);
}

int depth = (visual == scr->root_visual) ? XCB_COPY_FROM_PARENT : 32;

mon->pixmap = xcb_generate_id(c);
xcb_create_pixmap(c, depth, mon->pixmap, mon->window, mon->width, bh);
}

monitor_t *
monitor_new (int x, int y, int width, int height)
{
Expand All @@ -790,11 +827,9 @@ monitor_new (int x, int y, int width, int height)
ret->x, ret->y, width, bh, 0,
XCB_WINDOW_CLASS_INPUT_OUTPUT, visual,
XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL | XCB_CW_OVERRIDE_REDIRECT | XCB_CW_EVENT_MASK | XCB_CW_COLORMAP,
(const uint32_t []){ bgc.v, bgc.v, dock, XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_BUTTON_PRESS, colormap });

ret->pixmap = xcb_generate_id(c);
xcb_create_pixmap(c, depth, ret->pixmap, ret->window, width, bh);
(const uint32_t []){ bgc.v, bgc.v, dock, XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_STRUCTURE_NOTIFY, colormap });

create_pixmap(ret);
return ret;
}

Expand Down Expand Up @@ -1262,6 +1297,7 @@ main (int argc, char **argv)
xcb_generic_event_t *ev;
xcb_expose_event_t *expose_ev;
xcb_button_press_event_t *press_ev;
xcb_configure_notify_event_t *notify_ev;
char input[4096] = {0, };
bool permanent = false;
int geom_v[4] = { -1, -1, 0, 0 };
Expand Down Expand Up @@ -1383,6 +1419,26 @@ main (int argc, char **argv)
}
}
break;
case XCB_CONFIGURE_NOTIFY:
notify_ev = (xcb_configure_notify_event_t *)ev;

for (monitor_t *mon = monhead; mon; mon = mon->next) {
if (mon->window != notify_ev->window)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Once the matching window is processed you can terminate the loop.

continue;

mon->x = notify_ev->x;
mon->y = notify_ev->y;
bw = mon->width = notify_ev->width;
bh = notify_ev->height;

create_pixmap(mon); // Xorg doesn't allow resizing pixmaps, so we create a new one
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Put the comment above the code so that the lines are not too long.

update_ewmh_atoms();

// Reprocess last input using the new geometry
parse(input);
redraw = true;
}
break;
}

free(ev);
Expand Down