set default theme for a new display



hi,

for unit-tests I open a second display on a Xvfb server which I start
before. This elaready works nicely. Now I also take screenshots from the
test-runs, for the manuals. This combined with altering the envoronment
(LC_ALL='en fr de ...') creates me localized screenshots. So far so
good. The issue is that gtk+ uses the default theme on the new display.
While the API docs are very sparse about how the theme stuff works, even
reading the sources did not really help.

Below is the code I use so far. As soon as I call
gtk_settings_get_for_screen(default_screen); I get stuff like

The program 'check_buzzard' received an X Window System error.
This probably reflects a bug in the program.
The error was 'BadRequest (invalid request code or no such operation)'.
  (Details: serial 96 error_code 1 request_code 0 minor_code 0)
  (Note to programmers: normally, X errors are reported asynchronously;
   that is, you will receive the error a while after causing it.
   To debug your program, run it with the --sync command line
   option to change this behavior. You can then get a meaningful
   backtrace from your debugger if you break on the gdk_x_error() function.)

Each test itself gets run in a fork(). If I add gdk_threads_leave(); ...
gdk_threads_enter(); around if(gtk_settings_get_for_screen()) ... the
application blocks :( Any idea?

Stefan


if((display_manager = gdk_display_manager_get())) {
  GdkScreen *default_screen;
  GtkSettings *default_settings;
  gchar *theme_name;
     
  default_display =
gdk_display_manager_get_default_display(display_manager);
  if((default_screen = gdk_display_get_default_screen(default_display))) {
    if((default_settings = gtk_settings_get_for_screen(default_screen))) {
      g_object_get(default_settings,"gtk-theme-name",&theme_name,NULL);
      GST_INFO("current theme is \"%s\"",theme_name);
      //g_object_unref(default_settings);
    }
    else GST_WARNING("can't get default_settings");
    //g_object_unref(default_screen);
  }
  else GST_WARNING("can't get default_screen");
     
  if((test_display = gdk_display_open(display_name))) {
    GdkScreen *test_screen;
    GtkSettings *test_settings;

    if((test_screen = gdk_display_get_default_screen(test_display))) {
      if((test_settings = gtk_settings_get_for_screen(test_screen))) {
        g_object_set(test_settings,"gtk-theme-name",theme_name,NULL);
        gtk_rc_reparse_all_for_settings(test_settings,TRUE);
        GST_INFO("theme switched ");
        //g_object_unref(test_settings);
      }
      else GST_WARNING("can't get test_settings on display:
\"%s\"",display_name);
      //g_object_unref(test_screen);
    }
    else GST_WARNING("can't get test_screen on display:
\"%s\"",display_name);

    gdk_display_manager_set_default_display(display_manager,test_display);
    GST_INFO("display %p,\"%s\" is
active",test_display,gdk_display_get_name(test_display));       
  }
  else {
    GST_WARNING("failed to open display: \"%s\"",display_name);
  }
  g_free(theme_name);
}
else {
  GST_WARNING("can't get display-manager");
}




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]