Hello community, here is the log from the commit of package awesome for openSUSE:Factory checked in at 2016-01-17 09:23:29 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/awesome (Old) and /work/SRC/openSUSE:Factory/.awesome.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "awesome" Changes: -------- --- /work/SRC/openSUSE:Factory/awesome/awesome.changes 2015-10-14 16:45:09.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.awesome.new/awesome.changes 2016-01-17 09:23:30.000000000 +0100 @@ -1,0 +2,37 @@ +Sat Jan 16 11:01:51 UTC 2016 - sor.alexei@meowr.ru + +- Update to 3.5.7: + * tag.lua: add "property::icon_only" signal. + * Make stdout/stderr line buffered. + * cmake: s/ESCAPE_QUOTE/ESCAPE_QUOTES/. + * awesome_atexit: keep client order always. + * Add .travis.yml from master, ignoring functional tests. + * awesomeConfig.cmake: Allow setting AWESOME_DATA_DIR. + * Fix the definition of A_STRNEQ_CASE. + * Fix focus handling with multiple awesome instances. + * Remove titlebars from clients during shutdown. + * a_dbus_message_iter: Handle DBUS_TYPE_DOUBLE. + * Ignore more events while minimising a client. + * Screen __index: Don't turn argument into a string. + * Keep stacking order across restarts. + * Keep client order across restarts. + * Force systray redraw on BG colour change. + * Fix enter/leave events on titlebars. + * Fix compilation. + * Handle enter/leave events with detail=Inferior correctly. + * Never explicitly focus the root window. + * Fix client_apply_size_hints(). + * Make awesome.quit() during startup work. + * Fix obvious typo in xwindow_translate_for_gravity(). + * Apply window gravity when a window moves. + * Refactor code a little. + * Apply window gravity for titlebar resizes. + * Apply window gravity for border width changes. + * Grab client keys on the client window. + * Spawn: Improve handling of startup notification. + * objects: Add .valid property. + * Change codename. + * awful.menu: update t new layout api. +- Require 3.5+ version of awesome-branding. + +------------------------------------------------------------------- Old: ---- awesome-3.5.6.tar.xz New: ---- awesome-3.5.7.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ awesome.spec ++++++ --- /var/tmp/diff_new_pack.3BofPq/_old 2016-01-17 09:23:31.000000000 +0100 +++ /var/tmp/diff_new_pack.3BofPq/_new 2016-01-17 09:23:31.000000000 +0100 @@ -1,7 +1,7 @@ # # spec file for package awesome # -# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -16,8 +16,9 @@ # +%define _version 3.5 Name: awesome -Version: 3.5.6 +Version: 3.5.7 Release: 0 Summary: Highly configurable tiling and floating Window Manager License: GPL-2.0+ @@ -53,7 +54,7 @@ BuildRequires: pkgconfig(xcb-xtest) BuildRequires: pkgconfig(xproto) >= 7.0.15 BuildRequires: typelib(Pango) -Requires: %{name}-branding +Requires: %{name}-branding >= %{_version} Requires: lua-lgi Requires: typelib(Pango) ++++++ awesome-3.5.6.tar.xz -> awesome-3.5.7.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/awesome-3.5.6/.travis.yml new/awesome-3.5.7/.travis.yml --- old/awesome-3.5.6/.travis.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/awesome-3.5.7/.travis.yml 2016-01-15 16:51:19.000000000 +0100 @@ -0,0 +1,66 @@ +sudo: required +dist: trusty +language: c +env: + matrix: + # Note: luarocks does not work with Lua 5.0. + - LUA=5.1 LGIVER= LUANAME=lua5.1 + - LUA=5.2 LGIVER= LUANAME=lua5.2 BUILD_APIDOC=true + - LUA=5.2 LGIVER=0.7.1 LUANAME=lua5.2 + # luajit: requires --lua-suffix=jit-2.0.0-beta9 in Ubuntu precise. + # Later versions seem to provide a `luajit` symlink, so `jit` would be enough. + # See http://packages.ubuntu.com/precise/i386/luajit/filelist. + - LUA=5.1 LGIVER= LUANAME=luajit-5.1 INSTALL_PKGS="luajit" LUAINCLUDE=/usr/include/luajit-2.0 LUAROCKS_ARGS=--lua-suffix=jit-2.0.2 + global: + # Secure token to push to gh-pages. + - secure: "LZxt9559+V3qJMdVgmKW4RYTt8ZINooex/qsnoEJUtZloj/eFNG4COT2z6a2yeH2tKWzknCsmV9nLPJiNEA2KLcyqDhjFQvJwKmsBuhGUmLyeQgfenjweorRjO8NT18X1SAEUXAMnClPu+OeTDs4BAuVn5foGZ7xpcRg2E+j2mc=" + +before_install: + - if [ -z $LUAINCLUDE ]; then LUAINCLUDE=/usr/include/${LUANAME}; fi + - cmake --version + +install: + # Travis boilerplate: the apt-get cache might be out of date. + - sudo apt-get update -qq + + # Do not install recommended packages with apt-get. + - echo 'APT::Install-Recommends "false";' | sudo tee /etc/apt/apt.conf.d/no-recommends + + # Install build dependencies. + # See also `apt-cache showsrc awesome | grep -E '^(Version|Build-Depends)'`. + - sudo apt-get install -y libcairo2-dev xmlto asciidoc libpango1.0-dev gperf luadoc libxcb-xtest0-dev libxcb-icccm4-dev libxcb-randr0-dev libxcb-keysyms1-dev libxcb-xinerama0-dev libxcb-image0-dev libev-dev libimlib2-dev libdbus-1-dev libxdg-basedir-dev libstartup-notification0-dev imagemagick libxcb1-dev libxcb-shape0-dev libxcb-util0-dev libxcursor-dev libx11-xcb-dev libxcb-cursor-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev + + # Install Lua (per env). + - sudo apt-get install -y lib${LUANAME}-dev ${LUANAME} ${INSTALL_PKGS} + + # Install luarocks (for the selected Lua version). + - travis_retry wget http://keplerproject.github.io/luarocks/releases/luarocks-2.2.2.tar.gz + - tar xf luarocks-2.2.2.tar.gz + - cd luarocks-2.2.2 + - ./configure --lua-version=$LUA --with-lua-include=${LUAINCLUDE} ${LUAROCKS_ARGS} + - make build + - sudo make install + - cd .. + + # lgi. + - sudo apt-get install -y gir1.2-pango-1.0 libgirepository1.0-dev + - travis_retry sudo luarocks install lgi $LGIVER + + # Install busted for "make check". + - travis_retry sudo luarocks install busted + + # Install ldoc for building docs. + - travis_retry sudo luarocks install ldoc + - travis_retry sudo luarocks install lua-discount + + # Determine custom version. + - export AWESOME_VERSION="${TRAVIS_BRANCH}-g$(git rev-parse --short HEAD)" + - 'if [ "$TRAVIS_PULL_REQUEST" != false ]; then AWESOME_VERSION="${AWESOME_VERSION}-PR${TRAVIS_PULL_REQUEST}"; fi' + +script: + - export CMAKE_ARGS="-DLUA_LIBRARY=/usr/lib/x86_64-linux-gnu/lib${LUANAME}.so -DLUA_INCLUDE_DIR=${LUAINCLUDE} -D OVERRIDE_VERSION=$AWESOME_VERSION" + - make && sudo env PATH=$PATH make install && awesome --version + +after_success: + # Push updated API docs for relevant branches, e.g. non-PRs builds on master. + - if [ "$BUILD_APIDOC" = "true" ]; then build-utils/travis-apidoc.sh; fi diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/awesome-3.5.6/.version_stamp new/awesome-3.5.7/.version_stamp --- old/awesome-3.5.6/.version_stamp 2015-01-10 20:39:22.000000000 +0100 +++ new/awesome-3.5.7/.version_stamp 2016-01-15 16:54:42.000000000 +0100 @@ -1 +1 @@ -v3.5.6 \ No newline at end of file +v3.5.7 \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/awesome-3.5.6/awesome.c new/awesome-3.5.7/awesome.c --- old/awesome-3.5.6/awesome.c 2015-01-10 20:36:35.000000000 +0100 +++ new/awesome-3.5.7/awesome.c 2016-01-15 16:51:19.000000000 +0100 @@ -72,6 +72,23 @@ lua_pushboolean(globalconf.L, restart); signal_object_emit(globalconf.L, &global_signals, "exit", 1); + /* Move clients where we want them to be and keep the stacking order intact */ + foreach(c, globalconf.stack) + { + xcb_reparent_window(globalconf.connection, (*c)->window, globalconf.screen->root, + (*c)->geometry.x, (*c)->geometry.y); + } + + /* Save the client order. This is useful also for "hard" restarts. */ + xcb_window_t *wins = p_alloca(xcb_window_t, globalconf.clients.len); + int n = 0; + foreach(client, globalconf.clients) + wins[n++] = (*client)->window; + + xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, + globalconf.screen->root, + AWESOME_CLIENT_ORDER, XCB_ATOM_WINDOW, 32, n, wins); + a_dbus_cleanup(); systray_cleanup(); @@ -94,6 +111,36 @@ xcb_disconnect(globalconf.connection); } +/** Restore the client order after a restart */ +static void +restore_client_order(xcb_get_property_cookie_t prop_cookie) +{ + int client_idx = 0; + xcb_window_t *windows; + xcb_get_property_reply_t *reply; + + reply = xcb_get_property_reply(globalconf.connection, prop_cookie, NULL); + if (!reply || reply->format != 32 || reply->value_len == 0) { + p_delete(&reply); + return; + } + + windows = xcb_get_property_value(reply); + for (uint32_t i = 0; i < reply->value_len; i++) + /* Find windows[i] and swap it to where it belongs */ + foreach(c, globalconf.clients) + if ((*c)->window == windows[i]) + { + client_t *tmp = *c; + *c = globalconf.clients.tab[client_idx]; + globalconf.clients.tab[client_idx] = tmp; + client_idx++; + } + + luaA_class_emit_signal(globalconf.L, &client_class, "list", 0); + p_delete(&reply); +} + /** Scan X to find windows to manage. */ static void @@ -104,6 +151,7 @@ xcb_window_t *wins = NULL; xcb_get_window_attributes_reply_t *attr_r; xcb_get_geometry_reply_t *geom_r; + xcb_get_property_cookie_t prop_cookie; long state; tree_r = xcb_query_tree_reply(globalconf.connection, @@ -113,6 +161,11 @@ if(!tree_r) return; + /* This gets the property and deletes it */ + prop_cookie = xcb_get_property_unchecked(globalconf.connection, true, + globalconf.screen->root, AWESOME_CLIENT_ORDER, + XCB_ATOM_WINDOW, 0, UINT_MAX); + /* Get the tree of the children windows of the current root window */ if(!(wins = xcb_query_tree_children(tree_r))) fatal("cannot get tree children"); @@ -167,6 +220,8 @@ } p_delete(&tree_r); + + restore_client_order(prop_cookie); } static void @@ -324,6 +379,10 @@ { NULL, 0, NULL, 0 } }; + /* Make stdout/stderr line buffered. */ + setvbuf(stdout, NULL, _IOLBF, 0); + setvbuf(stderr, NULL, _IOLBF, 0); + /* clear the globalconf structure */ p_clear(&globalconf, 1); globalconf.keygrabber = LUA_REFNIL; @@ -499,23 +558,27 @@ spawn_init(); /* The default GC is just a newly created associated with a window with - * depth globalconf.default_depth */ - xcb_window_t tmp_win = xcb_generate_id(globalconf.connection); + * depth globalconf.default_depth. + * The window_no_focus is used for "nothing has the input focus". */ + globalconf.focus.window_no_focus = xcb_generate_id(globalconf.connection); globalconf.gc = xcb_generate_id(globalconf.connection); xcb_create_window(globalconf.connection, globalconf.default_depth, - tmp_win, globalconf.screen->root, + globalconf.focus.window_no_focus, globalconf.screen->root, -1, -1, 1, 1, 0, XCB_COPY_FROM_PARENT, globalconf.visual->visual_id, - XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL | XCB_CW_COLORMAP, + XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL | + XCB_CW_OVERRIDE_REDIRECT | XCB_CW_COLORMAP, (const uint32_t []) { globalconf.screen->black_pixel, globalconf.screen->black_pixel, + 1, globalconf.default_cmap }); - xcb_create_gc(globalconf.connection, globalconf.gc, tmp_win, XCB_GC_FOREGROUND | XCB_GC_BACKGROUND, + xcb_map_window(globalconf.connection, globalconf.focus.window_no_focus); + xcb_create_gc(globalconf.connection, globalconf.gc, globalconf.focus.window_no_focus, + XCB_GC_FOREGROUND | XCB_GC_BACKGROUND, (const uint32_t[]) { globalconf.screen->black_pixel, globalconf.screen->white_pixel }); - xcb_destroy_window(globalconf.connection, tmp_win); /* Get the window tree associated to this screen */ tree_c = xcb_query_tree_unchecked(globalconf.connection, @@ -547,9 +610,12 @@ g_main_context_set_poll_func(g_main_context_default(), &a_glib_poll); gettimeofday(&last_wakeup, NULL); - /* main event loop */ - globalconf.loop = g_main_loop_new(NULL, FALSE); - g_main_loop_run(globalconf.loop); + /* main event loop (if not NULL, awesome.quit() was already called) */ + if (globalconf.loop == NULL) + { + globalconf.loop = g_main_loop_new(NULL, FALSE); + g_main_loop_run(globalconf.loop); + } g_main_loop_unref(globalconf.loop); globalconf.loop = NULL; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/awesome-3.5.6/awesomeConfig.cmake new/awesome-3.5.7/awesomeConfig.cmake --- old/awesome-3.5.6/awesomeConfig.cmake 2015-01-10 20:36:35.000000000 +0100 +++ new/awesome-3.5.7/awesomeConfig.cmake 2016-01-15 16:51:19.000000000 +0100 @@ -4,7 +4,7 @@ # `git describe` later. set(VERSION devel) -set(CODENAME "For Those About To Rock") +set(CODENAME "Space Oddity") project(${PROJECT_AWE_NAME} C) @@ -239,6 +239,13 @@ set(XDG_CONFIG_DIR ${SYSCONFDIR}/xdg CACHE PATH "xdg config directory") endif() +# setting AWESOME_DATA_PATH +if(DEFINED AWESOME_DATA_PATH) + set(AWESOME_DATA_PATH ${AWESOME_DATA_PATH} CACHE PATH "awesome share directory") +else() + set(AWESOME_DATA_PATH ${CMAKE_INSTALL_PREFIX}/share/${PROJECT_AWE_NAME} CACHE PATH "awesome share directory") +endif() + # setting AWESOME_DOC_PATH if(DEFINED AWESOME_DOC_PATH) set(AWESOME_DOC_PATH ${AWESOME_DOC_PATH} CACHE PATH "awesome docs directory") @@ -269,7 +276,6 @@ set(AWESOME_COMPILE_BY $ENV{USER}) set(AWESOME_RELEASE ${CODENAME}) set(AWESOME_SYSCONFDIR ${XDG_CONFIG_DIR}/${PROJECT_AWE_NAME}) -set(AWESOME_DATA_PATH ${CMAKE_INSTALL_PREFIX}/share/${PROJECT_AWE_NAME}) set(AWESOME_LUA_LIB_PATH ${AWESOME_DATA_PATH}/lib) set(AWESOME_ICON_PATH ${AWESOME_DATA_PATH}/icons) set(AWESOME_THEMES_PATH ${AWESOME_DATA_PATH}/themes) @@ -290,7 +296,7 @@ message(STATUS "Configuring ${outfile}") configure_file(${SOURCE_DIR}/${file} ${BUILD_DIR}/${outfile} - ESCAPE_QUOTE + ESCAPE_QUOTES @ONLY) endmacro() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/awesome-3.5.6/common/atoms.list new/awesome-3.5.7/common/atoms.list --- old/awesome-3.5.6/common/atoms.list 2015-01-10 20:36:35.000000000 +0100 +++ new/awesome-3.5.7/common/atoms.list 2016-01-15 16:51:19.000000000 +0100 @@ -61,3 +61,4 @@ WM_CLIENT_LEADER XSEL_DATA WM_TAKE_FOCUS +AWESOME_CLIENT_ORDER diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/awesome-3.5.6/common/luaclass.c new/awesome-3.5.7/common/luaclass.c --- old/awesome-3.5.6/common/luaclass.c 2015-01-10 20:36:35.000000000 +0100 +++ new/awesome-3.5.7/common/luaclass.c 2016-01-15 16:51:19.000000000 +0100 @@ -369,6 +369,19 @@ lua_class_t *class = luaA_class_get(L, 1); + /* Is this the special 'valid' property? This is the only property + * accessible for invalid objects and thus needs special handling. */ + const char *attr = luaL_checkstring(L, 2); + if (A_STREQ(attr, "valid")) + { + void *p = luaA_toudata(L, 1, class); + if (class->checker) + lua_pushboolean(L, p != NULL && class->checker(p)); + else + lua_pushboolean(L, p != NULL); + return 1; + } + lua_class_property_t *prop = luaA_class_property_get(L, class, 2); /* Property does exist and has an index callback */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/awesome-3.5.6/common/util.h new/awesome-3.5.7/common/util.h --- old/awesome-3.5.6/common/util.h 2015-01-10 20:36:35.000000000 +0100 +++ new/awesome-3.5.7/common/util.h 2016-01-15 16:51:19.000000000 +0100 @@ -237,7 +237,7 @@ } #define A_STREQ_CASE(a, b) (((a) == (b)) || a_strcasecmp(a, b) == 0) -#define A_STRNEQ_CASE(a, b) (!A_STRCASEEQ(a, b)) +#define A_STRNEQ_CASE(a, b) (!A_STREQ_CASE(a, b)) /** \brief \c NULL resistant strncmp. * \param[in] a the first string. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/awesome-3.5.6/dbus.c new/awesome-3.5.7/dbus.c --- old/awesome-3.5.6/dbus.c 2015-01-10 20:36:35.000000000 +0100 +++ new/awesome-3.5.7/dbus.c 2016-01-15 16:51:19.000000000 +0100 @@ -239,6 +239,7 @@ DBUS_MSG_HANDLE_TYPE_NUMBER(uint32_t, DBUS_TYPE_UINT32) DBUS_MSG_HANDLE_TYPE_NUMBER(int64_t, DBUS_TYPE_INT64) DBUS_MSG_HANDLE_TYPE_NUMBER(uint64_t, DBUS_TYPE_UINT64) + DBUS_MSG_HANDLE_TYPE_NUMBER(double, DBUS_TYPE_DOUBLE) #undef DBUS_MSG_HANDLE_TYPE_NUMBER case DBUS_TYPE_STRING: { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/awesome-3.5.6/event.c new/awesome-3.5.7/event.c --- old/awesome-3.5.6/event.c 2015-01-10 20:36:35.000000000 +0100 +++ new/awesome-3.5.7/event.c 2016-01-15 16:51:19.000000000 +0100 @@ -296,27 +296,37 @@ if((c = client_getbywin(ev->window))) { area_t geometry = c->geometry; + uint16_t bw = c->border_width; + uint16_t tb_left = c->titlebar[CLIENT_TITLEBAR_LEFT].size; + uint16_t tb_right = c->titlebar[CLIENT_TITLEBAR_RIGHT].size; + uint16_t tb_top = c->titlebar[CLIENT_TITLEBAR_TOP].size; + uint16_t tb_bottom = c->titlebar[CLIENT_TITLEBAR_BOTTOM].size; + uint16_t deco_left = bw + tb_left; + uint16_t deco_right = bw + tb_right; + uint16_t deco_top = bw + tb_top; + uint16_t deco_bottom = bw + tb_bottom; int16_t diff_w = 0, diff_h = 0, diff_border = 0; if(ev->value_mask & XCB_CONFIG_WINDOW_X) { + int16_t diff = 0; geometry.x = ev->x; - /* The ConfigureRequest specifies the position of the outer corner of the client window, we want the frame */ - geometry.x -= c->border_width; + xwindow_translate_for_gravity(c->size_hints.win_gravity, deco_left, 0, deco_right, 0, &diff, NULL); + geometry.x += diff; } if(ev->value_mask & XCB_CONFIG_WINDOW_Y) { + int16_t diff = 0; geometry.y = ev->y; - /* The ConfigureRequest specifies the position of the outer corner of the client window, we want the frame */ - geometry.y -= c->border_width; + xwindow_translate_for_gravity(c->size_hints.win_gravity, 0, deco_top, 0, deco_bottom, NULL, &diff); + geometry.y += diff; } if(ev->value_mask & XCB_CONFIG_WINDOW_WIDTH) { uint16_t old_w = geometry.width; geometry.width = ev->width; /* The ConfigureRequest specifies the size of the client window, we want the frame */ - geometry.width += c->titlebar[CLIENT_TITLEBAR_LEFT].size; - geometry.width += c->titlebar[CLIENT_TITLEBAR_RIGHT].size; + geometry.width += tb_left + tb_right; diff_w = geometry.width - old_w; } if(ev->value_mask & XCB_CONFIG_WINDOW_HEIGHT) @@ -324,13 +334,12 @@ uint16_t old_h = geometry.height; geometry.height = ev->height; /* The ConfigureRequest specifies the size of the client window, we want the frame */ - geometry.height += c->titlebar[CLIENT_TITLEBAR_TOP].size; - geometry.height += c->titlebar[CLIENT_TITLEBAR_BOTTOM].size; + geometry.height += tb_top + tb_bottom; diff_h = geometry.height - old_h; } if(ev->value_mask & XCB_CONFIG_WINDOW_BORDER_WIDTH) { - diff_border = ev->border_width - c->border_width; + diff_border = ev->border_width - bw; diff_h += diff_border; diff_w += diff_border; @@ -392,6 +401,44 @@ } } +/** Record that the given drawable contains the pointer. + */ +static void +event_drawable_under_mouse(lua_State *L, int ud) +{ + void *d; + + lua_pushvalue(L, ud); + d = luaA_object_ref(L, -1); + + if (d == globalconf.drawable_under_mouse) + { + /* Nothing to do */ + luaA_object_unref(L, d); + return; + } + + if (globalconf.drawable_under_mouse != NULL) + { + /* Emit leave on previous drawable */ + luaA_object_push(L, globalconf.drawable_under_mouse); + luaA_object_emit_signal(L, -1, "mouse::leave", 0); + lua_pop(L, 1); + + /* Unref the previous drawable */ + luaA_object_unref(L, globalconf.drawable_under_mouse); + globalconf.drawable_under_mouse = NULL; + } + if (d != NULL) + { + /* Reference the drawable for leave event later */ + globalconf.drawable_under_mouse = d; + + /* Emit enter */ + luaA_object_emit_signal(L, ud, "mouse::enter", 0); + } +} + /** The motion notify event handler. * \param ev The event. */ @@ -419,6 +466,7 @@ if (d) { luaA_object_push_item(globalconf.L, -1, d); + event_drawable_under_mouse(globalconf.L, -1); lua_pushnumber(globalconf.L, x); lua_pushnumber(globalconf.L, y); luaA_object_emit_signal(globalconf.L, -3, "mouse::move", 2); @@ -431,6 +479,7 @@ { luaA_object_push(globalconf.L, w); luaA_object_push_item(globalconf.L, -1, w->drawable); + event_drawable_under_mouse(globalconf.L, -1); lua_pushnumber(globalconf.L, ev->event_x); lua_pushnumber(globalconf.L, ev->event_y); luaA_object_emit_signal(globalconf.L, -3, "mouse::move", 2); @@ -444,7 +493,6 @@ static void event_handle_leavenotify(xcb_leave_notify_event_t *ev) { - drawin_t *drawin; client_t *c; globalconf.timestamp = ev->time; @@ -452,27 +500,18 @@ if(ev->mode != XCB_NOTIFY_MODE_NORMAL) return; - if((c = client_getbyframewin(ev->event))) + /* Ignore leave with detail inferior (we were left for a window contained in + * our window, so technically the pointer is still inside of this window). + */ + if(ev->detail != XCB_NOTIFY_DETAIL_INFERIOR && (c = client_getbyframewin(ev->event))) { luaA_object_push(globalconf.L, c); luaA_object_emit_signal(globalconf.L, -1, "mouse::leave", 0); - drawable_t *d = client_get_drawable(c, ev->event_x, ev->event_y); - if (d) - { - luaA_object_push_item(globalconf.L, -1, d); - luaA_object_emit_signal(globalconf.L, -1, "mouse::leave", 0); - lua_pop(globalconf.L, 1); - } - lua_pop(globalconf.L, 1); } - if((drawin = drawin_getbywin(ev->event))) - { - luaA_object_push(globalconf.L, drawin); - luaA_object_push_item(globalconf.L, -1, drawin->drawable); - luaA_object_emit_signal(globalconf.L, -1, "mouse::leave", 0); - lua_pop(globalconf.L, 2); - } + lua_pushnil(globalconf.L); + event_drawable_under_mouse(globalconf.L, -1); + lua_pop(globalconf.L, 1); } /** The enter notify event handler. @@ -493,23 +532,34 @@ { luaA_object_push(globalconf.L, drawin); luaA_object_push_item(globalconf.L, -1, drawin->drawable); - luaA_object_emit_signal(globalconf.L, -1, "mouse::enter", 0); + event_drawable_under_mouse(globalconf.L, -1); lua_pop(globalconf.L, 2); } if((c = client_getbyframewin(ev->event))) { luaA_object_push(globalconf.L, c); - luaA_object_emit_signal(globalconf.L, -1, "mouse::enter", 0); + /* Ignore enter with detail inferior: The pointer was previously inside + * of a child window, so technically this isn't a 'real' enter. + */ + if (ev->detail != XCB_NOTIFY_DETAIL_INFERIOR) + luaA_object_emit_signal(globalconf.L, -1, "mouse::enter", 0); + drawable_t *d = client_get_drawable(c, ev->event_x, ev->event_y); if (d) { luaA_object_push_item(globalconf.L, -1, d); - luaA_object_emit_signal(globalconf.L, -1, "mouse::enter", 0); + event_drawable_under_mouse(globalconf.L, -1); lua_pop(globalconf.L, 1); } lua_pop(globalconf.L, 1); } + else if (ev->event == globalconf.screen->root) { + /* When there are multiple X screens with awesome running separate + * instances, reset focus. + */ + globalconf.focus.need_update = true; + } } /** The focus in event handler. @@ -594,7 +644,7 @@ /* get keysym ignoring all modifiers */ xcb_keysym_t keysym = keyresolv_get_keysym(ev->detail, 0); client_t *c; - if((c = client_getbyframewin(ev->event))) + if((c = client_getbywin(ev->event))) { luaA_object_push(globalconf.L, c); event_key_callback(ev, &c->keys, -1, 1, &keysym); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/awesome-3.5.6/globalconf.h new/awesome-3.5.7/globalconf.h --- old/awesome-3.5.6/globalconf.h 2015-01-10 20:36:35.000000000 +0100 +++ new/awesome-3.5.7/globalconf.h 2016-01-15 16:51:19.000000000 +0100 @@ -103,6 +103,8 @@ int keygrabber; /** The mouse pointer grabber function */ int mousegrabber; + /** The drawable that currently contains the pointer */ + drawable_t *drawable_under_mouse; /** Input focus information */ struct { @@ -110,6 +112,8 @@ client_t *client; /** Is there a focus change pending? */ bool need_update; + /** When nothing has the input focus, this window actually is focused */ + xcb_window_t window_no_focus; } focus; /** Drawins */ drawin_array_t drawins; @@ -127,6 +131,8 @@ bool registered; /** Systray window parent */ drawin_t *parent; + /** Background color */ + uint32_t background_pixel; } systray; /** The monitor of startup notifications */ SnMonitorContext *snmonitor; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/awesome-3.5.6/lib/awful/menu.lua.in new/awesome-3.5.7/lib/awful/menu.lua.in --- old/awesome-3.5.6/lib/awful/menu.lua.in 2015-01-10 20:36:35.000000000 +0100 +++ new/awesome-3.5.7/lib/awful/menu.lua.in 2016-01-15 16:51:19.000000000 +0100 @@ -101,7 +101,7 @@ local function item_position(_menu, child) local in_dir, other, a, b = 0, 0, "height", "width" - local dir = _menu.layout.get_dir and _menu.layout:get_dir() or "y" + local dir = _menu.layout.dir or "y" if dir == "x" then a, b = b, a end local in_dir, other = 0, _menu[b] @@ -162,7 +162,7 @@ local function set_size(_menu) local in_dir, other, a, b = 0, 0, "height", "width" - local dir = _menu.layout.get_dir and _menu.layout:get_dir() or "y" + local dir = _menu.layout.dir or "y" if dir == "x" then a, b = b, a end for _, item in ipairs(_menu.items) do other = math.max(other, item[b]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/awesome-3.5.6/lib/awful/tag.lua.in new/awesome-3.5.7/lib/awful/tag.lua.in --- old/awesome-3.5.6/lib/awful/tag.lua.in 2015-01-10 20:36:35.000000000 +0100 +++ new/awesome-3.5.7/lib/awful/tag.lua.in 2016-01-15 16:51:19.000000000 +0100 @@ -622,6 +622,7 @@ capi.tag.add_signal("property::hide") capi.tag.add_signal("property::icon") +capi.tag.add_signal("property::icon_only") capi.tag.add_signal("property::layout") capi.tag.add_signal("property::mwfact") capi.tag.add_signal("property::ncol") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/awesome-3.5.6/luaa.c new/awesome-3.5.7/luaa.c --- old/awesome-3.5.6/luaa.c 2015-01-10 20:36:35.000000000 +0100 +++ new/awesome-3.5.7/luaa.c 2016-01-15 16:51:19.000000000 +0100 @@ -107,6 +107,8 @@ static int luaA_quit(lua_State *L) { + if (globalconf.loop == NULL) + globalconf.loop = g_main_loop_new(NULL, FALSE); g_main_loop_quit(globalconf.loop); return 0; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/awesome-3.5.6/luadoc/client.lua new/awesome-3.5.7/luadoc/client.lua --- old/awesome-3.5.6/luadoc/client.lua 2015-01-10 20:36:35.000000000 +0100 +++ new/awesome-3.5.7/luadoc/client.lua 2016-01-15 16:51:19.000000000 +0100 @@ -47,6 +47,7 @@ -- @field shape_client_bounding The client's bounding shape as set by the program as a (native) cairo surface. -- @field shape_client_clip The client's clip shape as set by the program as a (native) cairo surface. -- @field startup_id The FreeDesktop StartId. +-- @field valid If the client that this object refers to is still managed by awesome. -- @class table -- @name client diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/awesome-3.5.6/objects/client.c new/awesome-3.5.7/objects/client.c --- old/awesome-3.5.6/objects/client.c 2015-01-10 20:36:35.000000000 +0100 +++ new/awesome-3.5.7/objects/client.c 2016-01-15 16:51:19.000000000 +0100 @@ -36,6 +36,7 @@ static area_t titlebar_get_area(client_t *c, client_titlebar_t bar); static drawable_t *titlebar_get_drawable(lua_State *L, client_t *c, int cl_idx, client_titlebar_t bar); +static void client_resize_do(client_t *c, area_t geometry, bool force_notice, bool honor_hints); /** Collect a client. * \param L The Lua VM state. @@ -343,7 +344,7 @@ client_focus_refresh(void) { client_t *c = globalconf.focus.client; - xcb_window_t win = globalconf.screen->root; + xcb_window_t win = globalconf.focus.window_no_focus; if(!globalconf.focus.need_update) return; @@ -357,10 +358,11 @@ if(!c->nofocus) win = c->window; else - /* Focus the root window to make sure the previously focused client - * doesn't get any input in case WM_TAKE_FOCUS gets ignored. + /* Move the focus away from whatever has it to make sure the + * previously focused client doesn't get any input in case + * WM_TAKE_FOCUS gets ignored. */ - win = globalconf.screen->root; + win = globalconf.focus.window_no_focus; if(client_hasproto(c, WM_TAKE_FOCUS)) xwindow_takefocus(c->window); @@ -376,6 +378,24 @@ } static void +border_width_callback(client_t *c, uint16_t old_width, uint16_t new_width) +{ + if(c->size_hints.flags & XCB_ICCCM_SIZE_HINT_P_WIN_GRAVITY) + { + area_t geometry = c->geometry; + int16_t diff = new_width - old_width; + int16_t diff_x = 0, diff_y = 0; + xwindow_translate_for_gravity(c->size_hints.win_gravity, + diff, diff, diff, diff, + &diff_x, &diff_y); + geometry.x += diff_x; + geometry.y += diff_y; + /* force_notice = true -> inform client about changes */ + client_resize_do(c, geometry, true, false); + } +} + +static void client_update_properties(client_t *c) { /* get all hints */ @@ -446,6 +466,7 @@ client_t *c = client_new(globalconf.L); xcb_screen_t *s = globalconf.screen; + c->border_width_callback = (void (*) (void *, uint16_t, uint16_t)) border_width_callback; /* consider the window banned */ c->isbanned = true; @@ -623,7 +644,7 @@ /* Size hints are applied to the window without any decoration */ client_remove_titlebar_geometry(c, &geometry); - if(c->size_hints.flags & XCB_ICCCM_SIZE_HINT_P_SIZE) + if(c->size_hints.flags & XCB_ICCCM_SIZE_HINT_BASE_SIZE) { basew = c->size_hints.base_width; baseh = c->size_hints.base_height; @@ -642,7 +663,7 @@ minw = c->size_hints.min_width; minh = c->size_hints.min_height; } - else if(c->size_hints.flags & XCB_ICCCM_SIZE_HINT_P_SIZE) + else if(c->size_hints.flags & XCB_ICCCM_SIZE_HINT_BASE_SIZE) { /* min size is substituted with base size if not specified */ minw = c->size_hints.base_width; @@ -868,13 +889,18 @@ xwindow_set_state(c->window, XCB_ICCCM_WM_STATE_ICONIC); uint32_t no_event[] = { 0 }; - const uint32_t select_input_val[] = { CLIENT_SELECT_INPUT_EVENT_MASK }; + const uint32_t client_select_input_val[] = { CLIENT_SELECT_INPUT_EVENT_MASK }; + const uint32_t frame_select_input_val[] = { FRAME_SELECT_INPUT_EVENT_MASK }; xcb_grab_server(globalconf.connection); xcb_change_window_attributes(globalconf.connection, globalconf.screen->root, XCB_CW_EVENT_MASK, no_event); xcb_change_window_attributes(globalconf.connection, + c->frame_window, + XCB_CW_EVENT_MASK, + no_event); + xcb_change_window_attributes(globalconf.connection, c->window, XCB_CW_EVENT_MASK, no_event); @@ -884,9 +910,13 @@ XCB_CW_EVENT_MASK, ROOT_WINDOW_EVENT_MASK); xcb_change_window_attributes(globalconf.connection, + c->frame_window, + XCB_CW_EVENT_MASK, + frame_select_input_val); + xcb_change_window_attributes(globalconf.connection, c->window, XCB_CW_EVENT_MASK, - select_input_val); + client_select_input_val); xcb_ungrab_server(globalconf.connection); } else @@ -1689,19 +1719,39 @@ * titlebars should keep its current size!) */ area_t geometry = c->geometry; int change = size - c->titlebar[bar].size; + int16_t diff_top = 0, diff_bottom = 0, diff_right = 0, diff_left = 0; switch (bar) { case CLIENT_TITLEBAR_TOP: + geometry.height += change; + diff_top = change; + break; case CLIENT_TITLEBAR_BOTTOM: geometry.height += change; + diff_bottom = change; break; case CLIENT_TITLEBAR_RIGHT: + geometry.width += change; + diff_right = change; + break; case CLIENT_TITLEBAR_LEFT: geometry.width += change; + diff_left = change; break; default: fatal("Unknown titlebar kind %d\n", (int) bar); } + if(c->size_hints.flags & XCB_ICCCM_SIZE_HINT_P_WIN_GRAVITY) + { + int16_t diff_x = 0, diff_y = 0; + xwindow_translate_for_gravity(c->size_hints.win_gravity, + diff_left, diff_top, + diff_right, diff_bottom, + &diff_x, &diff_y); + geometry.x += diff_x; + geometry.y += diff_y; + } + c->titlebar[bar].size = size; client_resize_do(c, geometry, true, false); } @@ -2234,7 +2284,7 @@ luaA_key_array_set(L, 1, 2, keys); luaA_object_emit_signal(L, 1, "property::keys", 0); xcb_ungrab_key(globalconf.connection, XCB_GRAB_ANY, c->frame_window, XCB_BUTTON_MASK_ANY); - xwindow_grabkeys(c->frame_window, keys); + xwindow_grabkeys(c->window, keys); } return luaA_key_array_get(L, 1, keys); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/awesome-3.5.6/objects/window.c new/awesome-3.5.7/objects/window.c --- old/awesome-3.5.6/objects/window.c 2015-01-10 20:36:35.000000000 +0100 +++ new/awesome-3.5.7/objects/window.c 2016-01-15 16:51:19.000000000 +0100 @@ -169,6 +169,7 @@ window_set_border_width(lua_State *L, int idx, int width) { window_t *window = luaA_checkudata(L, idx, &window_class); + uint16_t old_width = window->border_width; if(width == window->border_width || width < 0) return; @@ -180,6 +181,9 @@ window->border_width = width; + if(window->border_width_callback) + (*window->border_width_callback)(window, old_width, width); + luaA_object_emit_signal(L, idx, "property::border_width", 0); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/awesome-3.5.6/objects/window.h new/awesome-3.5.7/objects/window.h --- old/awesome-3.5.6/objects/window.h 2015-01-10 20:36:35.000000000 +0100 +++ new/awesome-3.5.7/objects/window.h 2016-01-15 16:51:19.000000000 +0100 @@ -66,7 +66,9 @@ /** Border width */ \ uint16_t border_width; \ /** The window type */ \ - window_type_t type; + window_type_t type; \ + /** The border width callback */ \ + void (*border_width_callback)(void *, uint16_t old, uint16_t new); /** Window structure */ typedef struct diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/awesome-3.5.6/screen.c new/awesome-3.5.7/screen.c --- old/awesome-3.5.6/screen.c 2015-01-10 20:36:35.000000000 +0100 +++ new/awesome-3.5.7/screen.c 2016-01-15 16:51:19.000000000 +0100 @@ -422,7 +422,7 @@ { const char *name; - if((name = lua_tostring(L, 2))) + if(lua_type(L, 2) == LUA_TSTRING && (name = lua_tostring(L, 2))) foreach(screen, globalconf.screens) foreach(output, screen->outputs) if(A_STREQ(output->name, name)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/awesome-3.5.6/spawn.c new/awesome-3.5.7/spawn.c --- old/awesome-3.5.6/spawn.c 2015-01-10 20:36:35.000000000 +0100 +++ new/awesome-3.5.7/spawn.c 2016-01-15 16:51:19.000000000 +0100 @@ -260,7 +260,14 @@ static void spawn_callback(gpointer user_data) { + SnLauncherContext *context = (SnLauncherContext *) user_data; setsid(); + + if (context) + sn_launcher_context_setup_child_process(context); + else + /* Unset in case awesome was already started with this variable set */ + unsetenv("DESKTOP_STARTUP_ID"); } /** Parse a command line. @@ -352,12 +359,11 @@ /* app will have AWESOME_SPAWN_TIMEOUT seconds to complete, * or the timeout function will terminate the launch sequence anyway */ g_timeout_add_seconds(AWESOME_SPAWN_TIMEOUT, spawn_launchee_timeout, context); - sn_launcher_context_setup_child_process(context); } GError *error = NULL; retval = g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH, - spawn_callback, NULL, &pid, &error); + spawn_callback, context, &pid, &error); g_strfreev(argv); if(!retval) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/awesome-3.5.6/systray.c new/awesome-3.5.7/systray.c --- old/awesome-3.5.6/systray.c 2015-01-10 20:36:35.000000000 +0100 +++ new/awesome-3.5.7/systray.c 2016-01-15 16:51:19.000000000 +0100 @@ -45,12 +45,14 @@ xcb_screen_t *xscreen = globalconf.screen; globalconf.systray.window = xcb_generate_id(globalconf.connection); + globalconf.systray.background_pixel = xscreen->black_pixel; xcb_create_window(globalconf.connection, xscreen->root_depth, globalconf.systray.window, xscreen->root, -1, -1, 1, 1, 0, XCB_COPY_FROM_PARENT, xscreen->root_visual, - 0, NULL); + XCB_CW_BACK_PIXEL, (const uint32_t []) + { xscreen->black_pixel }); atom_name = xcb_atom_name_by_screen("_NET_SYSTEM_TRAY", globalconf.default_screen); if(!atom_name) @@ -255,7 +257,7 @@ } static void -systray_update(int base_size, bool horizontal, bool reverse) +systray_update(int base_size, bool horizontal, bool reverse, bool force_redraw) { if(base_size <= 0) return; @@ -287,6 +289,8 @@ XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y | XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT, config_vals); xcb_map_window(globalconf.connection, em->win); + if (force_redraw) + xcb_clear_area(globalconf.connection, 1, em->win, 0, 0, 0, 0); if(horizontal) config_vals[0] += base_size; else @@ -322,13 +326,18 @@ const char *bg = luaL_checklstring(L, 6, &bg_len); bool revers = lua_toboolean(L, 7); color_t bg_color; + bool force_redraw = false; - if(color_init_reply(color_init_unchecked(&bg_color, bg, bg_len))) + if(color_init_reply(color_init_unchecked(&bg_color, bg, bg_len)) + && globalconf.systray.background_pixel != bg_color.pixel) { uint32_t config_back[] = { bg_color.pixel }; + globalconf.systray.background_pixel = bg_color.pixel; xcb_change_window_attributes(globalconf.connection, globalconf.systray.window, XCB_CW_BACK_PIXEL, config_back); + xcb_clear_area(globalconf.connection, 1, globalconf.systray.window, 0, 0, 0, 0); + force_redraw = true; } if(globalconf.systray.parent != w) @@ -349,7 +358,7 @@ if(globalconf.embedded.len != 0) { - systray_update(base_size, horiz, revers); + systray_update(base_size, horiz, revers, force_redraw); xcb_map_window(globalconf.connection, globalconf.systray.window); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/awesome-3.5.6/xwindow.c new/awesome-3.5.7/xwindow.c --- old/awesome-3.5.6/xwindow.c 2015-01-10 20:36:35.000000000 +0100 +++ new/awesome-3.5.7/xwindow.c 2016-01-15 16:51:19.000000000 +0100 @@ -413,7 +413,7 @@ break; case XCB_GRAVITY_STATIC: x = -change_width_before; - x = -change_height_before; + y = -change_height_before; break; }