From 371ee3e8cc0d7d315e822d4c6f131b068b39f380 Mon Sep 17 00:00:00 2001 From: Julien Danjou Date: Thu, 17 Sep 2009 15:05:53 +0200 Subject: [PATCH] titlebar: remove Signed-off-by: Julien Danjou --- CMakeLists.txt | 1 - awesome.c | 4 - awesomerc.lua.in | 3 - banning.c | 28 +-- common/tokenize.gperf | 3 - event.c | 27 ++- lib/awful/init.lua.in | 1 - lib/awful/layout/init.lua.in | 1 - lib/awful/titlebar.lua.in | 422 ----------------------------------- luaa.c | 3 - luadoc/client.lua | 1 - luadoc/wibox.lua | 3 - objects/client.c | 61 ++--- objects/client.h | 2 - objects/wibox.c | 228 +++---------------- objects/wibox.h | 22 +- objects/widget.c | 14 +- objects/widgets/imagebox.c | 1 - objects/widgets/systray.c | 13 +- screen.c | 3 - titlebar.c | 366 ------------------------------ titlebar.h | 156 ------------- 22 files changed, 69 insertions(+), 1294 deletions(-) delete mode 100644 lib/awful/titlebar.lua.in delete mode 100644 titlebar.c delete mode 100644 titlebar.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 97cfb72d..00732635 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,7 +58,6 @@ set(AWE_SRCS ${SOURCE_DIR}/objects/wibox.c ${SOURCE_DIR}/systray.c ${SOURCE_DIR}/objects/tag.c - ${SOURCE_DIR}/titlebar.c ${SOURCE_DIR}/objects/widget.c ${SOURCE_DIR}/window.c ${SOURCE_DIR}/image.c diff --git a/awesome.c b/awesome.c index d7b3212b..bac38a74 100644 --- a/awesome.c +++ b/awesome.c @@ -39,7 +39,6 @@ #include "event.h" #include "property.h" #include "screen.h" -#include "titlebar.h" #include "luaa.h" #include "common/version.h" #include "common/atoms.h" @@ -87,10 +86,7 @@ awesome_atexit(void) /* remap all clients since some WM won't handle them otherwise */ foreach(c, globalconf.clients) - { client_unban(*c); - titlebar_client_detach(*c); - } /* Close Lua */ lua_close(globalconf.L); diff --git a/awesomerc.lua.in b/awesomerc.lua.in index 4b582d5c..0aea3c2d 100644 --- a/awesomerc.lua.in +++ b/awesomerc.lua.in @@ -305,9 +305,6 @@ awful.rules.rules = { -- {{{ Signals -- Signal function to execute when a new client appears. client.add_signal("manage", function (c, startup) - -- Add a titlebar - -- awful.titlebar.add(c, { modkey = modkey }) - -- Enable sloppy focus c:add_signal("mouse::enter", function(c) if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier diff --git a/banning.c b/banning.c index 2349ef37..b6cafd62 100644 --- a/banning.c +++ b/banning.c @@ -22,7 +22,6 @@ #include "banning.h" #include "objects/tag.h" #include "window.h" -#include "titlebar.h" #include "screen.h" /** Reban windows following current selected tags. @@ -56,31 +55,16 @@ reban(screen_t *screen) client_ignore_enterleave_events(); - foreach(_c, globalconf.clients) - { - client_t *c = *_c; - - /* Restore titlebar before client, so geometry is ok again. */ - if(titlebar_isvisible(c, screen)) - titlebar_unban(c->titlebar); - - if(client_isvisible(c, screen)) - client_unban(c); - } + foreach(c, globalconf.clients) + if(client_isvisible(*c, screen)) + client_unban(*c); /* Some people disliked the short flicker of background, so we first unban everything. * Afterwards we ban everything we don't want. This should avoid that. */ - foreach(_c, globalconf.clients) - { - client_t *c = *_c; - - if(!titlebar_isvisible(c, screen) && c->screen == screen) - titlebar_ban(c->titlebar); - + foreach(c, globalconf.clients) /* we don't touch other screens windows */ - if(!client_isvisible(c, screen) && c->screen == screen) - client_ban(c); - } + if(!client_isvisible(*c, screen) && (*c)->screen == screen) + client_ban(*c); client_restore_enterleave_events(); } diff --git a/common/tokenize.gperf b/common/tokenize.gperf index 724ed6be..00e4128a 100644 --- a/common/tokenize.gperf +++ b/common/tokenize.gperf @@ -19,7 +19,6 @@ button_release center char class -client conffile content Control @@ -75,7 +74,6 @@ orientation pid plot_data_add plot_properties_set -position release resize right @@ -100,7 +98,6 @@ textbox ticks_count ticks_gap timeout -titlebar top transient_for type diff --git a/event.c b/event.c index 7603eb5e..37d75a6b 100644 --- a/event.c +++ b/event.c @@ -32,7 +32,6 @@ #include "ewmh.h" #include "objects/client.h" #include "objects/widget.h" -#include "titlebar.h" #include "objects/key.h" #include "keygrabber.h" #include "mousegrabber.h" @@ -250,11 +249,10 @@ event_handle_configurerequest(void *data __attribute__ ((unused)), xcb_connection_t *connection, xcb_configure_request_event_t *ev) { client_t *c; - area_t geometry; if((c = client_getbywin(ev->window))) { - geometry = titlebar_geometry_remove(c->titlebar, c->border_width, c->geometry); + area_t geometry = c->geometries.internal; if(ev->value_mask & XCB_CONFIG_WINDOW_X) geometry.x = ev->x; @@ -277,13 +275,14 @@ event_handle_configurerequest(void *data __attribute__ ((unused)), XCB_CONFIG_WINDOW_STACK_MODE); /** Configure request are sent with size relative to real (internal) - * window size, i.e. without titlebars and borders. */ - geometry = titlebar_geometry_add(c->titlebar, c->border_width, geometry); + * window size, i.e. without borders. */ + geometry.width += 2 * c->border_width; + geometry.height += 2 * c->border_width; if(!client_resize(c, geometry, false)) { - /* Resize wasn't officially needed, but we don't want to break expectations. */ - geometry = titlebar_geometry_remove(c->titlebar, c->border_width, c->geometry); + geometry.width -= 2 * c->border_width; + geometry.height -= 2 * c->border_width; window_configure(c->window, geometry, c->border_width); } } @@ -415,7 +414,7 @@ event_handle_leavenotify(void *data __attribute__ ((unused)), if(ev->mode != XCB_NOTIFY_MODE_NORMAL) return 0; - if((c = client_getbytitlebarwin(ev->event)) || (c = client_getbywin(ev->event))) + if((c = client_getbywin(ev->event))) { luaA_object_push(globalconf.L, c); luaA_object_emit_signal(globalconf.L, -1, "mouse::leave", 0); @@ -471,8 +470,7 @@ event_handle_enternotify(void *data __attribute__ ((unused)), lua_pop(globalconf.L, 1); } - if((c = client_getbytitlebarwin(ev->event)) - || (c = client_getbywin(ev->event))) + if((c = client_getbywin(ev->event))) { luaA_object_push(globalconf.L, c); luaA_object_emit_signal(globalconf.L, -1, "mouse::enter", 0); @@ -492,8 +490,6 @@ event_handle_focusin(void *data __attribute__ ((unused)), xcb_connection_t *connection, xcb_focus_in_event_t *ev) { - client_t *c; - /* Events that we are interested in: */ switch(ev->detail) { @@ -507,9 +503,12 @@ event_handle_focusin(void *data __attribute__ ((unused)), */ case XCB_NOTIFY_DETAIL_NONLINEAR_VIRTUAL: case XCB_NOTIFY_DETAIL_NONLINEAR: - if((c = client_getbytitlebarwin(ev->event)) - || (c = client_getbywin(ev->event))) + { + client_t *c; + + if((c = client_getbywin(ev->event))) client_focus_update(c); + } /* all other events are ignored */ default: break; diff --git a/lib/awful/init.lua.in b/lib/awful/init.lua.in index 66c2e680..38e8b542 100644 --- a/lib/awful/init.lua.in +++ b/lib/awful/init.lua.in @@ -11,7 +11,6 @@ require("awful.placement") require("awful.prompt") require("awful.screen") require("awful.tag") -require("awful.titlebar") require("awful.util") require("awful.widget") require("awful.menu") diff --git a/lib/awful/layout/init.lua.in b/lib/awful/layout/init.lua.in index 963582e4..065dc449 100644 --- a/lib/awful/layout/init.lua.in +++ b/lib/awful/layout/init.lua.in @@ -105,7 +105,6 @@ capi.client.add_signal("new", function(c) c:add_signal("property::maximized_vertical", arrange_prop) c:add_signal("property::border_width", arrange_prop) c:add_signal("property::hidden", arrange_prop) - c:add_signal("property::titlebar", arrange_prop) c:add_signal("property::floating", arrange_prop) c:add_signal("property::geometry", arrange_prop) -- If prop is screen, we do not know what was the previous screen, so diff --git a/lib/awful/titlebar.lua.in b/lib/awful/titlebar.lua.in deleted file mode 100644 index 38d4c563..00000000 --- a/lib/awful/titlebar.lua.in +++ /dev/null @@ -1,422 +0,0 @@ ---------------------------------------------------------------------------- --- @author Julien Danjou <julien@danjou.info> --- @copyright 2008 Julien Danjou --- @release @AWESOME_VERSION@ ---------------------------------------------------------------------------- - --- Grab environment we need -local math = math -local image = image -local pairs = pairs -local type = type -local setmetatable = setmetatable -local type = type -local capi = -{ - awesome = awesome, - wibox = wibox, - widget = widget, - client = client, -} -local abutton = require("awful.button") -local beautiful = require("beautiful") -local util = require("awful.util") -local widget = require("awful.widget") -local mouse = require("awful.mouse") -local client = require("awful.client") -local layout = require("awful.widget.layout") - ---- Titlebar module for awful -module("awful.titlebar") - --- Privata data -local data = setmetatable({}, { __mode = 'k' }) - --- Predeclaration for buttons -local button_groups - -local function button_callback_focus_raise_move(w, t) - capi.client.focus = t.client - t.client:raise() - mouse.client.move(t.client) -end - -local function button_callback_move(w, t) - return mouse.client.move(t.client) -end - -local function button_callback_resize(w, t) - return mouse.client.resize(t.client) -end - ---- Create a standard titlebar. --- @param c The client. --- @param args Arguments. --- modkey: the modkey used for the bindings. --- fg: the foreground color. --- bg: the background color. --- fg_focus: the foreground color for focused window. --- fg_focus: the background color for focused window. --- width: the titlebar width -function add(c, args) - if not c or (c.type ~= "normal" and c.type ~= "dialog") then return end - if not args then args = {} end - if not args.height then args.height = capi.awesome.font_height * 1.5 end - local theme = beautiful.get() - if not args.widget then customwidget = {} else customwidget = args.widget end - -- Store colors - data[c] = {} - data[c].fg = args.fg or theme.titlebar_fg_normal or theme.fg_normal - data[c].bg = args.bg or theme.titlebar_bg_normal or theme.bg_normal - data[c].fg_focus = args.fg_focus or theme.titlebar_fg_focus or theme.fg_focus - data[c].bg_focus = args.bg_focus or theme.titlebar_bg_focus or theme.bg_focus - data[c].width = args.width - data[c].font = args.font or theme.titlebar_font or theme.font - - local tb = capi.wibox(args) - - local title = capi.widget({ type = "textbox" }) - if c.name then - title.text = " " .. - util.escape(c.name) .. " " - end - - -- Redirect relevant events to the client the titlebar belongs to - local bts = util.table.join( - abutton({ }, 1, button_callback_focus_raise_move), - abutton({ args.modkey }, 1, button_callback_move), - abutton({ args.modkey }, 3, button_callback_resize)) - title:buttons(bts) - - local appicon = capi.widget({ type = "imagebox" }) - appicon.image = c.icon - - -- for each button group, call create for the client. - -- if a button set is created add the set to the - -- data[c].button_sets for late updates and add the - -- individual buttons to the array part of the widget - -- list - local widget_list = { - layout = layout.horizontal.rightleft - } - local iw = 1 - local is = 1 - data[c].button_sets = {} - for i = 1, #button_groups do - local set = button_groups[i].create(c, args.modkey, theme) - if (set) then - data[c].button_sets[is] = set - is = is + 1 - for n,b in pairs(set) do - widget_list[iw] = b - iw = iw + 1 - end - end - end - - tb.widgets = { - widget_list, - customwidget, - { - appicon = appicon, - title = title, - layout = layout.horizontal.flex - }, - layout = layout.horizontal.rightleft - } - - c.titlebar = tb - - c:add_signal("property::icon", update) - c:add_signal("property::name", update) - c:add_signal("property::sticky", update) - c:add_signal("property::floating", update) - c:add_signal("property::ontop", update) - c:add_signal("property::maximized_vertical", update) - c:add_signal("property::maximized_horizontal", update) - update(c) -end - ---- Update a titlebar. This should be called in some hooks. --- @param c The client to update. --- @param prop The property name which has changed. -function update(c) - if c.titlebar and data[c] then - local widgets = c.titlebar.widgets - if widgets[3].title then - widgets[3].title.text = " ".. util.escape(c.name or "") .. " " - end - if widgets[3].appicon then - widgets[3].appicon.image = c.icon - end - if capi.client.focus == c then - c.titlebar.fg = data[c].fg_focus - c.titlebar.bg = data[c].bg_focus - else - c.titlebar.fg = data[c].fg - c.titlebar.bg = data[c].bg - end - - -- iterated of all registered button_sets and update - local sets = data[c].button_sets - for i = 1, #sets do - sets[i].update(c,prop) - end - end -end - ---- Remove a titlebar from a client. --- @param c The client. -function remove(c) - c.titlebar = nil - data[c] = nil -end - --- Create a new button for the toolbar --- @param c The client of the titlebar --- @param name The base name of the button (i.e. close) --- @param modkey ... you know that one, don't you? --- @param theme The theme from beautifull. Used to get the image paths --- @param state The state the button is associated to. Containse path the action and info about the image -local function button_new(c, name, modkey, theme, state) - local bts = abutton({ }, 1, nil, state.action) - - -- get the image path from the theme. Only return a button if we find an image - local img - img = "titlebar_" .. name .. "_button_" .. state.img - img = theme[img] - if not img then return end - img = image(img) - if not img then return end - - -- now create the button - local bname = name .. "_" .. state.idx - local button = widget.button({ image = img }) - if not button then return end - local rbts = button:buttons() - - for k, v in pairs(rbts) do - bts[#bts + 1] = v - end - - button:buttons(bts) - button.visible = false - return button -end - --- Update the buttons in a button group --- @param s The button group to update --- @param c The client of the titlebar --- @param p The property that has changed -local function button_group_update(s,c,p) - -- hide the currently active button, get the new state and show the new button - local n = s.select_state(c,p) - if n == nil then return end - if (s.active ~= nil) then s.active.visible = false end - s.active = s.buttons[n] - s.active.visible = true -end - --- Create all buttons in a group --- @param c The client of the titlebar --- @param group The button group to create the buttons for --- @param modkey ... --- @param theme Theme for the image paths -local function button_group_create(c, group, modkey, theme ) - local s = {} - s.name = group.name - s.select_state = group.select_state - s.buttons = { - layout = layout.horizontal.rightleft - } - for n,state in pairs(group.states) do - s.buttons[n] = button_new(c, s.name, modkey, theme, state) - if (s.buttons[n] == nil) then return end - for a,v in pairs(group.attributes) do - s.buttons[n][a] = v - end - end - function s.update(c,p) button_group_update(s,c,p) end - return s -end - --- Builds a new button group --- @param name The base name for the buttons in the group (i.e. "close") --- @param attrs Common attributes for the buttons (i.e. {align = "right") --- @param sfn State select function. --- @param args The states of the button -local function button_group(name, attrs, sfn, ...) - local s = {} - s.name = name - s.select_state = sfn - s.attributes = attrs - s.states = {} - - for i = 1, #arg do - local state = arg[i] - s.states[state.idx] = state - end - - function s.create(c,modkey, theme) return button_group_create(c,s,modkey, theme) end - return s -end - --- Select a state for a client based on an attribute of the client and whether it has focus --- @param c The client of the titlebar --- @param p The property that has changed --- @param a The property to check -local function select_state(c,p,a) - if (c == nil) then return "n/i" end - if capi.client.focus == c then - if c[a] then - return "f/a" - else - return "f/i" - end - else - if c[a] then - return "n/a" - else - return "n/i" - end - end -end - --- Select a state for a client based on whether it's floating or not --- @param c The client of the titlebar --- @param p The property that has changed -local function select_state_floating(c,p) - if not c then return end - if capi.client.focus == c then - if client.floating.get(c) then - return "f/a" - end - return "f/i" - end - if client.floating.get(c) then - return "n/a" - end - return "n/i" -end - --- Select a state for a client based on whether it's maximized or not --- @param c The client of the titlebar --- @param p The property that has changed -local function select_state_maximized(c,p) - if (c == nil) then return "n/i" end - if capi.client.focus == c then - if c.maximized_horizontal or c.maximized_vertical then - return "f/a" - else - return "f/i" - end - else - if c.maximized_horizontal or c.maximized_vertical then - return "n/a" - else - return "n/i" - end - end -end - --- Select a state for a client based on whether it has focus or not --- @param c The client of the titlebar --- @param p The property that has changed -local function select_state_focus(c,p) - if c and capi.client.focus == c then - return "f" - end - return "n" -end - --- These are the predefined button groups --- A short explanation using 'close_buttons' as an example: --- "close" : name of the button, the images for this button are taken from the --- theme variables titlebar_close_button_... --- { align ... : attributes of all the buttons --- select_state_focus : This function returns a short string used to describe --- the state. In this case either "n" or "f" depending on --- the focus state of the client. These strings can be --- choosen freely but the< must match one of the idx fuekds --- of the states below --- { idx = "n" ... : This is the state of the button for the 'unfocussed' --- (normal) state. The idx = "n" parameter connects this --- button to the return value of the 'select_state_focus' --- function. The img = "normal" parameter is used to --- determine its image. In this case the iamge is taken from --- the theme variable "titlebar_close_button_normal". --- Finally the last parameter is the action for mouse --- button 1 - -local ontop_buttons = button_group("ontop", - { align = "right" }, - function(c,p) return select_state(c, p, "ontop") end, - { idx = "n/i", img = "normal_inactive", - action = function(w, t) t.client.ontop = true end }, - { idx = "f/i", img = "focus_inactive", - action = function(w, t) t.client.ontop = true end }, - { idx = "n/a", img = "normal_active", - action = function(w, t) t.client.ontop = false end }, - { idx = "f/a", img = "focus_active", - action = function(w, t) t.client.ontop = false end }) - -local sticky_buttons = button_group("sticky", - { align = "right" }, - function(c,p) return select_state(c,p,"sticky") end, - { idx = "n/i", img = "normal_inactive", - action = function(w, t) t.client.sticky = true end }, - { idx = "f/i", img = "focus_inactive", - action = function(w, t) t.client.sticky = true end }, - { idx = "n/a", img = "normal_active", - action = function(w, t) t.client.sticky = false end }, - { idx = "f/a", img = "focus_active", - action = function(w, t) t.client.sticky = false end }) - -local maximized_buttons = button_group("maximized", - { align = "right" }, - select_state_maximized, - { idx = "n/i", img = "normal_inactive", - action = function(w, t) t.client.maximized_horizontal = true - t.client.maximized_vertical = true end }, - { idx = "f/i", img = "focus_inactive", - action = function(w, t) t.client.maximized_horizontal = true - t.client.maximized_vertical = true end }, - { idx = "n/a", img = "normal_active", - action = function(w, t) t.client.maximized_horizontal = false - t.client.maximized_vertical = false end }, - { idx = "f/a", img = "focus_active", - action = function(w, t) t.client.maximized_horizontal = false - t.client.maximized_vertical = false end }) - -local close_buttons = button_group("close", - { align = "left" }, - select_state_focus, - { idx = "n", img = "normal", - action = function (w, t) t.client:kill() end }, - { idx = "f", img = "focus", - action = function (w, t) t.client:kill() end }) - -local function floating_update(w, t) - client.floating.toggle(t.client) -end - -local floating_buttons = button_group("floating", - { align = "right"}, - select_state_floating, - { idx = "n/i", img = "normal_inactive", action = floating_update }, - { idx = "f/i", img = "focus_inactive", action = floating_update }, - { idx = "n/a", img = "normal_active", action = floating_update }, - { idx = "f/a", img = "focus_active", action = floating_update }) - -button_groups = { close_buttons, - ontop_buttons, - sticky_buttons, - maximized_buttons, - floating_buttons } - --- Register standards hooks -capi.client.add_signal("focus", update) -capi.client.add_signal("unfocus", update) - --- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80 diff --git a/luaa.c b/luaa.c index ea80e837..0ee2d568 100644 --- a/luaa.c +++ b/luaa.c @@ -603,9 +603,6 @@ luaA_awesome_newindex(lua_State *L) /* refresh all wiboxes */ foreach(wibox, globalconf.wiboxes) (*wibox)->need_update = true; - foreach(c, globalconf.clients) - if((*c)->titlebar) - (*c)->titlebar->need_update = true; } break; case A_TK_FG: diff --git a/luadoc/client.lua b/luadoc/client.lua index 6cabe243..3235c9a3 100644 --- a/luadoc/client.lua +++ b/luadoc/client.lua @@ -23,7 +23,6 @@ module("client") -- @field size_hints_honor Honor size hints, i.e. respect size ratio. -- @field border_width The client border width. -- @field border_color The client border color. --- @field titlebar The client titlebar. -- @field urgent The client urgent state. -- @field content An image representing the client window content (screenshot). -- @field focus The focused client. diff --git a/luadoc/wibox.lua b/luadoc/wibox.lua index 5b88a211..9b919cfd 100644 --- a/luadoc/wibox.lua +++ b/luadoc/wibox.lua @@ -5,14 +5,11 @@ module("wibox") --- Wibox object. -- @field screen Screen number. --- @field client The client attached to (titlebar only). -- @field border_width Border width. -- @field border_color Border color. --- @field align The alignment (titlebar only). -- @field fg Foreground color. -- @field bg Background color. -- @field bg_image Background image. --- @field position The position (titlebar only). -- @field ontop On top of other windows. -- @field cursor The mouse cursor. -- @field visible Visibility. diff --git a/objects/client.c b/objects/client.c index 9ff46ead..46991024 100644 --- a/objects/client.c +++ b/objects/client.c @@ -25,11 +25,12 @@ #include "objects/tag.h" #include "ewmh.h" #include "screen.h" -#include "titlebar.h" +#include "wibox.h" #include "systray.h" #include "property.h" #include "spawn.h" #include "luaa.h" +#include "window.h" #include "common/atoms.h" #include "common/xutil.h" @@ -452,18 +453,7 @@ client_stack_above(client_t *c, xcb_window_t previous) XCB_CONFIG_WINDOW_SIBLING | XCB_CONFIG_WINDOW_STACK_MODE, config_win_vals); - config_win_vals[0] = c->window; - - if(c->titlebar) - { - xcb_configure_window(globalconf.connection, - c->titlebar->window, - XCB_CONFIG_WINDOW_SIBLING | XCB_CONFIG_WINDOW_STACK_MODE, - config_win_vals); - previous = c->titlebar->window; - } - else - previous = c->window; + previous = config_win_vals[0] = c->window; /* stack transient window on top of their parents */ foreach(node, globalconf.stack) @@ -811,7 +801,7 @@ client_geometry_hints(client_t *c, area_t geometry) } /** Resize client window. - * The sizes given as parameters are with titlebar and borders! + * The sizes given as parameters are with borders! * \param c Client to resize. * \param geometry New window geometry. * \param hints Use size hints. @@ -820,7 +810,6 @@ client_geometry_hints(client_t *c, area_t geometry) bool client_resize(client_t *c, area_t geometry, bool hints) { - area_t geometry_internal; area_t area; /* offscreen appearance fixes */ @@ -835,8 +824,10 @@ client_resize(client_t *c, area_t geometry, bool hints) if(geometry.y + geometry.height < 0) geometry.y = 0; - /* Real client geometry, please keep it contained to C code at the very least. */ - geometry_internal = titlebar_geometry_remove(c->titlebar, c->border_width, geometry); + area_t geometry_internal = { .x = geometry.x, + .y = geometry.y, + .width = geometry.width - 2 * c->border_width, + .height = geometry.height - 2 * c->border_width }; if(hints) geometry_internal = client_geometry_hints(c, geometry_internal); @@ -845,7 +836,10 @@ client_resize(client_t *c, area_t geometry, bool hints) return false; /* Also let client hints propagate to the "official" geometry. */ - geometry = titlebar_geometry_add(c->titlebar, c->border_width, geometry_internal); + geometry.x = geometry_internal.x; + geometry.y = geometry_internal.y; + geometry.width = geometry_internal.width + 2 * c->border_width; + geometry.height = geometry_internal.height + 2 * c->border_width; if(c->geometries.internal.x != geometry_internal.x || c->geometries.internal.y != geometry_internal.y @@ -864,11 +858,9 @@ client_resize(client_t *c, area_t geometry, bool hints) c->geometries.internal.width = values[2] = geometry_internal.width; c->geometries.internal.height = values[3] = geometry_internal.height; - /* Also store geometry including border and titlebar. */ + /* Also store geometry including border */ c->geometry = geometry; - titlebar_update_geometry(c); - /* Ignore all spurious enter/leave notify events */ client_ignore_enterleave_events(); @@ -957,8 +949,6 @@ client_set_fullscreen(lua_State *L, int cidx, bool s) /* become fullscreen! */ if(s) { - /* Make sure the current geometry is stored without titlebar. */ - titlebar_ban(c->titlebar); /* remove any max state */ client_set_maximized_horizontal(L, cidx, false); client_set_maximized_vertical(L, cidx, false); @@ -1235,8 +1225,6 @@ client_unmanage(client_t *c) window_state_set(c->window, XCB_WM_STATE_WITHDRAWN); - titlebar_client_detach(c); - ewmh_update_net_client_list(c->phys_screen); /* set client as invalid */ @@ -1359,9 +1347,6 @@ client_set_border_width(lua_State *L, int cidx, int width) c->geometry.width += 2 * c->border_width; c->geometry.height += 2 * c->border_width; - /* Changing border size also affects the size of the titlebar. */ - titlebar_update_geometry(c); - luaA_object_emit_signal(L, cidx, "property::border_width", 0); } @@ -1743,16 +1728,6 @@ luaA_client_set_border_color(lua_State *L, client_t *c) return 0; } -static int -luaA_client_set_titlebar(lua_State *L, client_t *c) -{ - if(lua_isnil(L, -1)) - titlebar_client_detach(c); - else - titlebar_client_attach(c); - return 0; -} - static int luaA_client_set_skip_taskbar(lua_State *L, client_t *c) { @@ -1898,12 +1873,6 @@ luaA_client_get_icon(lua_State *L, client_t *c) return luaA_object_push_item(L, -2, c->icon); } -static int -luaA_client_get_titlebar(lua_State *L, client_t *c) -{ - return luaA_object_push(L, c->titlebar); -} - static int luaA_client_get_size_hints(lua_State *L, client_t *c) { @@ -2275,10 +2244,6 @@ client_class_setup(lua_State *L) (lua_class_propfunc_t) luaA_client_set_border_color, (lua_class_propfunc_t) luaA_client_get_border_color, (lua_class_propfunc_t) luaA_client_set_border_color); - luaA_class_add_property(&client_class, A_TK_TITLEBAR, - (lua_class_propfunc_t) luaA_client_set_titlebar, - (lua_class_propfunc_t) luaA_client_get_titlebar, - (lua_class_propfunc_t) luaA_client_set_titlebar); luaA_class_add_property(&client_class, A_TK_URGENT, (lua_class_propfunc_t) luaA_client_set_urgent, (lua_class_propfunc_t) luaA_client_get_urgent, diff --git a/objects/client.h b/objects/client.h index 61e25a4f..03fdce66 100644 --- a/objects/client.h +++ b/objects/client.h @@ -128,8 +128,6 @@ struct client_t screen_t *screen; /** Client physical screen */ int phys_screen; - /** Titlebar */ - wibox_t *titlebar; /** Button bindings */ button_array_t buttons; /** Key bindings */ diff --git a/objects/wibox.c b/objects/wibox.c index 21ba0731..2bffd9b7 100644 --- a/objects/wibox.c +++ b/objects/wibox.c @@ -23,7 +23,6 @@ #include "screen.h" #include "wibox.h" -#include "titlebar.h" #include "objects/client.h" #include "screen.h" #include "window.h" @@ -34,6 +33,34 @@ LUA_OBJECT_FUNCS(wibox_class, wibox_t, wibox) +/** Destroy all X resources of a wibox. + * \param w The wibox to wipe. + */ +static void +wibox_wipe(wibox_t *w) +{ + if(w->window) + { + /* Activate BMA */ + client_ignore_enterleave_events(); + xcb_destroy_window(globalconf.connection, w->window); + /* Deactivate BMA */ + client_restore_enterleave_events(); + w->window = XCB_NONE; + } + if(w->pixmap) + { + xcb_free_pixmap(globalconf.connection, w->pixmap); + w->pixmap = XCB_NONE; + } + if(w->gc) + { + xcb_free_gc(globalconf.connection, w->gc); + w->gc = XCB_NONE; + } + draw_context_wipe(&w->ctx); +} + /** Take care of garbage collecting a wibox. * \param L The Lua VM state. * \return The number of elements pushed on stack, 0! @@ -156,7 +183,7 @@ wibox_draw_context_update(wibox_t *w, xcb_screen_t *s) * \param w The wibox to initialize. * \param phys_screen Physical screen number. */ -void +static void wibox_init(wibox_t *w, int phys_screen) { xcb_screen_t *s = xutil_screen_get(globalconf.connection, phys_screen); @@ -212,7 +239,7 @@ wibox_refresh_pixmap(wibox_t *w) * \param udx The index of the wibox. * \param geometry The new geometry. */ -void +static void wibox_moveresize(lua_State *L, int udx, area_t geometry) { wibox_t *w = luaA_checkudata(L, udx, &wibox_class); @@ -346,7 +373,7 @@ wibox_set_border_color(lua_State *L, int udx, const xcolor_t *color) * \param udx The wibox to change orientation. * \param o The new orientation. */ -void +static void wibox_set_orientation(lua_State *L, int udx, orientation_t o) { wibox_t *w = luaA_checkudata(L, udx, &wibox_class); @@ -568,14 +595,6 @@ wibox_getbywin(xcb_window_t win) foreach(w, globalconf.wiboxes) if((*w)->window == win) return *w; - - foreach(_c, globalconf.clients) - { - client_t *c = *_c; - if(c->titlebar && c->titlebar->window == win) - return c->titlebar; - } - return NULL; } @@ -608,13 +627,6 @@ wibox_refresh(void) if((*w)->need_update) wibox_draw(*w); } - - foreach(_c, globalconf.clients) - { - client_t *c = *_c; - if(c->titlebar && c->titlebar->need_update) - wibox_draw(c->titlebar); - } } /** Set a wibox visible or not. @@ -653,34 +665,6 @@ wibox_set_visible(lua_State *L, int udx, bool v) } } -/** Destroy all X resources of a wibox. - * \param w The wibox to wipe. - */ -void -wibox_wipe(wibox_t *w) -{ - if(w->window) - { - /* Activate BMA */ - client_ignore_enterleave_events(); - xcb_destroy_window(globalconf.connection, w->window); - /* Deactivate BMA */ - client_restore_enterleave_events(); - w->window = XCB_NONE; - } - if(w->pixmap) - { - xcb_free_pixmap(globalconf.connection, w->pixmap); - w->pixmap = XCB_NONE; - } - if(w->gc) - { - xcb_free_gc(globalconf.connection, w->gc); - w->gc = XCB_NONE; - } - draw_context_wipe(&w->ctx); -} - /** Remove a wibox from a screen. * \param L The Lua VM state. * \param udx Wibox to detach from screen. @@ -853,17 +837,6 @@ luaA_wibox_invalidate_byitem(lua_State *L, const void *item) } } - - foreach(_c, globalconf.clients) - { - client_t *c = *_c; - if(c->titlebar && luaA_wibox_hasitem(L, c->titlebar, item)) - { - /* update wibox */ - wibox_need_update(c->titlebar); - lua_pop(L, 1); /* remove widgets table */ - } - } } /* Set or get the wibox geometry. @@ -889,18 +862,7 @@ luaA_wibox_geometry(lua_State *L) wingeom.height = luaA_getopt_number(L, 2, "height", wibox->geometry.height); if(wingeom.width > 0 && wingeom.height > 0) - switch(wibox->type) - { - case WIBOX_TYPE_TITLEBAR: - wibox_moveresize(L, 1, (area_t) { .x = wibox->geometry.x, - .y = wibox->geometry.y, - .width = wingeom.width, - .height = wingeom.height }); - break; - case WIBOX_TYPE_NORMAL: - wibox_moveresize(L, 1, wingeom); - break; - } + wibox_moveresize(L, 1, wingeom); } return luaA_pusharea(L, wibox->geometry); @@ -1138,102 +1100,6 @@ luaA_wibox_get_opacity(lua_State *L, wibox_t *wibox) return 0; } -/** Set the wibox alignment. - * \param L The Lua VM state. - * \param wibox The wibox object. - * \return The number of elements pushed on stack. - */ -static int -luaA_wibox_set_align(lua_State *L, wibox_t *wibox) -{ - size_t len; - const char *buf = luaL_checklstring(L, -1, &len); - wibox->align = draw_align_fromstr(buf, len); - luaA_object_emit_signal(L, -3, "property::align", 0); - switch(wibox->type) - { - case WIBOX_TYPE_NORMAL: - break; - case WIBOX_TYPE_TITLEBAR: - titlebar_update_geometry(client_getbytitlebar(wibox)); - break; - } - return 0; -} - -/** Get the wibox alignment. - * \param L The Lua VM state. - * \param wibox The wibox object. - * \return The number of elements pushed on stack. - */ -static int -luaA_wibox_get_align(lua_State *L, wibox_t *wibox) -{ - lua_pushstring(L, draw_align_tostr(wibox->align)); - return 1; -} - -/** Set the wibox position. - * \param L The Lua VM state. - * \param wibox The wibox object. - * \return The number of elements pushed on stack. - */ -static int -luaA_wibox_set_position(lua_State *L, wibox_t *wibox) -{ - switch(wibox->type) - { - case WIBOX_TYPE_NORMAL: - break; - case WIBOX_TYPE_TITLEBAR: - return luaA_titlebar_set_position(L, -3); - } - return 0; -} - -/** Get the wibox position. - * \param L The Lua VM state. - * \param wibox The wibox object. - * \return The number of elements pushed on stack. - */ -static int -luaA_wibox_get_position(lua_State *L, wibox_t *wibox) -{ - lua_pushstring(L, position_tostr(wibox->position)); - return 1; -} - -/** Set the wibox (titlebar) client. - * \param L The Lua VM state. - * \param wibox The wibox object. - * \return The number of elements pushed on stack. - */ -static int -luaA_wibox_set_client(lua_State *L, wibox_t *wibox) -{ - /* first detach */ - if(lua_isnil(L, -1)) - titlebar_client_detach(client_getbytitlebar(wibox)); - else - { - client_t *c = luaA_client_checkudata(L, -1); - lua_pushvalue(L, -3); - titlebar_client_attach(c); - } - return 0; -} - -/** Get the wibox (titlebar) client. - * \param L The Lua VM state. - * \param wibox The wibox object. - * \return The number of elements pushed on stack. - */ -static int -luaA_wibox_get_client(lua_State *L, wibox_t *wibox) -{ - return luaA_object_push(L, client_getbytitlebar(wibox)); -} - /** Set the wibox cursor. * \param L The Lua VM state. * \param wibox The wibox object. @@ -1267,19 +1133,13 @@ static int luaA_wibox_set_screen(lua_State *L, wibox_t *wibox) { if(lua_isnil(L, -1)) - { wibox_detach(L, -3); - titlebar_client_detach(client_getbytitlebar(wibox)); - } else { int screen = luaL_checknumber(L, -1) - 1; luaA_checkscreen(screen); if(!wibox->screen || screen != screen_array_indexof(&globalconf.screens, wibox->screen)) - { - titlebar_client_detach(client_getbytitlebar(wibox)); wibox_attach(L, -3, &globalconf.screens.tab[screen]); - } } return 0; } @@ -1353,17 +1213,7 @@ luaA_wibox_set_border_color(lua_State *L, wibox_t *wibox) static int luaA_wibox_set_visible(lua_State *L, wibox_t *wibox) { - bool b = luaA_checkboolean(L, -1); - if(b != wibox->visible) - switch(wibox->type) - { - case WIBOX_TYPE_NORMAL: - wibox_set_visible(L, -3, b); - break; - case WIBOX_TYPE_TITLEBAR: - titlebar_set_visible(wibox, b); - break; - } + wibox_set_visible(L, -3, luaA_checkboolean(L, -1)); return 0; } @@ -1537,18 +1387,6 @@ wibox_class_setup(lua_State *L) (lua_class_propfunc_t) luaA_wibox_set_cursor, (lua_class_propfunc_t) luaA_wibox_get_cursor, (lua_class_propfunc_t) luaA_wibox_set_cursor); - luaA_class_add_property(&wibox_class, A_TK_CLIENT, - (lua_class_propfunc_t) luaA_wibox_set_client, - (lua_class_propfunc_t) luaA_wibox_get_client, - (lua_class_propfunc_t) luaA_wibox_set_client); - luaA_class_add_property(&wibox_class, A_TK_POSITION, - (lua_class_propfunc_t) luaA_wibox_set_position, - (lua_class_propfunc_t) luaA_wibox_get_position, - (lua_class_propfunc_t) luaA_wibox_set_position); - luaA_class_add_property(&wibox_class, A_TK_ALIGN, - (lua_class_propfunc_t) luaA_wibox_set_align, - (lua_class_propfunc_t) luaA_wibox_get_align, - (lua_class_propfunc_t) luaA_wibox_set_align); luaA_class_add_property(&wibox_class, A_TK_FG, (lua_class_propfunc_t) luaA_wibox_set_fg, (lua_class_propfunc_t) luaA_wibox_get_fg, diff --git a/objects/wibox.h b/objects/wibox.h index 8bbeed1b..37a80b38 100644 --- a/objects/wibox.h +++ b/objects/wibox.h @@ -26,13 +26,6 @@ #include "strut.h" #include "common/luaobject.h" -/** Wibox types */ -typedef enum -{ - WIBOX_TYPE_NORMAL = 0, - WIBOX_TYPE_TITLEBAR -} wibox_type_t; - /** Wibox type */ struct wibox_t { @@ -41,12 +34,6 @@ struct wibox_t bool ontop; /** Visible */ bool visible; - /** Position */ - position_t position; - /** Wibox type */ - wibox_type_t type; - /** Alignment */ - alignment_t align; /** Screen */ screen_t *screen; /** Widget list */ @@ -62,8 +49,6 @@ struct wibox_t char *cursor; /** Background image */ image_t *bg_image; - /* Banned? used for titlebars */ - bool isbanned; /** Button bindings */ button_array_t buttons; /** The window object. */ @@ -106,12 +91,9 @@ void luaA_wibox_invalidate_byitem(lua_State *, const void *); wibox_t * wibox_getbywin(xcb_window_t); -void wibox_moveresize(lua_State *, int, area_t); -void wibox_refresh_pixmap_partial(wibox_t *, int16_t, int16_t, uint16_t, uint16_t); -void wibox_init(wibox_t *, int); -void wibox_wipe(wibox_t *); void wibox_set_opacity(lua_State *, int, double); -void wibox_set_orientation(lua_State *, int, orientation_t); + +void wibox_refresh_pixmap_partial(wibox_t *, int16_t, int16_t, uint16_t, uint16_t); void wibox_class_setup(lua_State *); diff --git a/objects/widget.c b/objects/widget.c index b7e3e66e..ecd67d7c 100644 --- a/objects/widget.c +++ b/objects/widget.c @@ -370,7 +370,7 @@ widget_invalidate_bytype(widget_constructor_t *type) } } -/** Set a wibox needs update because it has widget, or redraw a titlebar. +/** Set a wibox needs update because it has widget. * \param widget The widget to look for. */ void @@ -384,18 +384,6 @@ widget_invalidate_bywidget(widget_t *widget) (*wibox)->need_update = true; break; } - - foreach(_c, globalconf.clients) - { - client_t *c = *_c; - if(c->titlebar && !c->titlebar->need_update) - for(int j = 0; j < c->titlebar->widgets.len; j++) - if(c->titlebar->widgets.tab[j].widget == widget) - { - c->titlebar->need_update = true; - break; - } - } } /** Create a new widget. diff --git a/objects/widgets/imagebox.c b/objects/widgets/imagebox.c index d92adcd7..b01ef8cf 100644 --- a/objects/widgets/imagebox.c +++ b/objects/widgets/imagebox.c @@ -21,7 +21,6 @@ #include "objects/widget.h" #include "luaa.h" -#include "titlebar.h" /** The imagebox private data structure */ typedef struct diff --git a/objects/widgets/systray.c b/objects/widgets/systray.c index 9346da84..ecfef64e 100644 --- a/objects/widgets/systray.c +++ b/objects/widgets/systray.c @@ -62,18 +62,7 @@ static void systray_draw(widget_t *widget, draw_context_t *ctx, area_t geometry, wibox_t *p) { - uint32_t orient; - - switch(p->position) - { - case Right: - case Left: - orient = _NET_SYSTEM_TRAY_ORIENTATION_VERT; - break; - default: - orient = _NET_SYSTEM_TRAY_ORIENTATION_HORZ; - break; - } + uint32_t orient = _NET_SYSTEM_TRAY_ORIENTATION_HORZ; systray_data_t *d = widget->data; d->height = p->geometry.height; diff --git a/screen.c b/screen.c index 5cd0faeb..e8a0b564 100644 --- a/screen.c +++ b/screen.c @@ -270,9 +270,6 @@ screen_client_moveto(client_t *c, screen_t *new_screen, bool doresize) c->screen = new_screen; - if(c->titlebar) - c->titlebar->screen = new_screen; - /* If client was on a screen, remove old tags */ if(old_screen) foreach(old_tag, old_screen->tags) diff --git a/titlebar.c b/titlebar.c deleted file mode 100644 index cee99713..00000000 --- a/titlebar.c +++ /dev/null @@ -1,366 +0,0 @@ -/* - * titlebar.c - titlebar management - * - * Copyright © 2008-2009 Julien Danjou - * - * 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. - * - */ - -#include - -#include "titlebar.h" -#include "objects/client.h" -#include "objects/widget.h" -#include "objects/wibox.h" -#include "screen.h" -#include "luaa.h" - -/** Get a client by its titlebar. - * \param titlebar The titlebar. - * \return A client. - */ -client_t * -client_getbytitlebar(wibox_t *titlebar) -{ - foreach(c, globalconf.clients) - if((*c)->titlebar == titlebar) - return *c; - - return NULL; -} - -/** Get a client by its titlebar window. - * \param win The window. - * \return A client. - */ -client_t * -client_getbytitlebarwin(xcb_window_t win) -{ - foreach(c, globalconf.clients) - if((*c)->titlebar && (*c)->titlebar->window == win) - return *c; - - return NULL; -} - -/** Move a titlebar out of the viewport. - * \param titlebar The titlebar. - */ -void -titlebar_ban(wibox_t *titlebar) -{ - /* Do it manually because client geometry remains unchanged. */ - if(titlebar && !titlebar->isbanned) - { - client_t *c; - - if(titlebar->window) - xcb_unmap_window(globalconf.connection, titlebar->window); - - /* Remove titlebar geometry from client. */ - if((c = client_getbytitlebar(titlebar))) - c->geometry = titlebar_geometry_remove(titlebar, 0, c->geometry); - - titlebar->isbanned = true; - } -} - -/** Move a titlebar on top of its client. - * \param titlebar The titlebar. - */ -void -titlebar_unban(wibox_t *titlebar) -{ - /* Do this manually because the system doesn't know we moved the toolbar. - * Note that !visible titlebars are unmapped and for fullscreen it'll - * end up offscreen anyway. */ - if(titlebar && titlebar->isbanned) - { - client_t *c; - - if(titlebar->window) - xcb_map_window(globalconf.connection, titlebar->window); - - titlebar->isbanned = false; - - /* Add titlebar geometry from client. */ - if((c = client_getbytitlebar(titlebar))) - c->geometry = titlebar_geometry_add(titlebar, 0, c->geometry); - } -} - -/** Get titlebar area. - * \param c The client - * \param geometry The client geometry including borders, excluding titlebars. - * \param res Pointer to area of titlebar, must be allocated already. - */ -void -titlebar_geometry_compute(client_t *c, area_t geometry, area_t *res) -{ - int height, width, x_offset = 0, y_offset = 0; - - switch(c->titlebar->position) - { - default: - return; - case Top: - width = MAX(1, geometry.width); - switch(c->titlebar->align) - { - default: - break; - case AlignRight: - x_offset = geometry.width - width; - break; - case AlignCenter: - x_offset = (geometry.width - width) / 2; - break; - } - res->x = geometry.x + x_offset; - res->y = geometry.y - c->titlebar->geometry.height; - res->width = width; - res->height = c->titlebar->geometry.height; - break; - case Bottom: - width = MAX(1, geometry.width); - switch(c->titlebar->align) - { - default: - break; - case AlignRight: - x_offset = geometry.width - width; - break; - case AlignCenter: - x_offset = (geometry.width - width) / 2; - break; - } - res->x = geometry.x + x_offset; - res->y = geometry.y + geometry.height; - res->width = width; - res->height = c->titlebar->geometry.height; - break; - case Left: - height = MAX(1, geometry.height); - switch(c->titlebar->align) - { - default: - break; - case AlignRight: - y_offset = geometry.height - height; - break; - case AlignCenter: - y_offset = (geometry.height - height) / 2; - break; - } - res->x = geometry.x - c->titlebar->geometry.width; - res->y = geometry.y + y_offset; - res->width = c->titlebar->geometry.width; - res->height = height; - break; - case Right: - height = MAX(1, geometry.height); - switch(c->titlebar->align) - { - default: - break; - case AlignRight: - y_offset = geometry.height - height; - break; - case AlignCenter: - y_offset = (geometry.height - height) / 2; - break; - } - res->x = geometry.x + geometry.width; - res->y = geometry.y + y_offset; - res->width = c->titlebar->geometry.width; - res->height = height; - break; - } -} - -/** Detach a wibox titlebar from its client. - * \param c The client. - */ -void -titlebar_client_detach(client_t *c) -{ - /* If client has a titlebar, kick it out. */ - if(c && c->titlebar) - { - /* Update client geometry to exclude the titlebar. */ - c->geometry = titlebar_geometry_remove(c->titlebar, 0, c->geometry); - wibox_wipe(c->titlebar); - c->titlebar->type = WIBOX_TYPE_NORMAL; - c->titlebar->screen = NULL; - - luaA_object_unref(globalconf.L, c->titlebar); - c->titlebar = NULL; - - luaA_object_push(globalconf.L, c); - luaA_object_emit_signal(globalconf.L, -1, "property::titlebar", 0); - lua_pop(globalconf.L, 1); - client_stack(); - } -} - -/** Attach a wibox to a client as its titlebar. - * \param c The client. - */ -void -titlebar_client_attach(client_t *c) -{ - /* check if we can register the object */ - wibox_t *t = luaA_object_ref_class(globalconf.L, -1, &wibox_class); - - titlebar_client_detach(c); - - /* check if titlebar is already on a client */ - titlebar_client_detach(client_getbytitlebar(t)); - - /* check if client already has a titlebar. */ - titlebar_client_detach(c); - - /* set the object as new client's titlebar */ - c->titlebar = t; - - t->type = WIBOX_TYPE_TITLEBAR; - t->screen = c->screen; - - switch(t->position) - { - case Top: - case Bottom: - if(!t->geometry.height) - t->geometry.height = 1.5 * globalconf.font->height; - break; - case Left: - case Right: - if(!t->geometry.width) - t->geometry.width = 1.5 * globalconf.font->height; - break; - } - - /* Update client geometry to include the titlebar. */ - c->geometry = titlebar_geometry_add(c->titlebar, 0, c->geometry); - - /* Client geometry without titlebar, but including borders, since that is always consistent. */ - titlebar_geometry_compute(c, titlebar_geometry_remove(c->titlebar, 0, c->geometry), &t->geometry); - - wibox_init(t, c->phys_screen); - - t->need_update = true; - - /* Call update geometry. This will move the wibox to the right place, - * which might be the same as `wingeom', but then it will ban the - * titlebar if needed. */ - titlebar_update_geometry(c); - - xcb_map_window(globalconf.connection, t->window); - - luaA_object_push(globalconf.L, c); - luaA_object_emit_signal(globalconf.L, -1, "property::titlebar", 0); - lua_pop(globalconf.L, 1); - client_stack(); -} - -/** Map or unmap a titlebar wibox. - * \param t The wibox/titlebar. - * \param visible The new state of the titlebar. - */ -void -titlebar_set_visible(wibox_t *t, bool visible) -{ - if(visible != t->visible) - { - if((t->visible = visible)) - titlebar_unban(t); - else - titlebar_ban(t); - - client_stack(); - } -} - -int -luaA_titlebar_set_position(lua_State *L, int udx) -{ - wibox_t *titlebar = luaA_checkudata(L, udx, &wibox_class); - size_t len; - const char *buf = luaL_checklstring(L, -1, &len); - position_t position = position_fromstr(buf, len); - if(position != titlebar->position) - { - switch(position) - { - case Left: - switch(titlebar->position) - { - int tmp; - case Left: - case Right: - break; - case Top: - case Bottom: - tmp = titlebar->geometry.width; - titlebar->geometry.width = titlebar->geometry.height; - titlebar->geometry.height = tmp; - break; - } - wibox_set_orientation(L, udx, North); - break; - case Right: - switch(titlebar->position) - { - int tmp; - case Left: - case Right: - break; - case Top: - case Bottom: - tmp = titlebar->geometry.width; - titlebar->geometry.width = titlebar->geometry.height; - titlebar->geometry.height = tmp; - break; - } - wibox_set_orientation(L, udx, South); - break; - case Top: - case Bottom: - switch(titlebar->position) - { - int tmp; - case Left: - case Right: - tmp = titlebar->geometry.width; - titlebar->geometry.width = titlebar->geometry.height; - titlebar->geometry.height = tmp; - break; - case Top: - case Bottom: - break; - } - wibox_set_orientation(L, udx, East); - break; - } - titlebar->position = position; - client_t *c; - if((c = client_getbytitlebar(titlebar))) - titlebar_update_geometry(c); - } - return 0; -} - -// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80 diff --git a/titlebar.h b/titlebar.h deleted file mode 100644 index 2c5c843a..00000000 --- a/titlebar.h +++ /dev/null @@ -1,156 +0,0 @@ -/* - * titlebar.h - titlebar management header - * - * Copyright © 2008-2009 Julien Danjou - * - * 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_TITLEBAR_H -#define AWESOME_TITLEBAR_H - -#include "objects/wibox.h" -#include "objects/client.h" -#include "window.h" - -client_t * client_getbytitlebar(wibox_t *); -client_t * client_getbytitlebarwin(xcb_window_t); -void titlebar_geometry_compute(client_t *, area_t, area_t *); -void titlebar_init(client_t *); -void titlebar_client_detach(client_t *); -void titlebar_client_attach(client_t *); -void titlebar_set_visible(wibox_t *, bool); -void titlebar_ban(wibox_t *); -void titlebar_unban(wibox_t *); - -int luaA_titlebar_set_position(lua_State *, int); - -static inline bool -titlebar_isvisible(client_t *c, screen_t *screen) -{ - if(client_isvisible(c, screen)) - { - if(c->fullscreen) - return false; - if(!c->titlebar || !c->titlebar->visible) - return false; - return true; - } - return false; -} - -/** Add the titlebar geometry and border to a geometry. - * \param t The titlebar - * \param border The client border size. - * \param geometry The geometry - * \return A new geometry bigger if the titlebar is visible. - */ -static inline area_t -titlebar_geometry_add(wibox_t *t, int border, area_t geometry) -{ - /* We need to add titlebar border to the total width and height. - * This can then be subtracted/added to the width/height/x/y. - * In this case the border is included, because it belongs to a different window. - */ - if(t && t->visible) - switch(t->position) - { - case Top: - geometry.y -= t->geometry.height; - geometry.height += t->geometry.height; - break; - case Bottom: - geometry.height += t->geometry.height; - break; - case Left: - geometry.x -= t->geometry.width; - geometry.width += t->geometry.width; - break; - case Right: - geometry.width += t->geometry.width; - break; - default: - break; - } - - /* Adding a border to a client only changes width and height, x and y are including border. */ - geometry.width += 2 * border; - geometry.height += 2 * border; - - return geometry; -} - -/** Remove the titlebar geometry and border width to a geometry. - * \param t The titlebar. - * \param border The client border size. - * \param geometry The geometry. - * \return A new geometry smaller if the titlebar is visible. - */ -static inline area_t -titlebar_geometry_remove(wibox_t *t, int border, area_t geometry) -{ - /* We need to add titlebar border to the total width and height. - * This can then be subtracted/added to the width/height/x/y. - * In this case the border is included, because it belongs to a different window. - */ - if(t && t->visible) - switch(t->position) - { - case Top: - geometry.y += t->geometry.height; - unsigned_subtract(geometry.height, t->geometry.height); - break; - case Bottom: - unsigned_subtract(geometry.height, t->geometry.height); - break; - case Left: - geometry.x += t->geometry.width; - unsigned_subtract(geometry.width, t->geometry.width); - break; - case Right: - unsigned_subtract(geometry.width, t->geometry.width); - break; - default: - break; - } - - /* Adding a border to a client only changes width and height, x and y are including border. */ - unsigned_subtract(geometry.width, 2*border); - unsigned_subtract(geometry.height, 2*border); - - return geometry; -} - -/** Update the titlebar geometry for a client. - * \param c The client. - */ -static inline void -titlebar_update_geometry(client_t *c) -{ - area_t geom; - - if(!c->titlebar) - return; - - /* Client geometry without titlebar, but including borders, since that is always consistent. */ - titlebar_geometry_compute(c, titlebar_geometry_remove(c->titlebar, 0, c->geometry), &geom); - luaA_object_push(globalconf.L, c->titlebar); - wibox_moveresize(globalconf.L, -1, geom); - lua_pop(globalconf.L, 1); -} - -#endif -// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80