AC_CONFIG_SRCDIR([openbox/openbox.c])
AM_INIT_AUTOMAKE([foreign])
-AM_SILENT_RULES([yes])
OB_VERSION=$PACKAGE_VERSION
AC_SUBST(OB_VERSION)
-->
<keepBorder>yes</keepBorder>
<animateIconify>yes</animateIconify>
+ <flashFrameDelay>600</flashFrameDelay>
+ <flashFrameDuration>5000</flashFrameDuration>
<font place="ActiveWindow">
<name>sans</name>
<size>8</size>
<maximized>true</maximized>
# 'Horizontal', 'Vertical' or boolean (yes/no)
+
+ <opacity>255</opacity>
+ # make the window semi-transparent
+ # value between 0 and 255, inclusive; 0 invisible, 255 fully opaque
</application>
# end of the example
<xsd:element minOccurs="0" name="titleLayout" type="xsd:string"/>
<xsd:element minOccurs="0" name="keepBorder" type="ob:bool"/>
<xsd:element minOccurs="0" name="animateIconify" type="ob:bool"/>
+ <xsd:element minOccurs="0" name="flashFrameDelay" type="ob:integer"/>
+ <xsd:element minOccurs="0" name="flashFrameDuration" type="ob:integer"/>
<xsd:element minOccurs="0" maxOccurs="unbounded" name="font" type="ob:font"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element minOccurs="0" name="skip_taskbar" type="ob:bool"/>
<xsd:element minOccurs="0" name="fullscreen" type="ob:bool"/>
<xsd:element minOccurs="0" name="maximized" type="ob:maximization"/>
+ <xsd:element minOccurs="0" name="opacity" type="xsd:unsignedByte"/>
</xsd:all>
<!-- at least one of these must be present -->
<xsd:attribute name="role" type="xsd:string"/>
self->desktop = settings->desktop - 1;
}
+ if (settings->opacity != -1)
+ self->opacity = settings->opacity;
+
if (settings->layer == -1) {
self->below = TRUE;
self->above = FALSE;
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)
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;
/* 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
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)));
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 */
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);
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;
settings->fullscreen = -1;
settings->max_horz = -1;
settings->max_vert = -1;
+ settings->opacity = -1;
return settings;
}
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;
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.
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) {
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;
gint max_horz;
gint max_vert;
gint fullscreen;
-
gint layer;
+
+ guint8 opacity;
};
/*! Should new windows be focused */
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;
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 */
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;
}
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();
fprintf(f, "\t<y>%d</y>\n", prey);
fprintf(f, "\t<width>%d</width>\n", prew);
fprintf(f, "\t<height>%d</height>\n", preh);
+ fprintf(f, "\t<opacity>%d</opacity>\n", c->opacity);
if (c->shaded)
fprintf(f, "\t<shaded />\n");
if (c->iconic)
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;
gboolean shaded, iconic, skip_pager, skip_taskbar, fullscreen;
gboolean above, below, max_horz, max_vert, undecorated;
gboolean focused;
+ guint8 opacity;
gboolean matched;
};