Re: set default theme for a new display



Answering to my self. For now I don't run gtk+ tests in a forked
environment. There seems to be some curruption/problem with the gdk_thread
handing in this case.

Stefan

On 10:05:38 pm 03/08/2006 Stefan Kost <ensonic hora-obscura de> wrote:
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_displ
ay);
    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");
}

_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list gnome org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list




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