commit - 749e270c9e436c9e475d2ef00a30660ad7f1b12e
commit + 022fe1302ee7a0a1b07222bc3219e2be2960e58f
blob - 7e285dc9cc7d37558104a0476578f5ec3960492c
blob + e1bb4ca5fdb74148abbb1deea15b7c645763e8a8
--- TODO
+++ TODO
mostly for FreeBSD as OpenBSD and NetBSD already come with X11R6 and
X11R7.
-- Fix font line spacing in `mui_label`. When turning on setting the color
- of the xcb_render picture in `context.c` there is a noticable gap at
- the end of the texture. This is due to the layout height being multiplied
- by 1.5 as a temporary hack.
-
- Makefile for OpenBSD ports. The make command currently only create a
limbui.so file in the library folder. Change the makefile to install the
library on an OpenBSD system.
- Add label partial font styling to have different styles inside the same
label. More customization to label in other world.
+
+- Make event poping faster
blob - 1a3f4838d6f15495ff8fcdc0c8b1becb22a91327
blob + d22a4777aabf673199ee3f7ef4b102ccf6c86592
--- context.c
+++ context.c
{
uint16_t width;
uint16_t height;
+ uint16_t gwidth;
xcb_rectangle_t rect;
xcb_pixmap_t xcb_pixmap;
xcb_render_picture_t xcb_picture;
xcb_render_color_t xcb_color;
struct mui_label *label;
+ struct mui_group *group;
struct mui_layout *layout;
+ struct mui_layout *glayout;
label = (struct mui_label *)node->ptr;
layout = mui_get_label_layout(label);
+ group = mui_get_label_group(label);
+ glayout = mui_get_group_layout(group);
+ gwidth = mui_get_layout_width(glayout);
+
+
width = mui_get_layout_width(layout);
height = mui_get_layout_height(layout) * 1.5;
rect.x = 0;
rect.y = 0;
- rect.width = width;
+ rect.width = gwidth;
rect.height = height;
xcb_pixmap = xcb_generate_id(xcb.conn);
xcb_picture = xcb_generate_id(xcb.conn);
- xcb_create_pixmap(xcb.conn, 32, xcb_pixmap, xcb.screen->root, width, height);
+ xcb_create_pixmap(xcb.conn, 32, xcb_pixmap, xcb.screen->root, gwidth, height);
xcb_render_create_picture(xcb.conn, xcb_picture, xcb_pixmap, xcb.fmt_argb32, 0, NULL);
xcb_render_fill_rectangles(xcb.conn, XCB_RENDER_PICT_OP_SRC, xcb_picture, xcb_color, 1, &rect);
struct mui_color m_color;
int tindex; /* Text index */
int last_width;
+ int flags;
struct mui_gindice *ptr;
struct mui_gindice *last_indice;
tindex = 0;
last_width = 0;
last_indice = NULL;
+ flags = mui_get_label_flags(label);
while ((ptr = mui_get_label_next_indice(label, ptr))) {
+ int offset = 0;
header.dy += xcb.fonts[ptr->gs]->height;
/*
*
* This line will offset properly the xcb_picture
*/
+
+ if (flags & MUI_TEXT_ALIGN_RIGHT)
+ offset = gwidth - mui_get_label_line_width(label, ptr->lnum);
+ else if (flags & MUI_TEXT_ALIGN_CENTER)
+ offset = (gwidth - mui_get_label_line_width(label, ptr->lnum)) / 2;
+
if (last_indice) {
if (last_indice->lnum == ptr->lnum) {
header.dx = last_width;
}
}
+ header.dx += offset;
+
header.count = ptr->len;
text = mui_get_label_text(label);
blob - 1c9fac3bbc67c9dd9f7c24349f0b5e23c2a18b85
blob + a4f4b80eca3835b543e760efe65029d21b816028
--- demo/text/main.c
+++ demo/text/main.c
"OpenBSD - Free, Functional and secure\n\n"
"NetBSD- Free, Fast, Secure and highly portable Unix-like Open Source operating system\n\n"
"FreeBSD - The Power to Serve\n\n"
-"DragonflyBSD";
+"DragonflyBSD - The Power to Fly?";
int
main(void)
{
struct mui_event event;
struct mui_label *label;
+ struct mui_layout *layout;
window.mw = mui_create_window("text.ex", 320, 240);
window.group = mui_get_window_group(window.mw);
window.handler = mui_get_window_event_handler(window.mw);
label = mui_create_label(notice);
- mui_set_label_flags(label, MUI_TEXT_WRAPPED | MUI_TEXT_MULTILINE);
+ layout = mui_get_label_layout(label);
mui_group_add(window.group, MUI_LABEL, label);
+ mui_set_label_flags(label, MUI_TEXT_WRAPPED | MUI_TEXT_MULTILINE | MUI_TEXT_ALIGN_CENTER);
while ((event = mui_pop_event(window.handler)).type != MUI_EVENT_QUIT) {
mui_update();
blob - 7550594e8ce6f36f6d267ec6b8d9396befa14332
blob + f867e35956bb7b8d3076c09523d231ea5eb3d57d
--- event.c
+++ event.c
#include "mui.h"
+#define MUI_EVENT_MAX 4
+
struct mui_event_handler {
- uint8_t count;
- struct mui_window *mw;
- TAILQ_HEAD(ev_list, mui_event) head;
+ int capacity;
+ struct mui_window *mw;
+ TAILQ_HEAD(elist, mui_event) head;
};
{
struct mui_event_handler *handler;
- handler = calloc(1, sizeof(*handler));
+ handler = malloc(sizeof(*handler));
TAILQ_INIT(&handler->head);
- handler->count = 0;
+ handler->capacity = 0;
handler->mw = mw;
-
return handler;
}
void
mui_push_event(struct mui_event_handler *handler, struct mui_event *event)
{
- struct mui_event *current;
+ struct mui_event *del;
+ struct mui_event *new;
- if (handler->count == MUI_EVENT_MAX) {
- struct mui_event *tail;
-
- tail = TAILQ_FIRST(&handler->head);
- TAILQ_REMOVE(&handler->head, tail, entries);
- handler->count--;
- free(tail);
+ if (handler->capacity == MUI_EVENT_MAX) {
+ del = TAILQ_FIRST(&handler->head);
+ TAILQ_REMOVE(&handler->head, del, entries);
+ handler->capacity--;
+ free(del);
}
- current = calloc(1, sizeof(*current));
- memcpy(current, event, sizeof(struct mui_event));
-
- current->target.id = MUI_UNDEF;
- current->target.ptr = NULL;
- mui_event_set_target(handler, current);
- TAILQ_INSERT_HEAD(&handler->head, current, entries);
-
- handler->count++;
+ handler->capacity++;
+ new = calloc(1, sizeof(*new));
+ memcpy(new, event, sizeof(*new));
+ mui_event_set_target(handler, new);
+ TAILQ_INSERT_HEAD(&handler->head, new, entries);
}
struct mui_event
mui_pop_event(struct mui_event_handler *handler)
{
- struct mui_event event;
- struct mui_event *head;
+ struct mui_event event, *head;
- event.type = MUI_EVENT_NONE;
+ event.type = MUI_UNDEF;
+ if (handler->capacity == 0) return event;
- if (handler->count == 0)
- return event;
-
- head = TAILQ_LAST(&handler->head, ev_list);
-
+ head = TAILQ_LAST(&handler->head, elist);
memcpy(&event, head, sizeof(event));
TAILQ_REMOVE(&handler->head, head, entries);
free(head);
- handler->count--;
+ handler->capacity--;
return event;
}
blob - 27be9d05366f4aba761b51139b2701a9ca1877e5
blob + cc36c3ab9073768ecd209ad42b0b1672e3b29020
--- label.c
+++ label.c
struct mui_group *group;
struct mui_layout *layout;
+ uint16_t *widths;
TAILQ_HEAD(mui_gindice_h, mui_gindice) head;
};
memcpy(label->text, text, label->len);
label->text[label->len] = '\0';
label->font_id = 0;
+ label->flags = 0;
+ label->vlen = 0;
label->group = NULL;
label->color = (struct mui_color) { 0, 0, 0, 1.0 };
mui_group_remove(label->group, MUI_LABEL, label);
mui_delete_layout(label->layout);
+ free(label->widths);
free(label->text);
free(label);
}
}
int
+mui_get_label_line_width(struct mui_label *label, int line)
+{
+ return label->widths[line];
+}
+
+int
mui_get_label_len(struct mui_label *label)
{
return label->len;
return label->text;
}
+int
+mui_get_label_flags(struct mui_label *label)
+{
+ return label->flags;
+}
+
struct mui_color
mui_get_label_color(struct mui_label *label)
{
uint16_t twidth;
uint16_t lwidth;
uint32_t gs, lnum;
+ uint16_t last_width;
struct mui_gindice *np;
struct mui_layout *layout;
layout = mui_get_group_layout(label->group);
lwidth = mui_get_layout_width(layout);
+ last_width = 0;
gs = len = lnum = 0;
width = height = 0;
+ label->vlen = 0;
last_space = 0;
twidth = 0;
twidth += mui_ctx_get_glyph_width(label->text[i], label->font_id);
- if (label->text[i] == ' ')
+ if (label->text[i] == ' ') {
last_space = i;
+ last_width = twidth - mui_ctx_get_glyph_width(label->text[i], label->font_id);
+ }
if (twidth > lwidth && last_space > 0 && label->flags & MUI_TEXT_WRAPPED) {
/* Checking in current indice for last line */
width = (width < lwidth) ? lwidth : width;
height += mui_ctx_get_font_height(label->font_id);
+ label->widths = reallocarray(label->widths, ++label->vlen, sizeof(uint16_t));
+ label->widths[label->vlen-1] = last_width;
TAILQ_INSERT_TAIL(&label->head, np, entries);
i = last_space;
} else {
int cindex;
struct mui_gindice *curr;
- struct mui_gindice *next;
cindex = i - len;
curr = TAILQ_LAST(&label->head, mui_gindice_h);
while (cindex - curr->len > last_space) {
cindex -= curr->len;
- curr = TAILQ_PREV(curr, mui_gindice_h, entries);
+ TAILQ_REMOVE(&label->head, curr, entries);
+ curr = TAILQ_LAST(&label->head, mui_gindice_h);
}
- while ((next = TAILQ_NEXT(curr, entries))) {
- TAILQ_REMOVE(&label->head, next, entries);
- free(next);
- }
-
i = cindex - curr->len;
- curr->len = last_space - i;
+ curr->len = (last_space - i);
+ curr->lnum = lnum;
width = (width < lwidth) ? lwidth : width;
+ label->widths = reallocarray(label->widths, ++label->vlen, sizeof(uint16_t));
+ label->widths[label->vlen-1] = last_width;
i = last_space;
last_space = 0;
np->lnum = lnum;
width = (width < twidth) ? twidth : width;
height += mui_ctx_get_font_height(label->font_id);
+ label->widths = reallocarray(label->widths, ++label->vlen, sizeof(uint16_t));
+ label->widths[label->vlen-1] = twidth;
TAILQ_INSERT_TAIL(&label->head, np, entries);
break;
len = 0;
TAILQ_INSERT_TAIL(&label->head, np, entries);
- printf("{%d, %d, %d}, ", np->lnum, np->gs, np->len);
}
if (label->text[i] == '\n' && label->flags & MUI_TEXT_MULTILINE) {
width = (width < twidth) ? twidth : width;
height += mui_ctx_get_font_height(label->font_id);
+ label->widths = reallocarray(label->widths, ++label->vlen, sizeof(uint16_t));
+ label->widths[label->vlen-1] = twidth;
twidth = 0;
TAILQ_INSERT_TAIL(&label->head, np, entries);
mui_set_label_flags(struct mui_label *label, int flags)
{
label->flags = flags;
+ mui_format_label(label);
+
+ if (label->group)
+ mui_update_group_member_node(label->group, mui_in_group(label->group, MUI_LABEL, label));
}
blob - c9736c535e1c840f9cf282847f9187ef8013f530
blob + 8061a2f9ee7a02d181460e7f4ea54b475ba0ecb7
--- layout.c
+++ layout.c
layout->scale_x = l_scale_x;
layout->scale_y = l_scale_y;
- if (l_group) mui_update_group_member(l_group, mui_in_group(l_group, layout->type, layout->ptr));
+ if (layout->type == MUI_LABEL) {
+ mui_format_label(layout->ptr);
+ if (l_group)
+ mui_update_group_member_node(l_group, mui_in_group(l_group, layout->type, layout->ptr));
+ } else {
+ if (l_group)
+ mui_update_group_member(l_group, mui_in_group(l_group, layout->type, layout->ptr));
+ }
}
void
blob - daa50e1a8b330d153dcdaa012f2f6343b9e805b1
blob + b635ca1011256518c03b8d6efbc6ef21c123a3f5
--- mui.h
+++ mui.h
struct mui_ctx;
-#define MUI_EVENT_MAX 3
-
enum {
MUI_EVENT_NONE,
MUI_EVENT_QUIT,
void mui_delete_label(struct mui_label *label);
+void mui_format_label(struct mui_label *label);
+
struct mui_group *mui_get_label_group(struct mui_label *label);
struct mui_layout *mui_get_label_layout(struct mui_label *label);
int mui_get_label_len(struct mui_label *label);
+int mui_get_label_flags(struct mui_label *label);
+
struct mui_color mui_get_label_color(struct mui_label *label);
struct mui_gindice *mui_get_label_next_indice(struct mui_label *label, struct mui_gindice *ptr);
+int mui_get_label_line_width(struct mui_label *label, int line);
+
void mui_set_label_color(struct mui_label *label, float r, float g, float b, float a);
void mui_set_label_flags(struct mui_label *label, int flags);
#define MUI_TEXT_WRAPPED 1
#define MUI_TEXT_MULTILINE 2
+#define MUI_TEXT_ALIGN_RIGHT 4
+#define MUI_TEXT_ALIGN_CENTER 8
/* KEY CODES
*