diff --git a/HACKING b/HACKING index dab0aad8..e450bba3 100644 --- a/HACKING +++ b/HACKING @@ -27,8 +27,7 @@ not all, guidelines: lines * most other constructs should have braces on the same line as the statement + * else appears on a new line, just like an if * when in doubt look at the rest of the source * vim users can use "set expandtab tabstop=4 shiftwidth=4 softtabstop=4" for some of this - - diff --git a/data/autostart.sh b/data/autostart.sh index ab542841..53063262 100644 --- a/data/autostart.sh +++ b/data/autostart.sh @@ -22,7 +22,9 @@ if which dbus-launch >/dev/null && test -z "$DBUS_SESSION_BUS_ADDRESS"; then fi # Make GTK apps look and behave how they were set up in the gnome config tools -if which gnome-settings-daemon >/dev/null; then +if which /usr/libexec/gnome-settings-daemon >/dev/null; then + /usr/libexec/gnome-settings-daemon & +elif which gnome-settings-daemon >/dev/null; then gnome-settings-daemon & fi @@ -34,6 +36,6 @@ fi # Run XDG autostart things. By default don't run anything desktop-specific # See xdg-autostart --help more info DESKTOP_ENV="" -if which xdg-autostart; then +if which xdg-autostart >/dev/null; then xdg-autostart $DESKTOP_ENV fi diff --git a/data/rc.xml b/data/rc.xml index ef3d9bdc..f223f678 100644 --- a/data/rc.xml +++ b/data/rc.xml @@ -652,7 +652,9 @@ + role="the window's WM_WINDOW_ROLE property (see xprop)" + type="the window's _NET_WM_WINDOW_TYPE (if unspecified, then + it is dialog for child windows)"> # the name or the class can be set, or both. this is used to match # windows when they appear. role can optionally be set as well, to # further restrict your matches. @@ -661,6 +663,9 @@ # used by a shell. you can use * to match any characters and ? to match # any single character. + # the type is one of: normal, dialog, splash, utility, menu, toolbar, dock, + # or desktop + # when multiple rules match a window, they will all be applied, in the # order that they appear in this list diff --git a/data/rc.xsd b/data/rc.xsd index 47eeed12..de227ea1 100644 --- a/data/rc.xsd +++ b/data/rc.xsd @@ -189,10 +189,11 @@ + + - @@ -252,6 +253,18 @@ + + + + + + + + + + + + diff --git a/m4/openbox.m4 b/m4/openbox.m4 index 18e27178..5a95e846 100644 --- a/m4/openbox.m4 +++ b/m4/openbox.m4 @@ -10,14 +10,23 @@ AC_DEFUN([OB_DEBUG], AC_ARG_ENABLE([strict-ansi], AC_HELP_STRING([--enable-strict-ansi],[Enable strict ANSI compliance build [[default=no]]]), [STRICT=$enableval], [STRICT="no"]) - if test "$GCC" = "yes" && test "$STRICT" = "yes"; then - CFLAGS="$CFLAGS -ansi -pedantic -D_XOPEN_SOURCE" - fi AC_ARG_ENABLE([debug], AC_HELP_STRING([--enable-debug],[build a debug version [[default=no]]]), [DEBUG=$enableval], [DEBUG="no"]) + AC_ARG_ENABLE([gprof], + AC_HELP_STRING([--enable-gprof],[Enable gprof profiling output [[default=no]]]), + [PROF=$enableval], [PROF="no"]) + + AC_ARG_ENABLE([gprof-libc], + AC_HELP_STRING([--enable-gprof-libc],[Link against libc with profiling support [[default=no]]]), + [PROFLC=$enableval], [PROFLC="no"]) + + if test "$PROFLC" = "yes"; then + PROF="yes" # always enable profiling then + fi + TEST="" test "${PACKAGE_VERSION%*alpha*}" != "$PACKAGE_VERSION" && TEST="yes" test "${PACKAGE_VERSION%*beta*}" != "$PACKAGE_VERSION" && TEST="yes" @@ -52,6 +61,7 @@ AC_DEFUN([OB_COMPILER_FLAGS], AC_REQUIRE([AC_PROG_CC]) FLAGS="" + L="" if test "$DEBUG" = "yes"; then FLAGS="-DDEBUG" @@ -73,11 +83,18 @@ AC_DEFUN([OB_COMPILER_FLAGS], if test "$STRICT" = "yes"; then FLAGS="$FLAGS -ansi -pedantic -D_XOPEN_SOURCE" fi + if test "$PROF" = "yes"; then + FLAGS="$FLAGS -pg -fno-inline" + fi + if test "$PROFLC" = "yes"; then + L="$L -lc_p -lm_p" + fi FLAGS="$FLAGS -fno-strict-aliasing" fi AC_MSG_CHECKING([for compiler specific flags]) AC_MSG_RESULT([$FLAGS]) CFLAGS="$CFLAGS $FLAGS" + LIBS="$LIBS $L" ]) AC_DEFUN([OB_NLS], diff --git a/openbox/actions.c b/openbox/actions.c index 11581af6..5bd70139 100644 --- a/openbox/actions.c +++ b/openbox/actions.c @@ -345,8 +345,14 @@ void actions_client_move(ObActionsData *data, gboolean start) that moves windows our from under the cursor, the enter event will come as a GrabNotify which is ignored, so this makes a fake enter event + + don't do this if there is a grab on the pointer. enter events + are ignored during a grab, so don't force fake ones when they + should be ignored */ - if ((c = client_under_pointer()) && c != data->client) { + if ((c = client_under_pointer()) && c != data->client && + !grab_on_pointer()) + { ob_debug_type(OB_DEBUG_FOCUS, "Generating fake enter because we did a " "mouse-event action"); diff --git a/openbox/client.c b/openbox/client.c index c7a82d16..946e80d3 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -779,13 +779,15 @@ static ObAppSettings *client_get_settings_state(ObClient *self) !g_pattern_match(app->name, strlen(self->name), self->name, NULL)) match = FALSE; else if (app->class && - !g_pattern_match(app->class, - strlen(self->class), self->class, NULL)) + !g_pattern_match(app->class, + strlen(self->class), self->class, NULL)) match = FALSE; else if (app->role && !g_pattern_match(app->role, strlen(self->role), self->role, NULL)) match = FALSE; + else if ((signed)app->type >= 0 && app->type != self->type) + match = FALSE; if (match) { ob_debug("Window matching: %s", app->name); diff --git a/openbox/config.c b/openbox/config.c index a268eb5b..b5b4ef4e 100644 --- a/openbox/config.c +++ b/openbox/config.c @@ -100,6 +100,7 @@ GSList *config_per_app_settings; ObAppSettings* config_create_app_settings(void) { ObAppSettings *settings = g_new0(ObAppSettings, 1); + settings->type = -1; settings->decor = -1; settings->shade = -1; settings->monitor = -1; @@ -123,6 +124,7 @@ void config_app_settings_copy_non_defaults(const ObAppSettings *src, g_assert(src != NULL); g_assert(dst != NULL); + copy_if(type, -1); copy_if(decor, -1); copy_if(shade, -1); copy_if(focus, -1); @@ -190,15 +192,16 @@ static void config_parse_gravity_coord(xmlNodePtr node, GravityCoord *c) static void parse_per_app_settings(xmlNodePtr node, gpointer d) { xmlNodePtr app = obt_parse_find_node(node->children, "application"); - gchar *name = NULL, *class = NULL, *role = NULL; - gboolean name_set, class_set; + gchar *name = NULL, *class = NULL, *role = NULL, *type = NULL; + gboolean name_set, class_set, type_set; gboolean x_pos_given; while (app) { - name_set = class_set = x_pos_given = FALSE; + name_set = class_set = type_set = x_pos_given = FALSE; class_set = obt_parse_attr_string(app, "class", &class); name_set = obt_parse_attr_string(app, "name", &name); + type_set = obt_parse_attr_string(app, "type", &type); if (class_set || name_set) { xmlNodePtr n, c; ObAppSettings *settings = config_create_app_settings();; @@ -209,6 +212,25 @@ static void parse_per_app_settings(xmlNodePtr node, gpointer d) if (class_set) settings->class = g_pattern_spec_new(class); + if (type_set) { + if (!g_ascii_strcasecmp(type, "normal")) + settings->type = OB_CLIENT_TYPE_NORMAL; + else if (!g_ascii_strcasecmp(type, "dialog")) + settings->type = OB_CLIENT_TYPE_DIALOG; + else if (!g_ascii_strcasecmp(type, "splash")) + settings->type = OB_CLIENT_TYPE_SPLASH; + else if (!g_ascii_strcasecmp(type, "utility")) + settings->type = OB_CLIENT_TYPE_UTILITY; + else if (!g_ascii_strcasecmp(type, "menu")) + settings->type = OB_CLIENT_TYPE_MENU; + else if (!g_ascii_strcasecmp(type, "toolbar")) + settings->type = OB_CLIENT_TYPE_TOOLBAR; + else if (!g_ascii_strcasecmp(type, "dock")) + settings->type = OB_CLIENT_TYPE_DOCK; + else if (!g_ascii_strcasecmp(type, "desktop")) + settings->type = OB_CLIENT_TYPE_DESKTOP; + } + if (obt_parse_attr_string(app, "role", &role)) settings->role = g_pattern_spec_new(role); @@ -662,6 +684,11 @@ static void parse_resize(xmlNodePtr node, gpointer d) if ((n2 = obt_parse_find_node(n->children, "y"))) config_parse_gravity_coord(n2, &config_resize_popup_fixed.y); + + config_resize_popup_fixed.x.pos = + MAX(config_resize_popup_fixed.x.pos, 0); + config_resize_popup_fixed.y.pos = + MAX(config_resize_popup_fixed.y.pos, 0); } } } diff --git a/openbox/config.h b/openbox/config.h index cf9eb43e..1f4ae326 100644 --- a/openbox/config.h +++ b/openbox/config.h @@ -23,6 +23,7 @@ #include "misc.h" #include "stacking.h" #include "place.h" +#include "client.h" #include "geom.h" #include "moveresize.h" #include "render/render.h" @@ -37,6 +38,7 @@ struct _ObAppSettings GPatternSpec *class; GPatternSpec *name; GPatternSpec *role; + ObClientType type; GravityPoint position; gboolean pos_given; diff --git a/openbox/event.c b/openbox/event.c index cedac2e3..9502edf5 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -1369,7 +1369,7 @@ static void event_handle_client(ObClient *client, XEvent *e) ob_debug_type(OB_DEBUG_APP_BUGS, "_NET_ACTIVE_WINDOW message for window %s is " "missing source indication"); - client_activate(client, FALSE, TRUE, TRUE, + client_activate(client, TRUE, TRUE, TRUE, (e->xclient.data.l[0] == 0 || e->xclient.data.l[0] == 2)); } else if (msgtype == OBT_PROP_ATOM(NET_WM_MOVERESIZE)) { diff --git a/openbox/geom.h b/openbox/geom.h index bdcd3c55..7c5ee32e 100644 --- a/openbox/geom.h +++ b/openbox/geom.h @@ -23,7 +23,7 @@ #include typedef struct _GravityCoord { - int pos; + gint pos; gboolean center; gboolean opposite; } GravityCoord; diff --git a/openbox/menuframe.c b/openbox/menuframe.c index c25e485f..730f23f7 100644 --- a/openbox/menuframe.c +++ b/openbox/menuframe.c @@ -254,23 +254,24 @@ static void menu_frame_place_topmenu(ObMenuFrame *self, gint *x, gint *y) static void menu_frame_place_submenu(ObMenuFrame *self, gint *x, gint *y) { - gint overlap; + gint overlapx, overlapy; gint bwidth; - overlap = ob_rr_theme->menu_overlap; + overlapx = ob_rr_theme->menu_overlap_x; + overlapy = ob_rr_theme->menu_overlap_y; bwidth = ob_rr_theme->mbwidth; if (self->direction_right) *x = self->parent->area.x + self->parent->area.width - - overlap - bwidth; + overlapx - bwidth; else - *x = self->parent->area.x - self->area.width + overlap + bwidth; + *x = self->parent->area.x - self->area.width + overlapx + bwidth; *y = self->parent->area.y + self->parent_entry->area.y; if (config_menu_middle) *y -= (self->area.height - (bwidth * 2) - ITEM_HEIGHT) / 2; else - *y += overlap; + *y += overlapy; } void menu_frame_move_on_screen(ObMenuFrame *self, gint x, gint y, diff --git a/openbox/mouse.c b/openbox/mouse.c index 071a23b2..ae9a6fc2 100644 --- a/openbox/mouse.c +++ b/openbox/mouse.c @@ -45,7 +45,7 @@ typedef struct { /* Array of GSList*s of ObMouseBinding*s. */ static GSList *bound_contexts[OB_FRAME_NUM_CONTEXTS]; -/* TRUE when we have a grab on the pointer and need to reply the pointer event +/* TRUE when we have a grab on the pointer and need to replay the pointer event to send it to other applications */ static gboolean replay_pointer_needed; diff --git a/po/nl.po b/po/nl.po index ec779726..70ec7014 100644 --- a/po/nl.po +++ b/po/nl.po @@ -3,14 +3,15 @@ # This file is distributed under the same license as the openbox package. # Mark Pustjens , 2007. # Jochem Kossen , 2007. +# Marvin Vek, 2008 # msgid "" msgstr "" -"Project-Id-Version: Openbox 3.4.3\n" +"Project-Id-Version: Openbox 3.4.6.1\n" "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n" "POT-Creation-Date: 2008-02-02 11:51-0500\n" "PO-Revision-Date: 2007-07-12 13:01+0200\n" -"Last-Translator: Jochem Kossen \n" +"Last-Translator: Marvin Vek\n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -33,11 +34,11 @@ msgstr "Uitvoeren van '%s' mislukt: %s" #: openbox/client.c:1988 openbox/client.c:2020 msgid "Killing..." -msgstr "" +msgstr "Termineren..." #: openbox/client.c:1990 openbox/client.c:2022 msgid "Not Responding" -msgstr "" +msgstr "Reageert Niet" #: openbox/client_list_combined_menu.c:91 openbox/client_list_menu.c:94 msgid "Go there..." @@ -232,7 +233,7 @@ msgstr " --replace Vervang de huidig draaiende window manager\n" #: openbox/openbox.c:502 msgid " --config-file FILE Specify the path to the config file to use\n" -msgstr "" +msgstr " --config-file FILE Specificeer het pad naar het te gebruiken configuratiebestand\n" #: openbox/openbox.c:503 msgid " --sm-disable Disable connection to the session manager\n" @@ -256,7 +257,7 @@ msgstr " --restart Herstart Openbox\n" #: openbox/openbox.c:507 msgid " --exit Exit Openbox\n" -msgstr "" +msgstr " --exit Openbox afsluiten\n" #: openbox/openbox.c:508 msgid "" @@ -293,7 +294,7 @@ msgstr "" #: openbox/openbox.c:583 msgid "--config-file requires an argument\n" -msgstr "" +msgstr "--config-file vereist een argument\n" #: openbox/openbox.c:626 #, c-format @@ -321,6 +322,8 @@ msgid "" "Openbox is configured for %d desktops, but the current session has %d. " "Overriding the Openbox configuration." msgstr "" +"Openbox is geconfigureerd voor %d bureaubladen, maar de huidige sessie heeft %d. " +"Overnemen van de Openbox configuratie." #: openbox/screen.c:1169 #, c-format diff --git a/render/font.c b/render/font.c index 5ccfb8fd..583c9f7d 100644 --- a/render/font.c +++ b/render/font.c @@ -285,9 +285,20 @@ void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *area) } if (t->shadow_offset_x || t->shadow_offset_y) { - c.color.red = t->shadow_color->r | t->shadow_color->r << 8; - c.color.green = t->shadow_color->g | t->shadow_color->g << 8; - c.color.blue = t->shadow_color->b | t->shadow_color->b << 8; + /* From nvidia's readme (chapter 23): + + When rendering to a 32-bit window, keep in mind that the X RENDER + extension, used by most composite managers, expects "premultiplied + alpha" colors. This means that if your color has components (r,g,b) + and alpha value a, then you must render (a*r, a*g, a*b, a) into the + target window. + */ + c.color.red = (t->shadow_color->r | t->shadow_color->r << 8) * + t->shadow_alpha / 255; + c.color.green = (t->shadow_color->g | t->shadow_color->g << 8) * + t->shadow_alpha / 255; + c.color.blue = (t->shadow_color->b | t->shadow_color->b << 8) * + t->shadow_alpha / 255; c.color.alpha = 0xffff * t->shadow_alpha / 255; c.pixel = t->shadow_color->pixel; diff --git a/render/gradient.c b/render/gradient.c index 6439b301..fc75047f 100644 --- a/render/gradient.c +++ b/render/gradient.c @@ -197,6 +197,74 @@ static void create_bevel_colors(RrAppearance *l) l->surface.bevel_dark = RrColorNew(l->inst, r, g, b); } +/*! Repeat the first pixel over the entire block of memory + @param start The block of memory. start[0] will be copied + to the rest of the block. + @param w The width of the block of memory (including the already-set first + element +*/ +static inline void repeat_pixel(RrPixel32 *start, gint w) +{ + gint x; + RrPixel32 *dest; + + dest = start + 1; + + /* for really small things, just copy ourselves */ + if (w < 8) { + for (x = w-1; x > 0; --x) + *(dest++) = *start; + } + + /* for >= 8, then use O(log n) memcpy's... */ + else { + gchar *cdest; + gint lenbytes; + + /* copy the first 3 * 32 bits (3 words) ourselves - then we have + 3 + the original 1 = 4 words to make copies of at a time + + this is faster than doing memcpy for 1 or 2 words at a time + */ + for (x = 3; x > 0; --x) + *(dest++) = *start; + + /* cdest is a pointer to the pixel data that is typed char* so that + adding 1 to its position moves it only one byte + + lenbytes is the amount of bytes that we will be copying each + iteration. this doubles each time through the loop. + + x is the number of bytes left to copy into. lenbytes will alwaysa + be bounded by x + + this loop will run O(log n) times (n is the number of bytes we + need to copy into), since the size of the copy is doubled each + iteration. it seems that gcc does some nice optimizations to make + this memcpy very fast on hardware with support for vector operations + such as mmx or see. here is an idea of the kind of speed up we are + getting by doing this (splitvertical3 switches from doing + "*(data++) = color" n times to doing this memcpy thing log n times: + + % cumulative self self total + time seconds seconds calls ms/call ms/call name + 49.44 0.88 0.88 1063 0.83 0.83 splitvertical1 + 47.19 1.72 0.84 1063 0.79 0.79 splitvertical2 + 2.81 1.77 0.05 1063 0.05 0.05 splitvertical3 + */ + cdest = (gchar*)dest; + lenbytes = 4 * sizeof(RrPixel32); + for (x = (w - 4) * sizeof(RrPixel32); x > 0;) { + memcpy(cdest, start, lenbytes); + x -= lenbytes; + cdest += lenbytes; + lenbytes <<= 1; + if (lenbytes > x) + lenbytes = x; + } + } +} + static void gradient_parentrelative(RrAppearance *a, gint w, gint h) { RrPixel32 *source, *dest; @@ -423,10 +491,9 @@ static void gradient_solid(RrAppearance *l, gint w, gint h) static void gradient_splitvertical(RrAppearance *a, gint w, gint h) { - gint x, y1, y2, y3; + gint y1, y2, y3; RrSurface *sf = &a->surface; - RrPixel32 *data = sf->pixel_data; - RrPixel32 current; + RrPixel32 *data; gint y1sz, y2sz, y3sz; VARS(y1); @@ -455,39 +522,48 @@ static void gradient_splitvertical(RrAppearance *a, gint w, gint h) } SETUP(y3, sf->secondary, sf->split_secondary, y3sz); - for (y1 = y1sz; y1 > 0; --y1) { - current = COLOR(y1); - for (x = w - 1; x >= 0; --x) - *(data++) = current; + /* find the color for the first pixel of each row first */ + data = sf->pixel_data; + for (y1 = y1sz-1; y1 > 0; --y1) { + *data = COLOR(y1); + data += w; NEXT(y1); } - - for (y2 = y2sz; y2 > 0; --y2) { - current = COLOR(y2); - for (x = w - 1; x >= 0; --x) - *(data++) = current; - + *data = COLOR(y1); + data += w; + for (y2 = y2sz-1; y2 > 0; --y2) { + *data = COLOR(y2); + data += w; NEXT(y2); } - - for (y3 = y3sz; y3 > 0; --y3) { - current = COLOR(y3); - for (x = w - 1; x >= 0; --x) - *(data++) = current; - + *data = COLOR(y2); + data += w; + for (y3 = y3sz-1; y3 > 0; --y3) { + *data = COLOR(y3); + data += w; NEXT(y3); } + *data = COLOR(y3); + + /* copy the first pixels into the whole rows */ + data = sf->pixel_data; + for (y1 = h; y1 > 0; --y1) { + repeat_pixel(data, w); + data += w; + } } static void gradient_horizontal(RrSurface *sf, gint w, gint h) { - gint x, y; + gint x, y, cpbytes; RrPixel32 *data = sf->pixel_data, *datav; + gchar *datac; VARS(x); SETUP(x, sf->primary, sf->secondary, w); + /* set the color values for the first row */ datav = data; for (x = w - 1; x > 0; --x) { /* 0 -> w - 1 */ *datav = COLOR(x); @@ -497,22 +573,32 @@ static void gradient_horizontal(RrSurface *sf, gint w, gint h) *datav = COLOR(x); ++datav; - for (y = h - 1; y > 0; --y) { /* 1 -> h */ - memcpy(datav, data, w * sizeof(RrPixel32)); - datav += w; + /* copy the first row to the rest in O(logn) copies */ + datac = (gchar*)datav; + cpbytes = 1 * w * sizeof(RrPixel32); + for (y = (h - 1) * w * sizeof(RrPixel32); y > 0;) { + memcpy(datac, data, cpbytes); + y -= cpbytes; + datac += cpbytes; + cpbytes <<= 1; + if (cpbytes > y) + cpbytes = y; } } static void gradient_mirrorhorizontal(RrSurface *sf, gint w, gint h) { - gint x, y, half1, half2; + gint x, y, half1, half2, cpbytes; RrPixel32 *data = sf->pixel_data, *datav; + gchar *datac; VARS(x); half1 = (w + 1) / 2; half2 = w / 2; + /* set the color values for the first row */ + SETUP(x, sf->primary, sf->secondary, half1); datav = data; for (x = half1 - 1; x > 0; --x) { /* 0 -> half1 - 1 */ @@ -534,31 +620,43 @@ static void gradient_mirrorhorizontal(RrSurface *sf, gint w, gint h) ++datav; } - for (y = h - 1; y > 0; --y) { /* 1 -> h */ - memcpy(datav, data, w * sizeof(RrPixel32)); - datav += w; + /* copy the first row to the rest in O(logn) copies */ + datac = (gchar*)datav; + cpbytes = 1 * w * sizeof(RrPixel32); + for (y = (h - 1) * w * sizeof(RrPixel32); y > 0;) { + memcpy(datac, data, cpbytes); + y -= cpbytes; + datac += cpbytes; + cpbytes <<= 1; + if (cpbytes > y) + cpbytes = y; } } static void gradient_vertical(RrSurface *sf, gint w, gint h) { - gint x, y; - RrPixel32 *data = sf->pixel_data; - RrPixel32 current; + gint y; + RrPixel32 *data; VARS(y); SETUP(y, sf->primary, sf->secondary, h); - for (y = h - 1; y > 0; --y) { /* 0 -> h-1 */ - current = COLOR(y); - for (x = w - 1; x >= 0; --x) /* 0 -> w */ - *(data++) = current; + /* find the color for the first pixel of each row first */ + data = sf->pixel_data; + for (y = h - 1; y > 0; --y) { /* 0 -> h-1 */ + *data = COLOR(y); + data += w; NEXT(y); } - current = COLOR(y); - for (x = w - 1; x >= 0; --x) /* 0 -> w */ - *(data++) = current; + *data = COLOR(y); + + /* copy the first pixels into the whole rows */ + data = sf->pixel_data; + for (y = h; y > 0; --y) { + repeat_pixel(data, w); + data += w; + } } @@ -656,14 +754,13 @@ static void gradient_crossdiagonal(RrSurface *sf, gint w, gint h) *data = COLOR(x); } -static void gradient_pyramid(RrSurface *sf, gint inw, gint inh) +static void gradient_pyramid(RrSurface *sf, gint w, gint h) { - gint x, y, w = (inw >> 1) + 1, h = (inh >> 1) + 1; - RrPixel32 *data = sf->pixel_data; - RrPixel32 *end = data + inw*inh - 1; - RrPixel32 current; + RrPixel32 *ldata, *rdata; + RrPixel32 *cp; RrColor left, right; RrColor extracorner; + gint x, y, halfw, halfh, midx, midy; VARS(lefty); VARS(righty); @@ -673,54 +770,64 @@ static void gradient_pyramid(RrSurface *sf, gint inw, gint inh) extracorner.g = (sf->primary->g + sf->secondary->g) / 2; extracorner.b = (sf->primary->b + sf->secondary->b) / 2; - SETUP(lefty, (&extracorner), sf->secondary, h); - SETUP(righty, sf->primary, (&extracorner), h); + halfw = w >> 1; + halfh = h >> 1; + midx = w - halfw - halfw; /* 0 or 1, depending if w is even or odd */ + midy = h - halfh - halfh; /* 0 or 1, depending if h is even or odd */ + + SETUP(lefty, sf->primary, (&extracorner), halfh + midy); + SETUP(righty, (&extracorner), sf->secondary, halfh + midy); + + /* draw the top half + + it is faster to draw both top quarters together than to draw one and + then copy it over to the other side. + */ + + ldata = sf->pixel_data; + rdata = ldata + w - 1; + for (y = halfh + midy; y > 0; --y) { /* 0 -> (h+1)/2 */ + RrPixel32 c; - for (y = h - 1; y > 0; --y) { /* 0 -> h-1 */ COLOR_RR(lefty, (&left)); COLOR_RR(righty, (&right)); - SETUP(x, (&left), (&right), w); + SETUP(x, (&left), (&right), halfw + midx); - for (x = w - 1; x > 0; --x) { /* 0 -> w-1 */ - current = COLOR(x); - *(data+x) = current; - *(data+inw-x) = current; - *(end-x) = current; - *(end-(inw-x)) = current; + for (x = halfw + midx - 1; x > 0; --x) { /* 0 -> (w+1)/2 */ + c = COLOR(x); + *(ldata++) = *(rdata--) = c; NEXT(x); } - current = COLOR(x); - *(data+x) = current; - *(data+inw-x) = current; - *(end-x) = current; - *(end-(inw-x)) = current; - - data+=inw; - end-=inw; + c = COLOR(x); + *ldata = *rdata = c; + ldata += halfw + 1; + rdata += halfw - 1 + midx + w; NEXT(lefty); NEXT(righty); } - COLOR_RR(lefty, (&left)); - COLOR_RR(righty, (&right)); - SETUP(x, (&left), (&right), w); + /* copy the top half into the bottom half, mirroring it, so we can only + copy one row at a time - for (x = w - 1; x > 0; --x) { /* 0 -> w-1 */ - current = COLOR(x); - *(data+x) = current; - *(data+inw-x) = current; - *(end-x) = current; - *(end-(inw-x)) = current; + it is faster, to move the writing pointer forward, and the reading + pointer backward - NEXT(x); + this is the current code, moving the write pointer forward and read + pointer backward + 41.78 4.26 1.78 504 3.53 3.53 gradient_pyramid2 + this is the opposite, moving the read pointer forward and the write + pointer backward + 42.27 4.40 1.86 504 3.69 3.69 gradient_pyramid2 + + */ + ldata = sf->pixel_data + (halfh - 1) * w; + cp = ldata + (midy + 1) * w; + for (y = halfh; y > 0; --y) { + memcpy(cp, ldata, w * sizeof(RrPixel32)); + ldata -= w; + cp += w; } - current = COLOR(x); - *(data+x) = current; - *(data+inw-x) = current; - *(end-x) = current; - *(end-(inw-x)) = current; } - diff --git a/render/icon.h b/render/icon.h index 13eff847..f0b2d267 100644 --- a/render/icon.h +++ b/render/icon.h @@ -1,3 +1,5 @@ +/* GIMP RGBA C-Source image dump (icon.h) */ + /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*- icon.h for the Openbox window manager @@ -16,17 +18,14 @@ See the COPYING file for a copy of the GNU General Public License. */ -/* GIMP RGBA C-Source image dump (icon.h) */ - #define OB_DEFAULT_ICON_WIDTH (48) #define OB_DEFAULT_ICON_HEIGHT (48) #define OB_DEFAULT_ICON_BYTES_PER_PIXEL (4) /* 3:RGB, 4:RGBA */ #define OB_DEFAULT_ICON_COMMENT \ - "To recreate this file, save an image as \"C-Source\" in The Gimp. " \ - "Use \"ob_default_icon\" as the Prefixed Name. Enable Glib Types. " \ - "Enable Save Alpha Channel. Enable Use Macros instead of Struct." + "To recreate this file, save an image as \"C-Source\" in The Gimp. Use \"ob_default_icon\" as the Prefixed Name. Enable Glib Types. Enable Save Alpha Channel. Enable Use Macros instead of Struct." #define OB_DEFAULT_ICON_PIXEL_DATA ((guint8*) OB_DEFAULT_ICON_pixel_data) static const guint8 OB_DEFAULT_ICON_pixel_data[48 * 48 * 4 + 1] = +("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" @@ -36,406 +35,388 @@ static const guint8 OB_DEFAULT_ICON_pixel_data[48 * 48 * 4 + 1] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\10\373\10" - "\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373" - "\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10" - "\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10" - "\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10" - "\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373" - "\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10" - "\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10" - "\10\373\10\10\10\373\10\10\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\10" - "\373\10\10\10\373\20\22\24\373\20\22\24\373\20\22\24\373\20\22\24\373\20\22" - "\24\373\20\22\24\373\20\22\24\373\20\22\24\373\20\22\24\373\20\22\24\373\20" - "\22\24\373\20\22\24\373\20\22\24\373\20\22\24\373\20\22\24\373\20\22\24\373" - "\20\22\24\373\20\22\24\373\20\22\24\373\20\22\24\373\20\22\24\373\20\22\24" - "\373\20\22\24\373\20\22\24\373\20\22\24\373\20\22\24\373\20\22\24\373\20\22" - "\24\373\20\22\24\373\20\22\24\373\20\22\24\373\20\22\24\373\20\22\24\373\20" - "\22\24\373\20\22\24\373\20\22\24\373\20\22\24\373\20\22\24\373\20\22\24\373" - "\20\22\24\373\23\26\32\373\10\10\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" - "\10\10\373\20\22\24\373\277\324\347\373\277\325\347\373\277\324\347\373\277" - "\324\347\373\277\324\347\373\277\324\347\373\277\324\347\373\277\324\347\373" - "\277\324\347\373\277\324\347\373\277\324\347\373\277\324\347\373\277\324\347" - "\373\277\325\347\373\277\324\347\373\300\324\347\373\277\324\347\373\277\324" - "\347\373\277\324\347\373\277\324\347\373\300\324\347\373\277\324\347\373\277" - "\324\347\373\277\324\347\373\277\324\347\373\277\324\347\373\277\324\347\373" - "\277\324\347\373\277\324\347\373\277\324\347\373\277\324\347\373\300\324\347" - "\373\277\324\347\373\277\324\347\373\277\324\347\373\277\324\347\373\277\325" - "\347\373\277\324\347\373\277\324\347\373\277\324\347\373\20\22\24\373\10\10" - "\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\10\373\20\22\24\373\277\323" - "\347\373l\232\277\373n\232\277\373n\232\300\373n\232\300\373o\233\300\373" - "o\233\300\373o\233\301\373o\235\301\373q\235\303\373q\235\303\373q\235\303" - "\373r\236\304\373r\236\304\373t\236\304\373t\237\304\373t\237\305\373t\237" - "\305\373u\237\305\373u\237\306\373u\241\306\373u\241\306\373w\241\307\373" - "w\242\307\373y\242\307\373y\242\307\373y\242\310\373y\245\310\373z\245\311" - "\373z\244\311\373z\245\311\373|\245\311\373|\245\313\373|\245\313\373}\247" - "\313\373}\247\314\373}\247\314\373}\250\314\373\177\251\315\373t\232\277\373" - "\20\22\24\373\10\10\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\10\373\20" - "\22\24\373\277\323\346\373l\232\276\373l\230\277\373l\230\277\373n\232\277" - "\373n\232\300\373n\233\300\373o\233\300\373o\233\301\373o\233\301\373o\233" - "\301\373q\235\301\373q\235\303\373q\236\303\373r\236\303\373r\236\304\373" - "r\237\304\373t\236\304\373t\237\305\373t\237\305\373t\241\305\373u\241\306" - "\373u\241\306\373u\242\306\373w\241\306\373w\241\307\373w\242\307\373y\244" - "\307\373y\244\310\373y\244\310\373y\245\310\373z\245\311\373z\244\311\373" - "z\245\311\373|\247\313\373|\247\313\373|\245\313\373}\250\313\373}\250\314" - "\373q\230\276\373\20\22\24\373\10\10\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\10\10\10\373\20\22\24\373\275\322\345\373l\227\276\373k\230\276\373l\230" - "\276\373l\232\277\373l\230\277\373n\232\277\373n\233\300\373n\232\300\373" - "n\232\300\373o\233\300\373o\233\301\373o\233\301\373q\233\301\373q\235\303" - "\373q\235\303\373r\235\303\373r\236\304\373r\237\304\373r\237\304\373t\236" - "\304\373t\237\305\373t\237\305\373u\237\305\373u\241\306\373u\241\306\373" - "u\241\306\373w\242\307\373y\241\307\373w\244\307\373y\242\307\373y\244\310" - "\373z\244\310\373y\244\310\373z\244\311\373z\245\311\373z\245\311\373|\245" - "\313\373|\245\313\373o\230\275\373\20\22\24\373\10\10\10\373\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\10\10\10\373\17\22\24\373\273\322\344\373k\227\275\373" - "k\227\275\373k\230\276\373k\227\276\373l\230\276\373l\232\277\373l\232\277" - "\373n\232\277\373n\232\277\373n\232\300\373n\233\300\373o\232\300\373o\233" - "\301\373o\233\301\373o\233\301\373q\235\303\373r\236\303\373q\235\303\373" - "r\235\303\373r\236\304\373r\237\304\373r\237\304\373u\237\305\373t\237\305" - "\373t\241\305\373u\237\306\373u\237\306\373w\241\306\373w\241\306\373w\242" - "\307\373w\242\307\373w\242\307\373z\242\310\373y\244\310\373z\244\310\373" - "y\244\310\373|\244\311\373z\245\311\373n\225\273\373\17\22\24\373\10\10\10" - "\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\10\373\17\22\24\373\273\321\344" - "\373k\227\275\373i\227\275\373k\227\275\373k\230\276\373k\227\276\373l\230" - "\276\373l\230\276\373l\232\277\373l\232\277\373l\230\277\373n\232\277\373" - "n\232\300\373n\233\300\373o\233\300\373o\233\301\373o\235\301\373o\235\301" - "\373q\235\301\373r\235\303\373q\236\303\373r\235\303\373r\236\304\373r\236" - "\304\373r\236\304\373t\237\304\373t\236\305\373t\237\305\373t\237\305\373" - "w\241\306\373u\241\306\373u\241\306\373w\242\306\373w\242\307\373w\242\307" - "\373w\244\307\373y\244\310\373y\244\310\373z\244\310\373l\225\272\373\17\22" - "\24\373\10\10\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\10\373\17\22\24" - "\373\272\321\343\373i\225\273\373i\225\273\373i\227\275\373k\225\275\373i" - "\227\275\373k\227\275\373k\230\276\373l\230\276\373l\230\276\373l\230\276" - "\373n\232\277\373l\230\277\373n\232\277\373n\232\300\373o\233\300\373o\233" - "\300\373o\233\300\373o\233\301\373o\235\301\373o\233\301\373q\235\303\373" - "r\235\303\373q\236\303\373r\236\303\373t\236\304\373r\236\304\373r\237\304" - "\373t\237\304\373u\237\305\373t\237\305\373t\241\305\373u\241\306\373u\241" - "\306\373w\241\306\373u\242\306\373w\242\307\373w\242\307\373w\242\307\373" - "k\224\271\373\17\22\24\373\10\10\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" - "\10\10\373\17\22\24\373\271\320\343\373h\224\272\373_\212\260\373_\212\260" - "\373`\212\261\373`\212\261\373`\212\261\373`\212\261\373`\212\261\373`\214" - "\261\373b\214\263\373b\214\263\373b\214\263\373b\214\263\373b\214\263\373" - "c\214\263\373c\216\264\373e\216\264\373e\216\264\373c\216\264\373e\216\264" - "\373e\216\264\373f\217\265\373f\217\265\373e\217\265\373f\217\265\373f\217" - "\265\373f\217\265\373f\221\265\373f\217\266\373f\221\266\373h\221\266\373" - "i\221\266\373h\221\266\373h\222\266\373h\222\270\373i\221\270\373i\222\270" - "\373i\222\270\373i\222\270\373\17\22\24\373\10\10\10\373\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\10\10\10\373\17\21\24\373T\201\250\373T\201\250\373T\201\250" - "\373T\201\250\373T\201\250\373T\201\250\373T\201\250\373T\201\250\373T\201" - "\250\373T\201\250\373T\201\250\373T\201\250\373T\201\250\373T\201\250\373" - "T\201\250\373T\201\250\373T\201\250\373T\201\250\373T\201\250\373T\201\250" - "\373T\201\250\373T\201\250\373T\201\250\373T\201\250\373T\201\250\373T\201" - "\250\373T\201\250\373T\201\250\373T\201\250\373T\201\250\373T\201\250\373" - "T\201\250\373T\201\250\373T\201\250\373T\201\250\373T\201\250\373T\201\250" - "\373T\201\250\373T\201\250\373T\201\250\373\17\21\24\373\10\10\10\373\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\10\373\17\21\24\373T\201\250\373\374\375" - "\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374" - "\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373" - "\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376" - "\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375" - "\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374" - "\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373" - "\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376" - "\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373T\201" - "\250\373\17\21\24\373\10\10\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\10" - "\373\17\21\24\373T\201\250\373\375\376\376\373\375\376\376\373\375\376\376" - "\373\375\376\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375\376" - "\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375" - "\376\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375\376\376\373" - "\375\376\376\373\375\376\376\373\375\375\376\373\375\375\376\373\375\375\376" - "\373\375\376\376\373\375\375\376\373\375\375\376\373\375\376\376\373\375\375" - "\376\373\375\375\376\373\375\376\376\373\375\375\376\373\375\375\376\373\375" - "\375\376\373\375\375\376\373\375\375\376\373\375\375\376\373\375\375\376\373" - "\375\375\376\373\375\375\376\373T\201\250\373\17\21\24\373\10\10\10\373\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\10\373\17\21\24\373T\201\250\373\373" - "\375\376\373\373\375\376\373\373\375\376\373\373\375\376\373\373\375\376\373" - "\373\375\376\373\373\375\376\373\373\375\376\373\373\375\376\373\373\375\376" - "\373\373\375\376\373\373\375\376\373\373\375\376\373\373\375\376\373\373\375" - "\376\373\373\375\376\373\373\375\376\373\373\375\376\373\373\375\376\373\373" - "\375\376\373\373\375\376\373\373\375\376\373\373\375\376\373\373\375\376\373" - "\373\375\376\373\373\375\376\373\373\375\376\373\373\375\376\373\373\375\376" - "\373\373\375\376\373\373\375\376\373\373\375\376\373\373\375\376\373\373\375" - "\376\373\373\375\376\373\373\375\376\373\373\375\376\373\373\375\376\373T" - "\201\250\373\17\21\24\373\10\10\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" - "\10\10\373\17\21\24\373T\201\250\373\375\376\376\373\375\376\376\373\375\376" - "\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375" - "\376\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375\376\376\373" - "\375\376\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375\376\376" - "\373\375\376\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375\376" - "\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375" - "\376\376\373\375\375\376\373\375\375\376\373\375\375\376\373\375\375\376\373" - "\375\375\376\373\375\375\376\373\375\375\376\373\375\375\376\373\374\375\376" - "\373\374\375\376\373\374\375\376\373T\201\250\373\17\21\24\373\10\10\10\373" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\10\373\17\21\23\373T\201\250\373\374" - "\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373" - "\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376" - "\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375" - "\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374" - "\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373" - "\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376" - "\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375" - "\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373T" - "\201\250\373\17\21\23\373\10\10\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" - "\10\10\373\17\21\23\373T\201\250\373\375\376\376\373\375\376\376\373\375\376" - "\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375" - "\376\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375\376\376\373" - "\375\376\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375\376\376" - "\373\375\376\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375\376" - "\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375\375\376\373\375" - "\375\376\373\375\375\376\373\375\375\376\373\375\375\376\373\375\375\376\373" - "\375\375\376\373\375\375\376\373\374\375\376\373\374\375\376\373\374\375\376" - "\373\374\375\376\373\374\375\376\373T\201\250\373\17\21\23\373\10\10\10\373" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\10\373\17\21\23\373T\201\250\373\374" - "\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373" - "\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376" - "\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375" - "\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374" - "\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373" - "\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376" - "\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375" - "\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373T" - "\201\250\373\17\21\23\373\10\10\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" - "\10\10\373\17\21\23\373T\201\250\373\375\376\376\373\375\376\376\373\375\376" - "\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375" - "\376\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375\376\376\373" - "\375\376\376\373\375\376\376\373\375\375\376\373\375\375\376\373\375\376\376" - "\373\375\375\376\373\375\376\376\373\375\375\376\373\375\376\376\373\375\375" - "\376\373\375\376\376\373\375\375\376\373\375\375\376\373\375\375\376\373\375" - "\375\376\373\375\375\376\373\375\375\376\373\375\375\376\373\375\375\376\373" - "\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376" - "\373\374\375\376\373\374\375\376\373T\201\250\373\17\21\23\373\10\10\10\373" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\10\373\17\20\23\373T\201\250\373\374" - "\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373" - "\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376" - "\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375" - "\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374" - "\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373" - "\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376" - "\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375" - "\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373T" - "\201\250\373\17\20\23\373\10\10\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" - "\10\10\373\17\20\23\373T\201\250\373\375\376\376\373\375\376\376\373\375\376" - "\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375" - "\376\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375\375\376\373" - "\375\375\376\373\375\375\376\373\375\375\376\373\375\375\376\373\375\375\376" - "\373\375\375\376\373\375\375\376\373\375\375\376\373\375\375\376\373\375\375" - "\376\373\375\375\376\373\375\375\376\373\375\375\376\373\375\375\376\373\375" - "\375\376\373\375\375\376\373\375\375\376\373\374\375\376\373\374\375\376\373" - "\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376" - "\373\374\375\376\373\374\375\376\373T\201\250\373\17\20\23\373\10\10\10\373" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\10\373\17\20\23\373T\201\250\373\374" - "\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373" - "\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376" - "\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375" - "\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374" - "\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373" - "\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376" - "\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375" - "\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373T" - "\201\250\373\17\20\23\373\10\10\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" - "\10\10\373\16\20\23\373T\201\250\373\375\376\376\373\375\376\376\373\375\376" - "\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375" - "\376\376\373\375\376\376\373\375\375\376\373\375\375\376\373\375\375\376\373" - "\375\375\376\373\375\375\376\373\375\375\376\373\375\375\376\373\375\375\376" - "\373\375\375\376\373\375\375\376\373\375\375\376\373\374\375\376\373\374\375" - "\376\373\374\375\376\373\375\375\376\373\374\375\376\373\375\375\376\373\375" - "\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373" - "\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376" - "\373\374\375\376\373\374\375\376\373T\201\250\373\17\20\23\373\10\10\10\373" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\10\373\16\20\22\373T\201\250\373\373" - "\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373" - "\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375" - "\373\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373\373\375" - "\375\373\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373\373" - "\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373" - "\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375" - "\373\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373\373\375" - "\375\373\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373T" - "\201\250\373\16\20\22\373\10\10\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" - "\10\10\373\16\20\22\373T\201\250\373\375\376\376\373\375\376\376\373\375\376" - "\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375\376\376\373\375" - "\375\376\373\375\375\376\373\375\375\376\373\375\375\376\373\375\375\376\373" - "\375\375\376\373\375\375\376\373\375\375\376\373\375\375\376\373\375\375\376" - "\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375" - "\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374" - "\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373" - "\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376" - "\373\374\375\376\373\374\375\376\373T\201\250\373\16\20\22\373\10\10\10\373" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\10\373\16\20\22\373T\201\250\373\373" - "\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373" - "\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375" - "\373\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373\373\375" - "\375\373\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373\373" - "\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373" - "\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375" - "\373\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373\373\375" - "\375\373\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373T" - "\201\250\373\16\20\22\373\10\10\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" - "\10\10\373\16\20\22\373T\201\250\373\375\376\376\373\375\376\376\373\375\376" - "\376\373\375\376\376\373\375\376\376\373\375\375\376\373\375\375\376\373\375" - "\375\376\373\375\375\376\373\375\375\376\373\375\375\376\373\375\375\376\373" - "\375\375\376\373\375\375\376\373\375\375\376\373\374\375\376\373\374\375\376" - "\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375" - "\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374" - "\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373" - "\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376" - "\373\374\375\376\373\374\375\376\373T\201\250\373\16\20\22\373\10\10\10\373" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\10\373\16\20\22\373T\201\250\373\373" - "\375\375\373\373\374\375\373\373\374\375\373\373\375\375\373\373\375\375\373" - "\373\374\375\373\373\375\375\373\373\374\375\373\373\374\375\373\373\374\375" - "\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374" - "\375\373\373\375\375\373\373\374\375\373\373\375\375\373\373\374\375\373\373" - "\375\375\373\373\374\375\373\373\374\375\373\373\375\375\373\373\375\375\373" - "\373\374\375\373\373\374\375\373\373\375\375\373\373\375\375\373\373\374\375" - "\373\373\374\375\373\373\375\375\373\373\375\375\373\373\375\375\373\373\375" - "\375\373\373\375\375\373\373\375\375\373\373\374\375\373\373\374\375\373T" - "\201\250\373\16\20\22\373\10\10\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" - "\10\10\373\16\20\22\373T\201\250\373\375\375\376\373\375\375\376\373\375\375" - "\376\373\375\375\376\373\375\375\376\373\375\375\376\373\375\375\376\373\375" - "\375\376\373\375\375\376\373\375\375\376\373\375\375\376\373\375\375\376\373" - "\375\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376" - "\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375" - "\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374" - "\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373" - "\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376" - "\373\374\375\376\373\374\375\376\373T\201\250\373\16\20\22\373\10\10\10\373" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\10\373\16\20\22\373T\201\250\373\373" - "\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373" - "\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375" - "\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374" - "\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373" - "\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373" - "\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375" - "\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374" - "\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373]" - "\211\261\373\16\20\22\373\10\10\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" - "\10\10\373\16\20\22\373T\201\250\373\375\375\376\373\375\375\376\373\375\375" - "\376\373\375\375\376\373\375\375\376\373\375\375\376\373\375\375\376\373\375" - "\375\376\373\375\375\376\373\375\375\376\373\375\375\376\373\374\375\376\373" - "\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376" - "\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375" - "\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374" - "\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373" - "\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376" - "\373\374\375\376\373\373\375\375\373\\\211\260\373\15\20\22\373\10\10\10\373" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\10\373\15\20\22\373T\201\250\373\373" - "\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373" - "\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375" - "\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374" - "\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373" - "\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373" - "\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375" - "\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374" - "\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373[" - "\207\257\373\15\20\22\373\10\10\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" - "\10\10\373\15\20\22\373T\201\250\373\375\375\376\373\374\375\376\373\374\375" - "\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374" - "\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373" - "\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376" - "\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375" - "\376\373\374\375\375\373\374\375\375\373\374\375\375\373\374\375\375\373\374" - "\375\375\373\374\375\375\373\374\375\375\373\374\375\375\373\374\375\375\373" - "\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375" - "\373\373\375\375\373\373\375\375\373Y\206\255\373\15\20\22\373\10\10\10\373" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\10\373\15\20\22\373T\201\250\373\373" - "\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373" - "\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375" - "\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374" - "\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373" - "\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373" - "\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375" - "\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374" - "\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373V" - "\204\254\373\15\20\22\373\10\10\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" - "\10\10\373\15\20\22\373T\201\250\373\374\375\376\373\374\375\376\373\374\375" - "\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374" - "\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373" - "\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376" - "\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\375\373\374\375" - "\375\373\374\375\375\373\374\375\375\373\374\375\375\373\374\375\375\373\374" - "\375\375\373\374\375\375\373\374\375\375\373\373\375\375\373\373\375\375\373" - "\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375" - "\373\373\375\375\373\373\374\375\373V\202\253\373\15\20\22\373\10\10\10\373" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\10\373\15\20\22\373T\201\250\373\373" - "\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373" - "\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375" - "\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374" - "\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373" - "\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373" - "\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375" - "\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374" - "\375\373\373\374\375\373\373\374\375\373\373\374\375\373\373\374\375\373V" - "\202\253\373\15\20\22\373\10\10\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" - "\10\10\373\15\17\22\373T\201\250\373\374\375\376\373\374\375\376\373\374\375" - "\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374" - "\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373" - "\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376\373\374\375\376" - "\373\374\375\376\373\374\375\375\373\374\375\375\373\374\375\375\373\374\375" - "\375\373\374\375\375\373\374\375\375\373\374\375\375\373\374\375\375\373\374" - "\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373" - "\373\375\375\373\373\375\375\373\373\375\375\373\373\375\375\373\373\374\375" - "\373\373\374\375\373\373\374\375\373U\201\251\373\15\20\22\373\10\10\10\373" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\10\373\15\17\22\373T\201\250\373T\201" - "\250\373T\177\250\373T\177\250\373T\177\250\373T\177\250\373T\177\250\373" - "T\177\250\373T\177\250\373T\201\250\373T\177\250\373T\201\250\373T\177\250" - "\373R\177\250\373T\201\250\373R\177\250\373T\177\250\373T\201\250\373T\177" - "\250\373R\177\250\373T\201\250\373T\177\250\373T\177\250\373T\177\250\373" - "T\177\250\373T\201\250\373T\177\250\373T\177\250\373T\201\250\373T\177\250" - "\373T\177\250\373T\177\250\373T\177\250\373R\177\250\373R\177\250\373T\177" - "\250\373T\177\250\373T\177\250\373T\177\250\373T\177\250\373\15\17\22\373" - "\10\10\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\10\373\15\17\22\373\202" - "\247\300\373\201\244\300\373}\242\277\373\177\244\277\373\201\245\300\373" - "\202\247\301\373\204\247\303\373\206\250\303\373Ju\236\373\212\254\305\373" - "\214\255\306\373\216\257\307\373\217\260\307\373\221\261\310\373\222\261\311" - "\373\224\263\311\373\225\264\313\373\227\265\314\373\230\266\315\373\233\266" - "\315\373\235\270\316\373\236\272\317\373\237\273\320\373\237\272\320\373\237" - "\272\320\373\237\273\320\373\237\273\320\373\237\273\320\373\237\273\320\373" - "\237\273\320\373\237\273\320\373Ju\236\373\236\273\320\373\237\272\320\373" - "\237\272\320\373\237\272\320\373\237\273\320\373\236\272\320\373\237\273\320" - "\373\237\273\320\373\15\17\22\373\10\10\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\10\10\10\373\15\17\21\373\201\245\277\373My\241\373My\241\373Ly\241\373" - "My\241\373My\241\373My\241\373My\241\3733V\202\373Ny\242\373Nz\242\373Ny\242" - "\373Nz\242\373Mz\242\373Ny\242\373Nz\242\373Mz\242\373Nz\242\373Nz\242\373" - "Nz\242\373Nz\242\373Nz\242\373P|\244\373Pz\244\373N|\244\373Pz\244\373P|\244" - "\373Pz\244\373Pz\244\373P|\244\373P|\244\373-Nz\373Nz\244\373P|\244\373P|" - "\244\373P|\244\373P|\244\373P|\244\373P|\244\373P|\244\373\15\17\21\373\10" - "\10\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\10\373\10\10\10\373\15\17" - "\21\373\15\17\21\373\15\17\21\373\15\17\21\373\15\17\21\373\15\17\21\373\15" - "\17\21\373\15\17\21\373\15\17\21\373\15\17\21\373\15\17\21\373\15\17\21\373" - "\15\17\21\373\15\17\21\373\15\17\21\373\15\17\21\373\15\17\21\373\15\17\21" - "\373\15\17\21\373\15\17\21\373\15\17\21\373\15\17\21\373\15\17\21\373\15\17" - "\21\373\15\17\21\373\15\17\21\373\15\17\21\373\15\17\21\373\15\17\21\373\15" - "\17\21\373\15\17\21\373\15\17\21\373\15\17\21\373\15\17\21\373\15\17\21\373" - "\15\17\21\373\15\17\21\373\15\17\21\373\15\17\21\373\15\17\21\373\10\10\10" - "\373\10\10\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\10\373\10\10\10\373" - "\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10" - "\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10" - "\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10" - "\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373" - "\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10" - "\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10" - "\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10\10\10\373\10" - "\10\10\373\10\10\10\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0"; + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\40J\207\15\40J\207\23\40J\207" + "\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J" + "\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23" + "\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207" + "\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J" + "\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23" + "\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207" + "\23\40J\207\15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0'P\213\267'Q\214\275'Q\214\275" + "'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214" + "\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275" + "'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275(R\215\275'Q\214\275'Q\214" + "\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275" + "'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275(R\215" + "\275(R\215\275(R\215\275&P\213\267\40J\207\20\0\0\0\0\0\0\0\0\40J\207+Y{\252" + "\377\216\253\320\377\204\243\314\377\204\243\314\377\204\243\314\377\204\243" + "\314\377\204\243\314\377\204\243\314\377\204\243\314\377\204\243\314\377\204" + "\243\314\377\204\243\314\377\204\243\314\377\204\243\314\377\204\243\314\377" + "\204\243\314\377\204\243\314\377\204\243\314\377\204\243\314\377\204\243\314" + "\377\204\243\314\377\204\243\314\377\204\243\314\377\204\243\314\377\204\243" + "\314\377\204\243\314\377\203\243\314\377\203\243\313\377\203\243\313\377\203" + "\243\313\377\203\242\313\377\202\242\313\377\202\242\313\377\202\241\313\377" + "\201\241\312\377\201\241\312\377\201\240\312\377\201\240\312\377\200\240\312" + "\377\200\240\312\377\200\240\312\377\200\240\312\377\211\247\316\377Jn\241" + "\377\40J\207+\0\0\0\0\0\0\0\0\40J\207+Wy\251\377]\207\275\377>o\260\377>o" + "\260\377>o\260\377>o\260\377>o\260\377>o\260\377>o\260\377>o\260\377>o\260" + "\377>o\260\377>o\260\377>o\260\377>o\260\377>o\260\377>o\260\377>o\260\377" + ">o\260\377>o\260\377>o\260\377>o\260\377>o\260\377>o\260\377>o\260\377>o\260" + "\377>o\260\377>o\260\377>o\260\377>o\260\377=o\260\377=o\260\377=o\260\377" + "=o\260\377=o\260\377=o\260\377=o\260\377=o\260\377=o\260\377=o\260\377=o\260" + "\377=o\260\377_\210\275\377Hm\241\377\40J\207+\0\0\0\0\0\0\0\0\40J\207+Tw" + "\251\377]\207\276\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377?r" + "\263\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263" + "\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377" + "?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263" + "\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377" + "?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377]\210\277\377Fl\241\377" + "\40J\207+\0\0\0\0\0\0\0\0\40J\207+Rv\250\377\\\210\300\377At\265\377At\265" + "\377At\265\377At\265\377At\265\377At\265\377At\265\377At\265\377At\265\377" + "At\265\377At\265\377At\265\377At\265\377At\265\377At\265\377At\265\377At\265" + "\377At\265\377At\265\377At\265\377At\265\377At\265\377At\265\377At\265\377" + "At\265\377At\265\377At\265\377At\265\377At\265\377At\265\377At\265\377At\265" + "\377At\265\377At\265\377At\265\377At\265\377At\265\377At\265\377At\265\377" + "At\265\377\\\210\300\377Dj\240\377\40J\207+\0\0\0\0\0\0\0\0\40J\207+Ot\247" + "\377\\\211\302\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271" + "\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377" + "Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271" + "\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377" + "Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271" + "\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377[\211\302\377Bi\240\377\40J\207" + "+\0\0\0\0\0\0\0\0\40J\207+Ls\247\377\\\211\303\377Fy\273\377Fy\273\377Fy\273" + "\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377" + "Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273" + "\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377" + "Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273" + "\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377" + "\\\211\303\377Ah\240\377\40J\207+\0\0\0\0\0\0\0\0\40J\207+Jq\246\377\\\212" + "\305\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277" + "\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377" + "I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277" + "\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377" + "I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277" + "\377I}\277\377I}\277\377I}\277\377[\212\305\377?g\237\377\40J\207+\0\0\0\0" + "\0\0\0\0\40J\207+Jq\246\377\\\212\305\377I}\277\377I}\277\377I}\277\377I}" + "\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277" + "\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377" + "I}\277\377I}\277\377I}\277\377J~\300\377K\177\301\377K\177\301\377K\177\301" + "\377K\177\301\377K\177\301\377K\177\301\377K\177\301\377K\177\301\377K\177" + "\301\377K\177\301\377K\177\301\377K\177\301\377K\177\301\377K\177\301\377" + "K\177\301\377K\177\301\377K\177\301\377K\177\301\377Z\212\307\377=f\237\377" + "\40J\207+\0\0\0\0\0\0\0\0\40J\207+Ip\247\377\\\213\307\377J\177\301\377J\177" + "\301\377J\177\301\377J\177\301\377J\177\301\377J\177\301\377J\177\301\377" + "J\177\301\377J\177\301\377J\177\301\377J\177\301\377J\177\301\377J\177\301" + "\377J\177\301\377J\177\301\377J\177\301\377J\177\301\377J\177\301\377J\177" + "\301\377J\177\301\377J\177\301\377K\200\302\377K\200\302\377K\200\302\377" + "K\200\302\377K\200\302\377K\200\302\377K\200\302\377K\200\302\377K\200\302" + "\377K\200\302\377K\200\302\377K\200\302\377K\200\302\377K\200\302\377K\200" + "\302\377K\200\302\377K\200\302\377K\200\302\377K\200\302\377Z\212\307\377" + "=f\237\377\40J\207+\0\0\0\0\0\0\0\0\40J\207+Ho\247\377e\223\314\377Z\213\310" + "\377Z\213\310\377Z\213\310\377Z\213\310\377Z\213\307\377Z\213\307\377Z\213" + "\307\377Z\213\307\377Z\213\307\377Y\212\307\377Y\212\307\377Y\212\307\377" + "Y\212\307\377Y\212\307\377X\212\307\377X\212\307\377X\212\307\377X\211\307" + "\377X\212\307\377X\212\307\377X\211\307\377X\211\307\377X\211\307\377X\211" + "\307\377X\211\307\377X\211\307\377X\211\307\377X\211\307\377X\211\307\377" + "X\211\307\377W\211\307\377W\211\307\377W\211\307\377W\211\307\377W\211\307" + "\377W\211\307\377V\211\307\377V\211\307\377V\210\307\377V\210\307\377`\217" + "\312\377surface.grad = RR_SURFACE_PYRAMID; + look->surface.grad = RR_SURFACE_MIRROR_HORIZONTAL; look->surface.secondary = RrColorParse(inst, "Yellow"); + look->surface.split_secondary = RrColorParse(inst, "Red"); + look->surface.split_primary = RrColorParse(inst, "Green"); look->surface.primary = RrColorParse(inst, "Blue"); look->surface.interlaced = FALSE; if (ob_display == NULL) { @@ -76,8 +79,21 @@ gint main() return 0; } +#if BIGTEST + int i; + look->surface.pixel_data = g_new(RrPixel32, w*h); + for (i = 0; i < 10000; ++i) { + printf("\r%d", i); + fflush(stdout); + RrRender(look, w, h); + } + exit (0); +#endif + + RrPaint(look, win, w, h); - while (1) { + done = 0; + while (!done) { XNextEvent(ob_display, &report); switch (report.type) { case Expose: @@ -87,8 +103,10 @@ gint main() report.xconfigure.width, report.xconfigure.height); break; + case UnmapNotify: + done = 1; + break; } - } RrAppearanceFree (look); diff --git a/render/theme.c b/render/theme.c index e1cff0cd..ec12dafb 100644 --- a/render/theme.c +++ b/render/theme.c @@ -177,9 +177,14 @@ RrTheme* RrThemeNew(const RrInstance *inst, const gchar *name, theme->osd_font = RrFontOpenDefault(inst); /* load direct dimensions */ - if (!read_int(db, "menu.overlap", &theme->menu_overlap) || - theme->menu_overlap < -100 || theme->menu_overlap > 100) - theme->menu_overlap = 0; + if ((!read_int(db, "menu.overlap.x", &theme->menu_overlap_x) && + !read_int(db, "menu.overlap", &theme->menu_overlap_x)) || + theme->menu_overlap_x < -100 || theme->menu_overlap_x > 100) + theme->menu_overlap_x = 0; + if ((!read_int(db, "menu.overlap.y", &theme->menu_overlap_y) && + !read_int(db, "menu.overlap", &theme->menu_overlap_y)) || + theme->menu_overlap_y < -100 || theme->menu_overlap_y > 100) + theme->menu_overlap_y = 0; if (!read_int(db, "window.handle.width", &theme->handle_height) || theme->handle_height < 0 || theme->handle_height > 100) theme->handle_height = 6; diff --git a/render/theme.h b/render/theme.h index 5b4e785e..9b2d663e 100644 --- a/render/theme.h +++ b/render/theme.h @@ -45,7 +45,8 @@ struct _RrTheme { gint obwidth; /*!< osd border width */ gint cbwidthx; gint cbwidthy; - gint menu_overlap; + gint menu_overlap_x; + gint menu_overlap_y; /* these ones are calculated, not set directly by the theme file */ gint win_font_height; gint menu_title_font_height; diff --git a/tools/xdg-autostart/xdg-autostart b/tools/xdg-autostart/xdg-autostart index daa9117d..95ee5f51 100755 --- a/tools/xdg-autostart/xdg-autostart +++ b/tools/xdg-autostart/xdg-autostart @@ -67,7 +67,7 @@ def main(argv=sys.argv): if list: autofile.list(environments) else: autofile.run(environments) -class AutostartFile(): +class AutostartFile: def __init__(self, path): self.path = path self.filename = os.path.basename(path) @@ -178,7 +178,7 @@ def show_help(): print " --version Show version and copyright information" print print "ENVIRONMENT specifies a list of environments for which to run autostart" - print "applications for. If none are specified, only applications which do not " + print "applications. If none are specified, only applications which do not " print "limit themselves to certain environments will be run." print print "ENVIRONMENT can be one or more of:"