@@ -4907,19 +4907,92 @@ im_preedit_window_set_position(void)
49074907im_preedit_window_open ()
49084908{
49094909 char * preedit_string ;
4910+ #if !GTK_CHECK_VERSION (3 ,16 ,0 )
49104911 char buf [8 ];
4912+ #endif
49114913 PangoAttrList * attr_list ;
49124914 PangoLayout * layout ;
4915+ #if GTK_CHECK_VERSION (3 ,0 ,0 )
4916+ # if !GTK_CHECK_VERSION (3 ,16 ,0 )
4917+ GdkRGBA color ;
4918+ # endif
4919+ #else
49134920 GdkColor color ;
4921+ #endif
49144922 gint w , h ;
49154923
49164924 if (preedit_window == NULL )
49174925 {
49184926 preedit_window = gtk_window_new (GTK_WINDOW_POPUP );
4927+ gtk_window_set_transient_for (GTK_WINDOW (preedit_window ),
4928+ GTK_WINDOW (gui .mainwin ));
49194929 preedit_label = gtk_label_new ("" );
4930+ gtk_widget_set_name (preedit_label , "vim-gui-preedit-area" );
49204931 gtk_container_add (GTK_CONTAINER (preedit_window ), preedit_label );
49214932 }
49224933
4934+ #if GTK_CHECK_VERSION (3 ,16 ,0 )
4935+ {
4936+ GtkStyleContext * const context
4937+ = gtk_widget_get_style_context (gui .drawarea );
4938+ GtkCssProvider * const provider = gtk_css_provider_new ();
4939+ gchar * css = NULL ;
4940+ const char * const fontname
4941+ = pango_font_description_get_family (gui .norm_font );
4942+ gint fontsize
4943+ = pango_font_description_get_size (gui .norm_font ) / PANGO_SCALE ;
4944+ gchar * fontsize_propval = NULL ;
4945+
4946+ if (!pango_font_description_get_size_is_absolute (gui .norm_font ))
4947+ {
4948+ /* fontsize was given in points. Convert it into that in pixels
4949+ * to use with CSS. */
4950+ GdkScreen * const screen
4951+ = gdk_window_get_screen (gtk_widget_get_window (gui .mainwin ));
4952+ const gdouble dpi = gdk_screen_get_resolution (screen );
4953+ fontsize = dpi * fontsize / 72 ;
4954+ }
4955+ if (fontsize > 0 )
4956+ fontsize_propval = g_strdup_printf ("%dpx" , fontsize );
4957+ else
4958+ fontsize_propval = g_strdup_printf ("inherit" );
4959+
4960+ css = g_strdup_printf (
4961+ "widget#vim-gui-preedit-area {\n"
4962+ " font-family: %s,monospace;\n"
4963+ " font-size: %s;\n"
4964+ " color: #%.2lx%.2lx%.2lx;\n"
4965+ " background-color: #%.2lx%.2lx%.2lx;\n"
4966+ "}\n" ,
4967+ fontname != NULL ? fontname : "inherit" ,
4968+ fontsize_propval ,
4969+ (gui .norm_pixel >> 16 ) & 0xff ,
4970+ (gui .norm_pixel >> 8 ) & 0xff ,
4971+ gui .norm_pixel & 0xff ,
4972+ (gui .back_pixel >> 16 ) & 0xff ,
4973+ (gui .back_pixel >> 8 ) & 0xff ,
4974+ gui .back_pixel & 0xff );
4975+
4976+ gtk_css_provider_load_from_data (provider , css , -1 , NULL );
4977+ gtk_style_context_add_provider (context ,
4978+ GTK_STYLE_PROVIDER (provider ), G_MAXUINT );
4979+
4980+ g_free (css );
4981+ g_free (fontsize_propval );
4982+ g_object_unref (provider );
4983+ }
4984+ #elif GTK_CHECK_VERSION (3 ,0 ,0 )
4985+ gtk_widget_override_font (preedit_label , gui .norm_font );
4986+
4987+ vim_snprintf (buf , sizeof (buf ), "#%06X" , gui .norm_pixel );
4988+ gdk_rgba_parse (& color , buf );
4989+ gtk_widget_override_color (preedit_label , GTK_STATE_FLAG_NORMAL , & color );
4990+
4991+ vim_snprintf (buf , sizeof (buf ), "#%06X" , gui .back_pixel );
4992+ gdk_rgba_parse (& color , buf );
4993+ gtk_widget_override_background_color (preedit_label , GTK_STATE_FLAG_NORMAL ,
4994+ & color );
4995+ #else
49234996 gtk_widget_modify_font (preedit_label , gui .norm_font );
49244997
49254998 vim_snprintf (buf , sizeof (buf ), "#%06X" , gui .norm_pixel );
@@ -4929,6 +5002,7 @@ im_preedit_window_open()
49295002 vim_snprintf (buf , sizeof (buf ), "#%06X" , gui .back_pixel );
49305003 gdk_color_parse (buf , & color );
49315004 gtk_widget_modify_bg (preedit_window , GTK_STATE_NORMAL , & color );
5005+ #endif
49325006
49335007 gtk_im_context_get_preedit_string (xic , & preedit_string , & attr_list , NULL );
49345008
0 commit comments