X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=914b3ae35845a8ac5c9c3b93dcb8e8fc09d82a7d;hb=HEAD;hp=cd93ba590111a56a32ea5de9e5ed423b97f8d9a2;hpb=6eb740cf119b14903afa3028e108dd98c57ff926;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index cd93ba59..914b3ae3 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -218,7 +218,7 @@ void client_manage(Window window, ObPrompt *prompt) Time launch_time; guint32 user_time; gboolean obplaced; - gulong ignore_start; + gulong ignore_start = FALSE; ob_debug("Managing window: 0x%lx", window); @@ -370,8 +370,7 @@ void client_manage(Window window, ObPrompt *prompt) "program + user specified" : "BADNESS !?")))), place.width, place.height); - obplaced = place_client(self, do_activate, &place.x, &place.y, - settings); + obplaced = place_client(self, do_activate, &place, settings); /* watch for buggy apps that ask to be placed at (0,0) when there is a strut there */ @@ -986,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; @@ -1044,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) @@ -1224,13 +1228,15 @@ static void client_get_all(ObClient *self, gboolean real) from per-app settings */ client_get_session_ids(self); - /* now we got everything that can affect the decorations */ + /* get this early so we have it for debugging, also this can be used + by app rule matching */ + client_update_title(self); + + /* now we got everything that can affect the decorations or app rule + matching */ if (!real) return; - /* get this early so we have it for debugging */ - client_update_title(self); - /* save the values of the variables used for app rule matching */ client_save_app_rule_values(self); @@ -2457,20 +2463,10 @@ static void client_get_session_ids(ObClient *self) } } -/*! 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; @@ -2489,7 +2485,23 @@ static void client_save_app_rule_values(ObClient *self) 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) @@ -2841,6 +2853,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; @@ -2890,6 +2903,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 @@ -3778,6 +3794,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)));