From: Charles McGarvey Date: Fri, 26 Oct 2012 19:03:24 +0000 (-0600) Subject: Merge branch 'master' into chaz X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fopenbox;a=commitdiff_plain;h=9325c92056ff4268db2263cdf8c07bb529e158aa;hp=782b2864b1cc5ffab426dfb784a973576a98de18 Merge branch 'master' into chaz Conflicts: openbox/config.c --- diff --git a/configure.ac b/configure.ac index a1833090..dfdcf057 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,6 @@ AC_INIT([openbox], [3.5.0], [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) diff --git a/data/rc.xml b/data/rc.xml index 932521b7..ce1e8fc1 100644 --- a/data/rc.xml +++ b/data/rc.xml @@ -60,6 +60,8 @@ --> yes yes + 600 + 5000 sans 8 @@ -731,6 +733,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 --git a/data/rc.xsd b/data/rc.xsd index 425d53c9..0fd98ffb 100644 --- a/data/rc.xsd +++ b/data/rc.xsd @@ -91,6 +91,8 @@ + + @@ -253,6 +255,7 @@ + diff --git a/openbox/client.c b/openbox/client.c index b6cc4a87..1478d840 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -985,6 +985,9 @@ static ObAppSettings *client_get_settings_state(ObClient *self) self->desktop = settings->desktop - 1; } + if (settings->opacity != -1) + self->opacity = settings->opacity; + if (settings->layer == -1) { self->below = TRUE; self->above = FALSE; @@ -1043,6 +1046,8 @@ static void client_restore_session_state(ObClient *self) 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) @@ -2842,6 +2847,7 @@ static void client_apply_startup_state(ObClient *self, 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; @@ -2891,6 +2897,9 @@ static void client_apply_startup_state(ObClient *self, /* 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 @@ -3779,6 +3788,12 @@ void client_set_desktop(ObClient *self, guint target, 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 --git a/openbox/client.h b/openbox/client.h index d68d3035..a946f274 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -268,6 +268,8 @@ struct _ObClient 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 */ @@ -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); diff --git a/openbox/config.c b/openbox/config.c index 03fc96b3..c21b47d8 100644 --- a/openbox/config.c +++ b/openbox/config.c @@ -47,6 +47,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; @@ -121,6 +123,7 @@ ObAppSettings* config_create_app_settings(void) settings->fullscreen = -1; settings->max_horz = -1; settings->max_vert = -1; + settings->opacity = -1; return settings; } @@ -146,6 +149,7 @@ void config_app_settings_copy_non_defaults(const ObAppSettings *src, 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; @@ -343,6 +347,10 @@ static void parse_single_per_app_settings(xmlNodePtr app, 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. @@ -699,6 +707,10 @@ static void parse_theme(xmlNodePtr node, gpointer d) 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) { @@ -1074,6 +1086,8 @@ void config_startup(ObtXmlInst *i) 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 --git a/openbox/config.h b/openbox/config.h index 87662ab9..c09a1f4f 100644 --- a/openbox/config.h +++ b/openbox/config.h @@ -65,8 +65,9 @@ struct _ObAppSettings gint max_horz; gint max_vert; gint fullscreen; - gint layer; + + guint8 opacity; }; /*! Should new windows be focused */ @@ -151,6 +152,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 --git a/openbox/frame.c b/openbox/frame.c index 24d3eb53..0f2d56eb 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -1674,11 +1674,13 @@ static gboolean flash_timeout(gpointer data) 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 */ @@ -1694,14 +1696,19 @@ static gboolean flash_timeout(gpointer data) 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 --git a/openbox/moveresize.c b/openbox/moveresize.c index 1625ccf0..ffed9093 100644 --- a/openbox/moveresize.c +++ b/openbox/moveresize.c @@ -583,16 +583,16 @@ static void edge_warp_move_ptr(void) switch (edge_warp_dir) { 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(); diff --git a/openbox/session.c b/openbox/session.c index d6c6f767..1a81b90d 100644 --- a/openbox/session.c +++ b/openbox/session.c @@ -583,6 +583,7 @@ static gboolean session_save_to_file(const ObSMSaveData *savedata) fprintf(f, "\t%d\n", prey); fprintf(f, "\t%d\n", prew); fprintf(f, "\t%d\n", preh); + fprintf(f, "\t%d\n", c->opacity); if (c->shaded) fprintf(f, "\t\n"); if (c->iconic) @@ -763,6 +764,9 @@ static void session_load_file(const gchar *path) if (!(n = obt_xml_find_node(node->children, "height"))) goto session_load_bail; state->h = obt_xml_node_int(n); + if (!(n = obt_xml_find_node(node->children, "opacity"))) + goto session_load_bail; + state->opacity = obt_xml_node_int(n); state->shaded = obt_xml_find_node(node->children, "shaded") != NULL; diff --git a/openbox/session.h b/openbox/session.h index f37e2111..8cfcb8e7 100644 --- a/openbox/session.h +++ b/openbox/session.h @@ -34,6 +34,7 @@ struct _ObSessionState { gboolean shaded, iconic, skip_pager, skip_taskbar, fullscreen; gboolean above, below, max_horz, max_vert, undecorated; gboolean focused; + guint8 opacity; gboolean matched; };