From f0d31a52b7eb0682f4b114c475f9212355720051 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 10 Feb 2008 01:51:34 -0500 Subject: [PATCH 01/24] make white font shadows (negative shadowtint) work right.. this has been busted a long time. thank you nvidia. --- render/font.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/render/font.c b/render/font.c index 356b9c6e..369f262e 100644 --- a/render/font.c +++ b/render/font.c @@ -258,9 +258,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; From 64398a2b5f1497868734b245c1231371dbfb4eb7 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 10 Feb 2008 02:06:46 -0500 Subject: [PATCH 02/24] grammar hammer --- tools/xdg-autostart/xdg-autostart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/xdg-autostart/xdg-autostart b/tools/xdg-autostart/xdg-autostart index daa9117d..58855500 100755 --- a/tools/xdg-autostart/xdg-autostart +++ b/tools/xdg-autostart/xdg-autostart @@ -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:" From be6fd760f1175efdebda78715f5f6c03dac5a9be Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Mon, 11 Feb 2008 09:40:24 -0500 Subject: [PATCH 03/24] using () for a class that doesn't inherit breaks old python --- tools/xdg-autostart/xdg-autostart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/xdg-autostart/xdg-autostart b/tools/xdg-autostart/xdg-autostart index 58855500..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) From 2e96d75364aeaa28e8bc5b7780e055a2e3360956 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Mon, 11 Feb 2008 09:43:31 -0500 Subject: [PATCH 04/24] missing >/dev/null for a which statement --- data/autostart.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/autostart.sh b/data/autostart.sh index ab542841..83e8431e 100644 --- a/data/autostart.sh +++ b/data/autostart.sh @@ -34,6 +34,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 From a161f4e812b2cc0428eef560feb0b71fc8068ffb Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Mon, 11 Feb 2008 13:30:40 -0500 Subject: [PATCH 05/24] apparently gnome has hidden gnome-settings-daemon in libexec, so put that in the autostart.sh --- data/autostart.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/data/autostart.sh b/data/autostart.sh index 83e8431e..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 From eddcfdfdcd8e0238f9570358cd47eca773bff8d3 Mon Sep 17 00:00:00 2001 From: Mikael Magnusson Date: Tue, 12 Feb 2008 19:48:27 +0100 Subject: [PATCH 06/24] Update dutch translation. --- po/nl.po | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) 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 From d5a25283dceb4b0eb7f1dcba1ac15674f6422fbe Mon Sep 17 00:00:00 2001 From: Mikael Magnusson Date: Sat, 9 Feb 2008 11:43:26 +0100 Subject: [PATCH 07/24] Fix a minor issue with lastdesktop right after startup. --- openbox/screen.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/openbox/screen.c b/openbox/screen.c index da490778..5201f78a 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -620,10 +620,15 @@ void screen_set_desktop(guint num, gboolean dofocus) /* If screen_desktop_timeout is true, then we've been on this desktop long enough and we can save it as the last desktop. */ - /* save the "last desktop" as the "old desktop" */ - screen_old_desktop = screen_last_desktop; - /* save the desktop we're coming from as the "last desktop" */ - screen_last_desktop = previous; + if (screen_last_desktop == previous) + /* this is the startup state only */ + screen_old_desktop = screen_desktop; + else { + /* save the "last desktop" as the "old desktop" */ + screen_old_desktop = screen_last_desktop; + /* save the desktop we're coming from as the "last desktop" */ + screen_last_desktop = previous; + } } else { /* If screen_desktop_timeout is false, then we just got to this desktop From c907f5af4ad16b1b0ddcf9a17e1a196a079dd09a Mon Sep 17 00:00:00 2001 From: Mikael Magnusson Date: Fri, 8 Feb 2008 14:00:38 +0100 Subject: [PATCH 08/24] Wrap the focus action in actions_client_move. When alt-tabbing to iconified audacious and the playlist or eq window pops up under the cursor, they "stole" focus from the main window. --- openbox/actions/focus.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openbox/actions/focus.c b/openbox/actions/focus.c index 67c1479f..0ef9d268 100644 --- a/openbox/actions/focus.c +++ b/openbox/actions/focus.c @@ -55,7 +55,9 @@ static gboolean run_func(ObActionsData *data, gpointer options) (data->context != OB_FRAME_CONTEXT_CLIENT && data->context != OB_FRAME_CONTEXT_FRAME)) { + actions_client_move(data, TRUE); client_activate(data->client, o->here, FALSE, FALSE, TRUE); + actions_client_move(data, FALSE); } } else if (data->context == OB_FRAME_CONTEXT_DESKTOP) { /* focus action on the root window. make keybindings work for this From 38bef0a38bf907a54c193ab063b4830788398edc Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sat, 9 Feb 2008 18:48:56 -0500 Subject: [PATCH 09/24] Make a pending ReplayPointer happen before moving/showing/hiding a window in an action. Commit c907f5af4ad16b1 broke kdesktop again, so we have to fix it at an even finer level. --- openbox/actions.c | 19 +------------------ openbox/client.c | 12 ++++++++++++ openbox/mouse.c | 30 +++++++++++++++++++++++------- openbox/mouse.h | 5 +++++ 4 files changed, 41 insertions(+), 25 deletions(-) diff --git a/openbox/actions.c b/openbox/actions.c index b7ba5b44..90a7719b 100644 --- a/openbox/actions.c +++ b/openbox/actions.c @@ -36,7 +36,6 @@ static ObActionsAct* actions_build_act_from_string(const gchar *name); static ObActionsAct *interactive_act = NULL; static guint interactive_initial_state = 0; -static gboolean replay_pointer = FALSE; struct _ObActionsDefinition { guint ref; @@ -224,16 +223,6 @@ static void actions_setup_data(ObActionsData *data, data->client = client; } -void actions_set_need_pointer_replay_before_move(gboolean replay) -{ - replay_pointer = replay; -} - -gboolean actions_get_need_pointer_replay_before_move() -{ - return replay_pointer; -} - void actions_run_acts(GSList *acts, ObUserAction uact, guint state, @@ -346,14 +335,8 @@ gboolean actions_interactive_input_event(XEvent *e) void actions_client_move(ObActionsData *data, gboolean start) { static gulong ignore_start = 0; - if (start) { + if (start) ignore_start = event_start_ignore_all_enters(); - if (replay_pointer) { - /* replay the pointer event before any windows move */ - XAllowEvents(ob_display, ReplayPointer, event_curtime); - replay_pointer = FALSE; - } - } else if (config_focus_follow && data->context != OB_FRAME_CONTEXT_CLIENT) { diff --git a/openbox/client.c b/openbox/client.c index e7290ca5..43a2f551 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -2572,6 +2572,10 @@ gboolean client_show(ObClient *self) gboolean show = FALSE; if (client_should_show(self)) { + /* replay pending pointer event before showing the window, in case it + should be going to something under the window */ + mouse_replay_pointer(); + frame_show(self->frame); show = TRUE; @@ -2613,6 +2617,10 @@ gboolean client_hide(ObClient *self) so trying to ignore them is futile in case 3 anyways */ + /* replay pending pointer event before hiding the window, in case it + should be going to the window */ + mouse_replay_pointer(); + frame_hide(self->frame); hide = TRUE; @@ -3028,6 +3036,10 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h, if (!user) ignore_start = event_start_ignore_all_enters(); + /* replay pending pointer event before move the window, in case it + would change what window gets the event */ + mouse_replay_pointer(); + frame_adjust_area(self->frame, fmoved, fresized, FALSE); if (!user) diff --git a/openbox/mouse.c b/openbox/mouse.c index 711317ec..6d532518 100644 --- a/openbox/mouse.c +++ b/openbox/mouse.c @@ -46,6 +46,9 @@ 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 + to send it to other applications */ +static gboolean replay_pointer_needed; ObFrameContext mouse_button_frame_context(ObFrameContext context, guint button, @@ -200,6 +203,15 @@ static gboolean fire_binding(ObMouseAction a, ObFrameContext context, return TRUE; } +void mouse_replay_pointer() +{ + if (replay_pointer_needed) { + /* replay the pointer event before any windows move */ + XAllowEvents(ob_display, ReplayPointer, event_curtime); + replay_pointer_needed = FALSE; + } +} + void mouse_event(ObClient *client, XEvent *e) { static Time ltime; @@ -229,12 +241,17 @@ void mouse_event(ObClient *client, XEvent *e) XAllowEvents with ReplayPointer at some point, to send the event through to the client. when this happens though depends. if windows are going to be moved on screen, then the click will end - up going somewhere wrong, so have the action system perform the - ReplayPointer for us if that is the case. */ + up going somewhere wrong, set that we need it, and if nothing + else causes the replay pointer to be run, then we will do it + after all the actions are finished. + + (We do it after all the actions because FocusIn interrupts + dragging for kdesktop, so if we send the button event now, and + then they get a focus event after, it breaks. Instead, wait to send + the button press until after the actions when possible.) + */ if (CLIENT_CONTEXT(context, client)) - actions_set_need_pointer_replay_before_move(TRUE); - else - actions_set_need_pointer_replay_before_move(FALSE); + replay_pointer_needed = TRUE; fire_binding(OB_MOUSE_ACTION_PRESS, context, client, e->xbutton.state, @@ -248,8 +265,7 @@ void mouse_event(ObClient *client, XEvent *e) /* replay the pointer event if it hasn't been replayed yet (i.e. no windows were moved) */ - if (actions_get_need_pointer_replay_before_move()) - XAllowEvents(ob_display, ReplayPointer, event_curtime); + mouse_replay_pointer(); /* in the client context, we won't get a button release because of the way it is grabbed, so just fake one */ diff --git a/openbox/mouse.h b/openbox/mouse.h index 44d563a3..a862fe5b 100644 --- a/openbox/mouse.h +++ b/openbox/mouse.h @@ -40,4 +40,9 @@ void mouse_grab_for_client(struct _ObClient *client, gboolean grab); ObFrameContext mouse_button_frame_context(ObFrameContext context, guint button, guint state); +/*! If a replay pointer is needed, then do it. Call this when windows are + going to be moving/appearing/disappearing, so that you know the mouse click + will go to the right window */ +void mouse_replay_pointer(); + #endif From 83c739df9117cde1982a1fec4487ea1a3eb6ebf0 Mon Sep 17 00:00:00 2001 From: Mikael Magnusson Date: Sun, 10 Feb 2008 07:54:21 +0100 Subject: [PATCH 10/24] typo in comment --- openbox/mouse.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openbox/mouse.c b/openbox/mouse.c index 6d532518..f2e13cdf 100644 --- a/openbox/mouse.c +++ b/openbox/mouse.c @@ -46,7 +46,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; From ed81992aeaf5b81aa9c4ee5e1491c43d7aa8862e Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 10 Feb 2008 15:04:26 -0500 Subject: [PATCH 11/24] make rendertest exit cleanly when it is unmapped (iconify/desktopchange) --- render/test.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/render/test.c b/render/test.c index 307e2629..05416a3f 100644 --- a/render/test.c +++ b/render/test.c @@ -44,6 +44,7 @@ gint main() Window win; RrInstance *inst; RrAppearance *look; + int done; Window root; XEvent report; @@ -67,8 +68,10 @@ gint main() inst = RrInstanceNew(ob_display, ob_screen); look = RrAppearanceNew(inst, 0); - look->surface.grad = RR_SURFACE_PYRAMID; + look->surface.grad = RR_SURFACE_SPLIT_VERTICAL; 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) { @@ -77,7 +80,8 @@ gint main() } RrPaint(look, win, w, h); - while (1) { + done = 0; + while (!done) { XNextEvent(ob_display, &report); switch (report.type) { case Expose: @@ -87,8 +91,10 @@ gint main() report.xconfigure.width, report.xconfigure.height); break; + case UnmapNotify: + done = 1; + break; } - } RrAppearanceFree (look); From 18a35e04914bf8d108cf7a9d46970f13620ef534 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 10 Feb 2008 15:06:38 -0500 Subject: [PATCH 12/24] add --enable-gprof option for configure --- m4/openbox.m4 | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/m4/openbox.m4 b/m4/openbox.m4 index 29114360..5c3aeec8 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], From 1d00d9947067da76ac4d8d0a6b9ef2c28e73349e Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 10 Feb 2008 16:49:16 -0500 Subject: [PATCH 13/24] use memcpy's to make splitvertical gradient much faster - using log n memcpy's is much quicker than setting a pointer value n times Here are some profiling results. splitvertical1 is the original code, splitvertical2 is some slight improvements in locality for it, and splitvertical3 is the new O(log n) memcpy code % cumulative self self total time seconds seconds calls ms/call ms/call name 49.44 0.88 0.88 1063 0.83 0.83 gradient_splitvertical1 47.19 1.72 0.84 1063 0.79 0.79 gradient_splitvertical2 2.81 1.77 0.05 1063 0.05 0.05 gradient_splitvertical3 i also tested this with 'time' to draw 1000 gradients, and the new code used approximately half the user time, and finished 10 seconds quicker. so yeah, it's magical and works well. --- render/gradient.c | 80 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 60 insertions(+), 20 deletions(-) diff --git a/render/gradient.c b/render/gradient.c index 6439b301..bbd2a5c9 100644 --- a/render/gradient.c +++ b/render/gradient.c @@ -425,8 +425,7 @@ static void gradient_splitvertical(RrAppearance *a, gint w, gint h) { gint x, y1, y2, y3; RrSurface *sf = &a->surface; - RrPixel32 *data = sf->pixel_data; - RrPixel32 current; + RrPixel32 *data, *start; gint y1sz, y2sz, y3sz; VARS(y1); @@ -455,29 +454,70 @@ 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 */ + + start = sf->pixel_data; + data = start + 1; + + for (y1 = h; y1 > 0; --y1) { + /* for really small things, just copy ourselves */ + if (w < 8) { + for (x = w-1; x > 0; --x) + *(data++) = *start; + } + /* for >= 8, then use O(log n) memcpy's... */ + else { + gint len = 4; + gint lenbytes = 4 * sizeof(RrPixel32); + + /* 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) + *(data++) = *start; + + for (x = w - 4; x > 0;) { + memcpy(data, start, lenbytes); + x -= len; + data += len; + len <<= 1; + lenbytes <<= 1; + if (len > x) { + len = x; + lenbytes = x * sizeof(RrPixel32); + } + } + } + + start += w; + ++data; + } } static void gradient_horizontal(RrSurface *sf, gint w, gint h) @@ -551,13 +591,13 @@ static void gradient_vertical(RrSurface *sf, gint w, gint h) for (y = h - 1; y > 0; --y) { /* 0 -> h-1 */ current = COLOR(y); - for (x = w - 1; x >= 0; --x) /* 0 -> w */ + for (x = w; x > 0; --x) /* 0 -> w */ *(data++) = current; NEXT(y); } current = COLOR(y); - for (x = w - 1; x >= 0; --x) /* 0 -> w */ + for (x = w; x > 0; --x) /* 0 -> w */ *(data++) = current; } From 3611c8210cc632c2a21c67ccbf40857342c10371 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 10 Feb 2008 17:06:18 -0500 Subject: [PATCH 14/24] use memcpy's to speed up vertical gradients too. split the fancy memcpy() code out into the repeat_pixel function. --- render/gradient.c | 115 ++++++++++++++++++++++++++-------------------- 1 file changed, 66 insertions(+), 49 deletions(-) diff --git a/render/gradient.c b/render/gradient.c index bbd2a5c9..d1d90e41 100644 --- a/render/gradient.c +++ b/render/gradient.c @@ -197,6 +197,52 @@ 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 { + gint len = 4; + gint lenbytes = 4 * sizeof(RrPixel32); + + /* 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; + + for (x = w - 4; x > 0;) { + memcpy(dest, start, lenbytes); + x -= len; + dest += len; + len <<= 1; + lenbytes <<= 1; + if (len > x) { + len = x; + lenbytes = x * sizeof(RrPixel32); + } + } + } +} + static void gradient_parentrelative(RrAppearance *a, gint w, gint h) { RrPixel32 *source, *dest; @@ -423,9 +469,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, *start; + RrPixel32 *data; gint y1sz, y2sz, y3sz; VARS(y1); @@ -479,44 +525,10 @@ static void gradient_splitvertical(RrAppearance *a, gint w, gint h) *data = COLOR(y3); /* copy the first pixels into the whole rows */ - - start = sf->pixel_data; - data = start + 1; - + data = sf->pixel_data; for (y1 = h; y1 > 0; --y1) { - /* for really small things, just copy ourselves */ - if (w < 8) { - for (x = w-1; x > 0; --x) - *(data++) = *start; - } - /* for >= 8, then use O(log n) memcpy's... */ - else { - gint len = 4; - gint lenbytes = 4 * sizeof(RrPixel32); - - /* 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) - *(data++) = *start; - - for (x = w - 4; x > 0;) { - memcpy(data, start, lenbytes); - x -= len; - data += len; - len <<= 1; - lenbytes <<= 1; - if (len > x) { - len = x; - lenbytes = x * sizeof(RrPixel32); - } - } - } - - start += w; - ++data; + repeat_pixel(data, w); + data += w; } } @@ -582,23 +594,28 @@ static void gradient_mirrorhorizontal(RrSurface *sf, gint w, gint h) 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; 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; 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; + } } From 9c729986844a65545f7736d053359ad24d2df120 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 10 Feb 2008 18:08:05 -0500 Subject: [PATCH 15/24] a small optimization for the vertical gradients, and use the same log(n) strategy to use less memcpy's for filling out the horizontal gradients --- render/gradient.c | 79 +++++++++++++++++++++++++++++++++++------------ render/test.c | 14 ++++++++- 2 files changed, 73 insertions(+), 20 deletions(-) diff --git a/render/gradient.c b/render/gradient.c index d1d90e41..d7401a98 100644 --- a/render/gradient.c +++ b/render/gradient.c @@ -218,8 +218,8 @@ static inline void repeat_pixel(RrPixel32 *start, gint w) /* for >= 8, then use O(log n) memcpy's... */ else { - gint len = 4; - gint lenbytes = 4 * sizeof(RrPixel32); + 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 @@ -229,16 +229,38 @@ static inline void repeat_pixel(RrPixel32 *start, gint w) for (x = 3; x > 0; --x) *(dest++) = *start; - for (x = w - 4; x > 0;) { - memcpy(dest, start, lenbytes); - x -= len; - dest += len; - len <<= 1; + /* 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 (len > x) { - len = x; - lenbytes = x * sizeof(RrPixel32); - } + if (lenbytes > x) + lenbytes = x; } } } @@ -534,12 +556,14 @@ static void gradient_splitvertical(RrAppearance *a, gint w, gint h) 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); @@ -549,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 */ @@ -586,9 +620,16 @@ 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; } } diff --git a/render/test.c b/render/test.c index 05416a3f..36c962da 100644 --- a/render/test.c +++ b/render/test.c @@ -68,7 +68,7 @@ gint main() inst = RrInstanceNew(ob_display, ob_screen); look = RrAppearanceNew(inst, 0); - look->surface.grad = RR_SURFACE_SPLIT_VERTICAL; + 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"); @@ -79,6 +79,18 @@ 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); done = 0; while (!done) { From 91a1b089097cb3ba66f779df80fa7a51490aa785 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 10 Feb 2008 18:30:07 -0500 Subject: [PATCH 16/24] force the resize popup to be on-screen (not negative position) --- openbox/config.c | 5 +++++ openbox/geom.h | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/openbox/config.c b/openbox/config.c index 673af4bd..e1954a79 100644 --- a/openbox/config.c +++ b/openbox/config.c @@ -675,6 +675,11 @@ static void parse_resize(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, if ((n2 = parse_find_node("y", n->children))) config_parse_gravity_coord(doc, 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/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; From b92cb6a08a1dc560e439d2a01cfbb32f50130324 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 10 Feb 2008 18:41:11 -0500 Subject: [PATCH 17/24] remove an XXX comment, the sanity check seems to have worked out fine. --- render/image.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/render/image.c b/render/image.c index 2eb043a2..fa630b74 100644 --- a/render/image.c +++ b/render/image.c @@ -126,9 +126,6 @@ void RrImageDraw(RrPixel32 *target, RrTextureRGBA *rgba, dw = (gint)(dh * ((gdouble)sw / sh)); } - if (!(dw && dh)) - return; /* XXX sanity check */ - if (sw != dw || sh != dh) { /*if (!(rgba->cache && dw == rgba->cwidth && dh == rgba->cheight))*/ { g_free(rgba->cache); From 6bda8c29038649f4bd4c54ce011473b1344bb291 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Mon, 11 Feb 2008 01:15:06 -0500 Subject: [PATCH 18/24] speed up the pyramid gradient using memcpy's. also make it not crash for 1px high textures. here are some sample profiling results. pyramid2 is the new code % cumulative self self total time seconds seconds calls ms/call ms/call name 58.78 1.54 1.54 255 6.04 6.04 gradient_pyramid1 40.46 2.60 1.06 255 4.16 4.16 gradient_pyramid2 54.88 2.25 2.25 504 4.46 4.46 gradient_pyramid1 44.88 4.09 1.84 504 3.65 3.65 gradient_pyramid2 --- render/gradient.c | 87 ++++++++++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 39 deletions(-) diff --git a/render/gradient.c b/render/gradient.c index d7401a98..fc75047f 100644 --- a/render/gradient.c +++ b/render/gradient.c @@ -754,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); @@ -771,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; } - From 8186a81fe0095a46c2a65e252268f19d5798095a Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Mon, 11 Feb 2008 22:10:21 -0500 Subject: [PATCH 19/24] split menu overlap into x and y components --- openbox/menuframe.c | 11 ++++++----- render/theme.c | 11 ++++++++--- render/theme.h | 3 ++- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/openbox/menuframe.c b/openbox/menuframe.c index fb9b6c5b..3bbf1be2 100644 --- a/openbox/menuframe.c +++ b/openbox/menuframe.c @@ -249,23 +249,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/render/theme.c b/render/theme.c index 9fc1f1db..b1b15ff2 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 2c35284f..3f87ce93 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; From c0333e9452330c6b7b44aa81bbccc7460fd50e14 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Mon, 11 Feb 2008 22:11:46 -0500 Subject: [PATCH 20/24] _net_active_window shouldn't change desktop, is the general policy concensus. --- openbox/event.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openbox/event.c b/openbox/event.c index 7e2766f0..1b3c1c23 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -1355,7 +1355,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\n"); - 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 == prop_atoms.net_wm_moveresize) { From 8f5540f76dec892ce5e632bef55bf989c55dc71a Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Wed, 13 Feb 2008 00:37:03 -0500 Subject: [PATCH 21/24] turn the new openbox.png into the default icon.h --- render/icon.h | 795 ++++++++++++++++++++++++-------------------------- 1 file changed, 388 insertions(+), 407 deletions(-) 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\377 Date: Wed, 13 Feb 2008 10:19:52 -0500 Subject: [PATCH 22/24] don't force fake enter events while there is a grab on the pointer. this fixes focus switching during a move/resize from mouse-button-bound actions. --- openbox/actions.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/openbox/actions.c b/openbox/actions.c index 90a7719b..32b3d274 100644 --- a/openbox/actions.c +++ b/openbox/actions.c @@ -347,8 +347,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"); From 27177e498b737cc351ce446f0b89010bcf29bfcd Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Wed, 13 Feb 2008 20:53:25 -0500 Subject: [PATCH 23/24] let you match per-app settings based on the window type --- data/rc.xml | 7 ++++++- data/rc.xsd | 15 ++++++++++++++- openbox/client.c | 6 ++++-- openbox/config.c | 28 +++++++++++++++++++++++++--- openbox/config.h | 2 ++ 5 files changed, 51 insertions(+), 7 deletions(-) diff --git a/data/rc.xml b/data/rc.xml index 98daf274..ebe2f310 100644 --- a/data/rc.xml +++ b/data/rc.xml @@ -642,7 +642,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. @@ -651,6 +653,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/openbox/client.c b/openbox/client.c index 43a2f551..371eb087 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -844,13 +844,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\n", app->name); diff --git a/openbox/config.c b/openbox/config.c index e1954a79..c82e3b3a 100644 --- a/openbox/config.c +++ b/openbox/config.c @@ -101,6 +101,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; @@ -124,6 +125,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); @@ -193,15 +195,16 @@ static void parse_per_app_settings(ObParseInst *inst, xmlDocPtr doc, xmlNodePtr node, gpointer data) { xmlNodePtr app = parse_find_node("application", node->children); - 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 = parse_attr_string("class", app, &class); name_set = parse_attr_string("name", app, &name); + type_set = parse_attr_string("type", app, &type); if (class_set || name_set) { xmlNodePtr n, c; ObAppSettings *settings = config_create_app_settings();; @@ -212,6 +215,25 @@ static void parse_per_app_settings(ObParseInst *inst, xmlDocPtr doc, 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 (parse_attr_string("role", app, &role)) settings->role = g_pattern_spec_new(role); diff --git a/openbox/config.h b/openbox/config.h index 3fd1b879..62b92473 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" @@ -38,6 +39,7 @@ struct _ObAppSettings GPatternSpec *class; GPatternSpec *name; GPatternSpec *role; + ObClientType type; GravityPoint position; gboolean pos_given; From f1f61ff703db72cc1db7f834c9cb45616d55da10 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Wed, 13 Feb 2008 21:11:05 -0500 Subject: [PATCH 24/24] update the indent style guidelines --- HACKING | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 - -