add disabled buttons, instead of now showing buttons at all when they wont do anything, now show a disabled button instead. this severely breaks compatibility with blackbox themes since there is no good way to automiatically create a disabled button that i can think of, so if they dont exist in the theme you get black and white for the button.

when a window cant be resized, its handle is not removed but its grips are.

change allowing the user to disable individual decorations as that is overkill,
instead allow a toggle through the client.decorate boolean.
This commit is contained in:
Dana Jansens 2003-07-10 23:27:02 +00:00
parent b0e8e276e4
commit 81af5a8b0c
11 changed files with 313 additions and 196 deletions

View file

@ -1105,7 +1105,7 @@ void action_toggle_decorations(union ActionData *data)
if (!c) return;
c->disabled_decorations = c->disabled_decorations ? 0 : ~0;
c->decorate = !c->decorate;
client_setup_decor_and_functions(c);
}

View file

@ -544,7 +544,7 @@ static void client_get_all(ObClient *self)
self->layer = -1;
self->urgent = FALSE;
self->positioned = FALSE;
self->disabled_decorations = 0;
self->decorate = TRUE;
self->group = NULL;
self->nicons = 0;
@ -914,22 +914,28 @@ void client_update_normal_hints(ObClient *self)
void client_setup_decor_and_functions(ObClient *self)
{
/* start with everything (cept fullscreen) */
self->decorations = Decor_Titlebar | Decor_Handle | Decor_Border |
Decor_Icon | Decor_AllDesktops | Decor_Iconify | Decor_Maximize |
Decor_Shade;
self->functions = OB_CLIENT_FUNC_RESIZE | OB_CLIENT_FUNC_MOVE |
OB_CLIENT_FUNC_ICONIFY | OB_CLIENT_FUNC_MAXIMIZE |
OB_CLIENT_FUNC_SHADE;
self->decorations = (OB_FRAME_DECOR_TITLEBAR |
OB_FRAME_DECOR_HANDLE |
OB_FRAME_DECOR_GRIPS |
OB_FRAME_DECOR_BORDER |
OB_FRAME_DECOR_ICON |
OB_FRAME_DECOR_ALLDESKTOPS |
OB_FRAME_DECOR_ICONIFY |
OB_FRAME_DECOR_MAXIMIZE |
OB_FRAME_DECOR_SHADE);
self->functions = (OB_CLIENT_FUNC_RESIZE |
OB_CLIENT_FUNC_MOVE |
OB_CLIENT_FUNC_ICONIFY |
OB_CLIENT_FUNC_MAXIMIZE |
OB_CLIENT_FUNC_SHADE);
if (self->delete_window) {
self->decorations |= Decor_Close;
self->functions |= OB_CLIENT_FUNC_CLOSE;
self->decorations |= OB_FRAME_DECOR_CLOSE;
}
if (!(self->min_size.width < self->max_size.width ||
self->min_size.height < self->max_size.height)) {
self->decorations &= ~(Decor_Maximize | Decor_Handle);
self->min_size.height < self->max_size.height))
self->functions &= ~OB_CLIENT_FUNC_RESIZE;
}
switch (self->type) {
case OB_CLIENT_TYPE_NORMAL:
@ -941,14 +947,12 @@ void client_setup_decor_and_functions(ObClient *self)
case OB_CLIENT_TYPE_DIALOG:
case OB_CLIENT_TYPE_UTILITY:
/* these windows cannot be maximized */
self->decorations &= ~Decor_Maximize;
self->functions &= ~OB_CLIENT_FUNC_MAXIMIZE;
break;
case OB_CLIENT_TYPE_MENU:
case OB_CLIENT_TYPE_TOOLBAR:
/* these windows get less functionality */
self->decorations &= ~(Decor_Iconify | Decor_Handle);
self->functions &= ~(OB_CLIENT_FUNC_ICONIFY | OB_CLIENT_FUNC_RESIZE);
break;
@ -965,16 +969,11 @@ void client_setup_decor_and_functions(ObClient *self)
decor and functionality */
if (self->mwmhints.flags & OB_MWM_FLAG_DECORATIONS) {
if (! (self->mwmhints.decorations & OB_MWM_DECOR_ALL)) {
if (! (self->mwmhints.decorations & OB_MWM_DECOR_BORDER))
self->decorations &= ~Decor_Border;
if (! (self->mwmhints.decorations & OB_MWM_DECOR_HANDLE))
self->decorations &= ~Decor_Handle;
if (! (self->mwmhints.decorations & OB_MWM_DECOR_TITLE))
self->decorations &= ~Decor_Titlebar;
if (! (self->mwmhints.decorations & OB_MWM_DECOR_ICONIFY))
self->decorations &= ~Decor_Iconify;
if (! (self->mwmhints.decorations & OB_MWM_DECOR_MAXIMIZE))
self->decorations &= ~Decor_Maximize;
if (! ((self->mwmhints.decorations & OB_MWM_DECOR_HANDLE) ||
(self->mwmhints.decorations & OB_MWM_DECOR_TITLE)))
/* if the mwm hints request no handle or title, then all
decorations are disabled */
self->decorations = 0;
}
}
@ -984,43 +983,40 @@ void client_setup_decor_and_functions(ObClient *self)
self->functions &= ~OB_CLIENT_FUNC_RESIZE;
if (! (self->mwmhints.functions & OB_MWM_FUNC_MOVE))
self->functions &= ~OB_CLIENT_FUNC_MOVE;
/* dont let mwm hints kill any buttons
if (! (self->mwmhints.functions & OB_MWM_FUNC_ICONIFY))
self->functions &= ~OB_CLIENT_FUNC_ICONIFY;
if (! (self->mwmhints.functions & OB_MWM_FUNC_MAXIMIZE))
self->functions &= ~OB_CLIENT_FUNC_MAXIMIZE;
*/
/* dont let mwm hints kill the close button
if (! (self->mwmhints.functions & MwmFunc_Close))
self->functions &= ~Func_Close; */
self->functions &= ~OB_CLIENT_FUNC_CLOSE; */
}
}
/* can't maximize without moving/resizing */
if (!((self->functions & OB_CLIENT_FUNC_MOVE) &&
(self->functions & OB_CLIENT_FUNC_RESIZE)))
self->functions &= ~(OB_CLIENT_FUNC_MAXIMIZE |
OB_CLIENT_FUNC_FULLSCREEN);
if (!(self->functions & OB_CLIENT_FUNC_SHADE))
self->decorations &= ~OB_FRAME_DECOR_SHADE;
if (!(self->functions & OB_CLIENT_FUNC_ICONIFY))
self->decorations &= ~OB_FRAME_DECOR_ICONIFY;
if (!(self->functions & OB_CLIENT_FUNC_RESIZE))
self->decorations &= ~OB_FRAME_DECOR_GRIPS;
/* finally, user specified disabled decorations are applied to subtract
decorations */
if (self->disabled_decorations & Decor_Titlebar)
self->decorations &= ~Decor_Titlebar;
if (self->disabled_decorations & Decor_Handle)
self->decorations &= ~Decor_Handle;
if (self->disabled_decorations & Decor_Border)
self->decorations &= ~Decor_Border;
if (self->disabled_decorations & Decor_Iconify)
self->decorations &= ~Decor_Iconify;
if (self->disabled_decorations & Decor_Maximize)
self->decorations &= ~Decor_Maximize;
if (self->disabled_decorations & Decor_AllDesktops)
self->decorations &= ~Decor_AllDesktops;
if (self->disabled_decorations & Decor_Shade)
self->decorations &= ~Decor_Shade;
if (self->disabled_decorations & Decor_Close)
self->decorations &= ~Decor_Close;
/* can't maximize without moving/resizing */
if (!((self->functions & OB_CLIENT_FUNC_MAXIMIZE) &&
(self->functions & OB_CLIENT_FUNC_MOVE) &&
(self->functions & OB_CLIENT_FUNC_RESIZE))) {
self->functions &= ~OB_CLIENT_FUNC_MAXIMIZE;
self->decorations &= ~OB_FRAME_DECOR_MAXIMIZE;
}
/* finally, the user can have requested no decorations, which overrides
everything */
if (!self->decorate)
self->decorations = 0;
/* if we don't have a titlebar, then we cannot shade! */
if (!(self->decorations & Decor_Titlebar))
if (!(self->decorations & OB_FRAME_DECOR_TITLEBAR))
self->functions &= ~OB_CLIENT_FUNC_SHADE;
/* now we need to check against rules for the client's current state */

View file

@ -53,21 +53,6 @@ typedef enum
OB_CLIENT_FUNC_CLOSE = 1 << 6 /*!< Allow to be closed */
} ObFunctions;
/*! The decorations the client window wants to be displayed on it */
typedef enum {
Decor_Titlebar = 1 << 0, /*!< Display a titlebar */
Decor_Handle = 1 << 1, /*!< Display a handle (bottom) */
Decor_Border = 1 << 2, /*!< Display a border */
Decor_Icon = 1 << 3, /*!< Display the window's icon */
Decor_Iconify = 1 << 4, /*!< Display an iconify button */
Decor_Maximize = 1 << 5, /*!< Display a maximize button */
/*! Display a button to toggle the window's placement on
all desktops */
Decor_AllDesktops = 1 << 6,
Decor_Shade = 1 << 7, /*!< Displays a shade button */
Decor_Close = 1 << 8 /*!< Display a close button */
} Decoration;
struct _ObClient
{
ObWindow obwin;
@ -225,16 +210,16 @@ struct _ObClient
are always below windows in higher layers. */
ObStackingLayer layer;
/*! A bitmask of values in the Decoration enum
/*! A bitmask of values in the ObFrameDecorations enum
The values in the variable are the decorations that the client wants to
be displayed around it.
*/
guint decorations;
/*! A bitmask of values in the Decoration enum.
Specifies the decorations that should NOT be displayed on the client.
/*! A user option. When this is set to FALSE the client will not ever
be decorated.
*/
guint disabled_decorations;
gboolean decorate;
/*! A bitmask of values in the ObFunctions enum
The values in the variable specify the ways in which the user is allowed

View file

@ -16,14 +16,6 @@
static void layout_title(ObFrame *self);
void frame_startup()
{
}
void frame_shutdown()
{
}
static Window createWindow(Window parent, unsigned long mask,
XSetWindowAttributes *attrib)
{
@ -171,7 +163,7 @@ void frame_adjust_shape(ObFrame *self)
ShapeBounding, ShapeSet);
num = 0;
if (self->decorations & Decor_Titlebar) {
if (self->decorations & OB_FRAME_DECOR_TITLEBAR) {
xrect[0].x = -ob_rr_theme->bevel;
xrect[0].y = -ob_rr_theme->bevel;
xrect[0].width = self->width + self->bwidth * 2;
@ -180,7 +172,7 @@ void frame_adjust_shape(ObFrame *self)
++num;
}
if (self->decorations & Decor_Handle) {
if (self->decorations & OB_FRAME_DECOR_HANDLE) {
xrect[1].x = -ob_rr_theme->bevel;
xrect[1].y = FRAME_HANDLE_Y(self);
xrect[1].width = self->width + self->bwidth * 2;
@ -200,7 +192,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, gboolean resized)
{
if (resized) {
self->decorations = self->client->decorations;
if (self->decorations & Decor_Border) {
if (self->decorations & OB_FRAME_DECOR_BORDER) {
self->bwidth = ob_rr_theme->bwidth;
self->cbwidth = ob_rr_theme->cbwidth;
} else {
@ -230,7 +222,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, gboolean resized)
self->max_x = -1;
self->close_x = -1;
if (self->decorations & Decor_Titlebar) {
if (self->decorations & OB_FRAME_DECOR_TITLEBAR) {
XMoveResizeWindow(ob_display, self->title,
-self->bwidth, -self->bwidth,
self->width, ob_rr_theme->title_height);
@ -242,19 +234,27 @@ void frame_adjust_area(ObFrame *self, gboolean moved, gboolean resized)
} else
XUnmapWindow(ob_display, self->title);
if (self->decorations & Decor_Handle) {
if (self->decorations & OB_FRAME_DECOR_HANDLE) {
XMoveResizeWindow(ob_display, self->handle,
-self->bwidth, FRAME_HANDLE_Y(self),
self->width, ob_rr_theme->handle_height);
XMoveWindow(ob_display, self->lgrip,
-self->bwidth, -self->bwidth);
XMoveWindow(ob_display, self->rgrip,
-self->bwidth + self->width -
ob_rr_theme->grip_width, -self->bwidth);
self->innersize.bottom += ob_rr_theme->handle_height +
self->bwidth;
XMapWindow(ob_display, self->handle);
if (self->decorations & OB_FRAME_DECOR_GRIPS) {
XMoveWindow(ob_display, self->lgrip,
-self->bwidth, -self->bwidth);
XMoveWindow(ob_display, self->rgrip,
-self->bwidth + self->width -
ob_rr_theme->grip_width, -self->bwidth);
XMapWindow(ob_display, self->lgrip);
XMapWindow(ob_display, self->rgrip);
} else {
XUnmapWindow(ob_display, self->lgrip);
XUnmapWindow(ob_display, self->rgrip);
}
/* XXX make a subwindow with these dimentions?
ob_rr_theme->grip_width + self->bwidth, 0,
self->width - (ob_rr_theme->grip_width + self->bwidth) * 2,
@ -433,28 +433,24 @@ static void layout_title(ObFrame *self)
for (lc = ob_rr_theme->title_layout; *lc != '\0'; ++lc) {
switch (*lc) {
case 'N':
if (!(self->decorations & Decor_Icon)) break;
if (n) { *lc = ' '; break; } /* rm duplicates */
n = TRUE;
self->label_width -= (ob_rr_theme->button_size + 2 +
ob_rr_theme->bevel + 1);
break;
case 'D':
if (!(self->decorations & Decor_AllDesktops)) break;
if (d) { *lc = ' '; break; } /* rm duplicates */
d = TRUE;
self->label_width -= (ob_rr_theme->button_size +
ob_rr_theme->bevel + 1);
break;
case 'S':
if (!(self->decorations & Decor_Shade)) break;
if (s) { *lc = ' '; break; } /* rm duplicates */
s = TRUE;
self->label_width -= (ob_rr_theme->button_size +
ob_rr_theme->bevel + 1);
break;
case 'I':
if (!(self->decorations & Decor_Iconify)) break;
if (i) { *lc = ' '; break; } /* rm duplicates */
i = TRUE;
self->label_width -= (ob_rr_theme->button_size +
@ -465,14 +461,12 @@ static void layout_title(ObFrame *self)
l = TRUE;
break;
case 'M':
if (!(self->decorations & Decor_Maximize)) break;
if (m) { *lc = ' '; break; } /* rm duplicates */
m = TRUE;
self->label_width -= (ob_rr_theme->button_size +
ob_rr_theme->bevel + 1);
break;
case 'C':
if (!(self->decorations & Decor_Close)) break;
if (c) { *lc = ' '; break; } /* rm duplicates */
c = TRUE;
self->label_width -= (ob_rr_theme->button_size +

View file

@ -26,6 +26,22 @@ typedef enum {
OB_FRAME_NUM_CONTEXTS
} ObFrameContext;
/*! The decorations the client window wants to be displayed on it */
typedef enum {
OB_FRAME_DECOR_TITLEBAR = 1 << 0, /*!< Display a titlebar */
OB_FRAME_DECOR_HANDLE = 1 << 1, /*!< Display a handle (bottom) */
OB_FRAME_DECOR_GRIPS = 1 << 2, /*!< Display grips in the handle */
OB_FRAME_DECOR_BORDER = 1 << 3, /*!< Display a border */
OB_FRAME_DECOR_ICON = 1 << 4, /*!< Display the window's icon */
OB_FRAME_DECOR_ICONIFY = 1 << 5, /*!< Display an iconify button */
OB_FRAME_DECOR_MAXIMIZE = 1 << 6, /*!< Display a maximize button */
/*! Display a button to toggle the window's placement on
all desktops */
OB_FRAME_DECOR_ALLDESKTOPS = 1 << 7,
OB_FRAME_DECOR_SHADE = 1 << 8, /*!< Displays a shade button */
OB_FRAME_DECOR_CLOSE = 1 << 9 /*!< Display a close button */
} ObFrameDecorations;
struct _ObFrame
{
struct _ObClient *client;
@ -83,9 +99,6 @@ struct _ObFrame
gboolean focused;
};
void frame_startup();
void frame_shutdown();
ObFrame *frame_new();
void frame_show(ObFrame *self);
void frame_hide(ObFrame *self);

View file

@ -22,61 +22,81 @@ void framerender_frame(ObFrame *self)
XSetWindowBorder(ob_display, self->plate,
RrColorPixel(ob_rr_theme->cb_unfocused_color));
if (self->client->decorations & Decor_Titlebar) {
if (self->decorations & OB_FRAME_DECOR_TITLEBAR) {
RrAppearance *t, *l, *m, *n, *i, *d, *s, *c;
t = (self->focused ?
self->a_focused_title : self->a_unfocused_title);
l = (self->focused ?
self->a_focused_label : self->a_unfocused_label);
m = (self->focused ?
(self->client->max_vert || self->client->max_horz ?
ob_rr_theme->a_focused_pressed_set_max :
(self->max_press ?
ob_rr_theme->a_focused_pressed_max :
ob_rr_theme->a_focused_unpressed_max)) :
(self->client->max_vert || self->client->max_horz ?
ob_rr_theme->a_unfocused_pressed_set_max :
(self->max_press ?
ob_rr_theme->a_unfocused_pressed_max :
ob_rr_theme->a_unfocused_unpressed_max)));
m = (!(self->decorations & OB_FRAME_DECOR_MAXIMIZE) ?
(self->focused ?
ob_rr_theme->a_disabled_focused_max :
ob_rr_theme->a_disabled_unfocused_max) :
(self->focused ?
(self->client->max_vert || self->client->max_horz ?
ob_rr_theme->a_focused_pressed_set_max :
(self->max_press ?
ob_rr_theme->a_focused_pressed_max :
ob_rr_theme->a_focused_unpressed_max)) :
(self->client->max_vert || self->client->max_horz ?
ob_rr_theme->a_unfocused_pressed_set_max :
(self->max_press ?
ob_rr_theme->a_unfocused_pressed_max :
ob_rr_theme->a_unfocused_unpressed_max))));
n = self->a_icon;
i = (self->focused ?
(self->iconify_press ?
ob_rr_theme->a_focused_pressed_iconify :
ob_rr_theme->a_focused_unpressed_iconify) :
(self->iconify_press ?
ob_rr_theme->a_unfocused_pressed_iconify :
ob_rr_theme->a_unfocused_unpressed_iconify));
d = (self->focused ?
(self->client->desktop == DESKTOP_ALL ?
ob_rr_theme->a_focused_pressed_set_desk :
(self->desk_press ?
ob_rr_theme->a_focused_pressed_desk :
ob_rr_theme->a_focused_unpressed_desk)) :
(self->client->desktop == DESKTOP_ALL ?
ob_rr_theme->a_unfocused_pressed_set_desk :
(self->desk_press ?
ob_rr_theme->a_unfocused_pressed_desk :
ob_rr_theme->a_unfocused_unpressed_desk)));
s = (self->focused ?
(self->client->shaded ?
ob_rr_theme->a_focused_pressed_set_shade :
(self->shade_press ?
ob_rr_theme->a_focused_pressed_shade :
ob_rr_theme->a_focused_unpressed_shade)) :
(self->client->shaded ?
ob_rr_theme->a_unfocused_pressed_set_shade :
(self->shade_press ?
ob_rr_theme->a_unfocused_pressed_shade :
ob_rr_theme->a_unfocused_unpressed_shade)));
c = (self->focused ?
(self->close_press ?
ob_rr_theme->a_focused_pressed_close :
ob_rr_theme->a_focused_unpressed_close) :
(self->close_press ?
ob_rr_theme->a_unfocused_pressed_close :
ob_rr_theme->a_unfocused_unpressed_close));
i = (!(self->decorations & OB_FRAME_DECOR_ICONIFY) ?
(self->focused ?
ob_rr_theme->a_disabled_focused_iconify :
ob_rr_theme->a_disabled_unfocused_iconify) :
(self->focused ?
(self->iconify_press ?
ob_rr_theme->a_focused_pressed_iconify :
ob_rr_theme->a_focused_unpressed_iconify) :
(self->iconify_press ?
ob_rr_theme->a_unfocused_pressed_iconify :
ob_rr_theme->a_unfocused_unpressed_iconify)));
d = (!(self->decorations & OB_FRAME_DECOR_ALLDESKTOPS) ?
(self->focused ?
ob_rr_theme->a_disabled_focused_desk :
ob_rr_theme->a_disabled_unfocused_desk) :
(self->focused ?
(self->client->desktop == DESKTOP_ALL ?
ob_rr_theme->a_focused_pressed_set_desk :
(self->desk_press ?
ob_rr_theme->a_focused_pressed_desk :
ob_rr_theme->a_focused_unpressed_desk)) :
(self->client->desktop == DESKTOP_ALL ?
ob_rr_theme->a_unfocused_pressed_set_desk :
(self->desk_press ?
ob_rr_theme->a_unfocused_pressed_desk :
ob_rr_theme->a_unfocused_unpressed_desk))));
s = (!(self->decorations & OB_FRAME_DECOR_SHADE) ?
(self->focused ?
ob_rr_theme->a_disabled_focused_shade :
ob_rr_theme->a_disabled_unfocused_shade) :
(self->focused ?
(self->client->shaded ?
ob_rr_theme->a_focused_pressed_set_shade :
(self->shade_press ?
ob_rr_theme->a_focused_pressed_shade :
ob_rr_theme->a_focused_unpressed_shade)) :
(self->client->shaded ?
ob_rr_theme->a_unfocused_pressed_set_shade :
(self->shade_press ?
ob_rr_theme->a_unfocused_pressed_shade :
ob_rr_theme->a_unfocused_unpressed_shade))));
c = (!(self->decorations & OB_FRAME_DECOR_CLOSE) ?
(self->focused ?
ob_rr_theme->a_disabled_focused_close :
ob_rr_theme->a_disabled_unfocused_close) :
(self->focused ?
(self->close_press ?
ob_rr_theme->a_focused_pressed_close :
ob_rr_theme->a_focused_unpressed_close) :
(self->close_press ?
ob_rr_theme->a_unfocused_pressed_close :
ob_rr_theme->a_unfocused_unpressed_close)));
RrPaint(t, self->title, self->width, ob_rr_theme->title_height);
@ -118,7 +138,7 @@ void framerender_frame(ObFrame *self)
framerender_close(self, c);
}
if (self->client->decorations & Decor_Handle) {
if (self->decorations & OB_FRAME_DECOR_HANDLE) {
RrAppearance *h, *g;
h = (self->focused ?
@ -126,23 +146,25 @@ void framerender_frame(ObFrame *self)
RrPaint(h, self->handle, self->width, ob_rr_theme->handle_height);
g = (self->focused ?
ob_rr_theme->a_focused_grip : ob_rr_theme->a_unfocused_grip);
if (self->decorations & OB_FRAME_DECOR_GRIPS) {
g = (self->focused ?
ob_rr_theme->a_focused_grip : ob_rr_theme->a_unfocused_grip);
if (g->surface.grad == RR_SURFACE_PARENTREL)
g->surface.parent = h;
if (g->surface.grad == RR_SURFACE_PARENTREL)
g->surface.parent = h;
g->surface.parentx = 0;
g->surface.parenty = 0;
g->surface.parentx = 0;
g->surface.parenty = 0;
RrPaint(g, self->lgrip,
ob_rr_theme->grip_width, ob_rr_theme->handle_height);
RrPaint(g, self->lgrip,
ob_rr_theme->grip_width, ob_rr_theme->handle_height);
g->surface.parentx = self->width - ob_rr_theme->grip_width;
g->surface.parenty = 0;
g->surface.parentx = self->width - ob_rr_theme->grip_width;
g->surface.parenty = 0;
RrPaint(g, self->rgrip,
ob_rr_theme->grip_width, ob_rr_theme->handle_height);
RrPaint(g, self->rgrip,
ob_rr_theme->grip_width, ob_rr_theme->handle_height);
}
}
}

View file

@ -243,7 +243,6 @@ int main(int argc, char **argv)
if (ob_rr_theme == NULL)
exit_with_error("Unable to load a theme.");
frame_startup();
moveresize_startup();
screen_startup();
group_startup();
@ -271,7 +270,6 @@ int main(int argc, char **argv)
screen_shutdown();
focus_shutdown();
moveresize_shutdown();
frame_shutdown();
menu_shutdown();
window_shutdown();
grab_shutdown();

View file

@ -31,44 +31,14 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name)
theme->inst = inst;
theme->b_color = theme->cb_unfocused_color = theme->cb_focused_color =
theme->title_unfocused_color = theme->title_focused_color =
theme->titlebut_unfocused_color = theme->titlebut_focused_color =
theme->menu_color = theme->menu_title_color =
theme->menu_disabled_color = theme->menu_hilite_color = NULL;
theme->winfont = theme->mtitlefont = theme->mfont = NULL;
theme->title_layout = NULL;
theme->max_set_mask = theme->max_unset_mask = NULL;
theme->desk_set_mask = theme->desk_unset_mask = NULL;
theme->shade_set_mask = theme->shade_unset_mask = NULL;
theme->iconify_mask = theme->close_mask = NULL;
theme->a_disabled_focused_max = RrAppearanceNew(inst, 1);
theme->a_disabled_unfocused_max = RrAppearanceNew(inst, 1);
theme->a_focused_unpressed_max = RrAppearanceNew(inst, 1);
theme->a_focused_pressed_max = RrAppearanceNew(inst, 1);
theme->a_focused_pressed_set_max = RrAppearanceNew(inst, 1);
theme->a_unfocused_unpressed_max = RrAppearanceNew(inst, 1);
theme->a_unfocused_pressed_max = RrAppearanceNew(inst, 1);
theme->a_unfocused_pressed_set_max = RrAppearanceNew(inst, 1);
theme->a_focused_unpressed_close = NULL;
theme->a_focused_pressed_close = NULL;
theme->a_unfocused_unpressed_close = NULL;
theme->a_unfocused_pressed_close = NULL;
theme->a_focused_unpressed_desk = NULL;
theme->a_focused_pressed_desk = NULL;
theme->a_focused_pressed_set_desk = NULL;
theme->a_unfocused_unpressed_desk = NULL;
theme->a_unfocused_pressed_desk = NULL;
theme->a_unfocused_pressed_set_desk = NULL;
theme->a_focused_unpressed_shade = NULL;
theme->a_focused_pressed_shade = NULL;
theme->a_focused_pressed_set_shade = NULL;
theme->a_unfocused_unpressed_shade = NULL;
theme->a_unfocused_pressed_shade = NULL;
theme->a_unfocused_pressed_set_shade = NULL;
theme->a_focused_unpressed_iconify = NULL;
theme->a_focused_pressed_iconify = NULL;
theme->a_unfocused_unpressed_iconify = NULL;
theme->a_unfocused_pressed_iconify = NULL;
theme->a_focused_grip = RrAppearanceNew(inst, 0);
theme->a_unfocused_grip = RrAppearanceNew(inst, 0);
theme->a_focused_title = RrAppearanceNew(inst, 0);
@ -194,6 +164,15 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name)
"window.label.unfocus.textColor",
&theme->title_unfocused_color))
theme->title_unfocused_color = RrColorNew(inst, 0xff, 0xff, 0xff);
if (!read_color(db, inst,
"window.button.disabled.focus.picColor",
&theme->titlebut_disabled_focused_color))
theme->titlebut_disabled_focused_color =
RrColorNew(inst, 0xff, 0xff, 0xff);
if (!read_color(db, inst,
"window.button.disabled.unfocus.picColor",
&theme->titlebut_disabled_unfocused_color))
theme->titlebut_disabled_unfocused_color = RrColorNew(inst, 0, 0, 0);
if (!read_color(db, inst,
"window.button.focus.picColor",
&theme->titlebut_focused_color))
@ -322,6 +301,14 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name)
set_default_appearance(theme->app_unhilite_label);
/* read buttons textures */
if (!read_appearance(db, inst,
"window.button.disabled.focus",
theme->a_disabled_focused_max))
set_default_appearance(theme->a_disabled_focused_max);
if (!read_appearance(db, inst,
"window.button.disabled.unfocus",
theme->a_disabled_unfocused_max))
set_default_appearance(theme->a_disabled_unfocused_max);
if (!read_appearance(db, inst,
"window.button.pressed.focus",
theme->a_focused_pressed_max))
@ -345,6 +332,10 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name)
theme->a_unfocused_unpressed_max))
set_default_appearance(theme->a_unfocused_unpressed_max);
theme->a_disabled_focused_close =
RrAppearanceCopy(theme->a_disabled_focused_max);
theme->a_disabled_unfocused_close =
RrAppearanceCopy(theme->a_disabled_unfocused_max);
theme->a_unfocused_unpressed_close =
RrAppearanceCopy(theme->a_unfocused_unpressed_max);
theme->a_unfocused_pressed_close =
@ -353,6 +344,10 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name)
RrAppearanceCopy(theme->a_focused_unpressed_max);
theme->a_focused_pressed_close =
RrAppearanceCopy(theme->a_focused_pressed_max);
theme->a_disabled_focused_desk =
RrAppearanceCopy(theme->a_disabled_focused_max);
theme->a_disabled_unfocused_desk =
RrAppearanceCopy(theme->a_disabled_unfocused_max);
theme->a_unfocused_unpressed_desk =
RrAppearanceCopy(theme->a_unfocused_unpressed_max);
theme->a_unfocused_pressed_desk =
@ -365,6 +360,10 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name)
RrAppearanceCopy(theme->a_focused_pressed_max);
theme->a_focused_pressed_set_desk =
RrAppearanceCopy(theme->a_focused_pressed_max);
theme->a_disabled_focused_shade =
RrAppearanceCopy(theme->a_disabled_focused_max);
theme->a_disabled_unfocused_shade =
RrAppearanceCopy(theme->a_disabled_unfocused_max);
theme->a_unfocused_unpressed_shade =
RrAppearanceCopy(theme->a_unfocused_unpressed_max);
theme->a_unfocused_pressed_shade =
@ -377,6 +376,10 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name)
RrAppearanceCopy(theme->a_focused_pressed_max);
theme->a_focused_pressed_set_shade =
RrAppearanceCopy(theme->a_focused_pressed_max);
theme->a_disabled_focused_iconify =
RrAppearanceCopy(theme->a_disabled_focused_max);
theme->a_disabled_unfocused_iconify =
RrAppearanceCopy(theme->a_disabled_focused_max);
theme->a_unfocused_unpressed_iconify =
RrAppearanceCopy(theme->a_unfocused_unpressed_max);
theme->a_unfocused_pressed_iconify =
@ -437,33 +440,45 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name)
theme->a_menu_hilite->texture[0].data.text.color =
theme->menu_hilite_color;
theme->a_focused_unpressed_max->texture[0].type =
theme->a_disabled_focused_max->texture[0].type =
theme->a_disabled_unfocused_max->texture[0].type =
theme->a_focused_unpressed_max->texture[0].type =
theme->a_focused_pressed_max->texture[0].type =
theme->a_focused_pressed_set_max->texture[0].type =
theme->a_unfocused_unpressed_max->texture[0].type =
theme->a_unfocused_pressed_max->texture[0].type =
theme->a_unfocused_pressed_set_max->texture[0].type =
theme->a_disabled_focused_close->texture[0].type =
theme->a_disabled_unfocused_close->texture[0].type =
theme->a_focused_unpressed_close->texture[0].type =
theme->a_focused_pressed_close->texture[0].type =
theme->a_unfocused_unpressed_close->texture[0].type =
theme->a_unfocused_pressed_close->texture[0].type =
theme->a_disabled_focused_desk->texture[0].type =
theme->a_disabled_unfocused_desk->texture[0].type =
theme->a_focused_unpressed_desk->texture[0].type =
theme->a_focused_pressed_desk->texture[0].type =
theme->a_focused_pressed_set_desk->texture[0].type =
theme->a_unfocused_unpressed_desk->texture[0].type =
theme->a_unfocused_pressed_desk->texture[0].type =
theme->a_unfocused_pressed_set_desk->texture[0].type =
theme->a_disabled_focused_shade->texture[0].type =
theme->a_disabled_unfocused_shade->texture[0].type =
theme->a_focused_unpressed_shade->texture[0].type =
theme->a_focused_pressed_shade->texture[0].type =
theme->a_focused_pressed_set_shade->texture[0].type =
theme->a_unfocused_unpressed_shade->texture[0].type =
theme->a_unfocused_pressed_shade->texture[0].type =
theme->a_unfocused_pressed_set_shade->texture[0].type =
theme->a_disabled_focused_iconify->texture[0].type =
theme->a_disabled_unfocused_iconify->texture[0].type =
theme->a_focused_unpressed_iconify->texture[0].type =
theme->a_focused_pressed_iconify->texture[0].type =
theme->a_unfocused_unpressed_iconify->texture[0].type =
theme->a_unfocused_pressed_iconify->texture[0].type = RR_TEXTURE_MASK;
theme->a_focused_unpressed_max->texture[0].data.mask.mask =
theme->a_disabled_focused_max->texture[0].data.mask.mask =
theme->a_disabled_unfocused_max->texture[0].data.mask.mask =
theme->a_focused_unpressed_max->texture[0].data.mask.mask =
theme->a_unfocused_unpressed_max->texture[0].data.mask.mask =
theme->a_focused_pressed_max->texture[0].data.mask.mask =
theme->a_unfocused_pressed_max->texture[0].data.mask.mask =
@ -471,12 +486,16 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name)
theme->a_focused_pressed_set_max->texture[0].data.mask.mask =
theme->a_unfocused_pressed_set_max->texture[0].data.mask.mask =
theme->max_set_mask;
theme->a_focused_pressed_close->texture[0].data.mask.mask =
theme->a_disabled_focused_close->texture[0].data.mask.mask =
theme->a_disabled_unfocused_close->texture[0].data.mask.mask =
theme->a_focused_pressed_close->texture[0].data.mask.mask =
theme->a_unfocused_pressed_close->texture[0].data.mask.mask =
theme->a_focused_unpressed_close->texture[0].data.mask.mask =
theme->a_unfocused_unpressed_close->texture[0].data.mask.mask =
theme->close_mask;
theme->a_focused_unpressed_desk->texture[0].data.mask.mask =
theme->a_disabled_focused_desk->texture[0].data.mask.mask =
theme->a_disabled_unfocused_desk->texture[0].data.mask.mask =
theme->a_focused_unpressed_desk->texture[0].data.mask.mask =
theme->a_unfocused_unpressed_desk->texture[0].data.mask.mask =
theme->a_focused_pressed_desk->texture[0].data.mask.mask =
theme->a_unfocused_pressed_desk->texture[0].data.mask.mask =
@ -484,7 +503,9 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name)
theme->a_focused_pressed_set_desk->texture[0].data.mask.mask =
theme->a_unfocused_pressed_set_desk->texture[0].data.mask.mask =
theme->desk_set_mask;
theme->a_focused_unpressed_shade->texture[0].data.mask.mask =
theme->a_disabled_focused_shade->texture[0].data.mask.mask =
theme->a_disabled_unfocused_shade->texture[0].data.mask.mask =
theme->a_focused_unpressed_shade->texture[0].data.mask.mask =
theme->a_unfocused_unpressed_shade->texture[0].data.mask.mask =
theme->a_focused_pressed_shade->texture[0].data.mask.mask =
theme->a_unfocused_pressed_shade->texture[0].data.mask.mask =
@ -492,11 +513,25 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name)
theme->a_focused_pressed_set_shade->texture[0].data.mask.mask =
theme->a_unfocused_pressed_set_shade->texture[0].data.mask.mask =
theme->shade_set_mask;
theme->a_focused_unpressed_iconify->texture[0].data.mask.mask =
theme->a_disabled_focused_iconify->texture[0].data.mask.mask =
theme->a_disabled_unfocused_iconify->texture[0].data.mask.mask =
theme->a_focused_unpressed_iconify->texture[0].data.mask.mask =
theme->a_unfocused_unpressed_iconify->texture[0].data.mask.mask =
theme->a_focused_pressed_iconify->texture[0].data.mask.mask =
theme->a_unfocused_pressed_iconify->texture[0].data.mask.mask =
theme->iconify_mask;
theme->a_disabled_focused_max->texture[0].data.mask.color =
theme->a_disabled_focused_close->texture[0].data.mask.color =
theme->a_disabled_focused_desk->texture[0].data.mask.color =
theme->a_disabled_focused_shade->texture[0].data.mask.color =
theme->a_disabled_focused_iconify->texture[0].data.mask.color =
theme->titlebut_disabled_focused_color;
theme->a_disabled_unfocused_max->texture[0].data.mask.color =
theme->a_disabled_unfocused_close->texture[0].data.mask.color =
theme->a_disabled_unfocused_desk->texture[0].data.mask.color =
theme->a_disabled_unfocused_shade->texture[0].data.mask.color =
theme->a_disabled_unfocused_iconify->texture[0].data.mask.color =
theme->titlebut_disabled_unfocused_color;
theme->a_focused_unpressed_max->texture[0].data.mask.color =
theme->a_focused_pressed_max->texture[0].data.mask.color =
theme->a_focused_pressed_set_max->texture[0].data.mask.color =

View file

@ -27,6 +27,8 @@ struct _RrTheme {
RrColor *cb_unfocused_color;
RrColor *title_focused_color;
RrColor *title_unfocused_color;
RrColor *titlebut_disabled_focused_color;
RrColor *titlebut_disabled_unfocused_color;
RrColor *titlebut_focused_color;
RrColor *titlebut_unfocused_color;
RrColor *menu_title_color;
@ -56,28 +58,38 @@ struct _RrTheme {
RrPixmapMask *close_mask;
/* global appearances */
RrAppearance *a_disabled_focused_max;
RrAppearance *a_disabled_unfocused_max;
RrAppearance *a_focused_unpressed_max;
RrAppearance *a_focused_pressed_max;
RrAppearance *a_focused_pressed_set_max;
RrAppearance *a_unfocused_unpressed_max;
RrAppearance *a_unfocused_pressed_max;
RrAppearance *a_unfocused_pressed_set_max;
RrAppearance *a_disabled_focused_close;
RrAppearance *a_disabled_unfocused_close;
RrAppearance *a_focused_unpressed_close;
RrAppearance *a_focused_pressed_close;
RrAppearance *a_unfocused_unpressed_close;
RrAppearance *a_unfocused_pressed_close;
RrAppearance *a_disabled_focused_desk;
RrAppearance *a_disabled_unfocused_desk;
RrAppearance *a_focused_unpressed_desk;
RrAppearance *a_focused_pressed_desk;
RrAppearance *a_focused_pressed_set_desk;
RrAppearance *a_unfocused_unpressed_desk;
RrAppearance *a_unfocused_pressed_desk;
RrAppearance *a_unfocused_pressed_set_desk;
RrAppearance *a_disabled_focused_shade;
RrAppearance *a_disabled_unfocused_shade;
RrAppearance *a_focused_unpressed_shade;
RrAppearance *a_focused_pressed_shade;
RrAppearance *a_focused_pressed_set_shade;
RrAppearance *a_unfocused_unpressed_shade;
RrAppearance *a_unfocused_pressed_shade;
RrAppearance *a_unfocused_pressed_set_shade;
RrAppearance *a_disabled_focused_iconify;
RrAppearance *a_disabled_unfocused_iconify;
RrAppearance *a_focused_unpressed_iconify;
RrAppearance *a_focused_pressed_iconify;
RrAppearance *a_unfocused_unpressed_iconify;

View file

@ -7,3 +7,4 @@ modal3
urgent
icons
override
noresize

61
tests/noresize.c Normal file
View file

@ -0,0 +1,61 @@
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
int main () {
XSetWindowAttributes xswa;
unsigned long xswamask;
Display *display;
Window win;
XEvent report;
int x=10,y=10,h=100,w=400;
XSizeHints size;
display = XOpenDisplay(NULL);
if (display == NULL) {
fprintf(stderr, "couldn't connect to X server :0\n");
return 0;
}
xswa.win_gravity = StaticGravity;
xswamask = CWWinGravity;
win = XCreateWindow(display, RootWindow(display, 0),
x, y, w, h, 10, CopyFromParent, CopyFromParent,
CopyFromParent, xswamask, &xswa);
XSetWindowBackground(display,win,WhitePixel(display,0));
size.flags = PMinSize | PMaxSize;
size.max_width = 0;
size.min_width = w;
size.max_height = 0;
size.min_height = h;
XSetWMNormalHints(display, win, &size);
XMapWindow(display, win);
XFlush(display);
XSelectInput(display, win, ExposureMask | StructureNotifyMask);
while (1) {
XNextEvent(display, &report);
switch (report.type) {
case Expose:
printf("exposed\n");
break;
case ConfigureNotify:
x = report.xconfigure.x;
y = report.xconfigure.y;
w = report.xconfigure.width;
h = report.xconfigure.height;
printf("confignotify %i,%i-%ix%i\n",x,y,w,h);
break;
}
}
return 1;
}