From: Charles McGarvey Date: Thu, 14 Aug 2014 18:39:50 +0000 (-0600) Subject: Merge branch 'master' into chaz X-Git-Url: https://git.dogcows.com/gitweb?a=commitdiff_plain;h=d67b818ae90c5574166d08422d3e9a68d8d65e16;hp=-c;p=chaz%2Fopenbox Merge branch 'master' into chaz Conflicts: openbox/moveresize.c --- d67b818ae90c5574166d08422d3e9a68d8d65e16 diff --combined configure.ac index dfdcf057,33fc6d92..f751b287 --- a/configure.ac +++ b/configure.ac @@@ -1,8 -1,9 +1,8 @@@ AC_PREREQ([2.54]) - AC_INIT([openbox], [3.5.0], [http://bugzilla.icculus.org]) + AC_INIT([openbox], [3.5.2], [http://bugzilla.icculus.org]) AC_CONFIG_SRCDIR([openbox/openbox.c]) AM_INIT_AUTOMAKE([foreign]) -AM_SILENT_RULES([yes]) OB_VERSION=$PACKAGE_VERSION AC_SUBST(OB_VERSION) @@@ -19,14 -20,14 +19,14 @@@ dnl if MAJOR or MINOR version changes, dnl RR_MAJOR_VERSION=3 RR_MINOR_VERSION=5 - RR_MICRO_VERSION=28 + RR_MICRO_VERSION=30 RR_INTERFACE_AGE=1 RR_BINARY_AGE=1 RR_VERSION=$RR_MAJOR_VERSION.$RR_MINOR_VERSION OBT_MAJOR_VERSION=3 OBT_MINOR_VERSION=5 - OBT_MICRO_VERSION=1 + OBT_MICRO_VERSION=3 OBT_INTERFACE_AGE=1 OBT_BINARY_AGE=1 OBT_VERSION=$OBT_MAJOR_VERSION.$OBT_MINOR_VERSION @@@ -194,6 -195,36 +194,36 @@@ f AM_CONDITIONAL(USE_IMLIB2, [test $imlib2_found = yes]) + AC_ARG_ENABLE(librsvg, + AC_HELP_STRING( + [--disable-librsvg], + [disable use of SVG image files for loading icons. [default=enabled]] + ), + [enable_librsvg=$enableval], + [enable_librsvg=yes] + ) + + if test "$enable_librsvg" = yes; then + PKG_CHECK_MODULES(LIBRSVG, [librsvg-2.0], + [ + AC_DEFINE(USE_LIBRSVG, [1], [Use SVG image files]) + AC_SUBST(LIBRSVG_CFLAGS) + AC_SUBST(LIBRSVG_LIBS) + # export it for the pkg-config file + PKG_CONFIG_LIBRSVG=librsvg-2.0 + AC_SUBST(PKG_CONFIG_LIBRSVG) + librsvg_found=yes + ], + [ + librsvg_found=no + ] + ) + else + librsvg_found=no + fi + + AM_CONDITIONAL(USE_LIBRSVG, [test $librsvg_found = yes]) + dnl Check for session management X11_SM @@@ -232,6 -263,7 +262,7 @@@ AC_MSG_RESULT([Compiling with these opt Startup Notification... $sn_found X Cursor Library... $xcursor_found Session Management... $SM - Imlib2 library... $imlib2_found + Imlib2 Library... $imlib2_found + SVG Support (librsvg)... $librsvg_found ]) AC_MSG_RESULT([configure complete, now type "make"]) diff --combined data/rc.xml index ce1e8fc1,3e5554ba..56217bf7 --- a/data/rc.xml +++ b/data/rc.xml @@@ -33,6 -33,9 +33,9 @@@ Smart +
yes
+ Primary yes yes + 600 + 5000 sans 8 @@@ -733,10 -734,6 +736,10 @@@ true # 'Horizontal', 'Vertical' or boolean (yes/no) + + 255 + # make the window semi-transparent + # value between 0 and 255, inclusive; 0 invisible, 255 fully opaque # end of the example diff --combined data/rc.xsd index 0fd98ffb,75dd660e..4e8f6bb3 --- a/data/rc.xsd +++ b/data/rc.xsd @@@ -70,6 -70,7 +70,7 @@@ + @@@ -91,8 -92,6 +92,8 @@@ + + @@@ -255,7 -254,6 +256,7 @@@ + diff --combined openbox/client.c index 1478d840,c97abd5a..914b3ae3 --- a/openbox/client.c +++ b/openbox/client.c @@@ -218,7 -218,7 +218,7 @@@ void client_manage(Window window, ObPro Time launch_time; guint32 user_time; gboolean obplaced; - gulong ignore_start; + gulong ignore_start = FALSE; ob_debug("Managing window: 0x%lx", window); @@@ -985,9 -985,6 +985,9 @@@ static ObAppSettings *client_get_settin self->desktop = settings->desktop - 1; } + if (settings->opacity != -1) + self->opacity = settings->opacity; + if (settings->layer == -1) { self->below = TRUE; self->above = FALSE; @@@ -1046,8 -1043,6 +1046,8 @@@ static void client_restore_session_stat self->max_horz = self->session->max_horz; self->max_vert = self->session->max_vert; self->undecorated = self->session->undecorated; + + self->opacity = self->session->opacity; } static gboolean client_restore_session_stacking(ObClient *self) @@@ -2463,20 -2458,10 +2463,10 @@@ static void client_get_session_ids(ObCl } } - /*! Save the properties used for app matching rules, as seen by Openbox when - the window mapped, so that users can still access them later if the app - changes them */ - static void client_save_app_rule_values(ObClient *self) + const gchar *client_type_to_string(ObClient *self) { const gchar *type; - OBT_PROP_SETS(self->window, OB_APP_ROLE, self->role); - OBT_PROP_SETS(self->window, OB_APP_NAME, self->name); - OBT_PROP_SETS(self->window, OB_APP_CLASS, self->class); - OBT_PROP_SETS(self->window, OB_APP_GROUP_NAME, self->group_name); - OBT_PROP_SETS(self->window, OB_APP_GROUP_CLASS, self->group_class); - OBT_PROP_SETS(self->window, OB_APP_TITLE, self->original_title); - switch (self->type) { case OB_CLIENT_TYPE_NORMAL: type = "normal"; break; @@@ -2495,7 -2480,23 +2485,23 @@@ case OB_CLIENT_TYPE_DOCK: type = "dock"; break; } - OBT_PROP_SETS(self->window, OB_APP_TYPE, type); + + return type; + } + + /*! Save the properties used for app matching rules, as seen by Openbox when + the window mapped, so that users can still access them later if the app + changes them */ + static void client_save_app_rule_values(ObClient *self) + { + OBT_PROP_SETS(self->window, OB_APP_ROLE, self->role); + OBT_PROP_SETS(self->window, OB_APP_NAME, self->name); + OBT_PROP_SETS(self->window, OB_APP_CLASS, self->class); + OBT_PROP_SETS(self->window, OB_APP_GROUP_NAME, self->group_name); + OBT_PROP_SETS(self->window, OB_APP_GROUP_CLASS, self->group_class); + OBT_PROP_SETS(self->window, OB_APP_TITLE, self->original_title); + + OBT_PROP_SETS(self->window, OB_APP_TYPE, client_type_to_string(self)); } static void client_change_wm_state(ObClient *self) @@@ -2847,7 -2848,6 +2853,7 @@@ static void client_apply_startup_state( gboolean demands_attention = self->demands_attention; gboolean max_horz = self->max_horz; gboolean max_vert = self->max_vert; + guint8 opacity = self->opacity; Rect oldarea; gint l; @@@ -2897,9 -2897,6 +2903,9 @@@ /* make sure client_setup_decor_and_functions() is called at least once */ client_setup_decor_and_functions(self, FALSE); + /* make the client semi-transparent */ + client_set_opacity(self, opacity); + /* if the window hasn't been configured yet, then do so now, in fact the x,y,w,h may _not_ be the same as the area rect, which can end up meaning that the client isn't properly moved/resized by the fullscreen @@@ -3788,12 -3785,6 +3794,12 @@@ void client_set_desktop(ObClient *self focus_cycle_addremove(NULL, TRUE); } +void client_set_opacity(ObClient *self, guint8 opacity) +{ + OBT_PROP_SET32(self->window, NET_WM_WINDOW_OPACITY, CARDINAL, + opacity * 16777216); +} + gboolean client_is_direct_child(ObClient *parent, ObClient *child) { while (child != parent && (child = client_direct_parent(child))); diff --combined openbox/client.h index a946f274,5ae2d3d2..76ef6696 --- a/openbox/client.h +++ b/openbox/client.h @@@ -268,8 -268,6 +268,8 @@@ struct _ObClien gboolean max_vert; /*! The window is maximized to fill the screen horizontally */ gboolean max_horz; + /*! The window is semi-transparent */ + guint8 opacity; /*! The window should not be displayed by pagers */ gboolean skip_pager; /*! The window should not be displayed by taskbars */ @@@ -550,9 -548,6 +550,9 @@@ void client_kill(ObClient *self) void client_set_desktop(ObClient *self, guint target, gboolean donthide, gboolean dontraise); +/*! Adjust the client opacity */ +void client_set_opacity(ObClient *self, guint8 opacity); + /*! Show the client if it should be shown. Returns if the window is shown. */ gboolean client_show(ObClient *self); @@@ -650,6 -645,9 +650,9 @@@ void client_update_icons(ObClient *self /*! Updates the window's icon geometry (where to iconify to/from) */ void client_update_icon_geometry(ObClient *self); + /*! Helper function to convert the ->type member to string representation */ + const gchar *client_type_to_string(ObClient *self); + /*! Set up what decor should be shown on the window and what functions should be allowed (ObClient::decorations and ObClient::functions). This also updates the NET_WM_ALLOWED_ACTIONS hint. diff --combined openbox/config.c index c21b47d8,76f48569..64bf981c --- a/openbox/config.c +++ b/openbox/config.c @@@ -37,6 -37,7 +37,7 @@@ gboolean config_focus_under_mouse gboolean config_unfocus_leave; ObPlacePolicy config_place_policy; + gboolean config_place_center; ObPlaceMonitor config_place_monitor; guint config_primary_monitor_index; @@@ -47,8 -48,6 +48,8 @@@ StrutPartial config_margins gchar *config_theme; gboolean config_theme_keepborder; guint config_theme_window_list_icon_size; +guint config_frame_flash_delay; +guint config_frame_flash_duration; gchar *config_title_layout; @@@ -123,7 -122,6 +124,7 @@@ ObAppSettings* config_create_app_settin settings->fullscreen = -1; settings->max_horz = -1; settings->max_vert = -1; + settings->opacity = -1; return settings; } @@@ -149,7 -147,6 +150,7 @@@ void config_app_settings_copy_non_defau copy_if(fullscreen, -1); copy_if(max_horz, -1); copy_if(max_vert, -1); + copy_if(opacity, -1); if (src->pos_given) { dst->pos_given = TRUE; @@@ -158,13 -155,10 +159,10 @@@ /* monitor is copied above */ } - if (src->size_given) { - dst->size_given = TRUE; - dst->width_num = src->width_num; - dst->width_denom = src->width_denom; - dst->height_num = src->height_num; - dst->height_denom = src->height_denom; - } + dst->width_num = src->width_num; + dst->width_denom = src->width_denom; + dst->height_num = src->height_num; + dst->height_denom = src->height_denom; } void config_parse_relative_number(gchar *s, gint *num, gint *denom) @@@ -216,7 -210,6 +214,6 @@@ static void parse_single_per_app_settin { xmlNodePtr n, c; gboolean x_pos_given = FALSE; - gboolean width_given = FALSE; if ((n = obt_xml_find_node(app->children, "decor"))) if (!obt_xml_node_contains(n, "default")) @@@ -267,20 -260,22 +264,22 @@@ config_parse_relative_number(s, &settings->width_num, &settings->width_denom); - if (settings->width_num > 0 && settings->width_denom >= 0) - width_given = TRUE; + if (settings->width_num <= 0 || settings->width_denom < 0) + settings->width_num = settings->width_denom = 0; g_free(s); } } - if (width_given && (c = obt_xml_find_node(n->children, "height"))) { - gchar *s = obt_xml_node_string(c); - config_parse_relative_number(s, - &settings->height_num, - &settings->height_denom); - if (settings->height_num > 0 && settings->height_denom >= 0) - settings->size_given = TRUE; - g_free(s); + if ((c = obt_xml_find_node(n->children, "height"))) { + if (!obt_xml_node_contains(c, "default")) { + gchar *s = obt_xml_node_string(c); + config_parse_relative_number(s, + &settings->height_num, + &settings->height_denom); + if (settings->height_num <= 0 || settings->height_denom < 0) + settings->height_num = settings->height_denom = 0; + g_free(s); + } } } @@@ -347,10 -342,6 +346,10 @@@ g_free(s); } } + + if ((n = obt_xml_find_node(app->children, "opacity"))) + if (!obt_xml_node_contains(n, "default")) + settings->opacity = obt_xml_node_int(n); } /* Manages settings for individual applications. @@@ -635,9 -626,13 +634,13 @@@ static void parse_placement(xmlNodePtr node = node->children; - if ((n = obt_xml_find_node(node, "policy"))) + if ((n = obt_xml_find_node(node, "policy"))) { if (obt_xml_node_contains(n, "UnderMouse")) config_place_policy = OB_PLACE_POLICY_MOUSE; + } + if ((n = obt_xml_find_node(node, "center"))) { + config_place_center = obt_xml_node_bool(n); + } if ((n = obt_xml_find_node(node, "monitor"))) { if (obt_xml_node_contains(n, "active")) config_place_monitor = OB_PLACE_MONITOR_ACTIVE; @@@ -707,10 -702,6 +710,10 @@@ static void parse_theme(xmlNodePtr node else if (config_theme_window_list_icon_size > 96) config_theme_window_list_icon_size = 96; } + if ((n = obt_xml_find_node(node, "flashFrameDelay"))) + config_frame_flash_delay = obt_xml_node_int(n); + if ((n = obt_xml_find_node(node, "flashFrameDuration"))) + config_frame_flash_duration = obt_xml_node_int(n); n = obt_xml_find_node(node, "font"); while (n) { @@@ -942,9 -933,9 +945,9 @@@ static void parse_menu(xmlNodePtr node config_menu_manage_desktops = obt_xml_node_bool(n); if ((n = obt_xml_find_node(node, "showIcons"))) { config_menu_show_icons = obt_xml_node_bool(n); - #ifndef USE_IMLIB2 + #if !defined(USE_IMLIB2) && !defined(USE_LIBRSVG) if (config_menu_show_icons) - g_message(_("Openbox was compiled without Imlib2 image loading support. Icons in menus will not be loaded.")); + g_message(_("Openbox was compiled without image loading support. Icons in menus will not be loaded.")); #endif } @@@ -1069,6 -1060,7 +1072,7 @@@ void config_startup(ObtXmlInst *i obt_xml_register(i, "focus", parse_focus, NULL); config_place_policy = OB_PLACE_POLICY_SMART; + config_place_center = TRUE; config_place_monitor = OB_PLACE_MONITOR_PRIMARY; config_primary_monitor_index = 1; @@@ -1086,8 -1078,6 +1090,8 @@@ config_title_layout = g_strdup("NLIMC"); config_theme_keepborder = TRUE; config_theme_window_list_icon_size = 36; + config_frame_flash_delay = 600; + config_frame_flash_duration = 5000; config_font_activewindow = NULL; config_font_inactivewindow = NULL; diff --combined openbox/config.h index c09a1f4f,fc1d217e..75bbf841 --- a/openbox/config.h +++ b/openbox/config.h @@@ -51,7 -51,6 +51,6 @@@ struct _ObAppSetting gint width_denom; gint height_num; gint height_denom; - gboolean size_given; guint desktop; gint shade; @@@ -65,9 -64,8 +64,9 @@@ gint max_horz; gint max_vert; gint fullscreen; - gint layer; + + guint8 opacity; }; /*! Should new windows be focused */ @@@ -90,6 -88,8 +89,8 @@@ extern gboolean config_unfocus_leave /*! The algorithm to use for placing new windows */ extern ObPlacePolicy config_place_policy; + /*! Place windows in the center of the free area */ + extern gboolean config_place_center; /*! Place windows on the active monitor (unless they are part of an application already on another monitor) */ extern ObPlaceMonitor config_place_monitor; @@@ -152,10 -152,6 +153,10 @@@ extern gchar *config_title_layout extern gboolean config_animate_iconify; /*! Size of icons in focus switching dialogs */ extern guint config_theme_window_list_icon_size; +/*! Amount of time between flashes (0 to disable flashing) */ +extern guint config_frame_flash_delay; +/*! How long (ms) to flash the window's frame (0 to flash forever) */ +extern guint config_frame_flash_duration; /*! The font for the active window's title */ extern RrFont *config_font_activewindow; diff --combined openbox/frame.c index 0f2d56eb,3dbcf126..dfb9c49a --- a/openbox/frame.c +++ b/openbox/frame.c @@@ -387,11 -387,10 +387,10 @@@ void frame_adjust_area(ObFrame *self, g if (self->decorations & OB_FRAME_DECOR_TITLEBAR) self->size.top += ob_rr_theme->title_height + self->bwidth; else if (self->max_horz && self->max_vert) { - /* A maximized and undecorated window needs a small border on the + /* A maximized and undecorated window needs a border on the top of the window to let the user still undecorate/unmaximize the window via the client menu. */ - /* XXX This size should probably be a theme option. */ - self->size.top += 1; + self->size.top += self->bwidth; } if (self->decorations & OB_FRAME_DECOR_HANDLE && @@@ -1674,13 -1673,11 +1673,13 @@@ static gboolean flash_timeout(gpointer ObFrame *self = data; GTimeVal now; - g_get_current_time(&now); - if (now.tv_sec > self->flash_end.tv_sec || - (now.tv_sec == self->flash_end.tv_sec && - now.tv_usec >= self->flash_end.tv_usec)) - self->flashing = FALSE; + if (config_frame_flash_duration != 0) { + g_get_current_time(&now); + if (now.tv_sec > self->flash_end.tv_sec || + (now.tv_sec == self->flash_end.tv_sec && + now.tv_usec >= self->flash_end.tv_usec)) + self->flashing = FALSE; + } if (!self->flashing) return FALSE; /* we are done */ @@@ -1696,19 -1693,14 +1695,19 @@@ void frame_flash_start(ObFrame *self) { + if (config_frame_flash_delay == 0) return; + self->flash_on = self->focused; if (!self->flashing) self->flash_timer = g_timeout_add_full(G_PRIORITY_DEFAULT, - 600, flash_timeout, self, + config_frame_flash_delay, flash_timeout, self, flash_done); - g_get_current_time(&self->flash_end); - g_time_val_add(&self->flash_end, G_USEC_PER_SEC * 5); + + if (config_frame_flash_duration != 0) { + g_get_current_time(&self->flash_end); + g_time_val_add(&self->flash_end, 1000 * config_frame_flash_duration); + } self->flashing = TRUE; } diff --combined openbox/moveresize.c index ffed9093,333a1bea..a8965570 --- a/openbox/moveresize.c +++ b/openbox/moveresize.c @@@ -83,6 -83,8 +83,8 @@@ static void client_dest(ObClient *clien { if (moveresize_client == client) moveresize_end(TRUE); + if (popup && client == popup->client) + popup->client = NULL; } void moveresize_startup(gboolean reconfig) @@@ -167,6 -169,7 +169,7 @@@ static void popup_coords(ObClient *c, c popup_position(popup, gravity, x, y); } + popup->client = c; popup_show(popup, text); g_free(text); } @@@ -312,6 -315,7 +315,7 @@@ void moveresize_end(gboolean cancel ungrab_pointer(); popup_hide(popup); + popup->client = NULL; if (!moving) { #ifdef SYNC @@@ -582,19 -586,19 +586,19 @@@ static void edge_warp_move_ptr(void a = screen_physical_area_all_monitors(); switch (edge_warp_dir) { - case OB_DIRECTION_NORTH: - y = a->height - 2; - break; - case OB_DIRECTION_EAST: - x = a->x + 1; - break; - case OB_DIRECTION_SOUTH: - y = a->y + 1; - break; - case OB_DIRECTION_WEST: - x = a->width - 2; - break; - default: + case OB_DIRECTION_NORTH: - y = a->height - 1; ++ y = a->height - 2; + break; + case OB_DIRECTION_EAST: - x = a->x; ++ x = a->x + 1; + break; + case OB_DIRECTION_SOUTH: - y = a->y; ++ y = a->y + 1; + break; + case OB_DIRECTION_WEST: - x = a->width - 1; ++ x = a->width - 2; + break; + default: g_assert_not_reached(); }