LAB_SSD_BUTTON_CLOSE,
LAB_SSD_BUTTON_MAXIMIZE,
LAB_SSD_BUTTON_ICONIFY,
+ LAB_SSD_PART_TITLEBAR,
LAB_SSD_PART_TITLE,
LAB_SSD_PART_CORNER_TOP_LEFT,
LAB_SSD_PART_CORNER_TOP_RIGHT,
struct wlr_box ssd_box(struct view *view, enum ssd_part_type type);
enum ssd_part_type ssd_at(struct view *view, double lx, double ly);
uint32_t ssd_resize_edges(enum ssd_part_type type);
+void ssd_update_title(struct view *view);
void ssd_create(struct view *view);
void ssd_destroy(struct view *view);
void ssd_update_geometry(struct view *view);
desktop_focus_view(&server->seat, view);
damage_all_outputs(server);
- if (is_double_click(500) && view_area == LAB_SSD_PART_TITLE) {
+ if (is_double_click(500) && view_area == LAB_SSD_PART_TITLEBAR) {
view_toggle_maximize(view);
return;
}
case LAB_SSD_BUTTON_ICONIFY:
view_minimize(view, true);
break;
- case LAB_SSD_PART_TITLE:
+ case LAB_SSD_PART_TITLEBAR:
interactive_begin(view, LAB_INPUT_STATE_MOVE, 0);
break;
case LAB_SSD_BUTTON_MAXIMIZE:
{
view->toplevel_handle = wlr_foreign_toplevel_handle_v1_create(
view->server->foreign_toplevel_manager);
+ if (!view->toplevel_handle) {
+ wlr_log(WLR_ERROR, "cannot create foreign toplevel handle for (%s)",
+ view->impl->get_string_prop(view, "title"));
+ return;
+ }
+
view_update_title(view);
wlr_foreign_toplevel_handle_v1_output_enter(view->toplevel_handle,
view_wlr_output(view));
handle_toplevel_handle_request_minimize;
wl_signal_add(&view->toplevel_handle->events.request_minimize,
&view->toplevel_handle_request_minimize);
+ // TODO: hook up remaining signals
}
#include <assert.h>
#include "config/rcxml.h"
+#include "common/font.h"
#include "labwc.h"
#include "theme.h"
#include "ssd.h"
box.width = theme->title_height;
box.height = theme->title_height;
break;
- case LAB_SSD_PART_TITLE:
+ case LAB_SSD_PART_TITLEBAR:
box.x = view->x;
box.y = view->y - theme->title_height;
box.width = view->w;
case LAB_SSD_BUTTON_ICONIFY:
box = ssd_interactive_box(view, type);
break;
- case LAB_SSD_PART_TITLE:
+ case LAB_SSD_PART_TITLEBAR:
box = ssd_interactive_box(view, type);
box.x += theme->title_height;
box.width -= 2 * theme->title_height;
break;
+ case LAB_SSD_PART_TITLE:
+ box = ssd_box(view, LAB_SSD_PART_TITLEBAR);
+ if (view->title) {
+ /* center align title vertically within allocated box */
+ box.y += (box.height - view->title->height) / 2;
+ box.width = view->title->width;
+ box.height = view->title->height;
+ }
+ break;
case LAB_SSD_PART_CORNER_TOP_LEFT:
box = ssd_interactive_box(view, type);
box.x += INVISIBLE_MARGIN;
return part;
}
+void
+ssd_update_title(struct view *view)
+{
+ struct theme *theme = view->server->theme;
+
+ /* TODO: use window.active.label.text.color here */
+ /* TODO: set max_width propertly */
+ font_texture_create(view->server, &view->title, 200,
+ view->impl->get_string_prop(view, "title"),
+ rc.font_name_activewindow,
+ theme->menu_items_active_text_color);
+
+ struct ssd_part *part;
+ wl_list_for_each(part, &view->ssd.parts, link) {
+ if (part->type == LAB_SSD_PART_TITLE) {
+ part->box = ssd_box(view, part->type);
+ break;
+ }
+ }
+}
+
void
ssd_create(struct view *view)
{
}
/* titlebar */
- part = add_part(view, LAB_SSD_PART_TITLE);
- part->box = ssd_box(view, LAB_SSD_PART_TITLE);
+ part = add_part(view, LAB_SSD_PART_TITLEBAR);
+ part->box = ssd_box(view, LAB_SSD_PART_TITLEBAR);
part->color.active = theme->window_active_title_bg_color;
part->color.inactive = theme->window_inactive_title_bg_color;
+ /* title text */
+ part = add_part(view, LAB_SSD_PART_TITLE);
+ ssd_update_title(view);
+ part->texture.active = &view->title;
+ part->texture.inactive = &view->title;
+
/* titlebar top-left corner */
part = add_part(view, LAB_SSD_PART_CORNER_TOP_LEFT);
part->box = ssd_box(view, part->type);