commit dabb3cbdf22467dfa5211200fc922d6bfc6b7eb0
Author: Albrecht Schlosser <AlbrechtS.fltk@online.de>
Date:   Sat Feb 11 16:35:53 2017 +0100

    Add 'oxy' scheme (created by Kdiman).

diff --git a/FL/Enumerations.H b/FL/Enumerations.H
index c31a9a6..fa751f2 100644
--- a/FL/Enumerations.H
+++ b/FL/Enumerations.H
@@ -629,6 +629,18 @@ enum Fl_Boxtype { // boxtypes (if you change these you must fix fl_boxtype.cxx):
   _FL_GLEAM_THIN_DOWN_BOX,	///< gleam version of FL_THIN_DOWN_BOX
   _FL_GLEAM_ROUND_UP_BOX,	///< gleam version of FL_ROUND_UP_BOX
   _FL_GLEAM_ROUND_DOWN_BOX,	///< gleam version of FL_ROUND_DOWN_BOX
+  _FL_OXY_UP_BOX,		///< oxy version of FL_OXY_UP_BOX
+  _FL_OXY_DOWN_BOX,		///< oxy version of FL_OXY_DOWN_BOX
+  _FL_OXY_UP_FRAME,		///< oxy version of FL_OXY_UP_FRAME
+  _FL_OXY_DOWN_FRAME,		///< oxy version of FL_OXY_DOWN_FRAME
+  _FL_OXY_THIN_UP_BOX,		///< oxy version of FL_OXY_THIN_UP_BOX
+  _FL_OXY_THIN_DOWN_BOX,	///< oxy version of FL_OXY_THIN_DOWN_BOX
+  _FL_OXY_THIN_UP_FRAME,	///< oxy version of FL_OXY_THIN_UP_FRAME
+  _FL_OXY_THIN_DOWN_FRAME,	///< oxy version of FL_OXY_THIN_DOWN_FRAME
+  _FL_OXY_ROUND_UP_BOX,		///< oxy version of FL_OXY_ROUND_UP_BOX
+  _FL_OXY_ROUND_DOWN_BOX,	///< oxy version of FL_OXY_ROUND_DOWN_BOX
+  _FL_OXY_BUTTON_UP_BOX,	///< oxy version of FL_OXY_BUTTON_UP_BOX
+  _FL_OXY_BUTTON_DOWN_BOX,	///< oxy version of FL_OXY_BUTTON_DOWN_BOX
   FL_FREE_BOXTYPE		///< the first free box type for creation of new box types
 };
 extern FL_EXPORT Fl_Boxtype fl_define_FL_ROUND_UP_BOX();
@@ -685,6 +697,20 @@ extern FL_EXPORT Fl_Boxtype fl_define_FL_GLEAM_UP_BOX();
 #define FL_GLEAM_ROUND_UP_BOX (Fl_Boxtype)(fl_define_FL_GLEAM_UP_BOX()+6)
 #define FL_GLEAM_ROUND_DOWN_BOX (Fl_Boxtype)(fl_define_FL_GLEAM_UP_BOX()+7)
 
+extern FL_EXPORT Fl_Boxtype fl_define_FL_OXY_UP_BOX();
+#define FL_OXY_UP_BOX fl_define_FL_OXY_UP_BOX()
+#define FL_OXY_DOWN_BOX (Fl_Boxtype)(fl_define_FL_OXY_UP_BOX()+1)
+#define FL_OXY_UP_FRAME (Fl_Boxtype)(fl_define_FL_OXY_UP_BOX()+2)
+#define FL_OXY_DOWN_FRAME (Fl_Boxtype)(fl_define_FL_OXY_UP_BOX()+3)
+#define FL_OXY_THIN_UP_BOX (Fl_Boxtype)(fl_define_FL_OXY_UP_BOX()+4)
+#define FL_OXY_THIN_DOWN_BOX (Fl_Boxtype)(fl_define_FL_OXY_UP_BOX()+5)
+#define FL_OXY_THIN_UP_FRAME (Fl_Boxtype)(fl_define_FL_OXY_UP_BOX()+6)
+#define FL_OXY_THIN_DOWN_FRAME (Fl_Boxtype)(fl_define_FL_OXY_UP_BOX()+7)
+#define FL_OXY_ROUND_UP_BOX (Fl_Boxtype)(fl_define_FL_OXY_UP_BOX()+8)
+#define FL_OXY_ROUND_DOWN_BOX (Fl_Boxtype)(fl_define_FL_OXY_UP_BOX()+9)
+#define FL_OXY_BUTTON_UP_BOX (Fl_Boxtype)(fl_define_FL_OXY_UP_BOX()+10)
+#define FL_OXY_BUTTON_DOWN_BOX (Fl_Boxtype)(fl_define_FL_OXY_UP_BOX()+11)
+
 // conversions of box types to other boxtypes:
 /**
   Get the filled version of a frame.
diff --git a/fluid/Fl_Widget_Type.cxx b/fluid/Fl_Widget_Type.cxx
index 5552a25..e961e93 100644
--- a/fluid/Fl_Widget_Type.cxx
+++ b/fluid/Fl_Widget_Type.cxx
@@ -690,6 +690,14 @@ Fl_Menu_Item boxmenu[] = {
 {"GLEAM_THIN_DOWN_BOX",0,0,(void *)FL_GLEAM_THIN_DOWN_BOX},
 {"GLEAM_ROUND_UP_BOX",0,0,(void *)FL_GLEAM_ROUND_UP_BOX},
 {"GLEAM_ROUND_DOWN_BOX",0,0,(void *)FL_GLEAM_ROUND_DOWN_BOX},
+{"OXY_UP_BOX",0,0,(void *)FL_OXY_UP_BOX},
+{"OXY_DOWN_BOX",0,0,(void *)FL_OXY_DOWN_BOX},
+{"OXY_THIN_UP_BOX",0,0,(void *)FL_OXY_THIN_UP_BOX},
+{"OXY_THIN_DOWN_BOX",0,0,(void *)FL_OXY_THIN_DOWN_BOX},
+{"OXY_ROUND_UP_BOX",0,0,(void *)FL_OXY_ROUND_UP_BOX},
+{"OXY_ROUND_DOWN_BOX",0,0,(void *)FL_OXY_ROUND_DOWN_BOX},
+{"OXY_BUTTON_UP_BOX",0,0,(void *)FL_OXY_BUTTON_UP_BOX},
+{"OXY_BUTTON_DOWN_BOX",0,0,(void *)FL_OXY_BUTTON_DOWN_BOX},
 {0},
 {"frames",0,0,0,FL_SUBMENU},
 {"UP_FRAME",0,0,(void *)FL_UP_FRAME},
@@ -710,6 +718,10 @@ Fl_Menu_Item boxmenu[] = {
 {"GTK_THIN_DOWN_FRAME",0,0,(void *)FL_GTK_THIN_DOWN_FRAME},
 {"GLEAM_UP_FRAME",0,0,(void *)FL_GLEAM_UP_FRAME},
 {"GLEAM_DOWN_FRAME",0,0,(void *)FL_GLEAM_DOWN_FRAME},
+{"OXY_UP_FRAME",0,0,(void *)FL_OXY_UP_FRAME},
+{"OXY_DOWN_FRAME",0,0,(void *)FL_OXY_DOWN_FRAME},
+{"OXY_THIN_UP_FRAME",0,0,(void *)FL_OXY_THIN_UP_FRAME},
+{"OXY_THIN_DOWN_FRAME",0,0,(void *)FL_OXY_THIN_DOWN_FRAME},
 {0},
 {0}};
 
diff --git a/fluid/alignment_panel.cxx b/fluid/alignment_panel.cxx
index 44fcfca..158cc26 100644
--- a/fluid/alignment_panel.cxx
+++ b/fluid/alignment_panel.cxx
@@ -154,6 +154,7 @@ Fl_Menu_Item menu_scheme_choice[] = {
  {"Plastic", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
  {"GTK+", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
  {"Gleam", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"Oxy", 0,  0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
  {0,0,0,0,0,0,0,0,0}
 };
 
diff --git a/fluid/alignment_panel.fl b/fluid/alignment_panel.fl
index 9eba25b..3aaff54 100644
--- a/fluid/alignment_panel.fl
+++ b/fluid/alignment_panel.fl
@@ -199,6 +199,10 @@ Function {make_settings_window()} {} {
         label Gleam
         xywh {20 20 35 25}
       }
+      MenuItem {} {
+        label {Oxy}
+        xywh {20 20 35 25}
+      }
     }
     Fl_Group {} {open
       xywh {20 43 330 161} labelfont 1 align 0
diff --git a/fluid/fluid.cxx b/fluid/fluid.cxx
index 8820da1..f6786e4 100644
--- a/fluid/fluid.cxx
+++ b/fluid/fluid.cxx
@@ -1160,6 +1160,9 @@ void scheme_cb(Fl_Choice *, void *) {
     case 4 : // Gleam
       Fl::scheme("gleam");
       break;
+    case 5 : // Oxy
+      Fl::scheme("oxy");
+      break;
   }
 
   fluid_prefs.set("scheme", scheme_choice->value());
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index b338461..df3439d 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -124,6 +124,7 @@ set (CPPFILES
   fl_oval_box.cxx
   fl_overlay.cxx
   fl_overlay_visual.cxx
+  fl_oxy.cxx
   fl_plastic.cxx
   fl_read_image.cxx
   fl_rect.cxx
diff --git a/src/Fl_Browser.cxx b/src/Fl_Browser.cxx
index d0a9b99..4dc3ef9 100644
--- a/src/Fl_Browser.cxx
+++ b/src/Fl_Browser.cxx
@@ -363,6 +363,7 @@ void Fl_Browser::data(int line, void* d) {
 int Fl_Browser::item_height(void *item) const {
   FL_BLINE* l = (FL_BLINE*)item;
   if (l->flags & NOTDISPLAYED) return 0;
+  bool flag_oxy = Fl::is_scheme("oxy");
 
   int hmax = 2; // use 2 to insure we don't return a zero!
 
@@ -370,6 +371,7 @@ int Fl_Browser::item_height(void *item) const {
     // For blank lines set the height to exactly 1 line!
     fl_font(textfont(), textsize());
     int hh = fl_height();
+    if (flag_oxy) hh += 2;
     if (hh > hmax) hmax = hh;
   } else {
     const int* i = column_widths();
@@ -400,6 +402,7 @@ int Fl_Browser::item_height(void *item) const {
       else str = NULL;
       if((!str && *ptr) || (str && ptr < str)) {
 	fl_font(font, tsize); int hh = fl_height();
+    if (flag_oxy) hh += 2;
 	if (hh > hmax) hmax = hh;
       }
       if (!str || !*str) break;
diff --git a/src/Fl_Browser_.cxx b/src/Fl_Browser_.cxx
index 84c12fe..608fd03 100644
--- a/src/Fl_Browser_.cxx
+++ b/src/Fl_Browser_.cxx
@@ -395,22 +395,28 @@ J1:
   // if not a full redraw or if it is selected:
   void* l = top();
   int yy = -offset_;
+  bool flag_oxy = Fl::is_scheme("oxy");
   for (; l && yy < H; l = item_next(l)) {
     int hh = item_height(l);
     if (hh <= 0) continue;
     if ((damage()&(FL_DAMAGE_SCROLL|FL_DAMAGE_ALL)) || l == redraw1 || l == redraw2) {
       if (item_selected(l)) {
-	fl_color(active_r() ? selection_color() : fl_inactive(selection_color()));
-	fl_rectf(X, yy+Y, W, hh);
+	if (flag_oxy) draw_box(FL_UP_BOX, X, yy+Y, W, hh, selection_color());
+	else {
+	  fl_color(active_r() ? selection_color() : fl_inactive(selection_color()));
+	  fl_rectf(X, yy+Y, W, hh);
+	}
       } else if (!(damage()&FL_DAMAGE_ALL)) {
 	fl_push_clip(X, yy+Y, W, hh);
 	draw_box(box() ? box() : FL_DOWN_BOX, x(), y(), w(), h(), color());
 	fl_pop_clip();
       }
+      if (flag_oxy) fl_push_clip(X+4, yy+Y, W-8, hh);
       item_draw(l, X-hposition_, yy+Y, W+hposition_, hh);
+      if (flag_oxy) fl_pop_clip();
       if (l == selection_ && Fl::focus() == this) {
-	draw_box(FL_BORDER_FRAME, X, yy+Y, W, hh, color());
-	draw_focus(FL_NO_BOX, X, yy+Y, W+1, hh+1);
+	if (!flag_oxy) draw_box(FL_BORDER_FRAME, X, yy+Y, W, hh, color());
+	draw_focus(flag_oxy?FL_UP_BOX:FL_NO_BOX, X, yy+Y, flag_oxy?W:W+1, hh+1);
       }
       int ww = item_width(l);
       if (ww > max_width) {max_width = ww; max_width_item = l;}
diff --git a/src/Fl_Check_Browser.cxx b/src/Fl_Check_Browser.cxx
index c08f514..bca8ba8 100644
--- a/src/Fl_Check_Browser.cxx
+++ b/src/Fl_Check_Browser.cxx
@@ -98,17 +98,24 @@ void *Fl_Check_Browser::item_prev(void *l) const {
 }
 
 int Fl_Check_Browser::item_height(void *) const {
-	return textsize() + 2;
+	if (Fl::is_scheme("oxy")) {
+	  fl_font(textfont(), textsize());
+	  return fl_height() + 2;
+	}
+	else
+	  return textsize() + 2;
 }
 
 #define CHECK_SIZE (textsize()-2)
 
 int Fl_Check_Browser::item_width(void *v) const {
+	int dx = Fl::is_scheme("oxy") ? 13 : 8;
 	fl_font(textfont(), textsize());
-	return int(fl_width(((cb_item *)v)->text)) + CHECK_SIZE + 8;
+	return int(fl_width(((cb_item *)v)->text)) + CHECK_SIZE + dx;
 }
 
 void Fl_Check_Browser::item_draw(void *v, int X, int Y, int, int) const {
+	bool flag_oxy = Fl::is_scheme("oxy");
 	cb_item *i = (cb_item *)v;
 	char *s = i->text;
 	int tsize = textsize();
@@ -116,15 +123,26 @@ void Fl_Check_Browser::item_draw(void *v, int X, int Y, int, int) const {
 	int cy = Y + (tsize + 1 - CHECK_SIZE) / 2;
 	X += 2;
 
-	fl_color(active_r() ? FL_FOREGROUND_COLOR : fl_inactive(FL_FOREGROUND_COLOR));
-	fl_loop(X, cy, X, cy + CHECK_SIZE,
-	        X + CHECK_SIZE, cy + CHECK_SIZE, X + CHECK_SIZE, cy);
+	if (flag_oxy) {
+	  fl_draw_box(FL_DOWN_BOX, X+2, cy, 15, 15, color());
+	  fl_color(active_r() ? FL_FOREGROUND_COLOR : fl_inactive(FL_FOREGROUND_COLOR));
+	}
+	else {
+	  fl_color(active_r() ? FL_FOREGROUND_COLOR : fl_inactive(FL_FOREGROUND_COLOR));
+	  fl_loop(X, cy, X, cy + CHECK_SIZE,
+		  X + CHECK_SIZE, cy + CHECK_SIZE, X + CHECK_SIZE, cy);
+	}
+
 	if (i->checked) {
 	  int tx = X + 3;
 	  int tw = CHECK_SIZE - 4;
 	  int d1 = tw/3;
 	  int d2 = tw-d1;
 	  int ty = cy + (CHECK_SIZE+d2)/2-d1-2;
+
+	  if (flag_oxy) {
+	    tx += 2; tw = 9; d1 = 3; d2 = 6; ty = cy+(15+d2)/2-d1-2;
+	  }
 	  for (int n = 0; n < 3; n++, ty++) {
 	    fl_line(tx, ty, tx+d1, ty+d1);
 	    fl_line(tx+d1, ty+d1, tx+tw-1, ty+d1-d2+1);
@@ -135,7 +153,7 @@ void Fl_Check_Browser::item_draw(void *v, int X, int Y, int, int) const {
 		col = fl_contrast(col, selection_color());
 	}
 	fl_color(col);
-	fl_draw(s, X + CHECK_SIZE + 8, Y + tsize - 1);
+	fl_draw(s, X + CHECK_SIZE + 8, flag_oxy ? Y + tsize : Y + tsize - 1);
 }
 
 void Fl_Check_Browser::item_select(void *v, int state) {
diff --git a/src/Fl_Choice.cxx b/src/Fl_Choice.cxx
index 4bf4e7d..fc4290f 100644
--- a/src/Fl_Choice.cxx
+++ b/src/Fl_Choice.cxx
@@ -3,7 +3,7 @@
 //
 // Choice widget for the Fast Light Tool Kit (FLTK).
 //
-// Copyright 1998-2015 by Bill Spitzak and others.
+// Copyright 1998-2017 by Bill Spitzak and others.
 //
 // This library is free software. Distribution and use rights are outlined in
 // the file "COPYING" which should have been included with this file.  If this
@@ -20,12 +20,14 @@
 #include <FL/Fl_Choice.H>
 #include <FL/fl_draw.H>
 #include "flstring.h"
+#include "fl_oxy.h"
 
 // Emulates the Forms choice widget.  This is almost exactly the same
 // as an Fl_Menu_Button.  The only difference is the appearance of the
 // button: it draws the text of the current pick and a down-arrow.
 
 void Fl_Choice::draw() {
+  bool flag_oxy = Fl::is_scheme("oxy");
   Fl_Boxtype btype = Fl::scheme() ? FL_UP_BOX		// non-default uses up box
                                   : FL_DOWN_BOX;	// default scheme uses down box
   int dx = Fl::box_dx(btype);
@@ -35,6 +37,7 @@ void Fl_Choice::draw() {
   int H = h() - 2 * dy;
   int W = Fl::is_scheme("gtk+")    ? 20 :			// gtk+  -- fixed size
           Fl::is_scheme("gleam")   ? 20 :			// gleam -- fixed size
+          Fl::is_scheme("oxy")     ? 17 :			// oxy   -- fixed size
           Fl::is_scheme("plastic") ? ((H > 20) ? 20 : H)	// plastic: shrink if H<20
                                    : ((H > 20) ? 20 : H);	// default: shrink if H<20
   int X = x() + w() - W - dx;
@@ -45,6 +48,8 @@ void Fl_Choice::draw() {
   int x1 = X + (W - 2 * w1 - 1) / 2;
   int y1 = Y + (H - w1 - 1) / 2;
 
+  if (flag_oxy) fl_push_clip(x(), y(), w(), h()); // *FIXME* why do we need this here?
+
   if (Fl::scheme()) {
     // NON-DEFAULT SCHEME
 
@@ -59,16 +64,33 @@ void Fl_Choice::draw() {
       fl_polygon(x1, y1 + 1, x1 + w1, y1 - w1 + 1, x1 + 2 * w1, y1 + 1);
     } else {
       // Show smaller up/down arrows with a divider...
-      x1 = x() + w() - 13 - dx;
-      y1 = y() + h() / 2;
-      fl_polygon(x1, y1 - 2, x1 + 3, y1 - 5, x1 + 6, y1 - 2);
-      fl_polygon(x1, y1 + 2, x1 + 3, y1 + 5, x1 + 6, y1 + 2);
-
-      fl_color(fl_darker(color()));
-      fl_yxline(x1 - 7, y1 - 8, y1 + 8);
-
-      fl_color(fl_lighter(color()));
-      fl_yxline(x1 - 6, y1 - 8, y1 + 8);
+      if (flag_oxy) {
+	Fl_Color hlcol = 0x0;
+	x1 = x() + w() - dx/2 - W/2 - 5;
+	y1 = y()-1 + h()/2 - 1;
+	// draw down arrow
+	oxy_arrow(x1, y1, FL_ALIGN_BOTTOM, active_r(), color(), FL_BLACK);
+	// draw the divider
+	hlcol = fl_color_average(color(), FL_BLACK, 0.88);
+	fl_color(active_r()?hlcol:fl_inactive(hlcol));
+	fl_yxline(x1-5, y()+dy, y()+h()-dx-2);
+	hlcol = fl_lighter(color());
+	fl_color(active_r()?hlcol:fl_inactive(hlcol));
+	fl_yxline(x1-4, y()+dy, y()+h()-dx-2);
+      }
+
+      else {
+	x1 = x() + w() - 13 - dx;
+	y1 = y() + h() / 2;
+	fl_polygon(x1, y1 - 2, x1 + 3, y1 - 5, x1 + 6, y1 - 2);
+	fl_polygon(x1, y1 + 2, x1 + 3, y1 + 5, x1 + 6, y1 + 2);
+
+	fl_color(fl_darker(color()));
+	fl_yxline(x1 - 7, y1 - 8, y1 + 8);
+
+	fl_color(fl_lighter(color()));
+	fl_yxline(x1 - 6, y1 - 8, y1 + 8);
+      }
     }
   } else {
     // DEFAULT SCHEME
@@ -95,7 +117,7 @@ void Fl_Choice::draw() {
 
     // Clip
     int xx = x() + dx, yy = y() + dy + 1, ww = w() - W, hh = H - 2;
-    fl_push_clip(xx, yy, ww, hh);
+    if (!flag_oxy) fl_push_clip(xx, yy, ww, hh);
 
     if ( Fl::scheme()) {
       Fl_Label l;
@@ -108,9 +130,13 @@ void Fl_Choice::draw() {
       l.color= m.labelcolor_ ? m.labelcolor_ : textcolor();
       if (!m.active()) l.color = fl_inactive((Fl_Color)l.color);
       fl_draw_shortcut = 2; // hack value to make '&' disappear
-      l.draw(xx+3, yy, ww>6 ? ww-6 : 0, hh, FL_ALIGN_LEFT);
+      if (flag_oxy) {
+	fl_push_clip(xx, yy-1, ww-dx-2, h()-dy-dy/2-1);
+	l.draw(xx+2, yy, ww-dx, hh, FL_ALIGN_LEFT);
+	fl_pop_clip();
+      }
+      else l.draw(xx+3, yy, ww>6 ? ww-6 : 0, hh, FL_ALIGN_LEFT);
       fl_draw_shortcut = 0;
-      if ( Fl::focus() == this ) draw_focus(box(), xx, yy, ww, hh);
     }
     else {
       fl_draw_shortcut = 2; // hack value to make '&' disappear
@@ -118,9 +144,15 @@ void Fl_Choice::draw() {
       fl_draw_shortcut = 0;
     }
 
-    fl_pop_clip();
+    if (!flag_oxy) fl_pop_clip();
+
+    // *FIXME* Added by 'oxy' scheme (didn't we have a focus box before?). AlbrechtS
+    if (Fl::focus() == this)
+      draw_focus(box(), xx, yy-1, flag_oxy ? ww-dx/2 : ww, flag_oxy ? h()-dy-dy : hh);
   }
 
+  if (flag_oxy) fl_pop_clip();	// *FIXME* why do we need this? (see above)
+
   // Widget's label
   draw_label();
 }
@@ -173,6 +205,7 @@ int Fl_Choice::value(int v) {
 int Fl_Choice::handle(int e) {
   if (!menu() || !menu()->text) return 0;
   const Fl_Menu_Item* v;
+  bool flag_oxy = Fl::is_scheme("oxy");
   switch (e) {
   case FL_ENTER:
   case FL_LEAVE:
@@ -186,24 +219,24 @@ int Fl_Choice::handle(int e) {
   J1:
     if (Fl::scheme()
 	|| fl_contrast(textcolor(), FL_BACKGROUND2_COLOR) != textcolor()) {
-      v = menu()->pulldown(x(), y(), w(), h(), mvalue(), this);
+      v = menu()->pulldown(x(), y(), w(), h(), flag_oxy ? 0 : mvalue(), this);
     } else {
       // In order to preserve the old look-n-feel of "white" menus,
       // temporarily override the color() of this widget...
       Fl_Color c = color();
       color(FL_BACKGROUND2_COLOR);
-      v = menu()->pulldown(x(), y(), w(), h(), mvalue(), this);
+      v = menu()->pulldown(x(), y(), w(), h(), flag_oxy ? 0 : mvalue(), this);
       color(c);
     }
     if (!v || v->submenu()) return 1;
-    if (v != mvalue()) redraw();
+    /*if (v != mvalue())*/ redraw(); // NOTE: for see the focus (kdiman)
     picked(v);
     return 1;
   case FL_SHORTCUT:
     if (Fl_Widget::test_shortcut()) goto J1;
     v = menu()->test_shortcut();
     if (!v) return 0;
-    if (v != mvalue()) redraw();
+    /*if (v != mvalue())*/ redraw(); // NOTE: for see the focus (kdiman)
     picked(v);
     return 1;
   case FL_FOCUS:
diff --git a/src/Fl_Light_Button.cxx b/src/Fl_Light_Button.cxx
index 33ecbc1..7b1acce 100644
--- a/src/Fl_Light_Button.cxx
+++ b/src/Fl_Light_Button.cxx
@@ -40,6 +40,10 @@ void Fl_Light_Button::draw() {
   int dy = (h() - W) / 2;	// neg. offset o.k. for vertical centering
   int lx = 0;			// relative label position (STR #3237)
 
+  bool flag_oxy = Fl::is_scheme("oxy");
+
+  if (flag_oxy && down_box()) W = 15; // fixing size of box
+
   if (down_box()) {
     // draw other down_box() styles:
     switch (down_box()) {
@@ -83,6 +87,7 @@ void Fl_Light_Button::draw() {
 	    fl_color(fl_color_average(FL_WHITE, FL_SELECTION_COLOR, 0.2f));
 	  } else fl_color(col);
 
+	  if (flag_oxy) tW = 5; // fixing size of circle
 	  switch (tW) {
 	    // Larger circles draw fine...
 	    default :
diff --git a/src/Fl_Menu.cxx b/src/Fl_Menu.cxx
index 1d56a1e..b9bd8b8 100644
--- a/src/Fl_Menu.cxx
+++ b/src/Fl_Menu.cxx
@@ -29,6 +29,7 @@
 #include <FL/fl_draw.H>
 #include <stdio.h>
 #include "flstring.h"
+#include "fl_oxy.h"
 
 /** Size of the menu starting from this menu item.
 
@@ -171,6 +172,7 @@ int Fl_Menu_Item::measure(int* hp, const Fl_Menu_* m) const {
 /** Draws the menu item in bounding box x,y,w,h, optionally selects the item. */
 void Fl_Menu_Item::draw(int x, int y, int w, int h, const Fl_Menu_* m,
 			int selected) const {
+  bool flag_oxy = Fl::is_scheme("oxy");
   Fl_Label l;
   l.value   = text;
   l.image   = 0;
@@ -183,7 +185,7 @@ void Fl_Menu_Item::draw(int x, int y, int w, int h, const Fl_Menu_* m,
   Fl_Color color = m ? m->color() : FL_GRAY;
   if (selected) {
     Fl_Color r = m ? m->selection_color() : FL_SELECTION_COLOR;
-    Fl_Boxtype b = m && m->down_box() ? m->down_box() : FL_FLAT_BOX;
+    Fl_Boxtype b = flag_oxy ? FL_UP_BOX : (m && m->down_box() ? m->down_box() : FL_FLAT_BOX);
     if (fl_contrast(r,color)!=r) { // back compatibility boxtypes
       if (selected == 2) { // menu title
 	r = color;
@@ -207,6 +209,7 @@ void Fl_Menu_Item::draw(int x, int y, int w, int h, const Fl_Menu_* m,
   if (flags & (FL_MENU_TOGGLE|FL_MENU_RADIO)) {
     int d = (h - FL_NORMAL_SIZE + 1) / 2;
     int W = h - 2 * d;
+    if (flag_oxy) { W = 15; d--; } // fixing size of box
 
     if (flags & FL_MENU_RADIO) {
       fl_draw_box(FL_ROUND_DOWN_BOX, x+2, y+d, W, W, FL_BACKGROUND2_COLOR);
@@ -221,6 +224,10 @@ void Fl_Menu_Item::draw(int x, int y, int w, int h, const Fl_Menu_* m,
 	  fl_color(fl_color_average(FL_WHITE, FL_SELECTION_COLOR, 0.2f));
 	} else fl_color(labelcolor_);
 
+	if (flag_oxy) {
+	  td = Fl::box_dx(FL_ROUND_DOWN_BOX) + 1;
+	  tW = 5; // fixing size of circle
+	}
 	switch (tW) {
 	  // Larger circles draw fine...
 	  default :
@@ -460,6 +467,7 @@ void menuwindow::drawentry(const Fl_Menu_Item* m, int n, int eraseit) {
   int ww = W-2*BW-1;
   int yy = BW+1+n*itemheight;
   int hh = itemheight - LEADING;
+  bool flag_oxy = Fl::is_scheme("oxy");
 
   if (eraseit && n != selected) {
     fl_push_clip(xx+1, yy-(LEADING-2)/2, ww-2, hh+(LEADING-2));
@@ -474,7 +482,11 @@ void menuwindow::drawentry(const Fl_Menu_Item* m, int n, int eraseit) {
     int sz = (hh-7)&-2;
     int y1 = yy+(hh-sz)/2;
     int x1 = xx+ww-sz-3;
-    fl_polygon(x1+2, y1, x1+2, y1+sz, x1+sz/2+2, y1+sz/2);
+    if (flag_oxy) {
+      x1+=(sz/2-BW*2-1);
+      y1=yy+hh/2-4; // 4 is half of arrow height
+      oxy_arrow(x1, y1, FL_ALIGN_RIGHT, active_r(), color(), (n==selected)?selection_color():FL_BLACK); // draw oxy arrow
+    } else fl_polygon(x1+2, y1, x1+2, y1+sz, x1+sz/2+2, y1+sz/2);
   } else if (m->shortcut_) {
     Fl_Font f = m->labelsize_ || m->labelfont_ ? (Fl_Font)m->labelfont_ :
                     button ? button->textfont() : FL_HELVETICA;
diff --git a/src/Fl_Menu_Button.cxx b/src/Fl_Menu_Button.cxx
index 74bf624..4aa2ce1 100644
--- a/src/Fl_Menu_Button.cxx
+++ b/src/Fl_Menu_Button.cxx
@@ -19,7 +19,7 @@
 #include <FL/Fl.H>
 #include <FL/Fl_Menu_Button.H>
 #include <FL/fl_draw.H>
-
+#include "fl_oxy.h"
 
 static Fl_Menu_Button	*pressed_menu_button_ = 0;
 
@@ -29,14 +29,18 @@ void Fl_Menu_Button::draw() {
   int H = (labelsize()-3)&-2;
   int X = x()+w()-H-Fl::box_dx(box())-Fl::box_dw(box())-1;
   int Y = y()+(h()-H)/2;
+  bool flag_oxy = Fl::is_scheme("oxy");
   draw_box(pressed_menu_button_ == this ? fl_down(box()) : box(), color());
   draw_label(x()+Fl::box_dx(box()), y(), X-x()+2, h());
   if (Fl::focus() == this) draw_focus();
   // ** if (box() == FL_FLAT_BOX) return; // for XForms compatibility
-  fl_color(active_r() ? FL_DARK3 : fl_inactive(FL_DARK3));
-  fl_line(X+H/2, Y+H, X, Y, X+H, Y);
-  fl_color(active_r() ? FL_LIGHT3 : fl_inactive(FL_LIGHT3));
-  fl_line(X+H, Y, X+H/2, Y+H);
+  if (flag_oxy) oxy_arrow(X, Y+3, FL_ALIGN_BOTTOM, active_r(), color(), FL_BLACK);
+  else {
+    fl_color(active_r() ? FL_DARK3 : fl_inactive(FL_DARK3));
+    fl_line(X+H/2, Y+H, X, Y, X+H, Y);
+    fl_color(active_r() ? FL_LIGHT3 : fl_inactive(FL_LIGHT3));
+    fl_line(X+H, Y, X+H/2, Y+H);
+  }
 }
 
 
diff --git a/src/Fl_Scrollbar.cxx b/src/Fl_Scrollbar.cxx
index a659e8e..e1f5c1c 100644
--- a/src/Fl_Scrollbar.cxx
+++ b/src/Fl_Scrollbar.cxx
@@ -22,6 +22,7 @@
 #include <FL/fl_draw.H>
 #include <math.h>
 #include "flstring.h"
+#include "fl_oxy.h"
 
 #define INITIALREPEAT .5
 #define REPEAT .05
@@ -203,6 +204,7 @@ void Fl_Scrollbar::draw() {
   int Y = y()+Fl::box_dy(box());
   int W = w()-Fl::box_dw(box());
   int H = h()-Fl::box_dh(box());
+  bool flag_oxy = Fl::is_scheme("oxy");
   if (horizontal()) {
     if (W < 3*H) {Fl_Slider::draw(X,Y,W,H); return;}
     Fl_Slider::draw(X+H,Y,W-2*H,H);
@@ -222,6 +224,12 @@ void Fl_Scrollbar::draw() {
 	fl_polygon(x1, yy1+w1, x1+w1, yy1+2*w1, x1+w1-1, yy1+w1, x1+w1, yy1);
 	x1 += (W-H);
 	fl_polygon(x1, yy1, x1+1, yy1+w1, x1, yy1+2*w1, x1+w1, yy1+w1);
+      } else if (flag_oxy) {
+	x1 = X+H/2+2;
+	int y1 = Y+H/2-3-2;
+	oxy_arrow(x1, y1, FL_ALIGN_LEFT, active_r(), color(), FL_BLACK); // left arrow
+	x1 += (W-H)-4;
+	oxy_arrow(x1, y1, FL_ALIGN_RIGHT, active_r(), color(), FL_BLACK); // right arrow
       } else {
 	fl_polygon(x1, yy1+w1, x1+w1, yy1+2*w1, x1+w1, yy1);
 	x1 += (W-H);
@@ -248,6 +256,12 @@ void Fl_Scrollbar::draw() {
 	yy1 += H-W;
 	fl_polygon(x1, yy1, x1+w1, yy1+1, x1+w1, yy1+w1);
 	fl_polygon(x1+w1, yy1+1, x1+2*w1, yy1, x1+w1, yy1+w1);
+      } else if (flag_oxy) {
+	x1 = X+W/2-4;
+	int y1 = Y+W/2+1;
+	oxy_arrow(x1, y1, FL_ALIGN_TOP, active_r(), color(), FL_BLACK); // top arrow
+	y1 += H-W-3;
+	oxy_arrow(x1, y1, FL_ALIGN_BOTTOM, active_r(), color(), FL_BLACK); // bottom arrow
       } else {
 	fl_polygon(x1, yy1+w1, x1+2*w1, yy1+w1, x1+w1, yy1);
 	yy1 += H-W;
diff --git a/src/Fl_Tabs.cxx b/src/Fl_Tabs.cxx
index 26e092f..7c762a0 100644
--- a/src/Fl_Tabs.cxx
+++ b/src/Fl_Tabs.cxx
@@ -376,6 +376,7 @@ void Fl_Tabs::draw_tab(int x1, int x2, int W, int H, Fl_Widget* o, int what) {
   int dy = Fl::box_dy(box());
   char prev_draw_shortcut = fl_draw_shortcut;
   fl_draw_shortcut = 1;
+  bool flag_oxy = Fl::is_scheme("oxy");
 
   Fl_Boxtype bt = (o==push_ &&!sel) ? fl_down(box()) : box();
 
@@ -390,7 +391,7 @@ void Fl_Tabs::draw_tab(int x1, int x2, int W, int H, Fl_Widget* o, int what) {
 
     H += dh;
 
-    Fl_Color c = sel ? selection_color() : o->selection_color();
+    Fl_Color c = sel ? selection_color() : (flag_oxy ? fl_color_average(o->selection_color(), FL_BLACK, 0.90) : o->selection_color());
 
     draw_box(bt, x1, y() + yofs, W, H + 10 - yofs, c);
 
@@ -404,7 +405,7 @@ void Fl_Tabs::draw_tab(int x1, int x2, int W, int H, Fl_Widget* o, int what) {
     // Restore the original label color...
     o->labelcolor(oc);
 
-    if (Fl::focus() == this && o->visible())
+    if (Fl::focus() == this && o->visible() && !flag_oxy)
       draw_focus(box(), x1, y(), W, H);
 
     fl_pop_clip();
@@ -416,7 +417,7 @@ void Fl_Tabs::draw_tab(int x1, int x2, int W, int H, Fl_Widget* o, int what) {
 
     H += dh;
 
-    Fl_Color c = sel ? selection_color() : o->selection_color();
+    Fl_Color c = sel ? selection_color() : (flag_oxy ? fl_color_average(o->selection_color(), FL_BLACK, 0.90) : o->selection_color());
 
     draw_box(bt, x1, y() + h() - H - 10, W, H + 10 - yofs, c);
 
@@ -430,7 +431,7 @@ void Fl_Tabs::draw_tab(int x1, int x2, int W, int H, Fl_Widget* o, int what) {
     // Restore the original label color...
     o->labelcolor(oc);
 
-    if (Fl::focus() == this && o->visible())
+    if (Fl::focus() == this && o->visible() && !flag_oxy)
       draw_focus(box(), x1, y() + h() - H, W, H);
 
     fl_pop_clip();
diff --git a/src/Fl_Widget.cxx b/src/Fl_Widget.cxx
index ee61043..a910c39 100644
--- a/src/Fl_Widget.cxx
+++ b/src/Fl_Widget.cxx
@@ -196,12 +196,14 @@ Fl_Widget::~Fl_Widget() {
 void
 Fl_Widget::draw_focus(Fl_Boxtype B, int X, int Y, int W, int H) const {
   if (!Fl::visible_focus()) return;
+  bool flag_oxy = Fl::is_scheme("oxy");
+  if (flag_oxy) W++;
   switch (B) {
     case FL_DOWN_BOX:
     case FL_DOWN_FRAME:
     case FL_THIN_DOWN_BOX:
     case FL_THIN_DOWN_FRAME:
-      X ++;
+      if (!flag_oxy) X ++;
       Y ++;
     default:
       break;
diff --git a/src/Fl_get_system_colors.cxx b/src/Fl_get_system_colors.cxx
index 59eb954..5c7913c 100644
--- a/src/Fl_get_system_colors.cxx
+++ b/src/Fl_get_system_colors.cxx
@@ -29,6 +29,7 @@
 #include <FL/Fl_Pixmap.H>
 #include <FL/Fl_Tiled_Image.H>
 #include "tile.xpm"
+#include "fl_oxy.h"
 
 /**
     Changes fl_color(FL_BACKGROUND_COLOR) to the given color, 
@@ -168,6 +169,7 @@ int Fl::scheme(const char *s) {
     else if (!fl_ascii_strcasecmp(s, "gtk+")) s = strdup("gtk+");
     else if (!fl_ascii_strcasecmp(s, "plastic")) s = strdup("plastic");
     else if (!fl_ascii_strcasecmp(s, "gleam")) s = strdup("gleam");
+    else if (!fl_ascii_strcasecmp(s, "oxy")) s = strdup("oxy");
     else s = 0;
   }
   if (scheme_) free((void*)scheme_);
@@ -276,6 +278,27 @@ int Fl::reload_scheme() {
 
     // Use slightly thinner scrollbars...
     Fl::scrollbar_size(15);
+  } else if (scheme_ && !fl_ascii_strcasecmp(scheme_, "oxy")) {
+    // Oxy scheme
+    if (scheme_bg_) {
+      delete scheme_bg_;
+      scheme_bg_ = (Fl_Image *)0;
+    }
+
+    set_boxtype(FL_UP_FRAME,        FL_OXY_UP_FRAME);
+    set_boxtype(FL_DOWN_FRAME,      FL_OXY_DOWN_FRAME);
+    set_boxtype(FL_THIN_UP_FRAME,   FL_OXY_THIN_UP_FRAME);
+    set_boxtype(FL_THIN_DOWN_FRAME, FL_OXY_THIN_DOWN_FRAME);
+
+    set_boxtype(FL_UP_BOX,          FL_OXY_UP_BOX);
+    set_boxtype(FL_DOWN_BOX,        FL_OXY_DOWN_BOX);
+    set_boxtype(FL_THIN_UP_BOX,     FL_OXY_THIN_UP_BOX);
+    set_boxtype(FL_THIN_DOWN_BOX,   FL_OXY_THIN_DOWN_BOX);
+    set_boxtype(_FL_ROUND_UP_BOX,   FL_OXY_ROUND_UP_BOX);
+    set_boxtype(_FL_ROUND_DOWN_BOX, FL_OXY_ROUND_DOWN_BOX);
+
+    // Use slightly thinner scrollbars...
+    Fl::scrollbar_size(15);
   } else {
     // Use the standard FLTK look-n-feel...
     if (scheme_bg_) {
diff --git a/src/Makefile b/src/Makefile
index 265cab0..0f14137 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -145,6 +145,7 @@ CPPFILES = \
 	fl_oval_box.cxx \
 	fl_overlay.cxx \
 	fl_overlay_visual.cxx \
+	fl_oxy.cxx \
 	fl_plastic.cxx \
 	fl_read_image.cxx \
 	fl_rect.cxx \
diff --git a/src/fl_boxtype.cxx b/src/fl_boxtype.cxx
index 449c01c..65e9e76 100644
--- a/src/fl_boxtype.cxx
+++ b/src/fl_boxtype.cxx
@@ -28,6 +28,7 @@
 #include <FL/Fl.H>
 #include <FL/Fl_Widget.H>
 #include <FL/fl_draw.H>
+#include "fl_oxy.h"
 #include <config.h>
 
 ////////////////////////////////////////////////////////////////
@@ -343,6 +344,18 @@ static struct {
   {fl_down_box,		2,2,4,4,0}, // _FL_GLEAM_THIN_DOWN_BOX
   {fl_up_box,	       	2,2,4,4,0}, // _FL_GLEAM_ROUND_UP_BOX
   {fl_down_box,		2,2,4,4,0}, // _FL_GLEAM_ROUND_DOWN_BOX
+  {oxy_up_box,		2,2,4,4,0}, // _FL_OXY_UP_BOX,
+  {oxy_down_box,	2,2,4,4,0}, // _FL_OXY_DOWN_BOX,
+  {oxy_up_frame,	2,2,4,4,0}, // _FL_OXY_UP_FRAME,
+  {oxy_down_frame,	2,2,4,4,0}, // _FL_OXY_DOWN_FRAME,
+  {oxy_thin_up_box,	1,1,2,2,0}, // _FL_OXY_THIN_UP_BOX,
+  {oxy_thin_down_box,	1,1,2,2,0}, // _FL_OXY_THIN_DOWN_BOX,
+  {oxy_thin_up_frame,	1,1,2,2,0}, // _FL_OXY_THIN_UP_FRAME,
+  {oxy_thin_down_frame,	1,1,2,2,0}, // _FL_OXY_THIN_DOWN_FRAME,
+  {oxy_round_up_box,	4,4,8,8,0}, // _FL_OXY_ROUND_UP_BOX,
+  {oxy_round_down_box,	4,4,8,8,0}, // _FL_OXY_ROUND_DOWN_BOX,
+  {oxy_button_up_box,	2,2,4,4,0}, // _FL_OXY_BUTTON_UP_BOX,
+  {oxy_button_down_box,	2,2,4,4,0}, // _FL_OXY_BUTTON_DOWN_BOX,
   {fl_up_box,		3,3,6,6,0}, // FL_FREE_BOX+0
   {fl_down_box,		3,3,6,6,0}, // FL_FREE_BOX+1
   {fl_up_box,		3,3,6,6,0}, // FL_FREE_BOX+2
diff --git a/src/fl_oxy.cxx b/src/fl_oxy.cxx
new file mode 100644
index 0000000..3a6d736
--- /dev/null
+++ b/src/fl_oxy.cxx
@@ -0,0 +1,455 @@
+//
+// "Oxy theme" drawing routines for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 2011 by Dmitrij K. e-mail: kdiman at live dot ru
+//
+// This library is free software. Distribution and use rights are outlined in
+// the file "COPYING" which should have been included with this file.  If this
+// file is missing or damaged, see the license at:
+//
+//     http://www.fltk.org/COPYING.php
+//
+// Please report all bugs and problems on the following page:
+//
+//     http://www.fltk.org/str.php
+//
+
+#ifndef fl_oxy_cxx
+#define fl_oxy_cxx
+
+#include <FL/Fl.H>
+#include <FL/fl_draw.H>
+#include "fl_oxy.h"
+
+
+#define GROFF 0.45f // gradients offset
+
+
+
+void oxy_arrow(int x1, int y1, Fl_Align a, bool ac, Fl_Color c, Fl_Color hc) {
+
+ Fl_Color hlcol = 0x0;
+
+  switch (a) {
+   case FL_ALIGN_TOP: {
+
+    hlcol = fl_color_average(c, hc, 0.38);
+    fl_color(ac?hlcol:fl_inactive(hlcol));
+    fl_line(x1, y1, x1+4, y1-4);
+    fl_line(x1+4, y1-4, x1+8, y1);
+
+    hlcol = fl_color_average(c, hc, 0.58);
+    fl_color(ac?hlcol:fl_inactive(hlcol));
+    y1++;
+    fl_line(x1+1, y1-1, x1+4, y1-4);
+    fl_line(x1+4, y1-4, x1+7, y1-1);
+
+    hlcol = fl_color_average(c, hc, 0.78);
+    fl_color(ac?hlcol:fl_inactive(hlcol));
+    y1-=2;
+    fl_line(x1, y1, x1+4, y1-4);
+    fl_line(x1+4, y1-4, x1+8, y1);
+
+    break;
+   }
+
+   case FL_ALIGN_BOTTOM: {
+    L_BOTTOM:
+
+    hlcol = fl_color_average(c, hc, 0.38);
+    fl_color(ac?hlcol:fl_inactive(hlcol));
+    fl_line(x1, y1, x1+4, y1+4);
+    fl_line(x1+4, y1+4, x1+8, y1);
+
+    hlcol = fl_color_average(c, hc, 0.58);
+    fl_color(ac?hlcol:fl_inactive(hlcol));
+    y1--;
+    fl_line(x1+1, y1+1, x1+4, y1+4);
+    fl_line(x1+4, y1+4, x1+7, y1+1);
+
+    hlcol = fl_color_average(c, hc, 0.78);
+    fl_color(ac?hlcol:fl_inactive(hlcol));
+    y1+=2;
+    fl_line(x1, y1, x1+4, y1+4);
+    fl_line(x1+4, y1+4, x1+8, y1);
+
+    break;
+   }
+
+   case FL_ALIGN_LEFT: {
+
+    hlcol = fl_color_average(c, hc, 0.38);
+    fl_color(ac?hlcol:fl_inactive(hlcol));
+    fl_line(x1, y1, x1-4, y1+4);
+    fl_line(x1-4, y1+4, x1, y1+8);
+
+    hlcol = fl_color_average(c, hc, 0.78);
+    fl_color(ac?hlcol:fl_inactive(hlcol));
+    x1--;
+    fl_line(x1, y1, x1-4, y1+4);
+    fl_line(x1-4, y1+4, x1, y1+8);
+
+    hlcol = fl_color_average(c, hc, 0.58);
+    fl_color(ac?hlcol:fl_inactive(hlcol));
+    x1+=2;
+    fl_line(x1-1, y1+1, x1-4, y1+4);
+    fl_line(x1-4, y1+4, x1-1, y1+7);
+
+    break;
+   }
+
+   case FL_ALIGN_RIGHT: {
+
+    hlcol = fl_color_average(c, hc, 0.38);
+    fl_color(ac?hlcol:fl_inactive(hlcol));
+    fl_line(x1, y1, x1+4, y1+4);
+    fl_line(x1+4, y1+4, x1, y1+8);
+
+    hlcol = fl_color_average(c, hc, 0.58);
+    fl_color(ac?hlcol:fl_inactive(hlcol));
+    x1--;
+    fl_line(x1+1, y1+1, x1+4, y1+4);
+    fl_line(x1+4, y1+4, x1+1, y1+7);
+
+    hlcol = fl_color_average(c, hc, 0.78);
+    fl_color(ac?hlcol:fl_inactive(hlcol));
+    x1+=2;
+    fl_line(x1, y1, x1+4, y1+4);
+    fl_line(x1+4, y1+4, x1, y1+8);
+
+    break;
+   }
+   default: { goto L_BOTTOM; break; }
+  }
+
+}
+
+
+
+
+  // draw gradient from South to Nord
+  static void _oxy_up_box_(int x, int y, int w, int h, Fl_Color bg) {
+   float groff = GROFF;
+   if (groff < 0.0) { groff = 0.0f; }
+   float gradoffset = groff;
+   float stepoffset = (1.0/(float)h);
+   int xw = x+w-1;
+//    from bottom to top
+   for (int _y = y; _y < y+h; _y++) {
+    fl_color(fl_color_average(bg, FL_WHITE, (gradoffset<1.0)?gradoffset:1.0));
+    fl_line(x, _y, xw, _y);
+    gradoffset += stepoffset;
+   }
+  }
+
+
+  // draw gradient from Nord to South
+  static void _oxy_down_box_(int x, int y, int w, int h, Fl_Color bg) {
+   float groff = GROFF;
+   if (groff < 0.0) { groff = 0.0f; }
+   float gradoffset = groff;
+   float stepoffset = (1.0/(float)h);
+   int xw = x+w-1;
+//    from top to bottom
+   for (int _y = y+h-1; _y >= y; _y--) {
+    fl_color(fl_color_average(bg, FL_WHITE, (gradoffset<1.0)?gradoffset:1.0));
+    fl_line(x, _y, xw, _y);
+    gradoffset += stepoffset;
+   }
+  }
+
+  // draw gradient for button up box
+  static void _oxy_button_up_box_(int x, int y, int w, int h, Fl_Color bg) {
+   int half_h = h/2;
+   float gradoffset = 0.15f;
+   float stepoffset = (1.0/(float)half_h);
+   Fl_Color c = fl_color_average(bg, FL_WHITE, 0.5);
+   int xw = x+w-1;
+   for (int _y = y; _y <= y+half_h; _y++) {
+    fl_color(fl_color_average(c, FL_WHITE, (gradoffset<1.0)?gradoffset:1.0));
+    fl_line(x, _y, xw, _y);
+    gradoffset += stepoffset;
+   }
+   gradoffset = 0.0f;
+   c = bg;
+   for (int _y = y+h-1; _y >= y+half_h-1; _y--) {
+    fl_color(fl_color_average(c, FL_WHITE, (gradoffset<1.0)?gradoffset:1.0));
+    fl_line(x, _y, xw, _y);
+    gradoffset += stepoffset;
+   }
+  }
+
+
+  // draw gradient for button down box
+   static void _oxy_button_down_box_(int x, int y, int w, int h, Fl_Color bg) {
+  bg = fl_color_average(bg, FL_BLACK, 0.88);
+  int half_h = h/2, xw = x+w-1;
+  float gradoffset = 0.15f, stepoffset = (1.0/(float)half_h);
+  Fl_Color c = fl_color_average(bg, FL_WHITE, 0.5);
+  for (int _y = y; _y <= y+half_h; _y++) {
+   fl_color(fl_color_average(c, FL_WHITE, (gradoffset<1.0)?gradoffset:1.0));
+   fl_line(x, _y, xw, _y);
+   gradoffset += stepoffset;
+  }
+  gradoffset = 0.0f;
+  c = bg;
+  for (int _y = y+h-1; _y >= y+half_h-1; _y--) {
+   fl_color(fl_color_average(c, FL_WHITE, (gradoffset<1.0)?gradoffset:1.0));
+   fl_line(x, _y, xw, _y);
+   gradoffset += stepoffset;
+  }
+ }
+
+
+  // draw rounded box
+  static void _oxy_rounded_box_(int x, int y, int w, int h, Fl_Color bg) {
+   fl_color(bg);
+   if (w > h) {
+    fl_pie(x, y, h, h, 90.0, 270.0); // right half of circle
+    fl_rectf(x+h/2, y, w-h, h); // rectangle between left and right half-circle
+    fl_pie(x+w-h, y, h, h, 0.0, 90.0); // top-left quarter of circle
+    fl_pie(x+w-h, y, h, h, 270.0, 360.0); // bottom-left quarter of circle
+   }
+   else {
+    fl_pie(x, y, w, w, 0.0, 180.0); // top half of circle
+    fl_rectf(x, y+w/2, w, h-w); // rectangle between top and bottom half-circle
+    fl_pie(x, y+h-w, w, w, 180.0, 360.0); // bottom half of circle
+   }
+  }
+
+
+enum {
+ OXY_UP_BOX,
+ OXY_DOWN_BOX,
+
+ OXY_UP_BUTTON,
+ OXY_DOWN_BUTTON,
+
+ OXY_UP_ROUND,
+ OXY_DOWN_ROUND,
+
+ OXY_UP_FRAME,
+ OXY_DOWN_FRAME
+};
+
+
+static Fl_Color oxy_color(Fl_Color c) {
+  if (Fl::draw_box_active()) { return c; }
+  else { return fl_inactive(c); }
+}
+
+
+
+static void oxy_draw(int x, int y, int w, int h, Fl_Color c, int typebox, bool is_shadow) {
+
+ if (w < 1 || h < 1) return;
+ int X, Y, W, H, X1, Y1;
+
+ // draw bg
+ if (typebox != OXY_UP_FRAME && typebox != OXY_DOWN_FRAME) {
+
+  X = x+1; Y = y+1; W = w-2; H = h-2;
+
+  switch (typebox) {
+   case OXY_UP_BOX: { _oxy_up_box_(X, Y, W, H, oxy_color(c)); break; }
+   case OXY_DOWN_BOX: { _oxy_down_box_(X, Y, W, H, oxy_color(c)); break; }
+   case OXY_UP_BUTTON: { _oxy_button_up_box_(X, Y, W, H, oxy_color(c)); break; }
+   case OXY_DOWN_BUTTON: { _oxy_button_down_box_(X, Y, W, H, oxy_color(c)); break; }
+   case OXY_UP_ROUND:
+   case OXY_DOWN_ROUND:
+    _oxy_rounded_box_(x, y, w, h, oxy_color(fl_color_average(c, FL_WHITE, 0.82)));
+    break;
+   default: { break; }
+  }
+ }
+
+ Fl_Color leftline = c, topline = c, rightline = c, bottomline = c;
+
+ if (typebox == OXY_UP_ROUND || typebox == OXY_DOWN_ROUND) {
+  leftline = fl_color_average(c, FL_WHITE, 0.88);
+  leftline = topline = rightline = bottomline = fl_color_average(leftline, FL_BLACK, 0.97);
+ }
+
+ else if (typebox == OXY_UP_BOX || typebox == OXY_UP_FRAME) {
+  topline = fl_color_average(c, FL_BLACK, 0.95);
+  leftline = fl_color_average(c, FL_BLACK, 0.85);
+  rightline = leftline;
+  bottomline = fl_color_average(c, FL_BLACK, 0.88);
+ }
+
+ else if (typebox == OXY_DOWN_BOX || typebox == OXY_DOWN_FRAME) {
+  topline = fl_color_average(c, FL_BLACK, 0.88);
+  leftline = fl_color_average(c, FL_BLACK, 0.85);
+  rightline = leftline;
+  bottomline = fl_color_average(c, FL_BLACK, 0.95);
+ }
+
+ else if (typebox == OXY_UP_BUTTON || typebox == OXY_DOWN_BUTTON) {
+  topline = leftline = rightline = bottomline = fl_color_average(c, FL_BLACK, 0.85);
+ }
+
+ // draw border
+ if (typebox != OXY_UP_ROUND && typebox != OXY_DOWN_ROUND) {
+  // bottom side
+  fl_color(oxy_color(bottomline));
+  fl_line(x+1, y+h-1, x+w-2, y+h-1);
+  // right side
+  fl_color(oxy_color(rightline));
+  fl_line(x+w-1, y+1, x+w-1, y+h-2);
+  // top side
+  fl_color(oxy_color(topline));
+  fl_line(x+1, y, x+w-2, y);
+  // left side
+  fl_color(oxy_color(leftline));
+  fl_line(x, y+1, x, y+h-2);
+ }
+
+ // draw shadow
+ if (is_shadow) {
+
+  if (typebox == OXY_UP_ROUND) {
+   topline = fl_color_average(c, FL_WHITE, 0.35);
+   bottomline = fl_color_average(c, FL_BLACK, 0.94);
+  }
+
+  else if (typebox == OXY_DOWN_ROUND) {
+   topline = fl_color_average(c, FL_BLACK, 0.94);
+   bottomline = fl_color_average(c, FL_WHITE, 0.35);
+  }
+
+  else if (typebox == OXY_UP_BOX || typebox == OXY_UP_FRAME) {
+   topline = fl_color_average(c, FL_WHITE, 0.35);
+   leftline = fl_color_average(c, FL_WHITE, 0.4);
+   rightline = leftline;
+   bottomline = fl_color_average(c, FL_BLACK, 0.8);
+  }
+
+  else if (typebox == OXY_DOWN_BOX || typebox == OXY_DOWN_FRAME) {
+   topline = fl_color_average(c, FL_BLACK, 0.8);
+   leftline = fl_color_average(c, FL_BLACK, 0.94);
+   rightline = leftline;
+   bottomline = fl_color_average(c, FL_WHITE, 0.35);
+  }
+
+  int xw1=x+w-1;
+  int xw2=x+w-2;
+  int xw3=x+w-3;
+  int yh2=y+h-2;
+  int yh1=y+h-1;
+
+  if (typebox == OXY_UP_BOX || typebox == OXY_UP_FRAME) {
+   fl_color(oxy_color(topline));
+   X=x+1;Y=y+1;X1=xw2;Y1=y+1;
+   fl_line(X, Y, X1, Y1); // top line
+
+   fl_color(oxy_color(leftline));
+   X=x+1;Y=yh2;X1=x+1;Y1=y+2;
+   fl_line(X, Y, X1, Y1); // left line
+
+   fl_color(oxy_color(rightline));
+   X=xw2;Y=y+2;X1=xw2;Y1=yh2;
+   fl_line(X, Y, X1, Y1); // right line
+
+   fl_color(oxy_color(bottomline));
+   X=xw2;Y=yh2;X1=x+1;Y1=yh2;
+   fl_line(X, Y, X1, Y1); // bottom line
+  }
+
+  else if (typebox == OXY_DOWN_BOX || typebox == OXY_DOWN_FRAME) {
+   fl_color(oxy_color(topline));
+   X=x+1;Y=y+1;X1=xw2;Y1=y+1;
+   fl_line(X, Y, X1, Y1); // top line
+
+   fl_color(oxy_color(leftline));
+   X=x+1;Y=yh2;X1=x+1;Y1=y+2;
+   fl_line(X, Y, X1, Y1); // left line
+
+   fl_color(oxy_color(rightline));
+   X=xw2;Y=y+2;X1=xw2;Y1=yh2;
+   fl_line(X, Y, X1, Y1); // right line
+
+   fl_color(oxy_color(bottomline));
+   X=xw3;Y=yh2;X1=x+2;Y1=yh2;
+   fl_line(X, Y, X1, Y1); // bottom line
+  }
+
+  else if (typebox == OXY_UP_ROUND || typebox == OXY_DOWN_ROUND) {
+
+   int Radius, smooth;
+   int r_offset2; // quarter of smooth and half of smooth
+
+   if (w > h) { smooth = w; }
+   else { smooth = h; }
+
+    // correcting `smooth'
+   if (smooth > 0 && (smooth*3 > w || smooth*3 > h)) {
+    if (h < w) { smooth = h/3; }
+    else { smooth = w/3; }
+   }
+
+   r_offset2 = smooth/2;
+
+   Radius = smooth*3;
+   if (Radius == 3) { Radius = 4; }
+
+   fl_color(oxy_color(topline));
+   fl_line(x+1, yh1-smooth-r_offset2, x+1, y+r_offset2+smooth); // left side
+   fl_arc(x+1, y+1, Radius, Radius, 90.0, 180.0); // left-top corner
+   if (typebox == OXY_DOWN_ROUND) { fl_arc(x+1, y+1, Radius+1, Radius+1, 90.0, 180.0); } // left-top corner (DOWN_BOX)
+   fl_line(x+smooth+r_offset2, y+1, xw1-smooth-r_offset2, y+1); // top side
+   fl_arc(xw1-Radius, y+1, Radius, Radius, 00.0, 90.0); // right-top corner
+   if (typebox == OXY_DOWN_ROUND) { fl_arc(xw1-Radius, y+1, Radius+1, Radius+1, 00.0, 90.0); } // right-top corner (DOWN_BOX)
+   fl_line(xw2, y+smooth+r_offset2, xw2, yh1-smooth-r_offset2); // right side
+   fl_arc(x+1, yh1-Radius, Radius, Radius, 180.0, 200.0); // left-bottom corner
+   fl_arc(xw1-Radius, yh1-Radius, Radius, Radius, 340.0, 360.0); // right-bottom
+   fl_color(oxy_color(bottomline));
+   fl_arc(x+1, yh1-Radius, Radius, Radius, 200.0, 270.0); // left-bottom corner
+   if (typebox == OXY_UP_ROUND) { fl_arc(x+1, yh1-Radius, Radius+1, Radius+1, 200.0, 270.0); } // left-bottom corner (UP_BOX)
+   fl_line(xw1-smooth-r_offset2, yh2, x+smooth+r_offset2, yh2); // bottom side
+   fl_arc(xw1-Radius, yh1-Radius, Radius, Radius, 270.0, 340.0); // right-bottom corner
+   if (typebox == OXY_UP_ROUND) { fl_arc(xw1-Radius, yh1-Radius, Radius+1, Radius+1, 270.0, 340.0); } // right-bottom corner
+  }
+
+ } /// end `if(is_shadow)'
+
+} /// end `static void oxy_draw(...)'
+
+
+
+void oxy_button_up_box(int x, int y, int w, int h, Fl_Color c) { oxy_draw(x, y, w, h, c, OXY_UP_BUTTON, true); }
+void oxy_button_down_box(int x, int y, int w, int h, Fl_Color c) { oxy_draw(x, y, w, h, c, OXY_DOWN_BUTTON, true); }
+void oxy_up_box(int x, int y, int w, int h, Fl_Color c) { oxy_draw(x, y, w, h, c, OXY_UP_BOX, true); }
+void oxy_down_box(int x, int y, int w, int h, Fl_Color c) { oxy_draw(x, y, w, h, c, OXY_DOWN_BOX, true); }
+void oxy_thin_up_box(int x, int y, int w, int h, Fl_Color c) { oxy_draw(x, y, w, h, c, OXY_UP_BOX, false); }
+void oxy_thin_down_box(int x, int y, int w, int h, Fl_Color c) { oxy_draw(x, y, w, h, c, OXY_DOWN_BOX, false); }
+void oxy_up_frame(int x, int y, int w, int h, Fl_Color c) { oxy_draw(x, y, w, h, c, OXY_UP_FRAME, true); }
+void oxy_down_frame(int x, int y, int w, int h, Fl_Color c) { oxy_draw(x, y, w, h, c, OXY_DOWN_FRAME, true); }
+void oxy_thin_up_frame(int x, int y, int w, int h, Fl_Color c) { oxy_draw(x, y, w, h, c, OXY_UP_FRAME, false); }
+void oxy_thin_down_frame(int x, int y, int w, int h, Fl_Color c) { oxy_draw(x, y, w, h, c, OXY_DOWN_FRAME, false); }
+void oxy_round_up_box(int x, int y, int w, int h, Fl_Color c) { oxy_draw(x, y, w, h, c, OXY_UP_ROUND, true); }
+void oxy_round_down_box(int x, int y, int w, int h, Fl_Color c) { oxy_draw(x, y, w, h, c, OXY_DOWN_ROUND, true); }
+
+
+
+extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*);
+
+Fl_Boxtype fl_define_FL_OXY_UP_BOX() {
+
+ fl_internal_boxtype(_FL_OXY_UP_BOX, oxy_up_box);
+ fl_internal_boxtype(_FL_OXY_DOWN_BOX, oxy_down_box);
+ fl_internal_boxtype(_FL_OXY_UP_FRAME, oxy_up_frame);
+ fl_internal_boxtype(_FL_OXY_DOWN_FRAME, oxy_down_frame);
+ fl_internal_boxtype(_FL_OXY_THIN_UP_BOX, oxy_thin_up_box);
+ fl_internal_boxtype(_FL_OXY_THIN_DOWN_BOX, oxy_thin_down_box);
+ fl_internal_boxtype(_FL_OXY_THIN_UP_FRAME, oxy_thin_up_frame);
+ fl_internal_boxtype(_FL_OXY_THIN_DOWN_FRAME, oxy_thin_down_frame);
+ fl_internal_boxtype(_FL_OXY_ROUND_UP_BOX, oxy_round_up_box);
+ fl_internal_boxtype(_FL_OXY_ROUND_DOWN_BOX, oxy_round_down_box);
+ fl_internal_boxtype(_FL_OXY_BUTTON_UP_BOX, oxy_button_up_box);
+ fl_internal_boxtype(_FL_OXY_BUTTON_DOWN_BOX, oxy_button_down_box);
+
+ return _FL_OXY_UP_BOX;
+
+}
+
+#endif
diff --git a/src/fl_oxy.h b/src/fl_oxy.h
new file mode 100644
index 0000000..0df7056
--- /dev/null
+++ b/src/fl_oxy.h
@@ -0,0 +1,39 @@
+//
+// "Oxy theme" drawing routines for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 2011 by Dmitrij K. e-mail: kdiman at live dot ru
+//
+// This library is free software. Distribution and use rights are outlined in
+// the file "COPYING" which should have been included with this file.  If this
+// file is missing or damaged, see the license at:
+//
+//     http://www.fltk.org/COPYING.php
+//
+// Please report all bugs and problems on the following page:
+//
+//     http://www.fltk.org/str.php
+//
+
+#ifndef fl_oxy_h
+#define fl_oxy_h
+
+#include <FL/Fl.H>
+
+// to draw arrow, a - direction the arrow, ac - active widget?, c - color the arrow, hc - lighting the arrrow
+void oxy_arrow(int x1, int y1, Fl_Align a, bool ac, Fl_Color c, Fl_Color hc=FL_BLACK);
+
+// draw boxes
+void oxy_up_box(int x, int y, int w, int h, Fl_Color c);
+void oxy_down_box(int x, int y, int w, int h, Fl_Color c);
+void oxy_up_frame(int x, int y, int w, int h, Fl_Color c);
+void oxy_down_frame(int x, int y, int w, int h, Fl_Color c);
+void oxy_thin_up_box(int x, int y, int w, int h, Fl_Color c);
+void oxy_thin_down_box(int x, int y, int w, int h, Fl_Color c);
+void oxy_thin_up_frame(int x, int y, int w, int h, Fl_Color c);
+void oxy_thin_down_frame(int x, int y, int w, int h, Fl_Color c);
+void oxy_round_up_box(int x, int y, int w, int h, Fl_Color c);
+void oxy_round_down_box(int x, int y, int w, int h, Fl_Color c);
+void oxy_button_up_box(int x, int y, int w, int h, Fl_Color c);
+void oxy_button_down_box(int x, int y, int w, int h, Fl_Color c);
+
+#endif
diff --git a/test/demo.cxx b/test/demo.cxx
index 6ba07b5..b5b9e9e 100644
--- a/test/demo.cxx
+++ b/test/demo.cxx
@@ -91,13 +91,15 @@ void create_the_forms() {
   choice->add("none");
   choice->add("gtk+");
   choice->add("gleam");
+  choice->add("oxy");
   choice->add("plastic");
   choice->callback((Fl_Callback *)doscheme);
   Fl::scheme(NULL);
   if (!Fl::scheme()) choice->value(0);
   else if (!strcmp(Fl::scheme(), "gtk+")) choice->value(1);
   else if (!strcmp(Fl::scheme(), "gleam")) choice->value(2);
-  else if (!strcmp(Fl::scheme(), "plastic")) choice->value(3);
+  else if (!strcmp(Fl::scheme(), "oxy")) choice->value(3);
+  else if (!strcmp(Fl::scheme(), "plastic")) choice->value(4);
   else choice->value(0);
   obj = new Fl_Button(10,15,330,380); obj->type(FL_HIDDEN_BUTTON);
   obj->callback(doback);
diff --git a/test/unittest_schemes.cxx b/test/unittest_schemes.cxx
index 2efcaac..752a04b 100644
--- a/test/unittest_schemes.cxx
+++ b/test/unittest_schemes.cxx
@@ -64,6 +64,7 @@ public:
     schemechoice->add("plastic");
     schemechoice->add("gtk+");
     schemechoice->add("gleam");
+    schemechoice->add("oxy");
     schemechoice->value(0);
     schemechoice->labelfont(FL_HELVETICA_BOLD);
     const char *name = Fl::scheme();
@@ -71,6 +72,7 @@ public:
            if ( strcmp(name, "plastic") == 0) { schemechoice->value(1); }
       else if ( strcmp(name, "gtk+")    == 0) { schemechoice->value(2); }
       else if ( strcmp(name, "gleam")   == 0) { schemechoice->value(3); }
+      else if ( strcmp(name, "oxy")     == 0) { schemechoice->value(4); }
     }
     schemechoice->callback(SchemeChoice_CB, (void*)this);
 
