Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package xsnow for openSUSE:Factory checked 
in at 2026-11-02 16:44:26
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/xsnow (Old)
 and      /work/SRC/openSUSE:Factory/.xsnow.new.1255 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "xsnow"

Mon Nov  2 16:44:26 2026 rev:21 rq:1394418 version:3.9.10

Changes:
--------
--- /work/SRC/openSUSE:Factory/xsnow/xsnow.changes      2026-10-23 
20:23:46.601194294 +0200
+++ /work/SRC/openSUSE:Factory/.xsnow.new.1255/xsnow.changes    2026-11-02 
16:44:27.652504894 +0100
@@ -1,0 +2,16 @@
+Fri Oct 30 21:56:32 UTC 2026 - Carsten Ziepke <[email protected]>
+
+- Update to version 3.9.10
+  * 01: Again! some adaptions on determining the size of the
+        transparent click-through window. Problem was that
+        transparent panels loose the transparency in cinnamon.
+        see: src/main.c: make_fullmaxscreen()
+  * 02: some code cleanup
+        scenery.c: scenery_draw(): wait a little bit before drawing,
+                   with multiple monitors the scenery changes after
+                   startup.
+        many files: change Flags.Done into global.Done
+        main.c: sometimes, ending xsnow results in a core dump.
+                - give threads some time o properly finish
+
+-------------------------------------------------------------------

Old:
----
  xsnow-3.9.9.tar.gz

New:
----
  xsnow-3.9.10.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ xsnow.spec ++++++
--- /var/tmp/diff_new_pack.ZeASmS/_old  2026-11-02 16:44:28.995561087 +0100
+++ /var/tmp/diff_new_pack.ZeASmS/_new  2026-11-02 16:44:28.999561254 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           xsnow
-Version:        3.9.9
+Version:        3.9.10
 Release:        0
 Summary:        A Christmas Animation
 License:        GPL-3.0-or-later

++++++ xsnow-3.9.9.tar.gz -> xsnow-3.9.10.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xsnow-3.9.9/ChangeLog new/xsnow-3.9.10/ChangeLog
--- old/xsnow-3.9.9/ChangeLog   2026-10-04 09:25:26.000000000 +0200
+++ new/xsnow-3.9.10/ChangeLog  2026-10-04 09:25:26.000000000 +0200
@@ -1,3 +1,16 @@
+version 3.9.10
+       01: Again! some adaptions on determining the size of the transparent
+           click-through window. Problem was that transparent panels loose
+           the transparency in cinnamon.
+           see: src/main.c: make_fullmaxscreen()
+       02: some code cleanup
+           scenery.c: scenery_draw(): wait a little bit before drawing,
+                      with multiple monitors the scenery changes after
+                      startup.
+           many files: change Flags.Done into global.Done
+           main.c: sometimes, ending xsnow results in a core dump.
+                   - give threads some time o properly finish
+
 version 3.9.9
        01: snow.c, xsnow.h and others: implement rotating flakes, following
            the kind instructions of Rick Jansen, the godfather of xsnow.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xsnow-3.9.9/configure new/xsnow-3.9.10/configure
--- old/xsnow-3.9.9/configure   2026-10-04 09:25:26.000000000 +0200
+++ new/xsnow-3.9.10/configure  2026-10-04 09:25:26.000000000 +0200
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.72 for xsnow 3.9.9.
+# Generated by GNU Autoconf 2.72 for xsnow 3.9.10.
 #
 # Report bugs to <[email protected]>.
 #
@@ -604,8 +604,8 @@
 # Identity of this package.
 PACKAGE_NAME='xsnow'
 PACKAGE_TARNAME='xsnow'
-PACKAGE_VERSION='3.9.9'
-PACKAGE_STRING='xsnow 3.9.9'
+PACKAGE_VERSION='3.9.10'
+PACKAGE_STRING='xsnow 3.9.10'
 PACKAGE_BUGREPORT='[email protected]'
 PACKAGE_URL=''
 
@@ -1391,7 +1391,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-'configure' configures xsnow 3.9.9 to adapt to many kinds of systems.
+'configure' configures xsnow 3.9.10 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1466,7 +1466,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of xsnow 3.9.9:";;
+     short | recursive ) echo "Configuration of xsnow 3.9.10:";;
    esac
   cat <<\_ACEOF
 
@@ -1588,7 +1588,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-xsnow configure 3.9.9
+xsnow configure 3.9.10
 generated by GNU Autoconf 2.72
 
 Copyright (C) 2023 Free Software Foundation, Inc.
@@ -2029,7 +2029,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by xsnow $as_me 3.9.9, which was
+It was created by xsnow $as_me 3.9.10, which was
 generated by GNU Autoconf 2.72.  Invocation command line was
 
   $ $0$ac_configure_args_raw
@@ -3722,7 +3722,7 @@
 
 # Define the identity of the package.
  PACKAGE='xsnow'
- VERSION='3.9.9'
+ VERSION='3.9.10'
 
 
 printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@@ -13812,7 +13812,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by xsnow $as_me 3.9.9, which was
+This file was extended by xsnow $as_me 3.9.10, which was
 generated by GNU Autoconf 2.72.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -13880,7 +13880,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-xsnow config.status 3.9.9
+xsnow config.status 3.9.10
 configured by $0, generated by GNU Autoconf 2.72,
   with options \\"\$ac_cs_config\\"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xsnow-3.9.9/configure.ac 
new/xsnow-3.9.10/configure.ac
--- old/xsnow-3.9.9/configure.ac        2026-10-04 09:25:26.000000000 +0200
+++ new/xsnow-3.9.10/configure.ac       2026-10-04 09:25:26.000000000 +0200
@@ -23,7 +23,7 @@
 #-endcopyright-
 
 AC_PREREQ([2.69])
-AC_INIT([xsnow],[3.9.9],[[email protected]])
+AC_INIT([xsnow],[3.9.10],[[email protected]])
 AC_CONFIG_SRCDIR([src/xsnow.h])
 AC_CONFIG_HEADERS([config.h])
 AM_INIT_AUTOMAKE
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xsnow-3.9.9/src/Santa.c new/xsnow-3.9.10/src/Santa.c
--- old/xsnow-3.9.9/src/Santa.c 2026-10-04 09:25:26.000000000 +0200
+++ new/xsnow-3.9.10/src/Santa.c        2026-10-04 09:25:26.000000000 +0200
@@ -264,7 +264,7 @@
 {
    (void) d;
    P("do_usanta %d\n",counter++);
-   if (Flags.Done)
+   if (global.Done)
       return FALSE;
 #define RETURN do { return TRUE ; } while(0)
    if (NOTACTIVE)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xsnow-3.9.9/src/aurora.c 
new/xsnow-3.9.10/src/aurora.c
--- old/xsnow-3.9.9/src/aurora.c        2026-10-04 09:25:26.000000000 +0200
+++ new/xsnow-3.9.10/src/aurora.c       2026-10-04 09:25:26.000000000 +0200
@@ -216,6 +216,8 @@
 void aurora_draw(cairo_t *cr)
 {
    P("aurora_draw %d %d\n",Flags.Aurora,global.counter++);
+   if (global.Done)
+      return;
    if(Flags.Aurora == 0)
       return;
    lock_copy();
@@ -245,7 +247,7 @@
    P("do_aurora %d %d\n",Flags.Aurora,global.counter++);
    while(1)
    {
-      if (Flags.Done)
+      if (global.Done)
         pthread_exit(NULL);
       if(!(Flags.Aurora == 0 || NOTACTIVE))
       {
@@ -334,6 +336,8 @@
            P("height: %d 
%f\n",j,scale*cairo_image_surface_get_height(vertsurf));
            if(1)
            {
+              if (global.Done)
+                 pthread_exit(NULL);
               // draw aurora
               cairo_set_source_surface (aurora_cr, vertsurf, 
a->step*a->z[j].x, a->z[j].y - imax/scale);
               cairo_paint_with_alpha(aurora_cr,alpha*a->za[j]);
@@ -367,6 +371,8 @@
               P("height: %d 
%f\n",j,scale*cairo_image_surface_get_height(vertsurf));
               if(1)
               {
+                 if (global.Done)
+                    pthread_exit(NULL);
                  // draw fuzz
                  cairo_set_source_surface (aurora_cr, vertsurf, 
a->step*a->fuzz[j].x, a->fuzz[j].y - imax/scale);
                  cairo_paint_with_alpha(aurora_cr,alpha*a->fuzz[j].a);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xsnow-3.9.9/src/birds.c new/xsnow-3.9.10/src/birds.c
--- old/xsnow-3.9.9/src/birds.c 2026-10-04 09:25:26.000000000 +0200
+++ new/xsnow-3.9.10/src/birds.c        2026-10-04 09:25:26.000000000 +0200
@@ -291,7 +291,7 @@
 {
    while(1)
    {
-      if (!(Flags.Done || INACTIVE))
+      if (!(global.Done || INACTIVE))
       {
 
         lock();
@@ -441,7 +441,7 @@
 
 int do_update_pos_birds(void *d)
 {
-   if (Flags.Done)
+   if (global.Done)
       return FALSE;
    LEAVE_IF_INACTIVE;
 
@@ -776,7 +776,7 @@
 
 static int do_wings(void *d)
 {
-   if (Flags.Done)
+   if (global.Done)
       return FALSE;
    LEAVE_IF_INACTIVE;
 
@@ -946,7 +946,7 @@
    // x: 0.1 .. 0.8
    // y: 0.4 .. 0.6
    // z: dependent on Flags.AttrSpace
-   if (Flags.Done)
+   if (global.Done)
       return FALSE;
    if (Flags.FollowSanta && !Flags.BirdsOnly)
       return TRUE;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xsnow-3.9.9/src/blowoff.c 
new/xsnow-3.9.10/src/blowoff.c
--- old/xsnow-3.9.9/src/blowoff.c       2026-10-04 09:25:26.000000000 +0200
+++ new/xsnow-3.9.10/src/blowoff.c      2026-10-04 09:25:26.000000000 +0200
@@ -67,7 +67,7 @@
 // determine if fallensnow should be handled for fsnow
 int do_blowoff(void *d)
 {
-   if (Flags.Done)
+   if (global.Done)
       return FALSE;
    if (NOTACTIVE || !Flags.BlowSnow)
       return TRUE;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xsnow-3.9.9/src/docs.c new/xsnow-3.9.10/src/docs.c
--- old/xsnow-3.9.9/src/docs.c  2026-10-04 09:25:26.000000000 +0200
+++ new/xsnow-3.9.10/src/docs.c 2026-10-04 09:25:26.000000000 +0200
@@ -408,6 +408,7 @@
    manout(" ","is transparent, but not click-through.");
    manout(" ","Flags to be tried in this case include: -root, -doublebuffer, 
-xwininfo, -id.");
    manout(".","Here follow some window managers with their issues:");
+   manout(".","(Note: this list was made some years ago, it needs updating.)");
    manout("."," ");
    manout("Tiling window managers","Here you need to float windows with 
class=Xsnow.");
    manout("AWESOME","Without compositor: no issues.");
@@ -436,7 +437,7 @@
    manout(" ","With compositor: no issues.");
    manout("MATE","No issues.");
    manout("OPENBOX","No issues.");
-   manout("PLASMA (KDE)","No issues.");
+   manout("PLASMA (KDE)","No issues, but see BUGS.");
    manout("SPECTRWM","Various issues. In any case you need in spectrwm.conf:");
    manout(".","    quirk[Xsnow] = FLOAT");
    manout("TWM","Without compositor: no issues.");
@@ -484,7 +485,7 @@
    manout(".","- In XFCE, compositing must be enabled for xsnow.");
    manout(" ","    Settings -> Window Manager Tweaks -> Compositor -> Enable 
display compositing");
    manout(".","- Depending on the window manager, snowing in 'all monitors' 
results in snowing");
-   manout(" ","    in one of the monitors. This happens for example in KDE.");
+   manout(" ","    in one of the monitors. This happens for example in 
KDE/plasma.");
 
    manout(".","- In multi-screen environments, it depends on the display 
settings");
    manout(" ","    if it is snowing on all screens. Experiment!");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xsnow-3.9.9/src/doit.h new/xsnow-3.9.10/src/doit.h
--- old/xsnow-3.9.9/src/doit.h  2026-10-04 09:25:26.000000000 +0200
+++ new/xsnow-3.9.10/src/doit.h 2026-10-04 09:25:26.000000000 +0200
@@ -37,7 +37,6 @@
    DOIT_I(CheckGtk            ,1  ,1 ) \
    DOIT_I(Defaults            ,0  ,0 ) \
    DOIT_I(Desktop             ,0  ,0 ) \
-   DOIT_I(Done                ,0  ,0 ) \
    DOIT_I(ForceRoot           ,0  ,0 ) \
    DOIT_I(FullScreen          ,0  ,0 ) \
    DOIT_I(HideMenu            ,0  ,0 ) \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xsnow-3.9.9/src/fallensnow.c 
new/xsnow-3.9.10/src/fallensnow.c
--- old/xsnow-3.9.9/src/fallensnow.c    2026-10-04 09:25:26.000000000 +0200
+++ new/xsnow-3.9.10/src/fallensnow.c   2026-10-04 09:25:26.000000000 +0200
@@ -244,7 +244,7 @@
    (void)d;
    while(1)
    {
-      if (Flags.Done)
+      if (global.Done)
         pthread_exit(NULL);
       if (!NOTACTIVE)
       {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xsnow-3.9.9/src/main.c new/xsnow-3.9.10/src/main.c
--- old/xsnow-3.9.9/src/main.c  2026-10-04 09:25:26.000000000 +0200
+++ new/xsnow-3.9.10/src/main.c 2026-10-04 09:25:26.000000000 +0200
@@ -183,7 +183,6 @@
 static int  do_full_trans(gpointer widget);
 static int  do_fadein(gpointer);
 static gboolean     on_draw_event(GtkWidget *widget, cairo_t *cr, gpointer 
user_data);
-//static int  do_display_dimensions_ready = 0;
 static int signal_caught = 0;
 static char *StopFile;
 
/**********************************************************************************************/
@@ -345,6 +344,9 @@
 
    global.Transparency        = 100;
 
+   global.init_ready          = 0;
+
+
    StopFile = (char*) 
malloc(sizeof(char)*(strlen(getenv("HOME"))+1+strlen(STOPFILE)+1));
    assert(StopFile);
    strcpy(StopFile,getenv("HOME"));
@@ -417,9 +419,6 @@
    if (strstr(Flags.SnowColor,"yellow") != NULL)
       printf("\n%s\n\n",_("Warning: don't eat yellow snow!"));
 
-   // set global.Transparency equal to Flags.Transparency:
-   adapt_transparency();
-
    // make a copy of all flags, before gtk_init() maybe removes some.
    // we need this at a restart of the program.
    // we need to remove 
@@ -610,7 +609,7 @@
       ui_set_sticky(Flags.AllWorkspaces);
       add_to_mainloop(PRIORITY_DEFAULT, time_desktop_type, 
do_show_desktop_type);
    }
-   Flags.Done = 0;
+   global.Done = 0;
    windows_init();
    moon_init();
    aurora_init();
@@ -655,11 +654,13 @@
    // main loop
    gtk_main();
 
-   if (SnowWinName) free(SnowWinName);
+   /*
+      if (SnowWinName) free(SnowWinName);
 
-   XClearWindow(global.display, global.SnowWin);
-   XFlush(global.display);
-   XCloseDisplay(global.display); //also frees the GC's, pixmaps and other 
resources on display
+      XClearWindow(global.display, global.SnowWin);
+      XFlush(global.display);
+      XCloseDisplay(global.display); //also frees the GC's, pixmaps and other 
resources on display
+      */
 
    if (DoRestart)
    {
@@ -1166,7 +1167,7 @@
 //
 int do_ui_check(void *d)
 {
-   if (Flags.Done)
+   if (global.Done)
       gtk_main_quit();
 
    if (Flags.NoMenu)
@@ -1249,7 +1250,7 @@
    // this can happen after changing of the displays settings
    // If the size has been changed, we restart the program
    (void)d;
-   if (Flags.Done)
+   if (global.Done)
       return FALSE;
    P("Trans: %d xxposures: %d Desktop: %d\n", global.Trans,   
global.xxposures, global.Desktop);
 
@@ -1259,7 +1260,7 @@
    if (global.ForceRestart)
    {
       DoRestart = 1;
-      Flags.Done = 1;
+      letshalt();
       I(_("Restart due to change of screen or language settings ...\n"));
    }
    return TRUE;
@@ -1269,7 +1270,7 @@
 {
    (void)d;
    P("do_event %d\n",counter++);
-   if (Flags.Done)
+   if (global.Done)
       return FALSE;
    XEvent ev;
    XFlush(global.display);
@@ -1319,7 +1320,7 @@
    if (unlink(StopFile) != 0)
       return TRUE;
    printf("Xsnow: halting because of existence of '%s'\n",StopFile);
-   Flags.Done = 1;
+   letshalt();
    return FALSE;
 }
 
@@ -1347,7 +1348,7 @@
 
 int do_show_range_etc(void *d)
 {
-   if (Flags.Done)
+   if (global.Done)
       return FALSE;
 
    if (Flags.NoMenu)
@@ -1380,7 +1381,7 @@
 int do_testing(void *d)
 {
    (void)d;
-   if (Flags.Done)
+   if (global.Done)
       return FALSE;
 
    P("SnowWinX: %d SnowWinY: %d SnowWinWidth: %d SnowWinHeight: 
%d\n",global.SnowWinX,global.SnowWinY,global.SnowWinWidth, 
global.SnowWinHeight);
@@ -1403,7 +1404,7 @@
       return;
    }
    global.HaltedByInterrupt = signum;
-   Flags.Done        = 1;
+   letshalt();
 }
 
 int XsnowErrors(Display *dpy, XErrorEvent *err)
@@ -1420,7 +1421,7 @@
    if (++count > countmax)
    {
       snprintf(global.Message,sizeof(global.Message),_("More than %d errors, I 
quit!"),countmax);
-      Flags.Done = 1;
+      letshalt();
    }
    return 0;
 }
@@ -1447,10 +1448,13 @@
 
 void drawit(cairo_t *cr)
 {
-   P("drawit %d %p\n",global.counter++,(void *)cr);
+   P("drawit %d %p %d\n",global.counter++,(void *)cr,global.init_ready);
 
-   if (Flags.Done)
+   if (global.Done)
+      return;
+   if (!global.init_ready)
       return;
+   P("drawit1 %d %p\n",global.counter++,(void *)cr);
 
    if(global.UseDouble)
    {
@@ -1550,12 +1554,6 @@
    // Make sure TransA is fullscreen or maximized and below or above as 
desired.
    if(global.Trans)
    {
-      if (Flags.Screen < 0 && nscreens > 1) 
-      {
-        make_fullmaxscreen();
-      }
-      else
-        gtk_window_maximize(GTK_WINDOW(TransA));
       set_below_above();
    }
 
@@ -1567,12 +1565,21 @@
 int do_display_dimensions(void *d)
 {
    (void)d;
-   //do_display_dimensions_ready = 1;
-   if (Flags.Done)
+   if (global.Done)
       return FALSE;
 
+   static int counter = 0;
+
+   if(counter == 1)
+   // fade global.Transparency from 100 to Flags.Transparency:
+      adapt_transparency();
+
    if (!SnowWinChanged)
+   {
+      if (++counter >1)
+        global.init_ready = 1;
       return TRUE;
+   }
    SnowWinChanged = 0;
 
    P("do_displaydimensions: calling DisplayDimensions()\n");
@@ -1600,18 +1607,22 @@
       SetWindowScale();
    }
    fflush(stdout);
+   if (++counter >1)
+      global.init_ready = 1;
    return TRUE;
 }
 
 int do_draw_all(gpointer widget)
 {
    static int counter = 0;
-   if (Flags.Done)
+   if (global.Done)
       return FALSE;
    P("do_draw_all %d %p\n",global.counter++,(void *)widget);
-   if (global.Trans && counter < 4) // to be sure we repeat this 5 times
-      make_fullmaxscreen();  // a bit strange that we have to repeat this here 
...
-   counter++;
+   if (global.Trans && counter < 1) 
+   {
+      make_fullmaxscreen();  
+      counter++;
+   }
 
    // this will result in a call of on_draw_event():
    gtk_widget_queue_draw(GTK_WIDGET(widget));
@@ -1670,12 +1681,19 @@
 
 int do_stopafter(void *d)
 {
-   Flags.Done = 1;
+   letshalt();
+   sleep(1);  // give threads time to stop
    printf(_("Halting because of flag %s\n"),"-stopafter");
    return FALSE;
    (void)d;
 }
 
+void letshalt()
+{
+   global.Done = 1;
+   sleep(1);  // give threads time to stop
+}
+
 void mybindtestdomain()
 {
    P("main: Flags.Language:%s\n",Flags.Language);
@@ -1807,11 +1825,6 @@
 
    UpdateFallenSnowAtBottom();
 
-#if 0
-   // not needed, will be taken care of by 
do_display_dimensions()->DisplayDimensions()
-   RedrawTrees();
-#endif
-
    SetMaxScreenSnowDepth();
    SetMaxWinSnowDepth();
    if(!global.IsDouble)
@@ -1843,25 +1856,63 @@
    // prevent from appearing in taskbar:
    gtk_window_set_skip_taskbar_hint(GTK_WINDOW(TransA),TRUE);
    gtk_window_set_skip_pager_hint  (GTK_WINDOW(TransA),TRUE);
-   if (Flags.Screen < 0)
+   GdkWindow *gdkwin = gtk_widget_get_window(TransA);
+   int nmonitors = xinerama(global.display, -1, NULL, NULL, NULL, NULL);
+   if (Flags.Screen < 0 && nmonitors>1)
    {
-      static GdkWindow *gdkwin = NULL;
-      static int nmonitors = 0;
-      if (!nmonitors)
-        nmonitors = xinerama(global.display, -1, NULL, NULL, NULL, NULL);
-      if (nmonitors == 1)  // return if number of monitors == 1
-        return;
-      if (!gdkwin)
-        gdkwin = gtk_widget_get_window(TransA);
       gdk_window_set_fullscreen_mode(gdkwin,GDK_FULLSCREEN_ON_ALL_MONITORS);
-      gtk_window_fullscreen(GTK_WINDOW(TransA));
+      gdk_window_fullscreen(gdkwin);
+      int w, h, x, y, xo, yo;
+      for (int i=0; i<20; i++)
+      {
+        // it seems that on my system, there must be at least
+        // 300 microseconds delay after gdk_window_get_geometry()
+        // to get the correct x, y, w and h values.
+        // since this function is called only once, we execute
+        // this silly loop.
+        gdk_window_get_geometry(gdkwin, &x, &y, &w, &h);
+        usleep(1000);
+      }
+      P("TransA, all monitors     fullscreen, w: %d, h: %d, x: %d, y: 
%d\n",w,h,x,y);
+      gdk_window_unfullscreen(gdkwin);
+      P("visible: %d\n",gdk_window_is_visible(gdkwin));
+      for (int i=0; i<20; i++) // once is not enough, it seems. why?
+      {
+        // it seems that on my system, there must be at least
+        // 300 microseconds delay after gdk_window_get_origin()
+        // to get the correct xo and yo values.
+        // since this function is called only once, we execute
+        // this silly loop.
+        gdk_window_get_origin(gdkwin, &xo, &yo);
+        usleep(1000);
+      }
+      P("origin: %d %d\n",xo,yo);
+      gdk_window_move_resize(gdkwin,x,y,w-xo,h-yo);
+      gdk_window_get_geometry(gdkwin, &x, &y, &w, &h);
+      P("TransA, all monitors   unfullscreen, w: %d, h: %d, x: %d, y: 
%d\n",w,h,x,y);
+      gdk_window_get_origin(gdkwin, &xo, &yo);
+      P("origin: %d %d\n",xo,yo);
    }
    else
+   {
       gtk_window_maximize(GTK_WINDOW(TransA));
+      int w, h, x, y;
+      gtk_window_get_size(GTK_WINDOW(TransA),&w,&h);
+      gtk_window_get_position(GTK_WINDOW(TransA),&x,&y);
+      P("TransA,   maximized, w: %d, h: %d, x: %d, y: %d\n",w,h,x,y);
+      gtk_window_set_default_size(GTK_WINDOW(TransA),w,h);
+      gtk_window_unmaximize(GTK_WINDOW(TransA));
+      gdk_window_move_resize(gdkwin,x,y,w,h);
+      gtk_window_get_size(GTK_WINDOW(TransA),&w,&h);
+      gtk_window_get_position(GTK_WINDOW(TransA),&x,&y);
+      P("TransA, unmaximized, w: %d, h: %d, x: %d, y: %d\n",w,h,x,y);
+   }
+
 }
 
 void adapt_transparency()
 {
+   P("adapt_transparency\n");
    float dt         = 0.04;
    fadein.count_max = time_fadein/dt;
    fadein.counter   = 0;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xsnow-3.9.9/src/meteor.c 
new/xsnow-3.9.10/src/meteor.c
--- old/xsnow-3.9.9/src/meteor.c        2026-10-04 09:25:26.000000000 +0200
+++ new/xsnow-3.9.10/src/meteor.c       2026-10-04 09:25:26.000000000 +0200
@@ -116,7 +116,7 @@
 {
    (void)data;
    P("do_emeteor %d\n",global.counter++);
-   if (Flags.Done)
+   if (global.Done)
       return FALSE;
    if (!meteor.active || NOTACTIVE)
       return TRUE;
@@ -151,7 +151,7 @@
 {
    (void)d;
    P("do_meteor %d\n",global.counter++);
-   if (Flags.Done)
+   if (global.Done)
       return FALSE;
 
    if (!(NOTACTIVE || meteor.active || Flags.NoMeteors))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xsnow-3.9.9/src/moon.c new/xsnow-3.9.10/src/moon.c
--- old/xsnow-3.9.9/src/moon.c  2026-10-04 09:25:26.000000000 +0200
+++ new/xsnow-3.9.10/src/moon.c 2026-10-04 09:25:26.000000000 +0200
@@ -223,7 +223,7 @@
    (void)d;
    static int xdirection = 1;
    static int ydirection = 1;
-   if (Flags.Done)
+   if (global.Done)
       return FALSE;
    LEAVE_IF_INACTIVE;
    if(!Flags.Moon)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xsnow-3.9.9/src/scenery.c 
new/xsnow-3.9.10/src/scenery.c
--- old/xsnow-3.9.9/src/scenery.c       2026-10-04 09:25:26.000000000 +0200
+++ new/xsnow-3.9.10/src/scenery.c      2026-10-04 09:25:26.000000000 +0200
@@ -129,9 +129,13 @@
 
 int scenery_draw(cairo_t *cr)
 {
-
    if(Flags.NoTrees)
       return TRUE;
+   if (!global.init_ready)
+      return TRUE;
+   //static int counter = 0;
+   //if (counter++ < 8)  // to prevent transients when using multiple monitors
+    //  return TRUE;
    for (int i=0; i<NTrees; i++)
    {
       Treeinfo *tree = Trees[i];
@@ -223,7 +227,7 @@
 int do_initbaum(void *d)
 {
    (void)d;
-   if (Flags.Done)
+   if (global.Done)
       return FALSE;
    P("%d do_initbaum %d %d\n",global.counter++,Newtrees, Flags.NoTrees);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xsnow-3.9.9/src/snow.c new/xsnow-3.9.10/src/snow.c
--- old/xsnow-3.9.9/src/snow.c  2026-10-04 09:25:26.000000000 +0200
+++ new/xsnow-3.9.10/src/snow.c 2026-10-04 09:25:26.000000000 +0200
@@ -205,7 +205,7 @@
 {
    if (Flags.NoSnowFlakes)
       return TRUE;
-   if (Flags.Done)
+   if (global.Done)
       return FALSE;
    P("snow_draw %d\n",global.counter++);
 
@@ -296,7 +296,7 @@
 
 int do_genflakes(void *d)
 {
-   if (Flags.Done)
+   if (global.Done)
       return FALSE;
 
 #define RETURN do {Prevtime = TNow; return TRUE;} while (0)
@@ -727,7 +727,7 @@
 int do_initsnow(void *d)
 {
    P("initsnow %d %d\n",global.FlakeCount,counter++);
-   if (Flags.Done)
+   if (global.Done)
       return FALSE;
    // first, kill all snowflakes
    KillFlakes = 1;
@@ -745,7 +745,7 @@
 
 int do_show_flakecount(void *d)
 {
-   if (Flags.Done)
+   if (global.Done)
       return FALSE;
    ui_show_nflakes(global.FlakeCount);
    return TRUE;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xsnow-3.9.9/src/stars.c new/xsnow-3.9.10/src/stars.c
--- old/xsnow-3.9.9/src/stars.c 2026-10-04 09:25:26.000000000 +0200
+++ new/xsnow-3.9.10/src/stars.c        2026-10-04 09:25:26.000000000 +0200
@@ -197,7 +197,7 @@
 
 int do_ustars(void *d)
 {
-   if (Flags.Done)
+   if (global.Done)
       return FALSE;
    if (NOTACTIVE)
       return TRUE;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xsnow-3.9.9/src/transwindow.c 
new/xsnow-3.9.10/src/transwindow.c
--- old/xsnow-3.9.9/src/transwindow.c   2026-10-04 09:25:26.000000000 +0200
+++ new/xsnow-3.9.10/src/transwindow.c  2026-10-04 09:25:26.000000000 +0200
@@ -111,6 +111,19 @@
                   // set full screen if so desired:
    P("xscreen: %d\n",xscreen);
 
+   gtk_window_set_default_size(GTK_WINDOW(transwindow),100,100);
+   gtk_window_move(GTK_WINDOW(transwindow),40,40);
+   gtk_widget_show(transwindow);
+   GdkWindow *gdkwin = gtk_widget_get_window(GTK_WIDGET(transwindow));
+   P("gdkwin: %p %p\n",(void*)gdkwin,(void*)transwindow);
+
+   // Ok, I admit: this all is a mess. Here a first approximation is
+   // made for the location and size of the transparent window.
+   // Later on, if needed (especially when using multiple monitors),
+   // things will get the correct values as part of the first call to
+   // main.c: do_draw_all() in main.c: make_fullmaxscreen().
+   // Probably all this stuff below should go there, something for a future 
version?
+
    if(xscreen < 0)
    {
       P("fullscreen\n");
@@ -152,9 +165,9 @@
       gtk_window_get_position (GTK_WINDOW(transwindow), &winx, &winy);
       P("winx winy: %d %d\n",winx,winy);
    }
+   P("gdkwin: %p %p\n",(void*)gdkwin,(void*)transwindow);
 
    gtk_widget_show_all(transwindow);
-   GdkWindow *gdkwin = gtk_widget_get_window(GTK_WIDGET(transwindow));
 
    // so that apps like xsnow will ignore this window:
    if(dock)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xsnow-3.9.9/src/treesnow.c 
new/xsnow-3.9.10/src/treesnow.c
--- old/xsnow-3.9.9/src/treesnow.c      2026-10-04 09:25:26.000000000 +0200
+++ new/xsnow-3.9.10/src/treesnow.c     2026-10-04 09:25:26.000000000 +0200
@@ -74,7 +74,7 @@
 int do_snow_on_trees(void *d)
 {
    P("do_snow_on_trees %d\n",counter++);
-   if (Flags.Done)
+   if (global.Done)
       return FALSE;
    if (NOTACTIVE)
       return TRUE;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xsnow-3.9.9/src/ui.c new/xsnow-3.9.10/src/ui.c
--- old/xsnow-3.9.9/src/ui.c    2026-10-04 09:25:26.000000000 +0200
+++ new/xsnow-3.9.10/src/ui.c   2026-10-04 09:25:26.000000000 +0200
@@ -805,8 +805,8 @@
    MODULE_EXPORT
 void button_quit()
 {
-   Flags.Done = 1;
-   P("button_quit: %d\n",Flags.Done);
+   letshalt();
+   P("button_quit: %d\n",global.Done);
 }
 
 
@@ -1158,7 +1158,8 @@
    init_pixmaps();
    set_buttons();
    if(global.IsWayland)
-      gtk_widget_set_sensitive(Button.Screenshots,0);
+      if (!Flags.NoMenu)
+        gtk_widget_set_sensitive(Button.Screenshots,0);
 #ifndef SCREENSHOTS
    gtk_widget_hide(Button.Screenshots);
 #endif
@@ -1186,7 +1187,8 @@
 
    if (Nscreens < 2)
    {
-      gtk_widget_set_sensitive(GTK_WIDGET(ScreenButton),FALSE);
+      if (!Flags.NoMenu)
+        gtk_widget_set_sensitive(GTK_WIDGET(ScreenButton),FALSE);
       Flags.Screen = -1;
    }
    if (Flags.Screen < -1)
@@ -1364,7 +1366,8 @@
 // however, see transparency and below 
 void ui_gray_erase(int m)
 {
-   gtk_widget_set_sensitive(Button.BelowAll,                      m);
+   if (!Flags.NoMenu)
+      gtk_widget_set_sensitive(Button.BelowAll,                      m);
    if(!Flags.BelowAllForce)
       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Button.BelowAll),1);
 }
@@ -1374,13 +1377,16 @@
 // m=1: make inactive
 void ui_gray_below(int m)
 {
-   gtk_widget_set_sensitive(Button.BelowAll, !m);
+   if (!Flags.NoMenu)
+      gtk_widget_set_sensitive(Button.BelowAll, !m);
 }
 
 // m=0: make active
 // m=1: make inactive
 void ui_gray_moonpos(int m)
 {
+   if(Flags.NoMenu)
+      return;
    GtkStyleContext *moonxlabelsc = gtk_widget_get_style_context(moonxlabel);
    GtkStyleContext *moonylabelsc = gtk_widget_get_style_context(moonylabel);
    if (m == 0)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xsnow-3.9.9/src/wind.c new/xsnow-3.9.10/src/wind.c
--- old/xsnow-3.9.9/src/wind.c  2026-10-04 09:25:26.000000000 +0200
+++ new/xsnow-3.9.10/src/wind.c 2026-10-04 09:25:26.000000000 +0200
@@ -73,7 +73,7 @@
 int do_newwind(void *d)
 {
    P("newwind\n");
-   if (Flags.Done)
+   if (global.Done)
       return FALSE;
    if (NOTACTIVE)
       return TRUE;
@@ -113,7 +113,7 @@
 int do_wind(void *d)
 {
    P("wind\n");
-   if (Flags.Done)
+   if (global.Done)
       return FALSE;
    if (NOTACTIVE)
       return TRUE;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xsnow-3.9.9/src/windows.c 
new/xsnow-3.9.10/src/windows.c
--- old/xsnow-3.9.9/src/windows.c       2026-10-04 09:25:26.000000000 +0200
+++ new/xsnow-3.9.10/src/windows.c      2026-10-04 09:25:26.000000000 +0200
@@ -280,7 +280,7 @@
       if (GetWindows(&w, &n)<0)
       {
         I("Cannot get windows\n");
-        Flags.Done = 1;
+        letshalt();
       }
       lock_Windows();
       Windows = (WinInfo *)realloc(Windows,sizeof(WinInfo)*n);
@@ -302,7 +302,7 @@
    int got_Windows_lock = 0;
    static long PrevWorkSpace = -123;
    P("do_wupdate #%d %d\n",global.counter++,global.WindowsChanged);
-   if (Flags.Done)
+   if (global.Done)
       return FALSE;
 
    if(Flags.NoKeepSWin) return TRUE;
@@ -344,7 +344,7 @@
    else
    {
       I("Cannot get current workspace\n");
-      Flags.Done = 1;
+      letshalt();
       goto end;
    }
 
@@ -423,7 +423,7 @@
         if (!global.Trans && !winfo)
         {
            I("No transparent window & no SnowWin %#lx 
found\n",global.SnowWin); 
-           Flags.Done = 1;
+           letshalt();
         }
    }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xsnow-3.9.9/src/xsnow.h new/xsnow-3.9.10/src/xsnow.h
--- old/xsnow-3.9.9/src/xsnow.h 2026-10-04 09:25:26.000000000 +0200
+++ new/xsnow-3.9.10/src/xsnow.h        2026-10-04 09:25:26.000000000 +0200
@@ -37,6 +37,7 @@
 #endif
 
 #ifdef NO_USE_BITS
+// Just to practice bit fields, does very little with memory consumption or 
cpu time.
 #define BITS(n)
 #else
 #define BITS(n) :n
@@ -199,12 +200,14 @@
    int testing             ;
    SnowMap        *fluffpix;
    int             counter;
-   unsigned int    xxposures BITS(1);
-   unsigned int    Desktop   BITS(1);
-   unsigned int    Trans     BITS(1);
-   unsigned int    UseDouble BITS(1);
-   unsigned int    IsDouble  BITS(1);
-   unsigned int    UseClip   BITS(1);
+   unsigned int    xxposures  BITS(1);
+   unsigned int    Desktop    BITS(1);
+   unsigned int    Trans      BITS(1);
+   unsigned int    UseDouble  BITS(1);
+   unsigned int    IsDouble   BITS(1);
+   unsigned int    UseClip    BITS(1);
+   unsigned int    init_ready BITS(1);   // to signal if initalization 
transparent window is ready
+   unsigned int    Done       BITS(1);   // Signal to stop activities
 
    int             XscreensaverMode;
 
@@ -308,7 +311,9 @@
    int            time_to_write_flags;
    int            tolxyw;             // tolerance used by comparing position 
and width of windows
    char*          FlagsFile;          // default: $HOME/.xsnowrc
-   float          Transparency;       //transparency, after time_fadein copy 
of Flags.Transparency
+   float          Transparency;       // transparency, after time_fadein copy 
of Flags.Transparency
 } global;
 
 extern int set_sticky(int s);
+
+extern void letshalt(void);

Reply via email to