Hello community, here is the log from the commit of package budgie-desktop for openSUSE:Factory checked in at 2020-11-24 22:12:08 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/budgie-desktop (Old) and /work/SRC/openSUSE:Factory/.budgie-desktop.new.5913 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "budgie-desktop" Tue Nov 24 22:12:08 2020 rev:13 rq:850311 version:10.5.1+ed8be169 Changes: -------- --- /work/SRC/openSUSE:Factory/budgie-desktop/budgie-desktop.changes 2020-11-03 15:32:05.856930305 +0100 +++ /work/SRC/openSUSE:Factory/.budgie-desktop.new.5913/budgie-desktop.changes 2020-11-24 22:12:57.459522134 +0100 @@ -1,0 +2,8 @@ +Mon Nov 23 20:06:02 UTC 2020 - Callum Farmer <callumjfarme...@gmail.com> + +- Update to version 10.5.1+ed8be169: + * Precise fullscreen tracking in Abomination + * Update carbontray and fix its copyright headers + * Implement setting to choose which side of the screen Raven opens on + +------------------------------------------------------------------- Old: ---- budgie-desktop-10.5.1+21060898.tar.xz New: ---- budgie-desktop-10.5.1+ed8be169.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ budgie-desktop.spec ++++++ --- /var/tmp/diff_new_pack.m66f9A/_old 2020-11-24 22:12:59.119523672 +0100 +++ /var/tmp/diff_new_pack.m66f9A/_new 2020-11-24 22:12:59.123523676 +0100 @@ -16,7 +16,7 @@ # Please submit bugfixes or comments via https://bugs.opensuse.org/ # Name: budgie-desktop -Version: 10.5.1+21060898 +Version: 10.5.1+ed8be169 Release: 0 Summary: GTK3 Desktop Environment License: GPL-2.0-or-later AND LGPL-2.1-or-later ++++++ budgie-desktop-10.5.1+21060898.tar.xz -> budgie-desktop-10.5.1+ed8be169.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/budgie-desktop-10.5.1+21060898/src/abomination/abomination.vala new/budgie-desktop-10.5.1+ed8be169/src/abomination/abomination.vala --- old/budgie-desktop-10.5.1+21060898/src/abomination/abomination.vala 2020-10-20 15:47:36.000000000 +0200 +++ new/budgie-desktop-10.5.1+ed8be169/src/abomination/abomination.vala 2020-11-08 17:30:11.000000000 +0100 @@ -132,14 +132,14 @@ }); app.window.state_changed.connect((changed, new_state) => { - bool now_fullscreen = window.is_fullscreen(); - - if (now_fullscreen) { - fullscreen_windows.insert(window.get_name(), window); // Add to fullscreen_windows - toggle_night_light(false); // Toggle the night light off if possible - } else { - fullscreen_windows.steal(window.get_name()); // Remove from fullscreen_windows - toggle_night_light(true); // Toggle the night light back on if possible + if (Wnck.WindowState.FULLSCREEN in changed) { + if (new_state == Wnck.WindowState.FULLSCREEN) { + fullscreen_windows.insert(window.get_name(), window); // Add to fullscreen_windows + toggle_night_light(false); // Toggle the night light off if possible + } else { + fullscreen_windows.steal(window.get_name()); // Remove from fullscreen_windows + toggle_night_light(true); // Toggle the night light back on if possible + } } }); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/budgie-desktop-10.5.1+21060898/src/applets/tray/carbontray/child.c new/budgie-desktop-10.5.1+ed8be169/src/applets/tray/carbontray/child.c --- old/budgie-desktop-10.5.1+21060898/src/applets/tray/carbontray/child.c 2020-10-20 15:47:36.000000000 +0200 +++ new/budgie-desktop-10.5.1+ed8be169/src/applets/tray/carbontray/child.c 2020-11-08 17:30:11.000000000 +0100 @@ -1,7 +1,7 @@ /* * This file is part of budgie-desktop * - * Copyright © 2015-2020 Budgie Desktop Developers + * Copyright © 2020 Budgie Desktop Developers * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,7 +19,6 @@ // static method header static void carbon_child_init(CarbonChild*); -static void carbon_child_realize(GtkWidget*); static void carbon_child_get_preferred_size(GtkWidget*, int*, int*); static bool set_wmclass(CarbonChild*, Display*); @@ -33,7 +32,7 @@ // public method implementations -CarbonChild* carbon_child_new(int size, GdkScreen* screen, Window iconWindow) { +CarbonChild* carbon_child_new(int size, bool shouldComposite, GdkScreen* screen, Window iconWindow) { if (GDK_IS_SCREEN(screen) == FALSE) { g_warning("No screen to place tray icon onto"); return NULL; @@ -73,10 +72,7 @@ self->isComposited = FALSE; gtk_widget_set_visual(GTK_WIDGET(self), visual); - int eventBaseReturn, errorBaseReturn; // unused, we only need to know if composite is supported at all - bool supportsComposite = XCompositeQueryExtension(xdisplay, &eventBaseReturn, &errorBaseReturn); - - if (supportsComposite) { + if (shouldComposite) { // check if there is an alpha channel in the visual. if there is, we can composite it int red_prec, green_prec, blue_prec; gdk_visual_get_red_pixel_details(visual, NULL, NULL, &red_prec); @@ -97,6 +93,33 @@ return self; } +bool carbon_child_realize(CarbonChild* self) { + GtkWidget* widget = GTK_WIDGET(self); + GdkWindow* window = gtk_widget_get_window(widget); + + GdkDisplay* display = gtk_widget_get_display(widget); + gdk_x11_display_error_trap_push(display); + + if (self->isComposited) { + XSetWindowBackground(GDK_DISPLAY_XDISPLAY(display), self->iconWindow, 0); + } else if (gtk_widget_get_visual(widget) == gdk_window_get_visual(gdk_window_get_parent(window))) { + XSetWindowBackgroundPixmap(GDK_DISPLAY_XDISPLAY(display), self->iconWindow, None); + } else { + self->parentRelativeBg = FALSE; + } + + int error = gdk_x11_display_error_trap_pop(display); + if (error != 0) { + g_warning("Encountered X error %d when setting background for tray icon", error); + return false; + } + + gdk_window_set_composited(window, self->isComposited); + gtk_widget_set_app_paintable(widget, self->parentRelativeBg || self->isComposited); + gtk_widget_set_size_request(widget, self->preferredSize, self->preferredSize); + return true; +} + void carbon_child_draw_on_tray(CarbonChild* self, GtkWidget* parent, cairo_t* cr) { g_return_if_fail(self != NULL); g_return_if_fail(parent != NULL); @@ -131,28 +154,6 @@ gtk_widget_set_valign(widget, GTK_ALIGN_CENTER); } -static void carbon_child_realize(GtkWidget* widget) { - CarbonChild* self = CARBON_CHILD(widget); - - gtk_widget_set_size_request(widget, self->preferredSize, self->preferredSize); - GTK_WIDGET_CLASS(carbon_child_parent_class)->realize(widget); - - GdkWindow* window = gtk_widget_get_window(widget); - Display* xdisplay = GDK_WINDOW_XDISPLAY(window); - Window xwindow = GDK_WINDOW_XID(window); - - if (self->isComposited) { - XSetWindowBackground(xdisplay, xwindow, 0); - } else if (gtk_widget_get_visual(widget) == gdk_window_get_visual(gdk_window_get_parent(window))) { - XSetWindowBackgroundPixmap(xdisplay, xwindow, None); - } else { - self->parentRelativeBg = FALSE; - } - - gdk_window_set_composited(window, self->isComposited); - gtk_widget_set_app_paintable(widget, self->parentRelativeBg || self->isComposited); -} - static void carbon_child_get_preferred_size(GtkWidget* base, int* minimum_size, int* natural_size) { int preferredSize = CARBON_CHILD(base)->preferredSize; *minimum_size = preferredSize; @@ -164,7 +165,6 @@ widget_class->get_preferred_width = carbon_child_get_preferred_size; widget_class->get_preferred_height = carbon_child_get_preferred_size; - widget_class->realize = carbon_child_realize; } static bool set_wmclass(CarbonChild* self, Display* xdisplay) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/budgie-desktop-10.5.1+21060898/src/applets/tray/carbontray/child.h new/budgie-desktop-10.5.1+ed8be169/src/applets/tray/carbontray/child.h --- old/budgie-desktop-10.5.1+21060898/src/applets/tray/carbontray/child.h 2020-10-20 15:47:36.000000000 +0200 +++ new/budgie-desktop-10.5.1+ed8be169/src/applets/tray/carbontray/child.h 2020-11-08 17:30:11.000000000 +0100 @@ -1,7 +1,7 @@ /* * This file is part of budgie-desktop * - * Copyright © 2015-2020 Budgie Desktop Developers + * Copyright © 2020 Budgie Desktop Developers * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -43,7 +43,9 @@ GType carbon_child_get_type(void); -CarbonChild* carbon_child_new(int, GdkScreen*, Window); +CarbonChild* carbon_child_new(int, bool, GdkScreen*, Window); + +bool carbon_child_realize(CarbonChild*); void carbon_child_draw_on_tray(CarbonChild*, GtkWidget*, cairo_t*); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/budgie-desktop-10.5.1+21060898/src/applets/tray/carbontray/tray.c new/budgie-desktop-10.5.1+ed8be169/src/applets/tray/carbontray/tray.c --- old/budgie-desktop-10.5.1+21060898/src/applets/tray/carbontray/tray.c 2020-10-20 15:47:36.000000000 +0200 +++ new/budgie-desktop-10.5.1+ed8be169/src/applets/tray/carbontray/tray.c 2020-11-08 17:30:11.000000000 +0100 @@ -1,7 +1,7 @@ /* * This file is part of budgie-desktop * - * Copyright © 2015-2020 Budgie Desktop Developers + * Copyright © 2020 Budgie Desktop Developers * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -96,13 +96,14 @@ tray->selectionAtom = gdk_atom_intern(selection_name, FALSE); g_free(selection_name); - GdkDisplay* display = gdk_screen_get_display(screen); - tray->invisible = GTK_WIDGET(g_object_ref(G_OBJECT(invisible))); set_xproperties(tray); - unsigned int timestamp = gdk_x11_get_server_time(gtk_widget_get_window(invisible)); + int eventBaseReturn, errorBaseReturn; // unused, we only need to know if composite is supported at all + tray->supportsComposite = XCompositeQueryExtension(GDK_SCREEN_XDISPLAY(screen), &eventBaseReturn, &errorBaseReturn); + unsigned int timestamp = gdk_x11_get_server_time(gtk_widget_get_window(invisible)); + GdkDisplay* display = gdk_screen_get_display(screen); bool succeed = gdk_selection_owner_set_for_display(display, gtk_widget_get_window(invisible), tray->selectionAtom, timestamp, TRUE); if (succeed) { @@ -265,7 +266,7 @@ } /* create the socket */ - CarbonChild* child = carbon_child_new(tray->iconSize, gtk_widget_get_screen(tray->invisible), window); + CarbonChild* child = carbon_child_new(tray->iconSize, tray->supportsComposite, gtk_widget_get_screen(tray->invisible), window); if (child == NULL) { return; } @@ -280,6 +281,12 @@ gtk_box_reorder_child(GTK_BOX(tray->box), socket, 0); } + // manually realize with custom method, as sometimes X can throw an error here + bool realized = carbon_child_realize(child); + if (!realized) { + return; + } + if (GTK_IS_WINDOW(gtk_widget_get_toplevel(socket))) { g_signal_connect(G_OBJECT(socket), "plug-removed", G_CALLBACK(handle_undock_request), tray); gtk_socket_add_id(GTK_SOCKET(socket), window); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/budgie-desktop-10.5.1+21060898/src/applets/tray/carbontray/tray.h new/budgie-desktop-10.5.1+ed8be169/src/applets/tray/carbontray/tray.h --- old/budgie-desktop-10.5.1+21060898/src/applets/tray/carbontray/tray.h 2020-10-20 15:47:36.000000000 +0200 +++ new/budgie-desktop-10.5.1+ed8be169/src/applets/tray/carbontray/tray.h 2020-11-08 17:30:11.000000000 +0100 @@ -1,7 +1,7 @@ /* * This file is part of budgie-desktop * - * Copyright © 2015-2020 Budgie Desktop Developers + * Copyright © 2020 Budgie Desktop Developers * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,6 +23,7 @@ GtkWidget* box; int iconSize; + bool supportsComposite; GHashTable* socketTable; GtkWidget* invisible; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/budgie-desktop-10.5.1+21060898/src/panel/manager.vala new/budgie-desktop-10.5.1+ed8be169/src/panel/manager.vala --- old/budgie-desktop-10.5.1+21060898/src/panel/manager.vala 2020-10-20 15:47:36.000000000 +0200 +++ new/budgie-desktop-10.5.1+ed8be169/src/panel/manager.vala 2020-11-08 17:30:11.000000000 +0100 @@ -61,6 +61,11 @@ public const string APPLET_PREFIX = "/com/solus-project/budgie-panel/applets"; /** + * Schema ID for Raven settings + */ + public const string RAVEN_SCHEMA = "com.solus-project.budgie-raven"; + + /** * Known panels */ public const string ROOT_KEY_PANELS = "panels"; @@ -98,6 +103,9 @@ /** Layout to select when reset/init for the first time */ public const string PANEL_KEY_LAYOUT = "layout"; + /** Position that Raven should have when opening */ + public const string RAVEN_KEY_POSITION = "raven-position"; + /** * The current migration level of Budgie, or format change, if you will. */ @@ -139,12 +147,14 @@ int primary_monitor = 0; Settings settings; + Settings raven_settings; Peas.Engine engine; Peas.ExtensionSet extensions; HashTable<string,Peas.PluginInfo?> plugins; private Budgie.Raven? raven = null; + RavenPosition raven_position; private Budgie.ThemeManager theme_manager; @@ -573,6 +583,20 @@ scr.size_changed.connect(this.on_monitors_changed); settings = new Settings(Budgie.ROOT_SCHEMA); + + // Listen to the Raven position setting for changes + raven_settings = new Settings(RAVEN_SCHEMA); + raven_position = (RavenPosition)raven_settings.get_enum(RAVEN_KEY_POSITION); + raven_settings.changed[RAVEN_KEY_POSITION].connect(() => { + RavenPosition new_position = (RavenPosition)raven_settings.get_enum(RAVEN_KEY_POSITION); + if (new_position != raven_position) { + raven_position = new_position; + + // Raven needs to know about its new position + update_screen(); + } + }); + this.default_layout = settings.get_string(PANEL_KEY_LAYOUT); theme_manager = new Budgie.ThemeManager(); raven = new Budgie.Raven(this); @@ -1085,7 +1109,54 @@ raven_screen.height -= bottom.intended_size - 5; } - if (left != null & right == null) { + // Set which side of the screen Raven should appear on + switch (raven_position) { + case RavenPosition.LEFT: + /* Stick/maybe hug left */ + raven.screen_edge = Gtk.PositionType.LEFT; + if (left != null) { + raven_screen.x += left.intended_size; + } + break; + case RavenPosition.RIGHT: + /* Stick/maybe hug right */ + raven.screen_edge = Gtk.PositionType.RIGHT; + if (right != null) { + raven_screen.width -= (right.intended_size); + } + break; + case RavenPosition.AUTOMATIC: + default: + set_raven_position(left, right, ref raven_screen); + break; + } + + /* Let Raven update itself accordingly */ + raven.update_geometry(raven_screen); + this.panels_changed(); + } + + bool is_panel_huggable(Budgie.Toplevel? panel) { + if (panel == null) { + return false; + } + if (panel.autohide != AutohidePolicy.NONE) { + return false; + } + if (panel.dock_mode) { + return false; + } + return true; + } + + /** + * Use the current panel layouts to figure out Raven's position. + * + * This function sets which side of the screen Raven should be on, + * as well as Raven's position or width (if it's on the right side). + */ + void set_raven_position(Toplevel? left, Toplevel? right, ref Gdk.Rectangle raven_screen) { + if (left != null && right == null) { if (this.is_panel_huggable(left)) { /* Hug left */ raven.screen_edge = Gtk.PositionType.LEFT; @@ -1118,23 +1189,6 @@ raven_screen.width -= (right.intended_size); } } - - /* Let Raven update itself accordingly */ - raven.update_geometry(raven_screen); - this.panels_changed(); - } - - bool is_panel_huggable(Budgie.Toplevel? panel) { - if (panel == null) { - return false; - } - if (panel.autohide != AutohidePolicy.NONE) { - return false; - } - if (panel.dock_mode) { - return false; - } - return true; } /** diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/budgie-desktop-10.5.1+21060898/src/panel/settings/settings_raven.vala new/budgie-desktop-10.5.1+ed8be169/src/panel/settings/settings_raven.vala --- old/budgie-desktop-10.5.1+21060898/src/panel/settings/settings_raven.vala 2020-10-20 15:47:36.000000000 +0200 +++ new/budgie-desktop-10.5.1+ed8be169/src/panel/settings/settings_raven.vala 2020-11-08 17:30:11.000000000 +0100 @@ -14,6 +14,7 @@ * RavenPage shows options for configuring Raven */ public class RavenPage : Budgie.SettingsPage { + private Gtk.ComboBox? raven_position; private Gtk.Switch? allow_volume_overdrive; private Gtk.Switch? enable_week_numbers; private Gtk.Switch? show_calendar_widget; @@ -34,6 +35,33 @@ var grid = new SettingsGrid(); this.add(grid); + raven_position = new Gtk.ComboBox(); + + // Add options for Raven position + var render = new Gtk.CellRendererText(); + var model = new Gtk.ListStore(3, typeof(string), typeof(string), typeof(RavenPosition)); + Gtk.TreeIter iter; + const RavenPosition[] positions = { + RavenPosition.AUTOMATIC, + RavenPosition.LEFT, + RavenPosition.RIGHT + }; + + foreach (var pos in positions) { + model.append(out iter); + model.set(iter, 0, pos.to_string(), 1, pos.get_display_name(), 2, pos, -1); + } + + raven_position.set_model(model); + raven_position.pack_start(render, true); + raven_position.add_attribute(render, "text", 1); + raven_position.set_id_column(0); + + grid.add_row(new SettingsRow(raven_position, + _("Set Raven position"), + _("Set which side of the screen Raven will open on. If set to Automatic, Raven will open where its parent panel is.") + )); + allow_volume_overdrive = new Gtk.Switch(); grid.add_row(new SettingsRow(allow_volume_overdrive, _("Allow raising volume above 100%"), @@ -76,6 +104,7 @@ )); raven_settings = new Settings("com.solus-project.budgie-raven"); + raven_settings.bind("raven-position", raven_position, "active-id", SettingsBindFlags.DEFAULT); raven_settings.bind("allow-volume-overdrive", allow_volume_overdrive, "active", SettingsBindFlags.DEFAULT); raven_settings.bind("enable-week-numbers", enable_week_numbers, "active", SettingsBindFlags.DEFAULT); raven_settings.bind("show-calendar-widget", show_calendar_widget, "active", SettingsBindFlags.DEFAULT); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/budgie-desktop-10.5.1+21060898/src/raven/com.solus-project.budgie.raven.gschema.xml new/budgie-desktop-10.5.1+ed8be169/src/raven/com.solus-project.budgie.raven.gschema.xml --- old/budgie-desktop-10.5.1+21060898/src/raven/com.solus-project.budgie.raven.gschema.xml 2020-10-20 15:47:36.000000000 +0200 +++ new/budgie-desktop-10.5.1+ed8be169/src/raven/com.solus-project.budgie.raven.gschema.xml 2020-11-08 17:30:11.000000000 +0100 @@ -1,7 +1,19 @@ <?xml version="1.0" encoding="UTF-8"?> <schemalist gettext-domain="budgie-desktop"> + <enum id="com.solus-project.budgie-raven.RavenPosition"> + <value nick="BUDGIE_RAVEN_POSITION_AUTOMATIC" value="1" /> + <value nick="BUDGIE_RAVEN_POSITION_LEFT" value="2" /> + <value nick="BUDGIE_RAVEN_POSITION_RIGHT" value="3" /> + </enum> + <schema path="/com/solus-project/budgie-raven/" id="com.solus-project.budgie-raven"> + <key enum="com.solus-project.budgie-raven.RavenPosition" name="raven-position"> + <default>'BUDGIE_RAVEN_POSITION_AUTOMATIC'</default> + <summary>Set Raven position</summary> + <description>Set which side of the screen Raven will open on. If set to Automatic, Raven will open where its parent panel is.</description> + </key> + <key type="b" name="allow-volume-overdrive"> <default>false</default> <summary>Allow raising volume above 100%</summary> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/budgie-desktop-10.5.1+21060898/src/raven/main_view.vala new/budgie-desktop-10.5.1+ed8be169/src/raven/main_view.vala --- old/budgie-desktop-10.5.1+21060898/src/raven/main_view.vala 2020-10-20 15:47:36.000000000 +0200 +++ new/budgie-desktop-10.5.1+ed8be169/src/raven/main_view.vala 2020-11-08 17:30:11.000000000 +0100 @@ -102,6 +102,12 @@ * on_raven_settings_changed will handle when the settings for Raven widgets have changed */ void on_raven_settings_changed(string key) { + // This key is handled by the panel manager instead of Raven directly. + // Moreover, it isn't a boolean so it logs a Critical message on the get_boolean() below. + if (key == "raven-position") { + return; + } + bool show_widget = raven_settings.get_boolean(key); /** diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/budgie-desktop-10.5.1+21060898/src/raven/raven.vala new/budgie-desktop-10.5.1+ed8be169/src/raven/raven.vala --- old/budgie-desktop-10.5.1+21060898/src/raven/raven.vala 2020-10-20 15:47:36.000000000 +0200 +++ new/budgie-desktop-10.5.1+ed8be169/src/raven/raven.vala 2020-11-08 17:30:11.000000000 +0100 @@ -13,6 +13,33 @@ public const string RAVEN_DBUS_NAME = "org.budgie_desktop.Raven"; public const string RAVEN_DBUS_OBJECT_PATH = "/org/budgie_desktop/Raven"; + /** + * Possible positions for Raven to be in. + * + * Automatic positioning will make Raven open on whichever side + * of the screen that the Raven toggle button is on. + */ + public enum RavenPosition { + AUTOMATIC = 1, + LEFT = 2, + RIGHT = 3; + + /** + * Get a user-friendly localized name for the position. + */ + public string get_display_name() { + switch (this) { + case RavenPosition.LEFT: + return _("Left"); + case RavenPosition.RIGHT: + return _("Right"); + case RavenPosition.AUTOMATIC: + default: + return _("Automatic"); + } + } + } + [DBus (name="org.budgie_desktop.Raven")] public class RavenIface { private Raven? parent = null; _______________________________________________ openSUSE Commits mailing list -- commit@lists.opensuse.org To unsubscribe, email commit-le...@lists.opensuse.org List Netiquette: https://en.opensuse.org/openSUSE:Mailing_list_netiquette List Archives: https://lists.opensuse.org/archives/list/commit@lists.opensuse.org