summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/options.txt5
-rw-r--r--src/feature.h7
-rw-r--r--src/gui.c17
-rw-r--r--src/gui_gtk_x11.c13
-rw-r--r--src/option.h3
-rw-r--r--src/proto/gui_gtk_x11.pro1
-rw-r--r--src/testdir/test_gui.vim9
-rw-r--r--src/version.c2
8 files changed, 56 insertions, 1 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index 9fa2bfb3a..4890a986c 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -856,6 +856,8 @@ A jump table for the options with a short description can be found at |Q_op|.
:set background&
< Vim will guess the value. In the GUI this should work correctly,
in other cases Vim might not be able to guess the right value.
+ If the GUI supports a dark them, you can use the "d" flag in
+ 'guioptions', see 'go-d'.
When the |t_RB| option is set, Vim will use it to request the background
color from the terminal. If the returned RGB value is dark/light and
@@ -3740,6 +3742,9 @@ A jump table for the options with a short description can be found at |Q_op|.
*'go-c'*
'c' Use console dialogs instead of popup dialogs for simple
choices.
+ *'go-d'*
+ 'd' Use dark theme variant if available. Currently only works for
+ GTK+ GUI.
*'go-e'*
'e' Add tab pages when indicated with 'showtabline'.
'guitablabel' can be used to change the text in the labels.
diff --git a/src/feature.h b/src/feature.h
index c4ccd2177..dc5accc7a 100644
--- a/src/feature.h
+++ b/src/feature.h
@@ -647,6 +647,13 @@
#endif
/*
+ * GUI dark theme variant
+ */
+#if defined(FEAT_GUI_GTK) && defined(USE_GTK3)
+# define FEAT_GUI_DARKTHEME
+#endif
+
+/*
* GUI tabline
*/
#if defined(FEAT_NORMAL) \
diff --git a/src/gui.c b/src/gui.c
index d9e7e47a0..860add2b4 100644
--- a/src/gui.c
+++ b/src/gui.c
@@ -3425,6 +3425,10 @@ static int prev_which_scrollbars[3];
void
gui_init_which_components(char_u *oldval UNUSED)
{
+#ifdef FEAT_GUI_DARKTHEME
+ static int prev_dark_theme = -1;
+ int using_dark_theme = FALSE;
+#endif
#ifdef FEAT_MENU
static int prev_menu_is_active = -1;
#endif
@@ -3495,6 +3499,11 @@ gui_init_which_components(char_u *oldval UNUSED)
case GO_BOT:
gui.which_scrollbars[SBAR_BOTTOM] = TRUE;
break;
+#ifdef FEAT_GUI_DARKTHEME
+ case GO_DARKTHEME:
+ using_dark_theme = TRUE;
+ break;
+#endif
#ifdef FEAT_MENU
case GO_MENUS:
gui.menu_is_active = TRUE;
@@ -3528,6 +3537,14 @@ gui_init_which_components(char_u *oldval UNUSED)
need_set_size = 0;
fix_size = FALSE;
+#ifdef FEAT_GUI_DARKTHEME
+ if (using_dark_theme != prev_dark_theme)
+ {
+ gui_mch_set_dark_theme(using_dark_theme);
+ prev_dark_theme = using_dark_theme;
+ }
+#endif
+
#ifdef FEAT_GUI_TABLINE
/* Update the GUI tab line, it may appear or disappear. This may
* cause the non-GUI tab line to disappear or appear. */
diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c
index 4940b87e2..1bf836fce 100644
--- a/src/gui_gtk_x11.c
+++ b/src/gui_gtk_x11.c
@@ -3130,6 +3130,19 @@ update_window_manager_hints(int force_width, int force_height)
}
}
+#if defined(FEAT_GUI_DARKTHEME) || defined(PROTO)
+ void
+gui_mch_set_dark_theme(int dark)
+{
+# if GTK_CHECK_VERSION(3,0,0)
+ GtkSettings *gtk_settings;
+
+ gtk_settings = gtk_settings_get_for_screen(gdk_screen_get_default());
+ g_object_set(gtk_settings, "gtk-application-prefer-dark-theme", (gboolean)dark, NULL);
+# endif
+}
+#endif /* FEAT_GUI_DARKTHEME */
+
#ifdef FEAT_TOOLBAR
/*
diff --git a/src/option.h b/src/option.h
index bb68d5afc..1d85843d5 100644
--- a/src/option.h
+++ b/src/option.h
@@ -213,6 +213,7 @@
#define GO_ASELML 'A' // autoselect modeless selection
#define GO_BOT 'b' // use bottom scrollbar
#define GO_CONDIALOG 'c' // use console dialog
+#define GO_DARKTHEME 'd' // use dark theme variant
#define GO_TABLINE 'e' // may show tabline
#define GO_FORG 'f' // start GUI in foreground
#define GO_GREY 'g' // use grey menu items
@@ -231,7 +232,7 @@
#define GO_FOOTER 'F' // add footer
#define GO_VERTICAL 'v' // arrange dialog buttons vertically
#define GO_KEEPWINSIZE 'k' // keep GUI window size
-#define GO_ALL "!aAbcefFghilmMprtTvk" // all possible flags for 'go'
+#define GO_ALL "!aAbcdefFghilmMprtTvk" // all possible flags for 'go'
// flags for 'comments' option
#define COM_NEST 'n' // comments strings nest
diff --git a/src/proto/gui_gtk_x11.pro b/src/proto/gui_gtk_x11.pro
index 708e68dd5..3f2604480 100644
--- a/src/proto/gui_gtk_x11.pro
+++ b/src/proto/gui_gtk_x11.pro
@@ -8,6 +8,7 @@ void gui_mch_stop_blink(int may_call_gui_update_cursor);
void gui_mch_start_blink(void);
int gui_mch_early_init_check(int give_message);
int gui_mch_init_check(void);
+void gui_mch_set_dark_theme(int dark);
void gui_mch_show_tabline(int showit);
int gui_mch_showing_tabline(void);
void gui_mch_update_tabline(void);
diff --git a/src/testdir/test_gui.vim b/src/testdir/test_gui.vim
index f2d82e4a6..0f2a96230 100644
--- a/src/testdir/test_gui.vim
+++ b/src/testdir/test_gui.vim
@@ -643,6 +643,15 @@ func Test_set_guioptions()
call assert_equal('aegi', &guioptions)
endif
+ if has('gui_gtk3')
+ set guioptions+=d
+ exec 'sleep' . duration
+ call assert_equal('aegid', &guioptions)
+ set guioptions-=d
+ exec 'sleep' . duration
+ call assert_equal('aegi', &guioptions)
+ endif
+
" Restore GUI ornaments to the default state.
set guioptions+=m
exec 'sleep' . duration
diff --git a/src/version.c b/src/version.c
index 9eb5db723..69c77d81d 100644
--- a/src/version.c
+++ b/src/version.c
@@ -758,6 +758,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2034,
+/**/
2033,
/**/
2032,