summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2009-11-21 16:56:07 -0500
committerDana Jansens <danakj@orodu.net>2009-11-21 16:56:07 -0500
commit4bf6b1b551be744be4fbe4d1faab5be12d051378 (patch)
treea17c1404021df31757bc53fe35914182f389c1e1
parentc02c825cb8f18f0170b312ea8d4b3f4d491bff40 (diff)
parentada5de28f71efaa5584709673cc49cdb3b703299 (diff)
Merge branch 'backport' into work
Conflicts: openbox/popup.c
-rw-r--r--openbox/actions/moveresizeto.c18
-rw-r--r--openbox/client.c3
-rw-r--r--openbox/frame.c11
-rw-r--r--openbox/popup.c2
-rw-r--r--openbox/screen.c43
-rw-r--r--render/theme.c9
6 files changed, 56 insertions, 30 deletions
diff --git a/openbox/actions/moveresizeto.c b/openbox/actions/moveresizeto.c
index 1d9e52f1..fc171fcc 100644
--- a/openbox/actions/moveresizeto.c
+++ b/openbox/actions/moveresizeto.c
@@ -112,16 +112,24 @@ static gboolean run_func(ObActionsData *data, gpointer options)
if (data->client) {
Rect *area, *carea;
ObClient *c;
- gint mon, cmon;
+ guint mon, cmon;
gint x, y, lw, lh, w, h;
c = data->client;
mon = o->monitor;
cmon = client_monitor(c);
- if (mon == CURRENT_MONITOR) mon = cmon;
- else if (mon == ALL_MONITORS) mon = SCREEN_AREA_ALL_MONITORS;
- else if (mon == NEXT_MONITOR) mon = (cmon + 1 > screen_num_monitors - 1) ? 0 : (cmon + 1);
- else if (mon == PREV_MONITOR) mon = (cmon == 0) ? (screen_num_monitors - 1) : (cmon - 1);
+ switch (mon) {
+ case CURRENT_MONITOR:
+ mon = cmon; break;
+ case ALL_MONITORS:
+ mon = SCREEN_AREA_ALL_MONITORS; break;
+ case NEXT_MONITOR:
+ mon = (cmon + 1 > screen_num_monitors - 1) ? 0 : (cmon + 1); break;
+ case PREV_MONITOR:
+ mon = (cmon == 0) ? (screen_num_monitors - 1) : (cmon - 1); break;
+ default:
+ g_assert_not_reached();
+ }
area = screen_area(c->desktop, mon, NULL);
carea = screen_area(c->desktop, cmon, NULL);
diff --git a/openbox/client.c b/openbox/client.c
index 060499b0..fc087d44 100644
--- a/openbox/client.c
+++ b/openbox/client.c
@@ -1752,7 +1752,8 @@ void client_setup_decor_and_functions(ObClient *self, gboolean reconfig)
/* finally, the user can have requested no decorations, which overrides
everything (but doesnt give it a border if it doesnt have one) */
if (self->undecorated)
- self->decorations = 0;
+ self->decorations &= (config_theme_keepborder ?
+ OB_FRAME_DECOR_BORDER : 0);
/* if we don't have a titlebar, then we cannot shade! */
if (!(self->decorations & OB_FRAME_DECOR_TITLEBAR))
diff --git a/openbox/frame.c b/openbox/frame.c
index ab5a14a8..72eab32b 100644
--- a/openbox/frame.c
+++ b/openbox/frame.c
@@ -338,14 +338,14 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
self->max_vert = self->client->max_vert;
self->shaded = self->client->shaded;
- if (self->decorations & OB_FRAME_DECOR_BORDER ||
- (self->client->undecorated && config_theme_keepborder
- && !self->client->fullscreen))
+ if (self->decorations & OB_FRAME_DECOR_BORDER)
self->bwidth = ob_rr_theme->fbwidth;
else
self->bwidth = 0;
- if (self->decorations & OB_FRAME_DECOR_BORDER) {
+ if (self->decorations & OB_FRAME_DECOR_BORDER &&
+ !self->client->undecorated)
+ {
self->cbwidth_l = self->cbwidth_r = ob_rr_theme->cbwidthx;
self->cbwidth_t = self->cbwidth_b = ob_rr_theme->cbwidthy;
} else
@@ -369,8 +369,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
STRUT_SET(self->size,
self->cbwidth_l + (!self->max_horz ? self->bwidth : 0),
self->cbwidth_t +
- (!self->max_horz || !self->max_vert ||
- !self->client->undecorated ? self->bwidth : 0),
+ (!self->max_horz || !self->max_vert ? self->bwidth : 0),
self->cbwidth_r + (!self->max_horz ? self->bwidth : 0),
self->cbwidth_b +
(!self->max_horz || !self->max_vert ? self->bwidth : 0));
diff --git a/openbox/popup.c b/openbox/popup.c
index af1c511c..47d0d0fb 100644
--- a/openbox/popup.c
+++ b/openbox/popup.c
@@ -64,6 +64,8 @@ ObPopup *popup_new(void)
void popup_free(ObPopup *self)
{
if (self) {
+ popup_hide(self); /* make sure it's not showing or is being delayed and
+ will be shown */
XDestroyWindow(obt_display, self->bg);
XDestroyWindow(obt_display, self->text);
RrAppearanceFree(self->a_bg);
diff --git a/openbox/screen.c b/openbox/screen.c
index be9f8fb7..b53671fa 100644
--- a/openbox/screen.c
+++ b/openbox/screen.c
@@ -56,7 +56,7 @@ static void screen_tell_ksplash(void);
static void screen_fallback_focus(void);
guint screen_num_desktops;
-guint screen_num_monitors;
+guint screen_num_monitors = 0;
guint screen_desktop;
guint screen_last_desktop;
gboolean screen_showing_desktop;
@@ -76,7 +76,7 @@ static GSList *struts_left = NULL;
static GSList *struts_right = NULL;
static GSList *struts_bottom = NULL;
-static ObPagerPopup **desktop_popup;
+static ObPagerPopup **desktop_popup = NULL;
/*! The number of microseconds that you need to be on a desktop before it will
replace the remembered "last desktop" */
@@ -345,20 +345,19 @@ void screen_startup(gboolean reconfig)
if (reconfig) {
guint i;
+
+ /* recreate the pager popups to use any new theme stuff. it was
+ freed in screen_shutdown() already. */
desktop_popup = g_new(ObPagerPopup*, screen_num_monitors);
for (i = 0; i < screen_num_monitors; i++) {
desktop_popup[i] = pager_popup_new();
pager_popup_height(desktop_popup[i], POPUP_HEIGHT);
-
- /* update the pager popup's width */
pager_popup_text_width_to_strings(desktop_popup[i],
screen_desktop_names,
screen_num_desktops);
}
return;
- } else {
- desktop_popup = NULL;
}
/* get the initial size */
@@ -449,10 +448,10 @@ void screen_shutdown(gboolean reconfig)
{
guint i;
- for (i = 0; i < screen_num_monitors; i++) {
+ for (i = 0; i < screen_num_monitors; i++)
pager_popup_free(desktop_popup[i]);
- }
g_free(desktop_popup);
+ desktop_popup = NULL;
if (reconfig)
return;
@@ -498,6 +497,7 @@ void screen_resize(void)
screen_update_areas();
dock_configure();
+ /* make sure all windows are visible */
for (it = client_list; it; it = g_list_next(it))
client_move_onscreen(it->data, FALSE);
}
@@ -1372,22 +1372,32 @@ static void get_xinerama_screens(Rect **xin_areas, guint *nxin)
void screen_update_areas(void)
{
- guint i, j;
+ guint i, j, onum;
gulong *dims;
GList *it;
GSList *sit;
+ onum = screen_num_monitors;
+
g_free(monitor_area);
get_xinerama_screens(&monitor_area, &screen_num_monitors);
- if (!desktop_popup) {
- desktop_popup = g_new(ObPagerPopup*, screen_num_monitors);
- for (i = 0; i < screen_num_monitors; i++) {
+ if (screen_num_monitors < onum) {
+ /* free some of the pager popups */
+ for (i = screen_num_monitors; i < onum; ++i)
+ pager_popup_free(desktop_popup[i]);
+ desktop_popup = g_renew(ObPagerPopup*, desktop_popup,
+ screen_num_monitors);
+ }
+ else {
+ /* add some more pager popups */
+ desktop_popup = g_renew(ObPagerPopup*, desktop_popup,
+ screen_num_monitors);
+ for (i = onum; i < screen_num_monitors; ++i) {
desktop_popup[i] = pager_popup_new();
pager_popup_height(desktop_popup[i], POPUP_HEIGHT);
-
- if (screen_desktop_names)
- /* update the pager popup's width */
+ if (screen_desktop_names) /* the areas are initialized before the
+ desktop names */
pager_popup_text_width_to_strings(desktop_popup[i],
screen_desktop_names,
screen_num_desktops);
@@ -1491,6 +1501,9 @@ void screen_update_areas(void)
b = MAX(b, s->strut->bottom);
}
+ /* if the monitor is not against the edge of the root window,
+ the struts will include the distance from the root window's edge
+ to the monitor, so add that back into the monitor's work area */
if (l) l += RECT_LEFT (monitor_area[screen_num_monitors])
- RECT_LEFT (monitor_area[i]);
if (t) t += RECT_TOP (monitor_area[screen_num_monitors])
diff --git a/render/theme.c b/render/theme.c
index 8ead9673..399bd2c5 100644
--- a/render/theme.c
+++ b/render/theme.c
@@ -46,7 +46,8 @@ static int parse_inline_number(const char *p);
static RrPixel32* read_c_image(gint width, gint height, const guint8 *data);
static void set_default_appearance(RrAppearance *a);
-static RrFont *get_font(RrFont *target, RrFont **default_font, const RrInstance *inst)
+static RrFont *get_font(RrFont *target, RrFont **default_font,
+ const RrInstance *inst)
{
if (target) {
RrFontRef(target);
@@ -147,8 +148,10 @@ RrTheme* RrThemeNew(const RrInstance *inst, const gchar *name,
theme->osd_unhilite_fg = RrAppearanceNew(inst, 0);
/* load the font stuff */
- theme->win_font_focused = get_font(active_window_font, &default_font, inst);
- theme->win_font_unfocused = get_font(inactive_window_font, &default_font, inst);
+ theme->win_font_focused = get_font(active_window_font,
+ &default_font, inst);
+ theme->win_font_unfocused = get_font(inactive_window_font,
+ &default_font, inst);
winjust = RR_JUSTIFY_LEFT;
if (read_string(db, "window.label.text.justify", &str)) {