diff options
Diffstat (limited to 'applets')
43 files changed, 2297 insertions, 1233 deletions
diff --git a/applets/clock/Makefile.am b/applets/clock/Makefile.am index 55f94e93..e145dd5f 100644 --- a/applets/clock/Makefile.am +++ b/applets/clock/Makefile.am @@ -67,6 +67,14 @@ libclock_applet_la_LIBADD = $(CLOCK_LDADD) libclock_applet_la_LDFLAGS = -module -avoid-version libclock_applet_la_CFLAGS = $(AM_CFLAGS) $(libclock_applet_la_OBJECTS): $(BUILT_SOURCES) + +if ENABLE_WAYLAND +libclock_applet_la_LIBADD += \ + $(WAYLAND_LIBS) + +AM_CPPFLAGS += \ + $(WAYLAND_CFLAGS) +endif else APPLET_IN_PROCESS = false APPLET_LOCATION = $(libexecdir)/clock-applet @@ -138,9 +146,9 @@ $(applet_in_files): $(applet_in_files).in Makefile $(applet_DATA): $(applet_in_files) $(AM_V_GEN) $(MSGFMT) --desktop --keyword= --keyword=Name --keyword=Description --template $< -d $(top_srcdir)/po -o $@ +service_in_files = org.mate.panel.applet.ClockAppletFactory.service.in if !CLOCK_INPROCESS servicedir = $(datadir)/dbus-1/services -service_in_files = org.mate.panel.applet.ClockAppletFactory.service.in service_DATA = $(service_in_files:.service.in=.service) org.mate.panel.applet.ClockAppletFactory.service: $(service_in_files) diff --git a/applets/clock/calendar-window.c b/applets/clock/calendar-window.c index 8fe2c77c..b4157344 100644 --- a/applets/clock/calendar-window.c +++ b/applets/clock/calendar-window.c @@ -93,10 +93,10 @@ static void calendar_mark_today(GtkCalendar *calendar) gtk_calendar_get_date(calendar, &year, &month, &day); time(&now); localtime_r (&now, &tm1); - if ((tm1.tm_mon == month) && (tm1.tm_year + 1900 == year)) { - gtk_calendar_mark_day (GTK_CALENDAR (calendar), tm1.tm_mday); + if ((tm1.tm_mon == (int) month) && (tm1.tm_year + 1900 == (int) year)) { + gtk_calendar_mark_day (GTK_CALENDAR (calendar), (guint) tm1.tm_mday); } else { - gtk_calendar_unmark_day (GTK_CALENDAR (calendar), tm1.tm_mday); + gtk_calendar_unmark_day (GTK_CALENDAR (calendar), (guint) tm1.tm_mday); } } @@ -131,8 +131,8 @@ calendar_window_create_calendar (CalendarWindow *calwin) localtime_r (calwin->priv->current_time, &tm1); gtk_calendar_select_month (GTK_CALENDAR (calendar), - tm1.tm_mon, tm1.tm_year + 1900); - gtk_calendar_select_day (GTK_CALENDAR (calendar), tm1.tm_mday); + (guint) tm1.tm_mon, (guint) (tm1.tm_year + 1900)); + gtk_calendar_select_day (GTK_CALENDAR (calendar), (guint) tm1.tm_mday); calendar_mark_today (GTK_CALENDAR(calendar)); g_signal_connect(calendar, "month-changed", @@ -403,6 +403,8 @@ calendar_window_dispose (GObject *object) calwin = CALENDAR_WINDOW (object); + g_clear_pointer (&calwin->priv->prefs_path, g_free); + if (calwin->priv->settings) g_object_unref (calwin->priv->settings); calwin->priv->settings = NULL; @@ -541,8 +543,6 @@ void calendar_window_set_show_weeks (CalendarWindow *calwin, gboolean show_weeks) { - GtkCalendarDisplayOptions options; - g_return_if_fail (CALENDAR_IS_WINDOW (calwin)); if (show_weeks == calwin->priv->show_weeks) @@ -551,6 +551,8 @@ calendar_window_set_show_weeks (CalendarWindow *calwin, calwin->priv->show_weeks = show_weeks; if (calwin->priv->calendar) { + GtkCalendarDisplayOptions options; + options = gtk_calendar_get_display_options (GTK_CALENDAR (calwin->priv->calendar)); if (show_weeks) @@ -617,17 +619,15 @@ calendar_window_set_prefs_path (CalendarWindow *calwin, !strcmp (calwin->priv->prefs_path, prefs_path)) return; - if (calwin->priv->prefs_path) - g_free (calwin->priv->prefs_path); - calwin->priv->prefs_path = NULL; - + g_free (calwin->priv->prefs_path); if (prefs_path && prefs_path [0]) calwin->priv->prefs_path = g_strdup (prefs_path); + else + calwin->priv->prefs_path = NULL; g_object_notify (G_OBJECT (calwin), "prefs-path"); if (calwin->priv->settings) g_object_unref (calwin->priv->settings); - calwin->priv->settings = g_settings_new_with_path (CLOCK_SCHEMA, calwin->priv->prefs_path); } diff --git a/applets/clock/clock-face.c b/applets/clock/clock-face.c index a30afd13..7340c8a8 100644 --- a/applets/clock/clock-face.c +++ b/applets/clock/clock-face.c @@ -369,20 +369,9 @@ clock_face_finalize (GObject *obj) { ClockFacePrivate *priv = clock_face_get_instance_private (CLOCK_FACE(obj)); - if (priv->location) { - g_object_unref (priv->location); - priv->location = NULL; - } - - if (priv->face_pixbuf) { - g_object_unref (priv->face_pixbuf); - priv->face_pixbuf = NULL; - } - - if (priv->size_widget) { - g_object_unref (priv->size_widget); - priv->size_widget = NULL; - } + g_clear_object (&priv->location); + g_clear_object (&priv->face_pixbuf); + g_clear_object (&priv->size_widget); G_OBJECT_CLASS (clock_face_parent_class)->finalize (obj); diff --git a/applets/clock/clock-face.h b/applets/clock/clock-face.h index 3c665c63..00106ca4 100644 --- a/applets/clock/clock-face.h +++ b/applets/clock/clock-face.h @@ -56,7 +56,6 @@ GtkWidget *clock_face_new_with_location (ClockFaceSize size, GtkWidget *size_widget); gboolean clock_face_refresh (ClockFace *this); - #ifdef __cplusplus } #endif diff --git a/applets/clock/clock-location-tile.c b/applets/clock/clock-location-tile.c index 55bc749a..e9260a31 100644 --- a/applets/clock/clock-location-tile.c +++ b/applets/clock/clock-location-tile.c @@ -82,7 +82,7 @@ clock_location_tile_new (ClockLocation *loc, g_signal_connect (priv->weather_icon, "query-tooltip", G_CALLBACK (weather_tooltip), this); - priv->location_weather_updated_id = g_signal_connect (G_OBJECT (loc), "weather-updated", + priv->location_weather_updated_id = g_signal_connect (loc, "weather-updated", G_CALLBACK (update_weather_icon), this); return this; @@ -140,22 +140,22 @@ clock_location_tile_finalize (GObject *g_obj) priv = clock_location_tile_get_instance_private (this); if (priv->location) { - g_signal_handler_disconnect (priv->location, priv->location_weather_updated_id); - priv->location_weather_updated_id = 0; - - g_object_unref (priv->location); - priv->location = NULL; - } +#if GLIB_CHECK_VERSION(2,62,0) + g_clear_signal_handler (&priv->location_weather_updated_id, + priv->location); +#else + if (priv->location_weather_updated_id != 0) { + g_signal_handler_disconnect (priv->location, + priv->location_weather_updated_id); + priv->location_weather_updated_id = 0; + } +#endif - if (priv->button_group) { - g_object_unref (priv->button_group); - priv->button_group = NULL; + g_clear_object (&priv->location); } - if (priv->current_group) { - g_object_unref (priv->current_group); - priv->current_group = NULL; - } + g_clear_object (&priv->button_group); + g_clear_object (&priv->current_group); G_OBJECT_CLASS (clock_location_tile_parent_class)->finalize (g_obj); } diff --git a/applets/clock/clock-location.c b/applets/clock/clock-location.c index 9dc25e4b..637d834d 100644 --- a/applets/clock/clock-location.c +++ b/applets/clock/clock-location.c @@ -92,7 +92,7 @@ clock_location_find_and_ref (GSList *locations, } if (l != NULL) - return g_object_ref (CLOCK_LOCATION (l->data)); + return CLOCK_LOCATION (l->data); else return NULL; } @@ -210,35 +210,14 @@ clock_location_finalize (GObject *g_obj) G_CALLBACK (network_changed), CLOCK_LOCATION (g_obj)); - if (priv->name) { - g_free (priv->name); - priv->name = NULL; - } - - if (priv->city) { - g_free (priv->city); - priv->city = NULL; - } + g_clear_pointer (&priv->name, g_free); + g_clear_pointer (&priv->city, g_free); - if (priv->systz) { - g_object_unref (priv->systz); - priv->systz = NULL; - } + g_clear_object (&priv->systz); - if (priv->timezone) { - g_free (priv->timezone); - priv->timezone = NULL; - } - - if (priv->tzname) { - g_free (priv->tzname); - priv->tzname = NULL; - } - - if (priv->weather_code) { - g_free (priv->weather_code); - priv->weather_code = NULL; - } + g_clear_pointer (&priv->timezone, g_free); + g_clear_pointer (&priv->tzname, g_free); + g_clear_pointer (&priv->weather_code, g_free); if (priv->weather_info) { weather_info_free (priv->weather_info); @@ -277,11 +256,7 @@ clock_location_set_name (ClockLocation *loc, const gchar *name) { ClockLocationPrivate *priv = clock_location_get_instance_private (loc); - if (priv->name) { - g_free (priv->name); - priv->name = NULL; - } - + g_free (priv->name); priv->name = g_strdup (name); } @@ -298,11 +273,7 @@ clock_location_set_city (ClockLocation *loc, const gchar *city) { ClockLocationPrivate *priv = clock_location_get_instance_private (loc); - if (priv->city) { - g_free (priv->city); - priv->city = NULL; - } - + g_free (priv->city); priv->city = g_strdup (city); } @@ -319,11 +290,7 @@ clock_location_set_timezone (ClockLocation *loc, const gchar *timezone) { ClockLocationPrivate *priv = clock_location_get_instance_private (loc); - if (priv->timezone) { - g_free (priv->timezone); - priv->timezone = NULL; - } - + g_free (priv->timezone); priv->timezone = g_strdup (timezone); } @@ -360,16 +327,11 @@ clock_location_set_tzname (ClockLocation *this, const char *tzname) { ClockLocationPrivate *priv = clock_location_get_instance_private (CLOCK_LOCATION(this)); - if (priv->tzname) { - if (strcmp (priv->tzname, tzname) == 0) { - return; - } - - g_free (priv->tzname); - priv->tzname = NULL; - } + if (priv->tzname && strcmp (priv->tzname, tzname) == 0) + return; - if (tzname) { + g_free (priv->tzname); + if (tzname && *tzname != '\0') { priv->tzname = g_strdup (tzname); } else { priv->tzname = NULL; @@ -472,7 +434,6 @@ clock_location_is_current (ClockLocation *loc) return FALSE; } - glong clock_location_get_offset (ClockLocation *loc) { @@ -596,7 +557,7 @@ clock_location_make_current (ClockLocation *loc, static gchar * clock_location_get_valid_weather_code (const gchar *code) { - if (!code || code[0] == '\0') + if (!code || *code == '\0') return g_strdup (WEATHER_EMPTY_CODE); else return g_strdup (code); diff --git a/applets/clock/clock-map.c b/applets/clock/clock-map.c index fc096c60..97441c62 100644 --- a/applets/clock/clock-map.c +++ b/applets/clock/clock-map.c @@ -150,32 +150,15 @@ clock_map_finalize (GObject *g_obj) priv->highlight_timeout_id = 0; } - if (priv->stock_map_pixbuf) { - g_object_unref (priv->stock_map_pixbuf); - priv->stock_map_pixbuf = NULL; - } + g_clear_object (&priv->stock_map_pixbuf); for (i = 0; i < MARKER_NB; i++) { - if (priv->location_marker_pixbuf[i]) { - g_object_unref (priv->location_marker_pixbuf[i]); - priv->location_marker_pixbuf[i] = NULL; - } + g_clear_object (&priv->location_marker_pixbuf[i]); } - if (priv->location_map_pixbuf) { - g_object_unref (priv->location_map_pixbuf); - priv->location_map_pixbuf = NULL; - } - - if (priv->shadow_pixbuf) { - g_object_unref (priv->shadow_pixbuf); - priv->shadow_pixbuf = NULL; - } - - if (priv->shadow_map_pixbuf) { - g_object_unref (priv->shadow_map_pixbuf); - priv->shadow_map_pixbuf = NULL; - } + g_clear_object (&priv->location_map_pixbuf); + g_clear_object (&priv->shadow_pixbuf); + g_clear_object (&priv->shadow_map_pixbuf); G_OBJECT_CLASS (clock_map_parent_class)->finalize (g_obj); } diff --git a/applets/clock/clock-map.h b/applets/clock/clock-map.h index 0df4a416..d400fa9b 100644 --- a/applets/clock/clock-map.h +++ b/applets/clock/clock-map.h @@ -36,7 +36,6 @@ void clock_map_refresh (ClockMap *this); void clock_map_update_time (ClockMap *this); void clock_map_blink_location (ClockMap *this, ClockLocation *loc); - #ifdef __cplusplus } #endif diff --git a/applets/clock/clock-sunpos.c b/applets/clock/clock-sunpos.c index 20a7b619..7b3ee86a 100644 --- a/applets/clock/clock-sunpos.c +++ b/applets/clock/clock-sunpos.c @@ -170,7 +170,6 @@ sun_position (time_t unix_time, gdouble *lat, gdouble *lon) *lon = ra; } - #if 0 int main (int argc, char *argv[]) diff --git a/applets/clock/clock.c b/applets/clock/clock.c index 28b28ac7..f97e56af 100644 --- a/applets/clock/clock.c +++ b/applets/clock/clock.c @@ -51,6 +51,11 @@ #include <gdk/gdkkeysyms.h> #include <gio/gio.h> +#if defined (CLOCK_INPROCESS) && defined (HAVE_WAYLAND) +#include <gdk/gdkwayland.h> +#include <gtk-layer-shell/gtk-layer-shell.h> +#endif + #ifdef HAVE_X11 #include <gdk/gdkx.h> #endif @@ -85,6 +90,18 @@ #define KEY_TEMPERATURE_UNIT "temperature-unit" #define KEY_SPEED_UNIT "speed-unit" +/* For watching for when the system resumes from sleep mode (e.g. suspend) + * and updating the clock as soon as that happens. */ +#define LOGIND_RUNNING() (access("/run/systemd/seats/", F_OK) >= 0) +#define SYSTEMD_LOGIND_SERVICE "org.freedesktop.login1" +#define SYSTEMD_LOGIND_PATH "/org/freedesktop/login1" +#define SYSTEMD_LOGIND_INTERFACE "org.freedesktop.login1.Manager" +#define CK_SERVICE "org.freedesktop.ConsoleKit" +#define CK_MANAGER_PATH "/org/freedesktop/ConsoleKit/Manager" +#define CK_MANAGER_INTERFACE "org.freedesktop.ConsoleKit.Manager" + +#define _clock_get_widget(x,y) (GTK_WIDGET (gtk_builder_get_object ((x)->builder, (y)))) + enum { COL_CITY_NAME = 0, COL_CITY_TZ, @@ -184,6 +201,8 @@ struct _ClockData { GSettings *settings; const gchar *weather_icon_name; + + GDBusProxy *system_manager_proxy; }; /* Used to count the number of clock instances. It's there to know when we @@ -241,13 +260,6 @@ clock_box_class_init (ClockBoxClass *klass) /* Clock */ -static inline GtkWidget * -_clock_get_widget (ClockData *cd, - const char *name) -{ - return GTK_WIDGET (gtk_builder_get_object (cd->builder, name)); -} - static void unfix_size (ClockData *cd) { @@ -373,7 +385,7 @@ calculate_minimum_height (GtkWidget *widget, { GtkStateFlags state; GtkStyleContext *style_context; - const PangoFontDescription *font_desc; + PangoFontDescription *font_desc; GtkBorder padding; PangoContext *pango_context; PangoFontMetrics *metrics; @@ -394,6 +406,7 @@ calculate_minimum_height (GtkWidget *widget, descent = pango_font_metrics_get_descent (metrics); pango_font_metrics_unref (metrics); + pango_font_description_free (font_desc); gtk_style_context_get_padding (style_context, state, &padding); @@ -499,8 +512,7 @@ get_updated_timeformat (ClockData *cd) static void update_timeformat (ClockData *cd) { - if (cd->timeformat) - g_free (cd->timeformat); + g_free (cd->timeformat); cd->timeformat = get_updated_timeformat (cd); } @@ -752,6 +764,12 @@ free_locations (ClockData *cd) static void destroy_clock (GtkWidget * widget, ClockData *cd) { + if (cd->system_manager_proxy) + { + g_signal_handlers_disconnect_by_data (cd->system_manager_proxy, cd); + g_object_unref (cd->system_manager_proxy); + } + if (cd->settings) g_signal_handlers_disconnect_by_data( cd->settings, cd); @@ -855,9 +873,9 @@ create_calendar (ClockData *cd) g_signal_connect (window, "edit-locations", G_CALLBACK (edit_locations_cb), cd); - g_signal_connect (window, "delete_event", + g_signal_connect (window, "delete-event", G_CALLBACK (delete_event), cd->panel_button); - g_signal_connect (window, "key_press_event", + g_signal_connect (window, "key-press-event", G_CALLBACK (close_on_escape), cd->panel_button); /*Name this window so the default theme can be overridden in panel theme, @@ -875,105 +893,204 @@ create_calendar (ClockData *cd) static void position_calendar_popup (ClockData *cd) { -#ifdef HAVE_X11 - GtkRequisition req; - GtkAllocation allocation; - GdkDisplay *display; - GdkScreen *screen; - GdkRectangle monitor; - GdkGravity gravity = GDK_GRAVITY_NORTH_WEST; - int button_w, button_h; - int x, y; - int w, h; - int i, n; - gboolean found_monitor = FALSE; - - if (!GDK_IS_X11_DISPLAY (gdk_display_get_default ())) - return; +#if defined(HAVE_X11) && defined(GDK_WINDOWING_X11) + if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) + { + GtkRequisition req; + GtkAllocation allocation; + GdkDisplay *display; + GdkScreen *screen; + GdkRectangle monitor; + GdkGravity gravity = GDK_GRAVITY_NORTH_WEST; + int button_w, button_h; + int x, y; + int w, h; + int i, n; + gboolean found_monitor = FALSE; + + + /* Get root origin of the toggle button, and position above that. */ + gdk_window_get_origin (gtk_widget_get_window (cd->panel_button), + &x, &y); + + gtk_window_get_size (GTK_WINDOW (cd->calendar_popup), &w, &h); + gtk_widget_get_preferred_size (cd->calendar_popup, &req, NULL); + w = req.width; + h = req.height; + + gtk_widget_get_allocation (cd->panel_button, &allocation); + button_w = allocation.width; + button_h = allocation.height; + + screen = gtk_window_get_screen (GTK_WINDOW (cd->calendar_popup)); + display = gdk_screen_get_display (screen); + + n = gdk_display_get_n_monitors (display); + for (i = 0; i < n; i++) { + gdk_monitor_get_geometry (gdk_display_get_monitor (display, i), &monitor); + if (x >= monitor.x && x <= monitor.x + monitor.width && + y >= monitor.y && y <= monitor.y + monitor.height) { + found_monitor = TRUE; + break; + } + } - /* Get root origin of the toggle button, and position above that. */ - gdk_window_get_origin (gtk_widget_get_window (cd->panel_button), - &x, &y); + if (!found_monitor) { + /* eek, we should be on one of those xinerama + monitors */ + monitor.x = 0; + monitor.y = 0; + monitor.width = WidthOfScreen (gdk_x11_screen_get_xscreen (screen)); + monitor.height = HeightOfScreen (gdk_x11_screen_get_xscreen (screen)); + } - gtk_window_get_size (GTK_WINDOW (cd->calendar_popup), &w, &h); - gtk_widget_get_preferred_size (cd->calendar_popup, &req, NULL); - w = req.width; - h = req.height; + /* Based on panel orientation, position the popup. + * Ignore window gravity since the window is undecorated. + * The orientations are all named backward from what + * I expected. + */ + switch (cd->orient) { + case MATE_PANEL_APPLET_ORIENT_RIGHT: + x += button_w; + if ((y + h) > monitor.y + monitor.height) + y -= (y + h) - (monitor.y + monitor.height); + + if ((y + h) > (monitor.height / 2)) + gravity = GDK_GRAVITY_SOUTH_WEST; + else + gravity = GDK_GRAVITY_NORTH_WEST; - gtk_widget_get_allocation (cd->panel_button, &allocation); - button_w = allocation.width; - button_h = allocation.height; - - screen = gtk_window_get_screen (GTK_WINDOW (cd->calendar_popup)); - display = gdk_screen_get_display (screen); - - n = gdk_display_get_n_monitors (display); - for (i = 0; i < n; i++) { - gdk_monitor_get_geometry (gdk_display_get_monitor (display, i), &monitor); - if (x >= monitor.x && x <= monitor.x + monitor.width && - y >= monitor.y && y <= monitor.y + monitor.height) { - found_monitor = TRUE; break; - } - } + case MATE_PANEL_APPLET_ORIENT_LEFT: + x -= w; + if ((y + h) > monitor.y + monitor.height) + y -= (y + h) - (monitor.y + monitor.height); - if (!found_monitor) { - /* eek, we should be on one of those xinerama - monitors */ - monitor.x = 0; - monitor.y = 0; - monitor.width = WidthOfScreen (gdk_x11_screen_get_xscreen (screen)); - monitor.height = HeightOfScreen (gdk_x11_screen_get_xscreen (screen)); - } + if ((y + h) > (monitor.height / 2)) + gravity = GDK_GRAVITY_SOUTH_EAST; + else + gravity = GDK_GRAVITY_NORTH_EAST; - /* Based on panel orientation, position the popup. - * Ignore window gravity since the window is undecorated. - * The orientations are all named backward from what - * I expected. - */ - switch (cd->orient) { - case MATE_PANEL_APPLET_ORIENT_RIGHT: - x += button_w; - if ((y + h) > monitor.y + monitor.height) - y -= (y + h) - (monitor.y + monitor.height); + break; + case MATE_PANEL_APPLET_ORIENT_DOWN: + y += button_h; + if ((x + w) > monitor.x + monitor.width) + x -= (x + w) - (monitor.x + monitor.width); - if ((y + h) > (monitor.height / 2)) - gravity = GDK_GRAVITY_SOUTH_WEST; - else gravity = GDK_GRAVITY_NORTH_WEST; - break; - case MATE_PANEL_APPLET_ORIENT_LEFT: - x -= w; - if ((y + h) > monitor.y + monitor.height) - y -= (y + h) - (monitor.y + monitor.height); + break; + case MATE_PANEL_APPLET_ORIENT_UP: + y -= h; + if ((x + w) > monitor.x + monitor.width) + x -= (x + w) - (monitor.x + monitor.width); - if ((y + h) > (monitor.height / 2)) - gravity = GDK_GRAVITY_SOUTH_EAST; - else - gravity = GDK_GRAVITY_NORTH_EAST; + gravity = GDK_GRAVITY_SOUTH_WEST; - break; - case MATE_PANEL_APPLET_ORIENT_DOWN: - y += button_h; - if ((x + w) > monitor.x + monitor.width) - x -= (x + w) - (monitor.x + monitor.width); + break; + } - gravity = GDK_GRAVITY_NORTH_WEST; + gtk_window_move (GTK_WINDOW (cd->calendar_popup), x, y); + gtk_window_set_gravity (GTK_WINDOW (cd->calendar_popup), gravity); + } +#endif - break; - case MATE_PANEL_APPLET_ORIENT_UP: - y -= h; - if ((x + w) > monitor.x + monitor.width) - x -= (x + w) - (monitor.x + monitor.width); + /*Only build wayland support when building in process*/ +#if defined(CLOCK_INPROCESS) && defined(HAVE_WAYLAND) && defined(GDK_WINDOWING_WAYLAND) + if (GDK_IS_WAYLAND_DISPLAY (gdk_display_get_default ())) + { + GtkWindow *window; + GdkWindow *panelwin; + GtkWidget *toplevel; + int x, y, w, h, panel_w, panel_h; + + /*Get the calendar window dimensions*/ + window = (GTK_WINDOW (cd->calendar_popup)); + gtk_window_get_size (window, &w, &h); + /*Find the position of the applet*/ + gdk_window_get_origin (gtk_widget_get_window (cd->panel_button), + &x, &y); + + /*Get the panel dimensions*/ + toplevel = gtk_widget_get_toplevel (cd->applet); + panelwin = gtk_widget_get_window (toplevel); + gdk_window_get_geometry (panelwin, NULL, NULL, &panel_w, &panel_h); + + /*Set up GTK Layer Shell*/ + gtk_layer_init_for_window (window); + gtk_layer_set_layer (window, GTK_LAYER_SHELL_LAYER_TOP); + + switch (cd->orient) { + case MATE_PANEL_APPLET_ORIENT_RIGHT: + gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_LEFT, TRUE); + gtk_layer_set_margin (window, GTK_LAYER_SHELL_EDGE_LEFT, 0); + gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_RIGHT, FALSE); + if (y < (panel_h - h)) + { + gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_TOP, TRUE); + gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_BOTTOM, FALSE); + gtk_layer_set_margin (window, GTK_LAYER_SHELL_EDGE_TOP, y); + } + else + { + gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_BOTTOM, TRUE); + gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_TOP, FALSE); + } + break; - gravity = GDK_GRAVITY_SOUTH_WEST; + case MATE_PANEL_APPLET_ORIENT_LEFT: + gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_RIGHT, TRUE); + gtk_layer_set_margin (window, GTK_LAYER_SHELL_EDGE_RIGHT, 0); + gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_LEFT, FALSE); + if (y < (panel_h - h)) + { + gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_TOP, TRUE); + gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_BOTTOM, FALSE); + gtk_layer_set_margin (window, GTK_LAYER_SHELL_EDGE_TOP, y); + } + else + { + gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_BOTTOM, TRUE); + gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_TOP, FALSE); + } + break; - break; - } + case MATE_PANEL_APPLET_ORIENT_DOWN: + gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_TOP, TRUE); + gtk_layer_set_margin (window, GTK_LAYER_SHELL_EDGE_TOP, 0); + gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_BOTTOM, FALSE); + if (x < (panel_w - w)) + { + gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_LEFT, TRUE); + gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_RIGHT, FALSE); + gtk_layer_set_margin (window, GTK_LAYER_SHELL_EDGE_LEFT, x); + } + else + { + gtk_layer_set_anchor(window, GTK_LAYER_SHELL_EDGE_RIGHT, TRUE); + gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_LEFT, FALSE); + } + break; - gtk_window_move (GTK_WINDOW (cd->calendar_popup), x, y); - gtk_window_set_gravity (GTK_WINDOW (cd->calendar_popup), gravity); + case MATE_PANEL_APPLET_ORIENT_UP: + gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_BOTTOM, TRUE); + gtk_layer_set_margin (window, GTK_LAYER_SHELL_EDGE_BOTTOM, 0); + gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_TOP, FALSE); + if (x < (panel_w - w)) + { + gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_LEFT, TRUE); + gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_RIGHT, FALSE); + gtk_layer_set_margin (window, GTK_LAYER_SHELL_EDGE_LEFT, x); + } + else + { + gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_RIGHT, TRUE); + gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_LEFT, FALSE); + } + break; + } + return; + } #endif } @@ -1050,7 +1167,6 @@ create_cities_store (ClockData *cd) } g_slist_free (list); - if (cd->prefs_window) { GtkWidget *widget = _clock_get_widget (cd, "cities_list"); gtk_tree_view_set_model (GTK_TREE_VIEW (widget), @@ -1071,35 +1187,17 @@ sort_locations_by_time (gconstpointer a, gconstpointer b) clock_location_localtime (loc_a, &tm_a); clock_location_localtime (loc_b, &tm_b); - ret = (tm_a.tm_year == tm_b.tm_year) ? 0 : 1; - if (ret) { - return (tm_a.tm_year < tm_b.tm_year) ? -1 : 1; - } - - ret = (tm_a.tm_mon == tm_b.tm_mon) ? 0 : 1; - if (ret) { - return (tm_a.tm_mon < tm_b.tm_mon) ? -1 : 1; - } - - ret = (tm_a.tm_mday == tm_b.tm_mday) ? 0 : 1; - if (ret) { - return (tm_a.tm_mday < tm_b.tm_mday) ? -1 : 1; - } - - ret = (tm_a.tm_hour == tm_b.tm_hour) ? 0 : 1; - if (ret) { - return (tm_a.tm_hour < tm_b.tm_hour) ? -1 : 1; - } - - ret = (tm_a.tm_min == tm_b.tm_min) ? 0 : 1; - if (ret) { - return (tm_a.tm_min < tm_b.tm_min) ? -1 : 1; - } - - ret = (tm_a.tm_sec == tm_b.tm_sec) ? 0 : 1; - if (ret) { - return (tm_a.tm_sec < tm_b.tm_sec) ? -1 : 1; - } + ret = tm_a.tm_year - tm_b.tm_year; + if (! ret) + ret = tm_a.tm_mon - tm_b.tm_mon; + if (! ret) + ret = tm_a.tm_mday - tm_b.tm_mday; + if (! ret) + ret = tm_a.tm_hour - tm_b.tm_hour; + if (! ret) + ret = tm_a.tm_min - tm_b.tm_min; + if (! ret) + ret = tm_a.tm_sec - tm_b.tm_sec; return ret; } @@ -1289,7 +1387,7 @@ do_not_eat_button_press (GtkWidget *widget, GdkEventButton *event) { if (event->button != 1) - g_signal_stop_emission_by_name (widget, "button_press_event"); + g_signal_stop_emission_by_name (widget, "button-press-event"); return FALSE; } @@ -1343,7 +1441,6 @@ force_no_button_vertical_padding (GtkWidget *widget) GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); g_object_unref (provider); - gtk_widget_set_name (widget, "clock-applet-button"); } @@ -1368,11 +1465,11 @@ create_main_clock_label (ClockData *cd) label = gtk_label_new (NULL); /*Fixme-this is invalid for labels with any recent GTK3 version, maybe all of them*/ /* - g_signal_connect (label, "size_request", + g_signal_connect (label, "size-request", G_CALLBACK (clock_size_request), cd); */ - g_signal_connect_swapped (label, "style_set", + g_signal_connect_swapped (label, "style-set", G_CALLBACK (unfix_size), cd); gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_CENTER); @@ -1418,11 +1515,11 @@ create_clock_widget (ClockData *cd) { /* Main toggle button */ cd->panel_button = create_main_clock_button (); - g_signal_connect (cd->panel_button, "button_press_event", + g_signal_connect (cd->panel_button, "button-press-event", G_CALLBACK (do_not_eat_button_press), NULL); g_signal_connect (cd->panel_button, "toggled", G_CALLBACK (toggle_calendar), cd); - g_signal_connect (G_OBJECT (cd->panel_button), "destroy", + g_signal_connect (cd->panel_button, "destroy", G_CALLBACK (destroy_clock), cd); gtk_widget_show (cd->panel_button); @@ -1827,11 +1924,11 @@ output_cb (GtkSpinButton *spin, { GtkAdjustment *adj; gchar *text; - int value; + gdouble value; adj = gtk_spin_button_get_adjustment (spin); - value = (int) gtk_adjustment_get_value (adj); - text = g_strdup_printf ("%02d", value); + value = gtk_adjustment_get_value (adj); + text = g_strdup_printf ("%02.0f", value); gtk_entry_set_text (GTK_ENTRY (spin), text); g_free (text); @@ -1847,7 +1944,7 @@ ensure_time_settings_window_is_created (ClockData *cd) return; cd->set_time_window = _clock_get_widget (cd, "set-time-window"); - g_signal_connect (cd->set_time_window, "delete_event", + g_signal_connect (cd->set_time_window, "delete-event", G_CALLBACK (delete_time_settings), cd); cd->calendar = _clock_get_widget (cd, "calendar"); @@ -1855,12 +1952,6 @@ ensure_time_settings_window_is_created (ClockData *cd) cd->minutes_spin = _clock_get_widget (cd, "minutes_spin"); cd->seconds_spin = _clock_get_widget (cd, "seconds_spin"); - gtk_entry_set_width_chars (GTK_ENTRY (cd->hours_spin), 2); - gtk_entry_set_width_chars (GTK_ENTRY (cd->minutes_spin), 2); - gtk_entry_set_width_chars (GTK_ENTRY (cd->seconds_spin), 2); - gtk_entry_set_alignment (GTK_ENTRY (cd->hours_spin), 1.0); - gtk_entry_set_alignment (GTK_ENTRY (cd->minutes_spin), 1.0); - gtk_entry_set_alignment (GTK_ENTRY (cd->seconds_spin), 1.0); g_signal_connect (cd->seconds_spin, "wrapped", G_CALLBACK (wrap_cb), cd); g_signal_connect (cd->minutes_spin, "wrapped", G_CALLBACK (wrap_cb), cd); g_signal_connect (cd->hours_spin, "wrapped", G_CALLBACK (wrap_cb), cd); @@ -1924,7 +2015,8 @@ format_changed (GSettings *settings, gchar *key, ClockData *clock) { - int new_format; + ClockFormat new_format; + new_format = g_settings_get_enum (settings, key); if (!clock->can_handle_format_12 && new_format == CLOCK_FORMAT_12) @@ -2127,9 +2219,6 @@ location_set_current_cb (ClockLocation *loc, static void locations_changed (ClockData *cd) { - GSList *l; - glong id; - if (!cd->locations) { if (cd->weather_obox) gtk_widget_hide (cd->weather_obox); @@ -2144,8 +2233,9 @@ locations_changed (ClockData *cd) gtk_widget_show (cd->weather_obox); } - for (l = cd->locations; l; l = l->next) { + for (GSList *l = cd->locations; l; l = l->next) { ClockLocation *loc = l->data; + glong id; id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (loc), "weather-updated")); if (id == 0) { @@ -2164,7 +2254,6 @@ locations_changed (ClockData *cd) create_cities_section (cd); } - static void set_locations (ClockData *cd, GSList *locations) { @@ -2253,7 +2342,7 @@ location_start_element (GMarkupParseContext *context, if (current && clock_location_is_current_timezone (loc)) clock_location_make_current (loc, NULL, NULL, NULL); - data->cities = g_slist_append (data->cities, loc); + data->cities = g_slist_append (data->cities, g_object_ref (loc)); } static GMarkupParser location_parser = { @@ -2325,21 +2414,25 @@ clock_timezone_changed (SystemTimezone *systz, refresh_click_timeout_time_only (cd); } +#define unit_combo_box_set_active(x,y) (gtk_combo_box_set_active (GTK_COMBO_BOX (gtk_builder_get_object (cd->builder, (x))), (y))) + static void temperature_unit_changed (GSettings *settings, gchar *key, ClockData *cd) { - cd->temperature_unit = g_settings_get_enum (settings, key); - if (cd->temperature_unit > 0) - { - GtkWidget *widget; - gint oldvalue; - widget = _clock_get_widget (cd, "temperature_combo"); - oldvalue = gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + 2; - if (oldvalue != cd->speed_unit) - gtk_combo_box_set_active (GTK_COMBO_BOX (widget), cd->temperature_unit - 2); - } + TempUnit temperature_unit = g_settings_get_enum (settings, key); + + if (cd->temperature_unit == temperature_unit) + return; + + /* TEMP_UNIT_INVALID = 0 */ + if (temperature_unit == TEMP_UNIT_INVALID) + return; + + unit_combo_box_set_active ("temperature_combo", + ((int) temperature_unit) - 2); + cd->temperature_unit = temperature_unit; update_weather_locations (cd); } @@ -2348,16 +2441,18 @@ speed_unit_changed (GSettings *settings, gchar *key, ClockData *cd) { - cd->speed_unit = g_settings_get_enum (settings, key); - if (cd->speed_unit > 0) - { - GtkWidget *widget; - gint oldvalue; - widget = _clock_get_widget (cd, "wind_speed_combo"); - oldvalue = gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + 2; - if (oldvalue != cd->speed_unit) - gtk_combo_box_set_active (GTK_COMBO_BOX (widget), cd->speed_unit - 2); - } + SpeedUnit speed_unit = g_settings_get_enum (settings, key); + + if (cd->speed_unit == speed_unit) + return; + + /* SPEED_UNIT_INVALID = 0 */ + if (speed_unit == SPEED_UNIT_INVALID) + return; + + unit_combo_box_set_active ("wind_speed_combo", + ((int) speed_unit) - 2); + cd->speed_unit = speed_unit; update_weather_locations (cd); } @@ -2402,16 +2497,6 @@ setup_gsettings (ClockData *cd) { cd->settings = mate_panel_applet_settings_new (MATE_PANEL_APPLET (cd->applet), CLOCK_SCHEMA); - /* hack to allow users to set custom format in dconf-editor */ - gint format; - gchar *custom_format; - format = g_settings_get_enum (cd->settings, KEY_FORMAT); - custom_format = g_settings_get_string (cd->settings, KEY_CUSTOM_FORMAT); - g_settings_set_enum (cd->settings, KEY_FORMAT, format); - g_settings_set_string (cd->settings, KEY_CUSTOM_FORMAT, custom_format); - if (custom_format != NULL) - g_free (custom_format); - g_signal_connect (cd->settings, "changed::" KEY_FORMAT, G_CALLBACK (format_changed), cd); g_signal_connect (cd->settings, "changed::" KEY_SHOW_SECONDS, G_CALLBACK (show_seconds_changed), cd); g_signal_connect (cd->settings, "changed::" KEY_SHOW_DATE, G_CALLBACK (show_date_changed), cd); @@ -2427,7 +2512,6 @@ setup_gsettings (ClockData *cd) static GSList * parse_gsettings_cities (ClockData *cd, gchar **values) { - gint i; LocationParserData data; GMarkupParseContext *context; @@ -2437,7 +2521,7 @@ parse_gsettings_cities (ClockData *cd, gchar **values) context = g_markup_parse_context_new (&location_parser, 0, &data, NULL); if (values) { - for (i = 0; values[i]; i++) { + for (gint i = 0; values[i]; i++) { g_markup_parse_context_parse (context, values[i], strlen(values[i]), NULL); } } @@ -2485,6 +2569,86 @@ load_gsettings (ClockData *cd) set_locations (cd, cities); } +/* When the system manager (ConsoleKit or systemd-logind) reports that + * the system has just resumed from sleep mode (e.g. suspend/hibernate), + * update the clock and the weather/temperature readings. That way, if + * the user suspended the system for an hour and then wakes the system up, + * the user will immediately see the current time and (if possible) + * updated weather data. Without this extra code, the user would most + * likely wake the system up and see the weather from an hour ago, and if + * the clock is set to not display seconds (only minutes), the clock may + * show an inaccurate time for up to a minute after resume. + */ +static void +system_manager_signal_cb (GDBusProxy *proxy, + gchar *sender_name, + gchar *signal_name, + GVariant *parameters, + ClockData *cd) +{ + if (g_strcmp0 (signal_name, "PrepareForSleep") == 0) + { + GVariant *variant; + gboolean active; + + variant = g_variant_get_child_value (parameters, 0); + active = g_variant_get_boolean (variant); + g_variant_unref (variant); + + /* The PrepareForSleep signal is emitted by ConsoleKit2 and + * logind, both before sleep mode is entered, and + * immediately after the system has resumed from sleep mode. + * Listeners of this signal distinguish between the two + * states by checking the parameter to this signal. If the + * parameter is TRUE, the system is about to enter sleep + * mode; if FALSE, the system has resumed from sleep mode. + * We only care about updating the clock after resumption, + * so test if the parameter is FALSE. + */ + if (active == FALSE) + { + update_clock (cd); + update_weather_locations (cd); + } + } +} + +static void +setup_monitor_for_resume (ClockData *cd) +{ + gboolean logind_running; + const char * service; + const char * path; + const char * interface; + + /* If logind is running, connect to logind; otherwise use ConsoleKit. + */ + logind_running = LOGIND_RUNNING (); + if (logind_running) { + service = SYSTEMD_LOGIND_SERVICE; + path = SYSTEMD_LOGIND_PATH; + interface = SYSTEMD_LOGIND_INTERFACE; + } else { + service = CK_SERVICE; + path = CK_MANAGER_PATH; + interface = CK_MANAGER_INTERFACE; + } + + cd->system_manager_proxy = g_dbus_proxy_new_for_bus_sync + (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, + NULL, + service, path, interface, + NULL, NULL); + + if (cd->system_manager_proxy != NULL) { + g_signal_connect (cd->system_manager_proxy, + "g-signal", + G_CALLBACK (system_manager_signal_cb), + cd); + } +} + static gboolean fill_clock_applet (MatePanelApplet *applet) { @@ -2518,19 +2682,14 @@ fill_clock_applet (MatePanelApplet *applet) /* we have to bind change_orient before we do applet_widget_add since we need to get an initial change_orient signal to set our initial oriantation, and we get that during the _add call */ - g_signal_connect (G_OBJECT (cd->applet), - "change_orient", + g_signal_connect (cd->applet, "change-orient", G_CALLBACK (applet_change_orient), cd); - g_signal_connect (G_OBJECT (cd->panel_button), - "size_allocate", + g_signal_connect (cd->panel_button, "size-allocate", G_CALLBACK (panel_button_change_pixel_size), cd); - mate_panel_applet_set_background_widget (MATE_PANEL_APPLET (cd->applet), - GTK_WIDGET (cd->applet)); - action_group = gtk_action_group_new ("ClockApplet Menu Actions"); gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); gtk_action_group_add_actions (action_group, @@ -2559,10 +2718,15 @@ fill_clock_applet (MatePanelApplet *applet) /* Make sure the weather icon gets updated when the panel size changes*/ g_signal_connect (cd->applet, - "change_size", + "change-size", G_CALLBACK (weather_icon_updated_cb), cd); + /* If ConsoleKit or systemd-logind is available, set up to update + * the clock if/when the system resumes from sleep (e.g. suspend/ + * hibernate). */ + setup_monitor_for_resume (cd); + return TRUE; } @@ -2686,7 +2850,7 @@ run_prefs_edit_save (GtkButton *button, ClockData *cd) */ clock_location_is_current (loc); - cd->locations = g_slist_append (cd->locations, loc); + cd->locations = g_slist_append (cd->locations, g_object_ref (loc)); } g_free (name); g_free (city); @@ -2916,7 +3080,7 @@ run_prefs_locations_add (GtkButton *button, ClockData *cd) if (g_object_get_data (G_OBJECT (edit_window), "delete-handler") == NULL) { g_object_set_data (G_OBJECT (edit_window), "delete-handler", - GINT_TO_POINTER (g_signal_connect (edit_window, "delete_event", G_CALLBACK (edit_delete), cd))); + GINT_TO_POINTER (g_signal_connect (edit_window, "delete-event", G_CALLBACK (edit_delete), cd))); } location_update_ok_sensitivity (cd); @@ -3045,7 +3209,6 @@ speed_combo_changed (GtkComboBox *combo, ClockData *cd) g_settings_set_enum (cd->settings, KEY_SPEED_UNIT, value); } - static void fill_prefs_window (ClockData *cd) { @@ -3199,36 +3362,35 @@ ensure_prefs_window_is_created (ClockData *cd) location_name_label = _clock_get_widget (cd, "location-name-label"); timezone_label = _clock_get_widget (cd, "timezone-label"); - if (!clock_locale_supports_am_pm ()) gtk_widget_hide (clock_options); selection = gtk_tree_view_get_selection (cd->prefs_locations); - g_signal_connect (G_OBJECT (selection), "changed", + g_signal_connect (selection, "changed", G_CALLBACK (prefs_locations_changed), cd); - g_signal_connect (G_OBJECT (cd->prefs_window), "delete_event", + g_signal_connect (cd->prefs_window, "delete-event", G_CALLBACK (prefs_hide_event), cd); - g_signal_connect (G_OBJECT (prefs_close_button), "clicked", + g_signal_connect (prefs_close_button, "clicked", G_CALLBACK (prefs_hide), cd); - g_signal_connect (G_OBJECT (prefs_help_button), "clicked", + g_signal_connect (prefs_help_button, "clicked", G_CALLBACK (prefs_help), cd); cd->prefs_location_remove_button = _clock_get_widget (cd, "prefs-locations-remove-button"); - g_signal_connect (G_OBJECT (cd->prefs_location_remove_button), "clicked", + g_signal_connect (cd->prefs_location_remove_button, "clicked", G_CALLBACK (run_prefs_locations_remove), cd); cd->prefs_location_add_button = _clock_get_widget (cd, "prefs-locations-add-button"); - g_signal_connect (G_OBJECT (cd->prefs_location_add_button), "clicked", + g_signal_connect (cd->prefs_location_add_button, "clicked", G_CALLBACK (run_prefs_locations_add), cd); cd->prefs_location_edit_button = _clock_get_widget (cd, "prefs-locations-edit-button"); - g_signal_connect (G_OBJECT (cd->prefs_location_edit_button), "clicked", + g_signal_connect (cd->prefs_location_edit_button, "clicked", G_CALLBACK (run_prefs_locations_edit), cd); edit_window = _clock_get_widget (cd, "edit-location-window"); @@ -3236,7 +3398,7 @@ ensure_prefs_window_is_created (ClockData *cd) gtk_window_set_transient_for (GTK_WINDOW (edit_window), GTK_WINDOW (cd->prefs_window)); - g_signal_connect (G_OBJECT (edit_window), "delete_event", + g_signal_connect (edit_window, "delete-event", G_CALLBACK (edit_hide_event), cd); edit_cancel_button = _clock_get_widget (cd, "edit-location-cancel-button"); @@ -3252,9 +3414,9 @@ ensure_prefs_window_is_created (ClockData *cd) gtk_label_set_mnemonic_widget (GTK_LABEL (location_name_label), GTK_WIDGET (cd->location_entry)); - g_signal_connect (G_OBJECT (cd->location_entry), "notify::location", + g_signal_connect (cd->location_entry, "notify::location", G_CALLBACK (location_changed), cd); - g_signal_connect (G_OBJECT (cd->location_entry), "changed", + g_signal_connect (cd->location_entry, "changed", G_CALLBACK (location_name_changed), cd); zone_box = _clock_get_widget (cd, "edit-location-timezone-box"); @@ -3264,15 +3426,15 @@ ensure_prefs_window_is_created (ClockData *cd) gtk_label_set_mnemonic_widget (GTK_LABEL (timezone_label), GTK_WIDGET (cd->zone_combo)); - g_signal_connect (G_OBJECT (cd->zone_combo), "notify::tzid", + g_signal_connect (cd->zone_combo, "notify::tzid", G_CALLBACK (location_timezone_changed), cd); mateweather_location_unref (world); - g_signal_connect (G_OBJECT (edit_cancel_button), "clicked", + g_signal_connect (edit_cancel_button, "clicked", G_CALLBACK (edit_hide), cd); - g_signal_connect (G_OBJECT (edit_ok_button), "clicked", + g_signal_connect (edit_ok_button, "clicked", G_CALLBACK (run_prefs_edit_save), cd); /* Set up the time setting section */ @@ -3350,8 +3512,7 @@ display_properties_dialog (ClockData *cd, gboolean start_in_locations_page) GtkWidget *notebook = _clock_get_widget (cd, "notebook"); gtk_widget_add_events (notebook, GDK_SCROLL_MASK); - g_signal_connect (GTK_NOTEBOOK (notebook), - "scroll-event", + g_signal_connect (notebook, "scroll-event", G_CALLBACK (on_notebook_scroll_event), NULL); @@ -3401,12 +3562,12 @@ static void display_about_dialog(GtkAction* action, ClockData* cd) "authors", authors, "comments", _("The Clock displays the current time and date"), "copyright", _("Copyright \xc2\xa9 1998-2004 Free Software Foundation, Inc.\n" - "Copyright \xc2\xa9 2012-2020 MATE developers"), + "Copyright \xc2\xa9 2012-2021 MATE developers"), "documenters", documenters, "logo-icon-name", CLOCK_ICON, "translator-credits", _("translator-credits"), "version", VERSION, - "website", "http://mate-desktop.org/", + "website", PACKAGE_URL, NULL); } diff --git a/applets/clock/clock.ui b/applets/clock/clock.ui index 822aca0b..fb62507c 100644 --- a/applets/clock/clock.ui +++ b/applets/clock/clock.ui @@ -1,55 +1,55 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- Generated with glade 3.22.0 --> +<!-- Generated with glade 3.38.2 --> <interface> <requires lib="gtk+" version="3.22"/> <object class="GtkAdjustment" id="adjustment1"> <property name="upper">59</property> <property name="value">59</property> - <property name="step_increment">1</property> - <property name="page_increment">30</property> + <property name="step-increment">1</property> + <property name="page-increment">30</property> </object> <object class="GtkAdjustment" id="adjustment2"> <property name="upper">59</property> <property name="value">59</property> - <property name="step_increment">1</property> - <property name="page_increment">30</property> + <property name="step-increment">1</property> + <property name="page-increment">30</property> </object> <object class="GtkAdjustment" id="adjustment3"> <property name="upper">23</property> <property name="value">23</property> - <property name="step_increment">1</property> - <property name="page_increment">12</property> + <property name="step-increment">1</property> + <property name="page-increment">12</property> </object> <object class="GtkImage" id="image1"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="icon_name">process-stop</property> + <property name="can-focus">False</property> + <property name="icon-name">process-stop</property> </object> <object class="GtkDialog" id="set-time-window"> - <property name="can_focus">False</property> - <property name="border_width">5</property> + <property name="can-focus">False</property> + <property name="border-width">5</property> <property name="title" translatable="yes">Time & Date</property> <property name="resizable">False</property> - <property name="type_hint">dialog</property> + <property name="type-hint">dialog</property> <child internal-child="vbox"> <object class="GtkBox" id="dialog-vbox2"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <child internal-child="action_area"> <object class="GtkButtonBox" id="dialog-action_area2"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="homogeneous">True</property> <child> <object class="GtkButton" id="cancel-set-time-button"> <property name="label" translatable="yes">_Cancel</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> + <property name="can-focus">True</property> + <property name="can-default">True</property> + <property name="receives-default">False</property> <property name="image">image1</property> - <property name="use_underline">True</property> + <property name="use-underline">True</property> </object> <packing> <property name="expand">False</property> @@ -61,9 +61,9 @@ <object class="GtkButton" id="set-time-button"> <property name="label" translatable="yes">_Set System Time</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="use_underline">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> </object> <packing> <property name="expand">False</property> @@ -75,28 +75,28 @@ <packing> <property name="expand">False</property> <property name="fill">False</property> - <property name="pack_type">end</property> + <property name="pack-type">end</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkAlignment" id="alignment1"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="yscale">0</property> - <property name="top_padding">7</property> - <property name="bottom_padding">6</property> - <property name="left_padding">7</property> - <property name="right_padding">7</property> + <property name="top-padding">7</property> + <property name="bottom-padding">6</property> + <property name="left-padding">7</property> + <property name="right-padding">7</property> <child> <object class="GtkBox" id="time_settings_box"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="spacing">12</property> <child> <object class="GtkCalendar" id="calendar"> <property name="visible">True</property> - <property name="can_focus">True</property> + <property name="can-focus">True</property> <property name="year">2009</property> <property name="month">5</property> <property name="day">3</property> @@ -108,23 +108,26 @@ </packing> </child> <child> + <!-- n-columns=3 n-rows=3 --> <object class="GtkGrid" id="table1"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="valign">start</property> - <property name="row_spacing">6</property> - <property name="column_spacing">12</property> + <property name="row-spacing">6</property> + <property name="column-spacing">12</property> <child> <object class="GtkBox" id="hbox61"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <child> <object class="GtkSpinButton" id="hours_spin"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">●</property> + <property name="can-focus">True</property> + <property name="invisible-char">●</property> + <property name="width-chars">2</property> + <property name="xalign">1</property> <property name="adjustment">adjustment3</property> - <property name="climb_rate">1</property> + <property name="climb-rate">1</property> <property name="numeric">True</property> <property name="wrap">True</property> </object> @@ -137,10 +140,12 @@ <child> <object class="GtkSpinButton" id="minutes_spin"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">●</property> + <property name="can-focus">True</property> + <property name="invisible-char">●</property> + <property name="width-chars">2</property> + <property name="xalign">1</property> <property name="adjustment">adjustment2</property> - <property name="climb_rate">1</property> + <property name="climb-rate">1</property> <property name="numeric">True</property> <property name="wrap">True</property> </object> @@ -153,10 +158,12 @@ <child> <object class="GtkSpinButton" id="seconds_spin"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">●</property> + <property name="can-focus">True</property> + <property name="invisible-char">●</property> + <property name="width-chars">2</property> + <property name="xalign">1</property> <property name="adjustment">adjustment1</property> - <property name="climb_rate">1</property> + <property name="climb-rate">1</property> <property name="numeric">True</property> <property name="wrap">True</property> </object> @@ -168,48 +175,63 @@ </child> </object> <packing> - <property name="left_attach">1</property> - <property name="top_attach">1</property> + <property name="left-attach">1</property> + <property name="top-attach">1</property> </packing> </child> <child> <object class="GtkLabel" id="current_time_label"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label">23:59:59</property> <property name="xalign">0</property> </object> <packing> - <property name="left_attach">1</property> - <property name="top_attach">0</property> + <property name="left-attach">1</property> + <property name="top-attach">0</property> </packing> </child> <child> <object class="GtkLabel" id="label236"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">_Time:</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">hours_spin</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">hours_spin</property> <property name="xalign">0</property> </object> <packing> - <property name="left_attach">0</property> - <property name="top_attach">1</property> + <property name="left-attach">0</property> + <property name="top-attach">1</property> </packing> </child> <child> <object class="GtkLabel" id="label235"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">Current Time:</property> <property name="xalign">0</property> </object> <packing> - <property name="left_attach">0</property> - <property name="top_attach">0</property> + <property name="left-attach">0</property> + <property name="top-attach">0</property> </packing> </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> </object> <packing> <property name="expand">False</property> @@ -232,71 +254,68 @@ <action-widget response="0">cancel-set-time-button</action-widget> <action-widget response="0">set-time-button</action-widget> </action-widgets> - <child> - <placeholder/> - </child> </object> <object class="GtkImage" id="image2"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="icon_name">gtk-ok</property> + <property name="can-focus">False</property> + <property name="icon-name">gtk-ok</property> </object> <object class="GtkImage" id="image3"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="icon_name">process-stop</property> + <property name="can-focus">False</property> + <property name="icon-name">process-stop</property> </object> <object class="GtkImage" id="image4"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="icon_name">help-browser</property> + <property name="can-focus">False</property> + <property name="icon-name">help-browser</property> </object> <object class="GtkImage" id="image5"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="icon_name">window-close</property> + <property name="can-focus">False</property> + <property name="icon-name">window-close</property> </object> <object class="GtkImage" id="image6"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="icon_name">list-add</property> + <property name="can-focus">False</property> + <property name="icon-name">list-add</property> </object> <object class="GtkImage" id="image7"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="icon_name">gtk-edit</property> + <property name="can-focus">False</property> + <property name="icon-name">gtk-edit</property> </object> <object class="GtkImage" id="image8"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="icon_name">list-remove</property> + <property name="can-focus">False</property> + <property name="icon-name">list-remove</property> </object> <object class="GtkDialog" id="prefs-window"> - <property name="can_focus">False</property> - <property name="border_width">5</property> + <property name="can-focus">False</property> + <property name="border-width">5</property> <property name="title" translatable="yes">Clock Preferences</property> <property name="resizable">False</property> - <property name="window_position">center</property> - <property name="type_hint">dialog</property> + <property name="window-position">center</property> + <property name="type-hint">dialog</property> <child internal-child="vbox"> <object class="GtkBox" id="dialog-vbox1"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <property name="spacing">2</property> <child internal-child="action_area"> <object class="GtkButtonBox" id="dialog-action_area1"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <child> <object class="GtkButton" id="prefs-help-button"> <property name="label" translatable="yes">_Help</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> + <property name="can-focus">True</property> + <property name="can-default">True</property> + <property name="receives-default">False</property> <property name="image">image4</property> - <property name="use_underline">True</property> + <property name="use-underline">True</property> </object> <packing> <property name="expand">False</property> @@ -308,10 +327,10 @@ <object class="GtkButton" id="time-settings-button"> <property name="label" translatable="yes">Time _Settings</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> - <property name="use_underline">True</property> + <property name="can-focus">True</property> + <property name="can-default">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> </object> <packing> <property name="expand">False</property> @@ -323,12 +342,12 @@ <object class="GtkButton" id="prefs-close-button"> <property name="label" translatable="yes">_Close</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="has_default">True</property> - <property name="receives_default">False</property> + <property name="can-focus">True</property> + <property name="can-default">True</property> + <property name="has-default">True</property> + <property name="receives-default">False</property> <property name="image">image5</property> - <property name="use_underline">True</property> + <property name="use-underline">True</property> </object> <packing> <property name="expand">False</property> @@ -340,32 +359,32 @@ <packing> <property name="expand">False</property> <property name="fill">False</property> - <property name="pack_type">end</property> + <property name="pack-type">end</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkNotebook" id="notebook"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="border_width">5</property> + <property name="can-focus">True</property> + <property name="border-width">5</property> <child> <object class="GtkBox" id="vbox17"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="border_width">12</property> + <property name="can-focus">False</property> + <property name="border-width">12</property> <property name="orientation">vertical</property> <property name="spacing">18</property> <child> <object class="GtkBox" id="clock-options"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <property name="spacing">6</property> <child> <object class="GtkLabel" id="label210"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">Clock Format</property> <property name="xalign">0</property> <attributes> @@ -381,21 +400,21 @@ <child> <object class="GtkAlignment" id="alignment32"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="left_padding">12</property> + <property name="can-focus">False</property> + <property name="left-padding">12</property> <child> <object class="GtkBox" id="hbox49"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="spacing">13</property> <child> <object class="GtkRadioButton" id="12hr_radio"> <property name="label" translatable="yes">_12 hour format</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="use_underline">True</property> - <property name="draw_indicator">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> </object> <packing> <property name="expand">False</property> @@ -407,10 +426,10 @@ <object class="GtkRadioButton" id="24hr_radio"> <property name="label" translatable="yes">_24 hour format</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="use_underline">True</property> - <property name="draw_indicator">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> <property name="group">12hr_radio</property> </object> <packing> @@ -438,13 +457,13 @@ <child> <object class="GtkBox" id="vbox29"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <property name="spacing">6</property> <child> <object class="GtkLabel" id="label229"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">Panel Display</property> <property name="xalign">0</property> <attributes> @@ -460,22 +479,22 @@ <child> <object class="GtkAlignment" id="alignment33"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="left_padding">12</property> + <property name="can-focus">False</property> + <property name="left-padding">12</property> <child> <object class="GtkBox" id="vbox30"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <property name="spacing">6</property> <child> <object class="GtkCheckButton" id="date_check"> <property name="label" translatable="yes">Show the _date</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="use_underline">True</property> - <property name="draw_indicator">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> </object> <packing> <property name="expand">False</property> @@ -487,10 +506,10 @@ <object class="GtkCheckButton" id="seconds_check"> <property name="label" translatable="yes">Show seco_nds</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="use_underline">True</property> - <property name="draw_indicator">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> </object> <packing> <property name="expand">False</property> @@ -502,10 +521,10 @@ <object class="GtkCheckButton" id="weeks_check"> <property name="label" translatable="yes">Show wee_k numbers in calendar</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="use_underline">True</property> - <property name="draw_indicator">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> </object> <packing> <property name="expand">False</property> @@ -517,10 +536,10 @@ <object class="GtkCheckButton" id="weather_check"> <property name="label" translatable="yes">Show _weather</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="use_underline">True</property> - <property name="draw_indicator">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> </object> <packing> <property name="expand">False</property> @@ -532,10 +551,10 @@ <object class="GtkCheckButton" id="temperature_check"> <property name="label" translatable="yes">Show _temperature</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="use_underline">True</property> - <property name="draw_indicator">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> </object> <packing> <property name="expand">False</property> @@ -564,38 +583,38 @@ <child type="tab"> <object class="GtkLabel" id="label209"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">General</property> </object> <packing> - <property name="tab_fill">False</property> + <property name="tab-fill">False</property> </packing> </child> <child> <object class="GtkBox" id="vbox24"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="border_width">12</property> + <property name="can-focus">False</property> + <property name="border-width">12</property> <property name="orientation">vertical</property> <property name="spacing">18</property> <child> <object class="GtkBox" id="hbox54"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="spacing">6</property> <child> <object class="GtkScrolledWindow" id="scrolledwindow10"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">never</property> - <property name="vscrollbar_policy">never</property> - <property name="shadow_type">in</property> + <property name="can-focus">True</property> + <property name="hscrollbar-policy">never</property> + <property name="vscrollbar-policy">never</property> + <property name="shadow-type">in</property> <child> <object class="GtkTreeView" id="cities_list"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="headers_visible">False</property> - <property name="hover_expand">True</property> + <property name="can-focus">True</property> + <property name="headers-visible">False</property> + <property name="hover-expand">True</property> <child internal-child="selection"> <object class="GtkTreeSelection"/> </child> @@ -611,19 +630,19 @@ <child> <object class="GtkButtonBox" id="vbuttonbox2"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <property name="spacing">6</property> - <property name="layout_style">start</property> + <property name="layout-style">start</property> <child> <object class="GtkButton" id="prefs-locations-add-button"> <property name="label" translatable="yes">_Add</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> + <property name="can-focus">True</property> + <property name="can-default">True</property> + <property name="receives-default">False</property> <property name="image">image6</property> - <property name="use_underline">True</property> + <property name="use-underline">True</property> </object> <packing> <property name="expand">False</property> @@ -635,11 +654,11 @@ <object class="GtkButton" id="prefs-locations-edit-button"> <property name="label" translatable="yes">_Edit</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> + <property name="can-focus">True</property> + <property name="can-default">True</property> + <property name="receives-default">False</property> <property name="image">image7</property> - <property name="use_underline">True</property> + <property name="use-underline">True</property> </object> <packing> <property name="expand">False</property> @@ -651,11 +670,11 @@ <object class="GtkButton" id="prefs-locations-remove-button"> <property name="label" translatable="yes">_Remove</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> + <property name="can-focus">True</property> + <property name="can-default">True</property> + <property name="receives-default">False</property> <property name="image">image8</property> - <property name="use_underline">True</property> + <property name="use-underline">True</property> </object> <packing> <property name="expand">False</property> @@ -685,31 +704,31 @@ <child type="tab"> <object class="GtkLabel" id="label220"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">Locations</property> </object> <packing> <property name="position">1</property> - <property name="tab_fill">False</property> + <property name="tab-fill">False</property> </packing> </child> <child> <object class="GtkBox" id="vbox27"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="border_width">12</property> + <property name="can-focus">False</property> + <property name="border-width">12</property> <property name="orientation">vertical</property> <property name="spacing">18</property> <child> <object class="GtkBox" id="vbox28"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <property name="spacing">6</property> <child> <object class="GtkLabel" id="label224"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">Display</property> <property name="xalign">0</property> <attributes> @@ -725,107 +744,120 @@ <child> <object class="GtkAlignment" id="alignment34"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="left_padding">12</property> + <property name="can-focus">False</property> + <property name="left-padding">12</property> <child> + <!-- n-columns=3 n-rows=4 --> <object class="GtkGrid" id="table25"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">12</property> - <property name="column_homogeneous">True</property> + <property name="can-focus">False</property> + <property name="row-spacing">6</property> + <property name="column-spacing">12</property> + <property name="column-homogeneous">True</property> <child> <object class="GtkComboBox" id="visibility_combo"> - <property name="can_focus">False</property> + <property name="can-focus">False</property> </object> <packing> - <property name="left_attach">1</property> - <property name="top_attach">3</property> + <property name="left-attach">1</property> + <property name="top-attach">3</property> </packing> </child> <child> <object class="GtkLabel" id="label232"> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">_Visibility unit:</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">visibility_combo</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">visibility_combo</property> <property name="xalign">0</property> </object> <packing> - <property name="left_attach">0</property> - <property name="top_attach">3</property> + <property name="left-attach">0</property> + <property name="top-attach">3</property> </packing> </child> <child> <object class="GtkComboBox" id="pressure_combo"> - <property name="can_focus">False</property> + <property name="can-focus">False</property> </object> <packing> - <property name="left_attach">1</property> - <property name="top_attach">2</property> + <property name="left-attach">1</property> + <property name="top-attach">2</property> </packing> </child> <child> <object class="GtkLabel" id="label231"> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">_Pressure unit:</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">pressure_combo</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">pressure_combo</property> <property name="xalign">0</property> </object> <packing> - <property name="left_attach">0</property> - <property name="top_attach">2</property> + <property name="left-attach">0</property> + <property name="top-attach">2</property> </packing> </child> <child> <object class="GtkComboBox" id="wind_speed_combo"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> </object> <packing> - <property name="left_attach">1</property> - <property name="top_attach">1</property> + <property name="left-attach">1</property> + <property name="top-attach">1</property> </packing> </child> <child> <object class="GtkComboBox" id="temperature_combo"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> </object> <packing> - <property name="left_attach">1</property> - <property name="top_attach">0</property> + <property name="left-attach">1</property> + <property name="top-attach">0</property> </packing> </child> <child> <object class="GtkLabel" id="label228"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">_Wind speed unit:</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">wind_speed_combo</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">wind_speed_combo</property> <property name="xalign">0</property> </object> <packing> - <property name="left_attach">0</property> - <property name="top_attach">1</property> + <property name="left-attach">0</property> + <property name="top-attach">1</property> </packing> </child> <child> <object class="GtkLabel" id="label227"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">_Temperature unit:</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">temperature_combo</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">temperature_combo</property> <property name="xalign">0</property> </object> <packing> - <property name="left_attach">0</property> - <property name="top_attach">0</property> + <property name="left-attach">0</property> + <property name="top-attach">0</property> </packing> </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> </object> </child> </object> @@ -850,12 +882,12 @@ <child type="tab"> <object class="GtkLabel" id="label223"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">Weather</property> </object> <packing> <property name="position">2</property> - <property name="tab_fill">False</property> + <property name="tab-fill">False</property> </packing> </child> </object> @@ -872,9 +904,6 @@ <action-widget response="0">time-settings-button</action-widget> <action-widget response="-7">prefs-close-button</action-widget> </action-widgets> - <child> - <placeholder/> - </child> </object> <object class="GtkListStore" id="liststore1"> <columns> @@ -905,28 +934,28 @@ </data> </object> <object class="GtkDialog" id="edit-location-window"> - <property name="can_focus">False</property> - <property name="border_width">5</property> + <property name="can-focus">False</property> + <property name="border-width">5</property> <property name="resizable">False</property> - <property name="type_hint">dialog</property> + <property name="type-hint">dialog</property> <child internal-child="vbox"> <object class="GtkBox" id="dialog-vbox3"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <child internal-child="action_area"> <object class="GtkButtonBox" id="dialog-action_area3"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <child> <object class="GtkButton" id="edit-location-cancel-button"> <property name="label" translatable="yes">_Cancel</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> + <property name="can-focus">True</property> + <property name="can-default">True</property> + <property name="receives-default">False</property> <property name="image">image3</property> - <property name="use_underline">True</property> + <property name="use-underline">True</property> </object> <packing> <property name="expand">False</property> @@ -938,11 +967,11 @@ <object class="GtkButton" id="edit-location-ok-button"> <property name="label" translatable="yes">_OK</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> + <property name="can-focus">True</property> + <property name="can-default">True</property> + <property name="receives-default">False</property> <property name="image">image2</property> - <property name="use_underline">True</property> + <property name="use-underline">True</property> </object> <packing> <property name="expand">False</property> @@ -954,37 +983,38 @@ <packing> <property name="expand">False</property> <property name="fill">False</property> - <property name="pack_type">end</property> + <property name="pack-type">end</property> <property name="position">0</property> </packing> </child> <child> + <!-- n-columns=3 n-rows=3 --> <object class="GtkGrid" id="table26"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> + <property name="can-focus">False</property> + <property name="row-spacing">6</property> + <property name="column-spacing">6</property> <child> <object class="GtkBox" id="vbox34"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <property name="spacing">6</property> <child> <object class="GtkScrolledWindow" id="scrolledwindow12"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">never</property> - <property name="vscrollbar_policy">never</property> + <property name="can-focus">True</property> + <property name="hscrollbar-policy">never</property> + <property name="vscrollbar-policy">never</property> <child> <object class="GtkViewport" id="viewport3"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="shadow_type">none</property> + <property name="can-focus">False</property> + <property name="shadow-type">none</property> <child> <object class="GtkImage" id="image30"> - <property name="can_focus">False</property> - <property name="icon_name">image-missing</property> + <property name="can-focus">False</property> + <property name="icon-name">image-missing</property> </object> </child> </object> @@ -997,102 +1027,103 @@ </packing> </child> <child> + <!-- n-columns=4 n-rows=5 --> <object class="GtkGrid" id="table27"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="border_width">5</property> + <property name="can-focus">False</property> + <property name="border-width">5</property> <property name="orientation">vertical</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> + <property name="row-spacing">6</property> + <property name="column-spacing">6</property> <child> <object class="GtkLabel" id="label243"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="vexpand">True</property> <property name="label" translatable="yes" comments="Languages that have a single word that translates as either "state" or "province" should use that instead of "region"."><small><i>Type a city, region, or country name and then select a match from the pop-up.</i></small></property> - <property name="use_markup">True</property> + <property name="use-markup">True</property> <property name="wrap">True</property> <property name="xalign">0</property> </object> <packing> - <property name="left_attach">1</property> - <property name="top_attach">1</property> + <property name="left-attach">1</property> + <property name="top-attach">1</property> <property name="width">3</property> </packing> </child> <child> <object class="GtkBox" id="edit-location-name-box"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <child> <placeholder/> </child> </object> <packing> - <property name="left_attach">1</property> - <property name="top_attach">0</property> + <property name="left-attach">1</property> + <property name="top-attach">0</property> <property name="width">3</property> </packing> </child> <child> <object class="GtkBox" id="edit-location-timezone-box"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <child> <placeholder/> </child> </object> <packing> - <property name="left_attach">1</property> - <property name="top_attach">2</property> + <property name="left-attach">1</property> + <property name="top-attach">2</property> <property name="width">3</property> </packing> </child> <child> <object class="GtkLabel" id="timezone-label"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">_Timezone:</property> - <property name="use_underline">True</property> + <property name="use-underline">True</property> <property name="xalign">0</property> </object> <packing> - <property name="left_attach">0</property> - <property name="top_attach">2</property> + <property name="left-attach">0</property> + <property name="top-attach">2</property> </packing> </child> <child> <object class="GtkLabel" id="location-name-label"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">_Location Name:</property> - <property name="use_underline">True</property> + <property name="use-underline">True</property> <property name="xalign">0</property> </object> <packing> - <property name="left_attach">0</property> - <property name="top_attach">0</property> + <property name="left-attach">0</property> + <property name="top-attach">0</property> </packing> </child> <child> <object class="GtkEntry" id="edit-location-latitude-entry"> <property name="visible">True</property> - <property name="can_focus">True</property> + <property name="can-focus">True</property> <property name="valign">center</property> <property name="hexpand">True</property> - <property name="invisible_char">•</property> + <property name="invisible-char">•</property> </object> <packing> - <property name="left_attach">1</property> - <property name="top_attach">3</property> + <property name="left-attach">1</property> + <property name="top-attach">3</property> </packing> </child> <child> <object class="GtkComboBox" id="edit-location-latitude-combo"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="model">liststore2</property> <child> <object class="GtkCellRendererText" id="cellrenderertext2"/> @@ -1102,42 +1133,42 @@ </child> </object> <packing> - <property name="left_attach">2</property> - <property name="top_attach">3</property> + <property name="left-attach">2</property> + <property name="top-attach">3</property> </packing> </child> <child> <object class="GtkLabel" id="label240"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="valign">center</property> <property name="label" translatable="yes"><i>(optional)</i></property> - <property name="use_markup">True</property> + <property name="use-markup">True</property> <property name="xalign">0</property> </object> <packing> - <property name="left_attach">3</property> - <property name="top_attach">3</property> + <property name="left-attach">3</property> + <property name="top-attach">3</property> </packing> </child> <child> <object class="GtkLabel" id="label239"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="valign">center</property> <property name="label" translatable="yes"><i>(optional)</i></property> - <property name="use_markup">True</property> + <property name="use-markup">True</property> <property name="xalign">0</property> </object> <packing> - <property name="left_attach">3</property> - <property name="top_attach">4</property> + <property name="left-attach">3</property> + <property name="top-attach">4</property> </packing> </child> <child> <object class="GtkComboBox" id="edit-location-longitude-combo"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="model">liststore1</property> <child> <object class="GtkCellRendererText" id="cellrenderertext1"/> @@ -1147,51 +1178,51 @@ </child> </object> <packing> - <property name="left_attach">2</property> - <property name="top_attach">4</property> + <property name="left-attach">2</property> + <property name="top-attach">4</property> </packing> </child> <child> <object class="GtkEntry" id="edit-location-longitude-entry"> <property name="visible">True</property> - <property name="can_focus">True</property> + <property name="can-focus">True</property> <property name="valign">center</property> <property name="hexpand">True</property> - <property name="invisible_char">•</property> + <property name="invisible-char">•</property> </object> <packing> - <property name="left_attach">1</property> - <property name="top_attach">4</property> + <property name="left-attach">1</property> + <property name="top-attach">4</property> </packing> </child> <child> <object class="GtkLabel" id="label238"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">L_ongitude:</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">edit-location-longitude-entry</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">edit-location-longitude-entry</property> <property name="xalign">0</property> </object> <packing> - <property name="left_attach">0</property> - <property name="top_attach">4</property> + <property name="left-attach">0</property> + <property name="top-attach">4</property> </packing> </child> <child> <object class="GtkBox" id="vbox35"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <property name="spacing">6</property> <property name="homogeneous">True</property> <child> <object class="GtkLabel" id="label237"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">L_atitude:</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">edit-location-latitude-entry</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">edit-location-latitude-entry</property> <property name="xalign">0</property> </object> <packing> @@ -1202,8 +1233,8 @@ </child> </object> <packing> - <property name="left_attach">0</property> - <property name="top_attach">3</property> + <property name="left-attach">0</property> + <property name="top-attach">3</property> </packing> </child> <child> @@ -1218,10 +1249,34 @@ </child> </object> <packing> - <property name="left_attach">0</property> - <property name="top_attach">0</property> + <property name="left-attach">0</property> + <property name="top-attach">0</property> </packing> </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> </object> <packing> <property name="expand">False</property> @@ -1235,8 +1290,5 @@ <action-widget response="-6">edit-location-cancel-button</action-widget> <action-widget response="-5">edit-location-ok-button</action-widget> </action-widgets> - <child> - <placeholder/> - </child> </object> </interface> diff --git a/applets/clock/system-timezone.c b/applets/clock/system-timezone.c index b1755aa9..a6f9c75d 100644 --- a/applets/clock/system-timezone.c +++ b/applets/clock/system-timezone.c @@ -213,8 +213,7 @@ system_timezone_constructor (GType type, g_object_unref (file); if (priv->monitors[i]) - g_signal_connect (G_OBJECT (priv->monitors[i]), - "changed", + g_signal_connect (priv->monitors [i], "changed", G_CALLBACK (system_timezone_monitor_changed), obj); } @@ -234,20 +233,11 @@ system_timezone_finalize (GObject *obj) systz = SYSTEM_TIMEZONE (obj); priv = system_timezone_get_instance_private (systz); - if (priv->tz) { - g_free (priv->tz); - priv->tz = NULL; - } - - if (priv->env_tz) { - g_free (priv->env_tz); - priv->env_tz = NULL; - } + g_clear_pointer (&priv->tz, g_free); + g_clear_pointer (&priv->env_tz, g_free); for (i = 0; i < CHECK_NB; i++) { - if (priv->monitors[i]) - g_object_unref (priv->monitors[i]); - priv->monitors[i] = NULL; + g_clear_object (&priv->monitors[i]); } G_OBJECT_CLASS (system_timezone_parent_class)->finalize (obj); @@ -265,9 +255,10 @@ system_timezone_monitor_changed (GFileMonitor *handle, gpointer user_data) { SystemTimezonePrivate *priv; - priv = system_timezone_get_instance_private (user_data); char *new_tz; + priv = system_timezone_get_instance_private (user_data); + if (event != G_FILE_MONITOR_EVENT_CHANGED && event != G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT && event != G_FILE_MONITOR_EVENT_DELETED && @@ -280,16 +271,15 @@ system_timezone_monitor_changed (GFileMonitor *handle, if (strcmp (priv->tz, new_tz) != 0) { g_free (priv->tz); - priv->tz = new_tz; + priv->tz = g_strdup (new_tz); g_signal_emit (G_OBJECT (user_data), system_timezone_signals[CHANGED], 0, priv->tz); - } else - g_free (new_tz); + } + g_free (new_tz); } - /* * Code to deal with the system timezone on all distros. * There's no dependency on the SystemTimezone GObject here. @@ -378,7 +368,6 @@ system_timezone_write_etc_timezone (const char *tz, return retval; } - /* Read a file that looks like a key-file (but there's no need for groups) * and get the last value for a specific key */ static char * @@ -413,16 +402,12 @@ system_timezone_read_key_file (const char *filename, if (value[0] == '\"') { if (value[len - 1] == '\"') { - if (retval) - g_free (retval); - + g_free (retval); retval = g_strndup (value + 1, len - 2); } } else { - if (retval) - g_free (retval); - + g_free (retval); retval = g_strdup (line + strlen (key_eq)); } @@ -720,7 +705,6 @@ recursive_compare (struct stat *localtime_stat, return NULL; } - static gboolean files_are_identical_inode (struct stat *a_stat, struct stat *b_stat, @@ -731,7 +715,6 @@ files_are_identical_inode (struct stat *a_stat, return (a_stat->st_ino == b_stat->st_ino); } - /* Determine if /etc/localtime is a hard link to some file, by looking at * the inodes */ static char * diff --git a/applets/clock/system-timezone.h b/applets/clock/system-timezone.h index 0ede8976..8a2c22ef 100644 --- a/applets/clock/system-timezone.h +++ b/applets/clock/system-timezone.h @@ -35,7 +35,6 @@ extern "C" { #define SYSTEM_ZONEINFODIR "/usr/share/zoneinfo" #endif - #define SYSTEM_TIMEZONE_TYPE (system_timezone_get_type ()) #define SYSTEM_TIMEZONE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), SYSTEM_TIMEZONE_TYPE, SystemTimezone)) #define SYSTEM_TIMEZONE_CLASS(c) (G_TYPE_CHECK_CLASS_CAST ((c), SYSTEM_TIMEZONE_TYPE, SystemTimezoneClass)) diff --git a/applets/fish/Makefile.am b/applets/fish/Makefile.am index 814d5d8c..604983a3 100644 --- a/applets/fish/Makefile.am +++ b/applets/fish/Makefile.am @@ -53,9 +53,9 @@ $(applet_in_files): $(applet_in_files).in Makefile $(applet_DATA): $(applet_in_files) $(AM_V_GEN) $(MSGFMT) --desktop --keyword= --keyword=Name --keyword=Description --template $< -d $(top_srcdir)/po -o $@ +service_in_files = org.mate.panel.applet.FishAppletFactory.service.in if !FISH_INPROCESS servicedir = $(datadir)/dbus-1/services -service_in_files = org.mate.panel.applet.FishAppletFactory.service.in service_DATA = $(service_in_files:.service.in=.service) org.mate.panel.applet.FishAppletFactory.service: $(service_in_files) diff --git a/applets/fish/fish.c b/applets/fish/fish.c index d77db1d9..45ce9228 100644 --- a/applets/fish/fish.c +++ b/applets/fish/fish.c @@ -27,7 +27,6 @@ #include <config.h> -#include <math.h> #include <string.h> #include <time.h> @@ -116,7 +115,6 @@ typedef struct { MatePanelAppletClass klass; } FishAppletClass; - static gboolean load_fish_image (FishApplet *fish); static void update_pixmap (FishApplet *fish); static void something_fishy_going_on (FishApplet *fish, const char *message); @@ -212,7 +210,8 @@ static void name_value_changed(GtkEntry* entry, FishApplet* fish) } static void image_value_changed(GtkFileChooser* chooser, FishApplet* fish) -{ char *path; +{ + char *path; char *image; char *path_gsettings; @@ -468,7 +467,7 @@ static void display_preferences_dialog(GtkAction* action, FishApplet* fish) gtk_spin_button_set_value (GTK_SPIN_BUTTON (fish->frames_spin), fish->n_frames); - g_signal_connect (fish->frames_spin, "value_changed", + g_signal_connect (fish->frames_spin, "value-changed", G_CALLBACK (n_frames_value_changed), fish); setup_sensitivity (fish, builder, @@ -480,7 +479,7 @@ static void display_preferences_dialog(GtkAction* action, FishApplet* fish) fish->speed_spin = GTK_WIDGET (gtk_builder_get_object (builder, "speed_spin")); gtk_spin_button_set_value (GTK_SPIN_BUTTON (fish->speed_spin), fish->speed); - g_signal_connect (fish->speed_spin, "value_changed", + g_signal_connect (fish->speed_spin, "value-changed", G_CALLBACK (speed_value_changed), fish); setup_sensitivity (fish, builder, @@ -502,7 +501,7 @@ static void display_preferences_dialog(GtkAction* action, FishApplet* fish) NULL /* label_post */, FISH_ROTATE_KEY /* key */); - g_signal_connect (fish->preferences_dialog, "delete_event", + g_signal_connect (fish->preferences_dialog, "delete-event", G_CALLBACK (delete_event), fish); g_signal_connect (fish->preferences_dialog, "response", G_CALLBACK (handle_response), fish); @@ -557,12 +556,12 @@ static void display_about_dialog(GtkAction* action, FishApplet* fish) "comments", descr, "copyright", _("Copyright \xc2\xa9 1998-2002 Free Software Foundation, Inc.\n" "Copyright \xc2\xa9 2002-2005 Vincent Untz\n" - "Copyright \xc2\xa9 2012-2020 MATE developers"), + "Copyright \xc2\xa9 2012-2021 MATE developers"), "documenters", documenters, "logo-icon-name", FISH_ICON, "translator-credits", _("translator-credits"), "version", VERSION, /* "3.4.7.4ac19" */ - "website", "http://mate-desktop.org/", + "website", PACKAGE_URL, NULL); g_free(descr); @@ -856,7 +855,7 @@ static void display_fortune_dialog(FishApplet* fish) gtk_dialog_set_default_response ( GTK_DIALOG (fish->fortune_dialog), GTK_RESPONSE_CLOSE); - g_signal_connect (fish->fortune_dialog, "delete_event", + g_signal_connect (fish->fortune_dialog, "delete-event", G_CALLBACK (delete_event), fish); g_signal_connect (fish->fortune_dialog, "response", G_CALLBACK (handle_fortune_response), fish); @@ -999,11 +998,12 @@ static void name_changed_notify(GSettings* settings, gchar* key, FishApplet* fis value = g_settings_get_string (settings, key); - if (!value [0] || (fish->name && !strcmp (fish->name, value))) + if (!value || *value == '\0' || (fish->name && !strcmp (fish->name, value))) { + g_free (value); return; + } - if (fish->name) - g_free (fish->name); + g_free (fish->name); fish->name = g_strdup (value); update_fortune_dialog (fish); @@ -1014,8 +1014,7 @@ static void name_changed_notify(GSettings* settings, gchar* key, FishApplet* fis strcmp (gtk_entry_get_text (GTK_ENTRY (fish->name_entry)), fish->name)) gtk_entry_set_text (GTK_ENTRY (fish->name_entry), fish->name); - if (value) - g_free (value); + g_free (value); } static void image_changed_notify(GSettings* settings, gchar* key, FishApplet* fish) @@ -1024,11 +1023,12 @@ static void image_changed_notify(GSettings* settings, gchar* key, FishApplet* fi value = g_settings_get_string (settings, key); - if (!value [0] || (fish->image && !strcmp (fish->image, value))) + if (!value || *value == '\0' || (fish->image && !strcmp (fish->image, value))) { + g_free (value); return; + } - if (fish->image) - g_free (fish->image); + g_free (fish->image); fish->image = g_strdup (value); load_fish_image (fish); @@ -1048,8 +1048,7 @@ static void image_changed_notify(GSettings* settings, gchar* key, FishApplet* fi g_free (path_chooser); } - if (value) - g_free (value); + g_free (value); } static void command_changed_notify(GSettings* settings, gchar* key, FishApplet* fish) @@ -1058,19 +1057,19 @@ static void command_changed_notify(GSettings* settings, gchar* key, FishApplet* value = g_settings_get_string (settings, key); - if (fish->command && !strcmp (fish->command, value)) + if (!value || *value == '\0' || (fish->command && !strcmp (fish->command, value))) { + g_free (value); return; + } - if (fish->command) - g_free (fish->command); + g_free (fish->command); fish->command = g_strdup (value); if (fish->command_entry && strcmp (gtk_entry_get_text (GTK_ENTRY (fish->command_entry)), fish->command)) gtk_entry_set_text (GTK_ENTRY (fish->command_entry), fish->command); - if (value) - g_free (value); + g_free (value); } static void n_frames_changed_notify(GSettings* settings, gchar* key, FishApplet* fish) @@ -1435,16 +1434,16 @@ static void update_pixmap(FishApplet* fish) if (fish->april_fools) { cairo_matrix_translate (&matrix, pixbuf_width - 1, pixbuf_height - 1); - cairo_matrix_rotate (&matrix, M_PI); + cairo_matrix_rotate (&matrix, G_PI); } if (rotate) { if (fish->orientation == MATE_PANEL_APPLET_ORIENT_RIGHT) { cairo_matrix_translate (&matrix, pixbuf_width - 1, 0); - cairo_matrix_rotate (&matrix, M_PI * 0.5); + cairo_matrix_rotate (&matrix, G_PI_2); } else { cairo_matrix_translate (&matrix, 0, pixbuf_height - 1); - cairo_matrix_rotate (&matrix, M_PI * 1.5); + cairo_matrix_rotate (&matrix, G_PI * 1.5); } cairo_matrix_scale (&matrix, (double) (pixbuf_height - 1) / width, @@ -1661,15 +1660,15 @@ static void setup_fish_widget(FishApplet* fish) GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_RELEASE_MASK); - g_signal_connect_swapped (widget, "enter_notify_event", + g_signal_connect_swapped (widget, "enter-notify-event", G_CALLBACK (fish_enter_notify), fish); - g_signal_connect_swapped (widget, "leave_notify_event", + g_signal_connect_swapped (widget, "leave-notify-event", G_CALLBACK (fish_leave_notify), fish); - g_signal_connect_swapped (widget, "button_release_event", + g_signal_connect_swapped (widget, "button-release-event", G_CALLBACK (handle_button_release), fish); gtk_widget_add_events (fish->drawing_area, GDK_BUTTON_RELEASE_MASK); - g_signal_connect_swapped (fish->drawing_area, "button_release_event", + g_signal_connect_swapped (fish->drawing_area, "button-release-event", G_CALLBACK (handle_button_release), fish); load_fish_image (fish); @@ -1681,7 +1680,7 @@ static void setup_fish_widget(FishApplet* fish) set_tooltip (fish); set_ally_name_desc (GTK_WIDGET (fish), fish); - g_signal_connect (fish, "key_press_event", + g_signal_connect (fish, "key-press-event", G_CALLBACK (handle_keypress), fish); gtk_widget_show_all (widget); @@ -1779,31 +1778,14 @@ static void fish_applet_dispose (GObject *object) fish); if (fish->timeout) - { g_source_remove (fish->timeout); - } - fish->timeout = 0; - if (fish->settings) - g_object_unref (fish->settings); - fish->settings = NULL; - - if (fish->lockdown_settings) - g_object_unref (fish->lockdown_settings); - fish->lockdown_settings = NULL; - - if (fish->name) - g_free (fish->name); - fish->name = NULL; - - if (fish->image) - g_free (fish->image); - fish->image = NULL; - - if (fish->command) - g_free (fish->command); - fish->command = NULL; + g_clear_object (&fish->settings); + g_clear_object (&fish->lockdown_settings); + g_clear_pointer (&fish->name, g_free); + g_clear_pointer (&fish->image, g_free); + g_clear_pointer (&fish->command, g_free); if (fish->surface) cairo_surface_destroy (fish->surface); @@ -1811,9 +1793,7 @@ static void fish_applet_dispose (GObject *object) fish->surface_width = 0; fish->surface_height = 0; - if (fish->pixbuf) - g_object_unref (fish->pixbuf); - fish->pixbuf = NULL; + g_clear_object (&fish->pixbuf); if (fish->preferences_dialog) gtk_widget_destroy (fish->preferences_dialog); @@ -1882,8 +1862,6 @@ static void fish_applet_instance_init(FishApplet* fish, FishAppletClass* klass) fish->april_fools = FALSE; mate_panel_applet_set_flags (MATE_PANEL_APPLET (fish), MATE_PANEL_APPLET_EXPAND_MINOR); - - mate_panel_applet_set_background_widget(MATE_PANEL_APPLET(fish), GTK_WIDGET(fish)); } static void fish_applet_class_init(FishAppletClass* klass) diff --git a/applets/notification_area/Makefile.am b/applets/notification_area/Makefile.am index 365cdf5d..8f6ec8d3 100644 --- a/applets/notification_area/Makefile.am +++ b/applets/notification_area/Makefile.am @@ -83,9 +83,9 @@ $(applet_in_files): $(applet_in_files).in Makefile -e "s|\@VERSION\@|$(PACKAGE_VERSION)|" \ $< > $@ +service_in_files = org.mate.panel.applet.NotificationAreaAppletFactory.service.in if !NOTIFICATION_AREA_INPROCESS servicedir = $(datadir)/dbus-1/services -service_in_files = org.mate.panel.applet.NotificationAreaAppletFactory.service.in service_DATA = $(service_in_files:.service.in=.service) org.mate.panel.applet.NotificationAreaAppletFactory.service: $(service_in_files) diff --git a/applets/notification_area/main.c b/applets/notification_area/main.c index 05962969..71221b65 100644 --- a/applets/notification_area/main.c +++ b/applets/notification_area/main.c @@ -73,7 +73,6 @@ static void (*parent_class_style_updated) (GtkWidget *widget); static void (*parent_class_change_background)(MatePanelApplet* panel_applet, MatePanelAppletBackgroundType type, GdkRGBA* color, cairo_pattern_t* pattern); static void (*parent_class_change_orient)(MatePanelApplet *panel_applet, MatePanelAppletOrient orient); - #ifdef PROVIDE_WATCHER_SERVICE /* Quite dirty way of providing the org.kde.StatusNotifierWatcher service * ourselves, in case the session doesn't already */ @@ -103,7 +102,6 @@ sn_watcher_service_ref (void) } #endif - static GtkOrientation get_gtk_orientation_from_applet_orient (MatePanelAppletOrient orient) { @@ -141,7 +139,7 @@ static void setup_gsettings (NaTrayApplet *applet) { applet->priv->settings = mate_panel_applet_settings_new (MATE_PANEL_APPLET (applet), NA_TRAY_SCHEMA); - g_signal_connect (applet->priv->settings, "changed::" KEY_MIN_ICON_SIZE, G_CALLBACK (gsettings_changed_min_icon_size), applet); + g_signal_connect_object (G_OBJECT(applet->priv->settings), "changed::" KEY_MIN_ICON_SIZE, G_CALLBACK (gsettings_changed_min_icon_size), applet, 0); } static void @@ -194,14 +192,14 @@ ensure_prefs_window_is_created (NaTrayApplet *applet) gtk_spin_button_set_range (GTK_SPIN_BUTTON (applet->priv->dialog->min_icon_size_spin), 7, 130); gtk_spin_button_set_value (GTK_SPIN_BUTTON (applet->priv->dialog->min_icon_size_spin), applet->priv->min_icon_size); - g_signal_connect_swapped (applet->priv->dialog->min_icon_size_spin, "value_changed", + g_signal_connect_swapped (applet->priv->dialog->min_icon_size_spin, "value-changed", G_CALLBACK (na_preferences_dialog_min_icon_size_changed), applet); g_signal_connect_swapped (applet->priv->dialog->preferences_dialog, "response", G_CALLBACK (na_preferences_dialog_response), applet); - g_signal_connect (G_OBJECT (applet->priv->dialog->preferences_dialog), "delete_event", + g_signal_connect (applet->priv->dialog->preferences_dialog, "delete-event", G_CALLBACK (na_preferences_dialog_hide_event), applet); } @@ -280,7 +278,7 @@ static void about_cb(GtkAction* action, NaTrayApplet* applet) "copyright", _("Copyright \xc2\xa9 2002 Red Hat, Inc.\n" "Copyright \xc2\xa9 2003-2006 Vincent Untz\n" "Copyright \xc2\xa9 2011 Perberos\n" - "Copyright \xc2\xa9 2012-2020 MATE developers"), + "Copyright \xc2\xa9 2012-2021 MATE developers"), "documenters", documenters, "logo-icon-name", NOTIFICATION_AREA_ICON, "translator-credits", _("translator-credits"), @@ -300,7 +298,6 @@ static const GtkActionEntry menu_actions [] = { G_CALLBACK (about_cb) } }; - static void na_tray_applet_realize (GtkWidget *widget) { @@ -497,11 +494,6 @@ applet_factory (MatePanelApplet *applet, strcmp (iid, "SystemTrayApplet") == 0)) return FALSE; - if (!GDK_IS_X11_DISPLAY (gtk_widget_get_display (GTK_WIDGET (applet)))) { - g_warning ("Notification area only works on X"); - return FALSE; - } - #ifndef NOTIFICATION_AREA_INPROCESS gtk_window_set_default_icon_name (NOTIFICATION_AREA_ICON); #endif diff --git a/applets/notification_area/main.h b/applets/notification_area/main.h index 32041cdf..a4325ba5 100644 --- a/applets/notification_area/main.h +++ b/applets/notification_area/main.h @@ -17,7 +17,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ - #ifndef __NA_TRAY_APPLET_H__ #define __NA_TRAY_APPLET_H__ diff --git a/applets/notification_area/na-grid.c b/applets/notification_area/na-grid.c index dbd95d50..9a4c45d9 100644 --- a/applets/notification_area/na-grid.c +++ b/applets/notification_area/na-grid.c @@ -316,21 +316,31 @@ na_grid_realize (GtkWidget *widget) { NaGrid *self = NA_GRID (widget); GdkScreen *screen; - GtkOrientation orientation; - NaHost *tray_host; + GdkDisplay *display; + GSettings *settings; GTK_WIDGET_CLASS (na_grid_parent_class)->realize (widget); + display = gdk_display_get_default (); /* Instantiate the hosts now we have a screen */ screen = gtk_widget_get_screen (GTK_WIDGET (self)); - orientation = gtk_orientable_get_orientation (GTK_ORIENTABLE (self)); - tray_host = na_tray_new_for_screen (screen, orientation); - g_object_bind_property (self, "orientation", + if (GDK_IS_X11_DISPLAY (display)) + { + GtkOrientation orientation; + NaHost *tray_host; + + orientation = gtk_orientable_get_orientation (GTK_ORIENTABLE (self)); + tray_host = na_tray_new_for_screen (screen, orientation); + g_object_bind_property (self, "orientation", tray_host, "orientation", G_BINDING_DEFAULT); - add_host (self, tray_host); - add_host (self, sn_host_v0_new ()); + add_host (self, tray_host); + } + settings = g_settings_new ("org.mate.panel"); + if (g_settings_get_boolean (settings, "enable-sni-support")) + add_host (self, sn_host_v0_new ()); + g_object_unref (settings); } static void diff --git a/applets/notification_area/org.mate.panel.NotificationAreaApplet.mate-panel-applet.desktop.in.in b/applets/notification_area/org.mate.panel.NotificationAreaApplet.mate-panel-applet.desktop.in.in index f7652db6..811348bc 100644 --- a/applets/notification_area/org.mate.panel.NotificationAreaApplet.mate-panel-applet.desktop.in.in +++ b/applets/notification_area/org.mate.panel.NotificationAreaApplet.mate-panel-applet.desktop.in.in @@ -11,7 +11,7 @@ Description=Area where notification icons appear # Translators: Do NOT translate or transliterate this text (this is an icon file name)! Icon=mate-panel-notification-area MateComponentId=OAFIID:MATE_NotificationAreaApplet;OAFIID:MATE_SystemTrayApplet; -Platforms=X11; +Platforms=X11;Wayland; X-MATE-Bugzilla-Bugzilla=MATE X-MATE-Bugzilla-Product=mate-panel X-MATE-Bugzilla-Component=notification area diff --git a/applets/notification_area/status-notifier/org.kde.StatusNotifierItem.xml b/applets/notification_area/status-notifier/org.kde.StatusNotifierItem.xml index 609d3050..c7aa0ebd 100644 --- a/applets/notification_area/status-notifier/org.kde.StatusNotifierItem.xml +++ b/applets/notification_area/status-notifier/org.kde.StatusNotifierItem.xml @@ -69,12 +69,20 @@ <property name="IconThemePath" type="s" access="read" /> + <property name="ItemIsMenu" type="b" access="read" /> + <property name="Menu" type="o" access="read" /> - <property name="ItemIsMenu" type="b" access="read" /> + <property name="XAyatanaLabel" type="s" access="read" /> <signal name="NewIconThemePath"> <arg name="icon_theme_path" type="s" /> </signal> + + <signal name="XAyatanaNewLabel"> + <arg name="label" type="s" /> + <arg name="guide" type="s" /> + </signal> + </interface> </node> diff --git a/applets/notification_area/status-notifier/sn-dbus-menu-item.c b/applets/notification_area/status-notifier/sn-dbus-menu-item.c index 62f21ca7..07d1957e 100644 --- a/applets/notification_area/status-notifier/sn-dbus-menu-item.c +++ b/applets/notification_area/status-notifier/sn-dbus-menu-item.c @@ -16,11 +16,12 @@ */ #include <config.h> +#include <libmate-desktop/mate-image-menu-item.h> #include "sn-dbus-menu-item.h" static GdkPixbuf * -pxibuf_new (GVariant *variant) +pixbuf_new (GVariant *variant) { gsize length; const guchar *data; @@ -149,7 +150,7 @@ sn_dbus_menu_item_new (GVariant *props) else if (g_strcmp0 (prop, "icon-name") == 0) item->icon_name = g_variant_dup_string (value, NULL); else if (g_strcmp0 (prop, "icon-data") == 0) - item->icon_data = pxibuf_new (value); + item->icon_data = pixbuf_new (value); else if (g_strcmp0 (prop, "label") == 0) item->label = g_variant_dup_string (value, NULL); else if (g_strcmp0 (prop, "shortcut") == 0) @@ -203,8 +204,8 @@ sn_dbus_menu_item_new (GVariant *props) cairo_surface_destroy (surface); } - item->item = gtk_image_menu_item_new (); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item->item), + item->item = mate_image_menu_item_new (); + mate_image_menu_item_set_image (MATE_IMAGE_MENU_ITEM (item->item), image); } @@ -252,7 +253,7 @@ sn_dbus_menu_item_new (GVariant *props) } void -sn_dubs_menu_item_free (gpointer data) +sn_dbus_menu_item_free (gpointer data) { SnDBusMenuItem *item; @@ -325,7 +326,7 @@ sn_dbus_menu_item_update_props (SnDBusMenuItem *item, image = NULL; } - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item->item), + mate_image_menu_item_set_image (MATE_IMAGE_MENU_ITEM (item->item), image); } else if (g_strcmp0 (prop, "icon-data") == 0) @@ -333,7 +334,7 @@ sn_dbus_menu_item_update_props (SnDBusMenuItem *item, GtkWidget *image; g_clear_object (&item->icon_data); - item->icon_data = pxibuf_new (value); + item->icon_data = pixbuf_new (value); if (item->icon_data) { @@ -347,7 +348,7 @@ sn_dbus_menu_item_update_props (SnDBusMenuItem *item, image = NULL; } - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item->item), + mate_image_menu_item_set_image (MATE_IMAGE_MENU_ITEM (item->item), image); } else if (g_strcmp0 (prop, "label") == 0) @@ -437,18 +438,18 @@ sn_dbus_menu_item_remove_props (SnDBusMenuItem *item, else if (g_strcmp0 (prop, "icon-name") == 0) { g_clear_pointer (&item->icon_name, g_free); - if (GTK_IS_IMAGE_MENU_ITEM (item->item)) + if (MATE_IS_IMAGE_MENU_ITEM (item->item)) { - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item->item), + mate_image_menu_item_set_image (MATE_IMAGE_MENU_ITEM (item->item), NULL); } } else if (g_strcmp0 (prop, "icon-data") == 0) { g_clear_object (&item->icon_data); - if (GTK_IS_IMAGE_MENU_ITEM (item->item)) + if (MATE_IS_IMAGE_MENU_ITEM (item->item)) { - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item->item), + mate_image_menu_item_set_image (MATE_IMAGE_MENU_ITEM (item->item), NULL); } } diff --git a/applets/notification_area/status-notifier/sn-dbus-menu-item.h b/applets/notification_area/status-notifier/sn-dbus-menu-item.h index c89de5c3..458417f2 100644 --- a/applets/notification_area/status-notifier/sn-dbus-menu-item.h +++ b/applets/notification_area/status-notifier/sn-dbus-menu-item.h @@ -16,7 +16,7 @@ */ #ifndef SN_DBUS_MENU_ITEM_H -#define SN_DUBS_MENU_ITEM_H +#define SN_DBUS_MENU_ITEM_H #include <gtk/gtk.h> @@ -51,7 +51,7 @@ typedef struct SnDBusMenuItem *sn_dbus_menu_item_new (GVariant *props); -void sn_dubs_menu_item_free (gpointer data); +void sn_dbus_menu_item_free (gpointer data); void sn_dbus_menu_item_update_props (SnDBusMenuItem *item, GVariant *props); diff --git a/applets/notification_area/status-notifier/sn-dbus-menu.c b/applets/notification_area/status-notifier/sn-dbus-menu.c index 03a95a4b..7b25c63f 100644 --- a/applets/notification_area/status-notifier/sn-dbus-menu.c +++ b/applets/notification_area/status-notifier/sn-dbus-menu.c @@ -419,8 +419,8 @@ sn_dbus_menu_finalize (GObject *object) menu = SN_DBUS_MENU (object); - g_free (menu->bus_name); - g_free (menu->object_path); + g_clear_pointer (&menu->bus_name, g_free); + g_clear_pointer (&menu->object_path, g_free); G_OBJECT_CLASS (sn_dbus_menu_parent_class)->finalize (object); } @@ -485,7 +485,7 @@ sn_dbus_menu_class_init (SnDBusMenuClass *menu_class) static void sn_dbus_menu_init (SnDBusMenu *menu) { - menu->items = g_hash_table_new_full (NULL, NULL, NULL, sn_dubs_menu_item_free); + menu->items = g_hash_table_new_full (NULL, NULL, NULL, sn_dbus_menu_item_free); menu->cancellable = g_cancellable_new (); } diff --git a/applets/notification_area/status-notifier/sn-host-v0.c b/applets/notification_area/status-notifier/sn-host-v0.c index 64da5da9..4ad6b359 100644 --- a/applets/notification_area/status-notifier/sn-host-v0.c +++ b/applets/notification_area/status-notifier/sn-host-v0.c @@ -193,7 +193,6 @@ register_host_cb (GObject *source_object, GError *error; SnHostV0 *v0; gchar **items; - gint i; error = NULL; sn_watcher_v0_gen_call_register_host_finish (SN_WATCHER_V0_GEN (source_object), @@ -224,7 +223,7 @@ register_host_cb (GObject *source_object, items = sn_watcher_v0_gen_dup_registered_items (v0->watcher); if (items) { - for (i = 0; items[i] != NULL; i++) + for (gint i = 0; items[i] != NULL; i++) add_registered_item (v0, items[i]); } diff --git a/applets/notification_area/status-notifier/sn-item-v0.c b/applets/notification_area/status-notifier/sn-item-v0.c index d218abad..9deab9d3 100644 --- a/applets/notification_area/status-notifier/sn-item-v0.c +++ b/applets/notification_area/status-notifier/sn-item-v0.c @@ -59,6 +59,7 @@ struct _SnItemV0 gchar *title; gint32 window_id; gchar *icon_name; + gchar *label; SnIconPixmap **icon_pixmap; gchar *overlay_icon_name; SnIconPixmap **overlay_icon_pixmap; @@ -83,7 +84,7 @@ enum LAST_PROP }; -static GParamSpec *properties[LAST_PROP] = { NULL }; +static GParamSpec *obj_properties[LAST_PROP] = { NULL }; G_DEFINE_TYPE (SnItemV0, sn_item_v0, SN_TYPE_ITEM) @@ -155,7 +156,7 @@ compare_size (gconstpointer a, } static cairo_surface_t * -get_surface (SnItemV0 *v0, +get_surface (SnIconPixmap **icon_pixmap, GtkOrientation orientation, gint size) { @@ -164,10 +165,10 @@ get_surface (SnItemV0 *v0, SnIconPixmap *pixmap = NULL; GList *l; - g_assert (v0->icon_pixmap != NULL && v0->icon_pixmap[0] != NULL); + g_assert (icon_pixmap != NULL && icon_pixmap[0] != NULL); - for (i = 0; v0->icon_pixmap[i] != NULL; i++) - pixmaps = g_list_prepend (pixmaps, v0->icon_pixmap[i]); + for (i = 0; icon_pixmap[i] != NULL; i++) + pixmaps = g_list_prepend (pixmaps, icon_pixmap[i]); pixmaps = g_list_sort_with_data (pixmaps, compare_size, GUINT_TO_POINTER (orientation)); @@ -233,6 +234,9 @@ get_icon_by_name (const gchar *icon_name, NULL, GTK_ICON_LOOKUP_FORCE_SIZE, NULL); } +#define ICON_NAME_VALID(icon_name) (icon_name && icon_name[0] != '\0') +#define ICON_PIXMAP_VALID(icon_pixmap) (icon_pixmap && icon_pixmap[0] != NULL) + static void update (SnItemV0 *v0) { @@ -240,7 +244,9 @@ update (SnItemV0 *v0) GtkImage *image; SnTooltip *tip; gint icon_size; - gboolean visible; + const gchar *icon_name; + SnIconPixmap **icon_pixmap; + g_return_if_fail (SN_IS_ITEM_V0 (v0)); image = GTK_IMAGE (v0->image); @@ -250,19 +256,34 @@ update (SnItemV0 *v0) else icon_size = MAX (1, v0->effective_icon_size); - if (v0->icon_name != NULL && v0->icon_name[0] != '\0') + /* If the item requests attention and has a specific icon for it, use that + * instead of the default icon. */ + if (g_strcmp0 (v0->status, "NeedsAttention") == 0 && + (ICON_NAME_VALID (v0->attention_icon_name) || + ICON_PIXMAP_VALID (v0->attention_icon_pixmap))) + { + icon_name = v0->attention_icon_name; + icon_pixmap = v0->attention_icon_pixmap; + } + else + { + icon_name = v0->icon_name; + icon_pixmap = v0->icon_pixmap; + } + + if (ICON_NAME_VALID (icon_name)) { cairo_surface_t *surface; gint scale; scale = gtk_widget_get_scale_factor (GTK_WIDGET (image)); - surface = get_icon_by_name (v0->icon_name, icon_size, scale); + surface = get_icon_by_name (icon_name, icon_size, scale); if (!surface) { GdkPixbuf *pixbuf; /*try to find icons specified by path and filename*/ - pixbuf = gdk_pixbuf_new_from_file (v0->icon_name, NULL); + pixbuf = gdk_pixbuf_new_from_file (icon_name, NULL); if (pixbuf && icon_size > 1) { /*An icon specified by path and filename may be the wrong size for the tray */ @@ -280,11 +301,11 @@ update (SnItemV0 *v0) gtk_image_set_from_surface (image, surface); cairo_surface_destroy (surface); } - else if (v0->icon_pixmap != NULL && v0->icon_pixmap[0] != NULL) + else if (ICON_PIXMAP_VALID (icon_pixmap)) { cairo_surface_t *surface; - surface = get_surface (v0, + surface = get_surface (icon_pixmap, gtk_orientable_get_orientation (GTK_ORIENTABLE (v0)), icon_size); if (surface != NULL) @@ -329,6 +350,7 @@ update (SnItemV0 *v0) gtk_widget_set_tooltip_markup (GTK_WIDGET (v0), NULL); } + gtk_button_set_label (GTK_BUTTON (v0), v0->label); accessible = gtk_widget_get_accessible (GTK_WIDGET (v0)); if (v0->title != NULL && *v0->title != '\0') @@ -339,7 +361,7 @@ update (SnItemV0 *v0) /* TODO: hide "Passive" items with a setting? */ /*Special case mate-polkit*/ if (g_strcmp0 (v0->status, "password-dialog") != 0){ - visible = g_strcmp0 (v0->status, "Passive") != 0; + gboolean visible = g_strcmp0 (v0->status, "Passive") != 0; gtk_widget_set_visible (GTK_WIDGET (v0), visible); } else @@ -638,7 +660,7 @@ update_title (GObject *source_object, v0 = SN_ITEM_V0 (user_data); - g_clear_pointer (&v0->title, g_free); + g_free (v0->title); v0->title = g_variant_dup_string (variant, NULL); g_clear_pointer (&variant, g_variant_unref); @@ -666,7 +688,7 @@ update_icon_name (GObject *source_object, v0 = SN_ITEM_V0 (user_data); - g_clear_pointer (&v0->icon_name, g_free); + g_free (v0->icon_name); v0->icon_name = g_variant_dup_string (variant, NULL); g_clear_pointer (&variant, g_variant_unref); @@ -717,7 +739,7 @@ update_overlay_icon_name (GObject *source_object, v0 = SN_ITEM_V0 (user_data); - g_clear_pointer (&v0->overlay_icon_name, g_free); + g_free (v0->overlay_icon_name); v0->overlay_icon_name = g_variant_dup_string (variant, NULL); g_clear_pointer (&variant, g_variant_unref); @@ -768,7 +790,7 @@ update_attention_icon_name (GObject *source_object, v0 = SN_ITEM_V0 (user_data); - g_clear_pointer (&v0->attention_icon_name, g_free); + g_free (v0->attention_icon_name); v0->attention_icon_name = g_variant_dup_string (variant, NULL); g_clear_pointer (&variant, g_variant_unref); @@ -790,7 +812,7 @@ update_attention_icon_pixmap (GObject *source_object, v0 = SN_ITEM_V0 (user_data); - g_clear_pointer (&v0->attention_icon_pixmap, icon_pixmap_free); + icon_pixmap_free (v0->attention_icon_pixmap); v0->attention_icon_pixmap = icon_pixmap_new (variant); g_clear_pointer (&variant, g_variant_unref); @@ -819,7 +841,7 @@ update_tooltip (GObject *source_object, v0 = SN_ITEM_V0 (user_data); - g_clear_pointer (&v0->tooltip, sn_tooltip_free); + sn_tooltip_free (v0->tooltip); v0->tooltip = sn_tooltip_new (variant); g_clear_pointer (&variant, g_variant_unref); @@ -848,6 +870,21 @@ new_status_cb (SnItemV0 *v0, } static void +new_label_cb (SnItemV0 *v0, + GVariant *parameters) +{ + GVariant *variant; + + variant = g_variant_get_child_value (parameters, 0); + + g_free (v0->label); + v0->label = g_variant_dup_string (variant, NULL); + g_variant_unref (variant); + + queue_update (v0); +} + +static void new_icon_theme_path_cb (SnItemV0 *v0, GVariant *parameters) { @@ -905,6 +942,8 @@ g_signal_cb (GDBusProxy *proxy, new_status_cb (v0, parameters); else if (g_strcmp0 (signal_name, "NewIconThemePath") == 0) new_icon_theme_path_cb (v0, parameters); + else if (g_strcmp0 (signal_name, "XAyatanaNewLabel") == 0) + new_label_cb (v0, parameters); else g_debug ("signal '%s' not handled!", signal_name); } @@ -975,6 +1014,8 @@ get_all_cb (GObject *source_object, v0->menu = g_variant_dup_string (value, NULL); else if (g_strcmp0 (key, "ItemIsMenu") == 0) v0->item_is_menu = g_variant_get_boolean (value); + else if (g_strcmp0 (key, "XAyatanaLabel") == 0) + v0->label = g_variant_dup_string (value, NULL); else g_debug ("property '%s' not handled!", key); @@ -1111,6 +1152,7 @@ sn_item_v0_finalize (GObject *object) g_clear_pointer (&v0->title, g_free); g_clear_pointer (&v0->icon_name, g_free); + g_clear_pointer (&v0->label, g_free); g_clear_pointer (&v0->icon_pixmap, icon_pixmap_free); g_clear_pointer (&v0->overlay_icon_name, g_free); g_clear_pointer (&v0->overlay_icon_pixmap, icon_pixmap_free); @@ -1345,15 +1387,15 @@ sn_item_v0_set_property (GObject *object, static void install_properties (GObjectClass *object_class) { - properties[PROP_ICON_SIZE] = + obj_properties[PROP_ICON_SIZE] = g_param_spec_int ("icon-size", "Icon size", "Icon size", 0, G_MAXINT, 16, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); - properties[PROP_ICON_PADDING] = + obj_properties[PROP_ICON_PADDING] = g_param_spec_int ("icon-padding", "Icon padding", "Icon padding", 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); - g_object_class_install_properties (object_class, LAST_PROP, properties); + g_object_class_install_properties (object_class, LAST_PROP, obj_properties); } static void @@ -1395,7 +1437,7 @@ sn_item_v0_init (SnItemV0 *v0) v0->icon_size = 16; v0->effective_icon_size = 0; v0->image = gtk_image_new (); - gtk_container_add (GTK_CONTAINER (v0), v0->image); + gtk_button_set_image (GTK_BUTTON (v0), v0->image); gtk_widget_show (v0->image); } @@ -1465,7 +1507,7 @@ sn_item_v0_set_icon_size (SnItemV0 *v0, if (v0->icon_size != size) { v0->icon_size = size; - g_object_notify_by_pspec (G_OBJECT (v0), properties[PROP_ICON_SIZE]); + g_object_notify_by_pspec (G_OBJECT (v0), obj_properties[PROP_ICON_SIZE]); if (v0->id != NULL) queue_update (v0); diff --git a/applets/notification_area/status-notifier/sn-item.c b/applets/notification_area/status-notifier/sn-item.c index 3dd0d605..9677e67e 100644 --- a/applets/notification_area/status-notifier/sn-item.c +++ b/applets/notification_area/status-notifier/sn-item.c @@ -358,6 +358,7 @@ sn_item_ready (SnItem *item) priv = SN_ITEM (item)->priv; priv->menu = sn_dbus_menu_new (priv->bus_name, menu); g_object_ref_sink (priv->menu); + gtk_button_set_always_show_image (GTK_BUTTON (item),TRUE); } static const gchar * diff --git a/applets/notification_area/system-tray/fixedtip.c b/applets/notification_area/system-tray/fixedtip.c index 180cbdd7..528e1767 100644 --- a/applets/notification_area/system-tray/fixedtip.c +++ b/applets/notification_area/system-tray/fixedtip.c @@ -128,7 +128,7 @@ na_fixed_tip_init (NaFixedTip *fixedtip) gtk_widget_add_events (GTK_WIDGET (fixedtip), GDK_BUTTON_PRESS_MASK); - g_signal_connect (fixedtip, "button_press_event", + g_signal_connect (fixedtip, "button-press-event", G_CALLBACK (button_press_handler), NULL); fixedtip->priv->orientation = GTK_ORIENTATION_HORIZONTAL; diff --git a/applets/notification_area/system-tray/na-tray-child.c b/applets/notification_area/system-tray/na-tray-child.c index cd7c305a..9eb03e22 100644 --- a/applets/notification_area/system-tray/na-tray-child.c +++ b/applets/notification_area/system-tray/na-tray-child.c @@ -546,7 +546,7 @@ na_tray_child_set_composited (NaTrayChild *child, if (child->composited == composited) return; - child->composited = composited; + child->composited = (composited != FALSE); if (gtk_widget_get_realized (GTK_WIDGET (child))) gdk_window_set_composited (gtk_widget_get_window (GTK_WIDGET (child)), composited); diff --git a/applets/notification_area/system-tray/na-tray-manager.c b/applets/notification_area/system-tray/na-tray-manager.c index f001c653..2bb679d8 100644 --- a/applets/notification_area/system-tray/na-tray-manager.c +++ b/applets/notification_area/system-tray/na-tray-manager.c @@ -148,7 +148,7 @@ na_tray_manager_class_init (NaTrayManagerClass *klass) G_PARAM_STATIC_BLURB)); manager_signals[TRAY_ICON_ADDED] = - g_signal_new ("tray_icon_added", + g_signal_new ("tray-icon-added", G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (NaTrayManagerClass, tray_icon_added), @@ -158,7 +158,7 @@ na_tray_manager_class_init (NaTrayManagerClass *klass) GTK_TYPE_SOCKET); manager_signals[TRAY_ICON_REMOVED] = - g_signal_new ("tray_icon_removed", + g_signal_new ("tray-icon-removed", G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (NaTrayManagerClass, tray_icon_removed), @@ -167,7 +167,7 @@ na_tray_manager_class_init (NaTrayManagerClass *klass) G_TYPE_NONE, 1, GTK_TYPE_SOCKET); manager_signals[MESSAGE_SENT] = - g_signal_new ("message_sent", + g_signal_new ("message-sent", G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (NaTrayManagerClass, message_sent), @@ -179,7 +179,7 @@ na_tray_manager_class_init (NaTrayManagerClass *klass) G_TYPE_LONG, G_TYPE_LONG); manager_signals[MESSAGE_CANCELLED] = - g_signal_new ("message_cancelled", + g_signal_new ("message-cancelled", G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (NaTrayManagerClass, message_cancelled), @@ -306,7 +306,7 @@ na_tray_manager_handle_dock_request (NaTrayManager *manager, return; } - g_signal_connect (child, "plug_removed", + g_signal_connect (child, "plug-removed", G_CALLBACK (na_tray_manager_plug_removed), manager); gtk_socket_add_id (GTK_SOCKET (child), icon_window); @@ -537,7 +537,6 @@ na_tray_manager_unmanage (NaTrayManager *manager) { #ifdef GDK_WINDOWING_X11 GdkDisplay *display; - guint32 timestamp; GtkWidget *invisible; GdkWindow *window; @@ -556,7 +555,7 @@ na_tray_manager_unmanage (NaTrayManager *manager) if (gdk_selection_owner_get_for_display (display, manager->selection_atom) == window) { - timestamp = gdk_x11_get_server_time (window); + guint32 timestamp = gdk_x11_get_server_time (window); gdk_selection_owner_set_for_display (display, NULL, manager->selection_atom, diff --git a/applets/notification_area/system-tray/na-tray.c b/applets/notification_area/system-tray/na-tray.c index fee75dc8..8e4c3068 100644 --- a/applets/notification_area/system-tray/na-tray.c +++ b/applets/notification_area/system-tray/na-tray.c @@ -161,13 +161,9 @@ static void icon_tip_buffer_free (gpointer data, gpointer userdata) { - IconTipBuffer *buffer; - - buffer = data; + IconTipBuffer *buffer = data; g_free (buffer->text); - buffer->text = NULL; - g_free (buffer); } @@ -456,16 +452,16 @@ na_tray_constructor (GType type, { trays_screens [screen_number].tray_manager = tray_manager; - g_signal_connect (tray_manager, "tray_icon_added", + g_signal_connect (tray_manager, "tray-icon-added", G_CALLBACK (tray_added), &trays_screens [screen_number]); - g_signal_connect (tray_manager, "tray_icon_removed", + g_signal_connect (tray_manager, "tray-icon-removed", G_CALLBACK (tray_removed), &trays_screens [screen_number]); - g_signal_connect (tray_manager, "message_sent", + g_signal_connect (tray_manager, "message-sent", G_CALLBACK (message_sent), &trays_screens [screen_number]); - g_signal_connect (tray_manager, "message_cancelled", + g_signal_connect (tray_manager, "message-cancelled", G_CALLBACK (message_cancelled), &trays_screens [screen_number]); diff --git a/applets/notification_area/testtray.c b/applets/notification_area/testtray.c index b7d884f4..15252b71 100644 --- a/applets/notification_area/testtray.c +++ b/applets/notification_area/testtray.c @@ -86,12 +86,16 @@ tray_removed_cb (GtkContainer *box, GtkWidget *icon, TrayData *data) static void orientation_changed_cb (GtkComboBox *combo, TrayData *data) { - GtkOrientation orientation = (GtkOrientation) gtk_combo_box_get_active (combo); - - g_print ("[Screen %u tray %p] Setting orientation to \"%s\"\n", - data->screen_num, data->traybox, orientation == 0 ? "horizontal" : "vertical"); - - gtk_orientable_set_orientation (GTK_ORIENTABLE (data->traybox), orientation); + gint active; + + if ((active = gtk_combo_box_get_active (combo)) != -1) { + GtkOrientation orientation = (GtkOrientation) active; + g_print ("[Screen %u tray %p] Setting orientation to \"%s\"\n", + data->screen_num, + data->traybox, + orientation == GTK_ORIENTATION_HORIZONTAL ? "horizontal" : "vertical"); + gtk_orientable_set_orientation (GTK_ORIENTABLE (data->traybox), orientation); + } } static void diff --git a/applets/wncklet/Makefile.am b/applets/wncklet/Makefile.am index 38dfaca5..14f8a5c7 100644 --- a/applets/wncklet/Makefile.am +++ b/applets/wncklet/Makefile.am @@ -1,3 +1,5 @@ +AUTOMAKE_OPTIONS = subdir-objects + AM_CPPFLAGS = \ $(LIBMATE_PANEL_APPLET_CFLAGS) \ $(WNCKLET_CFLAGS) \ @@ -76,9 +78,9 @@ $(applet_in_files): $(applet_in_files).in Makefile $(applet_DATA): $(applet_in_files) $(AM_V_GEN) $(MSGFMT) --desktop --keyword= --keyword=Name --keyword=Description --template $< -d $(top_srcdir)/po -o $@ +service_in_files = org.mate.panel.applet.WnckletFactory.service.in if !WNCKLET_INPROCESS servicedir = $(datadir)/dbus-1/services -service_in_files = org.mate.panel.applet.WnckletFactory.service.in service_DATA = $(service_in_files:.service.in=.service) org.mate.panel.applet.WnckletFactory.service: $(service_in_files) diff --git a/applets/wncklet/org.mate.panel.applet.window-list.gschema.xml.in b/applets/wncklet/org.mate.panel.applet.window-list.gschema.xml.in index 0f2d871d..93f32b46 100644 --- a/applets/wncklet/org.mate.panel.applet.window-list.gschema.xml.in +++ b/applets/wncklet/org.mate.panel.applet.window-list.gschema.xml.in @@ -20,5 +20,15 @@ <summary>Move windows to current workspace when unminimized</summary> <description>If true, then when unminimizing a window, move it to the current workspace. Otherwise, switch to the workspace of the window.</description> </key> + <key name="scroll-enabled" type="b"> + <default>true</default> + <summary>Whether to enable mouse scrolling in the switch window list</summary> + <description>If true, enable mouse scrolling in window list, otherwise disable mouse scrolling in window list.</description> + </key> + <key name="middle-click-close" type="b"> + <default>true</default> + <summary>Close window on middle mouse click</summary> + <description>If true, then clicking the middle mouse button over a taskbar item will close the window.</description> + </key> </schema> </schemalist> diff --git a/applets/wncklet/showdesktop.c b/applets/wncklet/showdesktop.c index c3454a0f..190077f1 100644 --- a/applets/wncklet/showdesktop.c +++ b/applets/wncklet/showdesktop.c @@ -22,7 +22,7 @@ */ #ifdef HAVE_CONFIG_H - #include <config.h> +#include <config.h> #endif #include <glib/gi18n.h> @@ -43,7 +43,6 @@ #define TIMEOUT_ACTIVATE_SECONDS 1 #define SHOW_DESKTOP_ICON "user-desktop" - typedef struct { /* widgets */ GtkWidget* applet; @@ -316,7 +315,7 @@ static gboolean do_not_eat_button_press(GtkWidget* widget, GdkEventButton* event { if (event->button != 1) { - g_signal_stop_emission_by_name(widget, "button_press_event"); + g_signal_stop_emission_by_name(widget, "button-press-event"); } return FALSE; @@ -371,15 +370,20 @@ static void show_desktop_applet_realized(MatePanelApplet* applet, gpointer data) #ifdef HAVE_X11 if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) - sdd->wnck_screen = wnck_screen_get(gdk_x11_screen_get_screen_number (screen)); + { + sdd->wnck_screen = wnck_screen_get (gdk_x11_screen_get_screen_number (screen)); + if (sdd->wnck_screen != NULL) + wncklet_connect_while_alive (sdd->wnck_screen, + "showing_desktop_changed", + G_CALLBACK (show_desktop_changed_callback), + sdd, + sdd->applet); + else + g_warning ("Could not get WnckScreen!"); + } #endif /* HAVE_X11 */ - if (sdd->wnck_screen != NULL) - wncklet_connect_while_alive(sdd->wnck_screen, "showing_desktop_changed", G_CALLBACK(show_desktop_changed_callback), sdd, sdd->applet); - else - g_warning("Could not get WnckScreen!"); - - show_desktop_changed_callback(sdd->wnck_screen, sdd); + show_desktop_changed_callback (sdd->wnck_screen, sdd); sdd->icon_theme = gtk_icon_theme_get_for_screen (screen); wncklet_connect_while_alive(sdd->icon_theme, "changed", G_CALLBACK(theme_changed_callback), sdd, sdd->applet); @@ -422,7 +426,9 @@ gboolean show_desktop_applet_fill(MatePanelApplet* applet) sdd->size = mate_panel_applet_get_size(MATE_PANEL_APPLET(sdd->applet)); - g_signal_connect(G_OBJECT(sdd->applet), "realize", G_CALLBACK(show_desktop_applet_realized), sdd); + g_signal_connect (sdd->applet, "realize", + G_CALLBACK (show_desktop_applet_realized), + sdd); sdd->button = gtk_toggle_button_new (); @@ -442,23 +448,29 @@ gboolean show_desktop_applet_fill(MatePanelApplet* applet) atk_obj = gtk_widget_get_accessible(sdd->button); atk_object_set_name (atk_obj, _("Show Desktop Button")); - g_signal_connect(G_OBJECT(sdd->button), "button_press_event", G_CALLBACK(do_not_eat_button_press), NULL); + g_signal_connect (sdd->button, "button-press-event", + G_CALLBACK(do_not_eat_button_press), + NULL); - g_signal_connect(G_OBJECT(sdd->button), "toggled", G_CALLBACK(button_toggled_callback), sdd); + g_signal_connect (sdd->button, "toggled", + G_CALLBACK (button_toggled_callback), + sdd); gtk_container_set_border_width(GTK_CONTAINER(sdd->button), 0); gtk_container_add(GTK_CONTAINER(sdd->button), sdd->image); gtk_container_add(GTK_CONTAINER(sdd->applet), sdd->button); - g_signal_connect (G_OBJECT(sdd->button), "size_allocate", G_CALLBACK(button_size_allocated), sdd); + g_signal_connect (sdd->button, "size-allocate", + G_CALLBACK (button_size_allocated), + sdd); /* FIXME: Update this comment. */ /* we have to bind change_orient before we do applet_widget_add since we need to get an initial change_orient signal to set our initial oriantation, and we get that during the _add call */ - g_signal_connect(G_OBJECT (sdd->applet), "change_orient", G_CALLBACK (applet_change_orient), sdd); - - mate_panel_applet_set_background_widget(MATE_PANEL_APPLET (sdd->applet), GTK_WIDGET(sdd->applet)); + g_signal_connect (sdd->applet, "change-orient", + G_CALLBACK (applet_change_orient), + sdd); action_group = gtk_action_group_new("ShowDesktop Applet Actions"); gtk_action_group_set_translation_domain(action_group, GETTEXT_PACKAGE); @@ -468,12 +480,18 @@ gboolean show_desktop_applet_fill(MatePanelApplet* applet) action_group); g_object_unref(action_group); - g_signal_connect(G_OBJECT(sdd->applet), "destroy", G_CALLBACK(applet_destroyed), sdd); + g_signal_connect (sdd->applet, "destroy", + G_CALLBACK (applet_destroyed), + sdd); gtk_drag_dest_set(GTK_WIDGET(sdd->button), 0, NULL, 0, 0); - g_signal_connect(G_OBJECT(sdd->button), "drag_motion", G_CALLBACK (button_drag_motion), sdd); - g_signal_connect(G_OBJECT(sdd->button), "drag_leave", G_CALLBACK (button_drag_leave), sdd); + g_signal_connect (sdd->button, "drag-motion", + G_CALLBACK (button_drag_motion), + sdd); + g_signal_connect (sdd->button, "drag-leave", + G_CALLBACK (button_drag_leave), + sdd); gtk_widget_show_all(sdd->applet); @@ -506,13 +524,13 @@ static void display_about_dialog(GtkAction* action, ShowDesktopData* sdd) "comments", _("This button lets you hide all windows and show the desktop."), "copyright", _("Copyright \xc2\xa9 2002 Red Hat, Inc.\n" "Copyright \xc2\xa9 2011 Perberos\n" - "Copyright \xc2\xa9 2012-2020 MATE developers"), + "Copyright \xc2\xa9 2012-2021 MATE developers"), "documenters", documenters, "icon-name", SHOW_DESKTOP_ICON, "logo-icon-name", SHOW_DESKTOP_ICON, "translator-credits", _("translator-credits"), "version", VERSION, - "website", "http://www.mate-desktop.org/", + "website", PACKAGE_URL, NULL); } @@ -554,7 +572,9 @@ static void button_toggled_callback(GtkWidget* button, ShowDesktopData* sdd) g_object_add_weak_pointer(G_OBJECT(dialog), (gpointer) &dialog); - g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), NULL); + g_signal_connect (dialog, "response", + G_CALLBACK(gtk_widget_destroy), + NULL); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); gtk_window_set_screen(GTK_WINDOW(dialog), gtk_widget_get_screen(button)); @@ -575,7 +595,7 @@ static void show_desktop_changed_callback(WnckScreen* screen, ShowDesktopData* s { #ifdef HAVE_X11 if (sdd->wnck_screen != NULL) - sdd->showing_desktop = wnck_screen_get_showing_desktop(sdd->wnck_screen); + sdd->showing_desktop = (wnck_screen_get_showing_desktop(sdd->wnck_screen) != FALSE); #endif /* HAVE_X11 */ update_button_state (sdd); diff --git a/applets/wncklet/showdesktop.h b/applets/wncklet/showdesktop.h index e82ed713..7aa7e60d 100644 --- a/applets/wncklet/showdesktop.h +++ b/applets/wncklet/showdesktop.h @@ -39,4 +39,3 @@ gboolean show_desktop_applet_fill(MatePanelApplet* applet); #endif - diff --git a/applets/wncklet/wayland-backend.c b/applets/wncklet/wayland-backend.c index 658eb6d3..f10b2d65 100644 --- a/applets/wncklet/wayland-backend.c +++ b/applets/wncklet/wayland-backend.c @@ -26,25 +26,45 @@ #endif #include <gdk/gdkwayland.h> +#include <gio/gdesktopappinfo.h> #include "wayland-backend.h" #include "wayland-protocol/wlr-foreign-toplevel-management-unstable-v1-client.h" -static const int window_button_width = 140; +/*shorter than wnck-tasklist due to common use of larger fonts*/ +#define TASKLIST_TEXT_MAX_WIDTH 16 + +/*In the future this could be changable from the panel-prefs dialog*/ +static const int max_button_width = 180; +static const int icon_size = 16; + +typedef struct +{ + GtkWidget *menu; + GtkWidget *maximize; + GtkWidget *minimize; + GtkWidget *on_top; + GtkWidget *close; +} ContextMenu; typedef struct { GtkWidget *list; GtkWidget *outer_box; + ContextMenu *context_menu; struct zwlr_foreign_toplevel_manager_v1 *manager; } TasklistManager; typedef struct { GtkWidget *button; + GtkWidget *icon; GtkWidget *label; struct zwlr_foreign_toplevel_handle_v1 *toplevel; gboolean active; + gboolean maximized; + gboolean minimized; + gboolean fullscreen; } ToplevelTask; static const char *tasklist_manager_key = "tasklist_manager"; @@ -55,9 +75,10 @@ static struct wl_registry *wl_registry_global = NULL; static uint32_t foreign_toplevel_manager_global_id = 0; static uint32_t foreign_toplevel_manager_global_version = 0; -static TasklistManager *tasklist_manager_new (); static ToplevelTask *toplevel_task_new (TasklistManager *tasklist, struct zwlr_foreign_toplevel_handle_v1 *handle); +guint buttons, tasklist_width; + static void wl_registry_handle_global (void *_data, struct wl_registry *registry, @@ -92,7 +113,7 @@ static const struct wl_registry_listener wl_registry_listener = { }; static void -wayland_tasklist_init_if_needed () +wayland_tasklist_init_if_needed (void) { if (has_initialized) return; @@ -120,7 +141,7 @@ foreign_toplevel_manager_handle_toplevel (void *data, { TasklistManager *tasklist = data; ToplevelTask *task = toplevel_task_new (tasklist, toplevel); - gtk_box_pack_start (GTK_BOX (tasklist->list), task->button, TRUE, TRUE, 2); + gtk_box_pack_start (GTK_BOX (tasklist->list), task->button, TRUE, TRUE, 0); } static void @@ -162,16 +183,84 @@ tasklist_manager_disconnected_from_widget (TasklistManager *tasklist) if (tasklist->manager) zwlr_foreign_toplevel_manager_v1_stop (tasklist->manager); + + if (tasklist->context_menu) + { + gtk_widget_destroy (tasklist->context_menu->menu); + g_free (tasklist->context_menu); + tasklist->context_menu = NULL; + } +} + +static void +menu_on_maximize (GtkMenuItem *item, gpointer user_data) +{ + ToplevelTask *task = g_object_get_data (G_OBJECT (item), toplevel_task_key); + if (task->toplevel) { + if (task->maximized) { + zwlr_foreign_toplevel_handle_v1_unset_maximized (task->toplevel); + } else { + zwlr_foreign_toplevel_handle_v1_set_maximized (task->toplevel); + } + } +} + +static void +menu_on_minimize (GtkMenuItem *item, gpointer user_data) +{ + ToplevelTask *task = g_object_get_data (G_OBJECT (item), toplevel_task_key); + if (task->toplevel) { + if (task->minimized) { + zwlr_foreign_toplevel_handle_v1_unset_minimized (task->toplevel); + } else { + zwlr_foreign_toplevel_handle_v1_set_minimized (task->toplevel); + } + } +} + +static void +menu_on_close (GtkMenuItem *item, gpointer user_data) +{ + ToplevelTask *task = g_object_get_data (G_OBJECT (item), toplevel_task_key); + if (task->toplevel) { + zwlr_foreign_toplevel_handle_v1_close (task->toplevel); + } +} + +static ContextMenu * +context_menu_new () +{ + ContextMenu *menu = g_new0 (ContextMenu, 1); + menu->menu = gtk_menu_new (); + menu->maximize = gtk_menu_item_new (); + menu->minimize = gtk_menu_item_new (); + menu->on_top = gtk_check_menu_item_new_with_label ("Always On Top"); + menu->close = gtk_menu_item_new_with_label ("Close"); + + gtk_menu_shell_append (GTK_MENU_SHELL (menu->menu), menu->maximize); + gtk_menu_shell_append (GTK_MENU_SHELL (menu->menu), menu->minimize); + gtk_menu_shell_append (GTK_MENU_SHELL (menu->menu), gtk_separator_menu_item_new ()); + gtk_menu_shell_append (GTK_MENU_SHELL (menu->menu), menu->on_top); + gtk_menu_shell_append (GTK_MENU_SHELL (menu->menu), gtk_separator_menu_item_new ()); + gtk_menu_shell_append (GTK_MENU_SHELL (menu->menu), menu->close); + + gtk_widget_show_all (menu->menu); + + g_signal_connect (menu->maximize, "activate", G_CALLBACK (menu_on_maximize), NULL); + g_signal_connect (menu->minimize, "activate", G_CALLBACK (menu_on_minimize), NULL); + g_signal_connect (menu->close, "activate", G_CALLBACK (menu_on_close), NULL); + gtk_widget_set_sensitive (menu->on_top, FALSE); + return menu; } static TasklistManager * -tasklist_manager_new () +tasklist_manager_new (void) { if (!foreign_toplevel_manager_global_id) return NULL; TasklistManager *tasklist = g_new0 (TasklistManager, 1); - tasklist->list = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); + tasklist->list = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_set_homogeneous (GTK_BOX (tasklist->list), TRUE); tasklist->outer_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start (GTK_BOX (tasklist->outer_box), tasklist->list, FALSE, FALSE, 0); @@ -187,6 +276,7 @@ tasklist_manager_new () tasklist_manager_key, tasklist, (GDestroyNotify)tasklist_manager_disconnected_from_widget); + tasklist->context_menu = context_menu_new (); return tasklist; } @@ -208,7 +298,27 @@ foreign_toplevel_handle_app_id (void *data, struct zwlr_foreign_toplevel_handle_v1 *toplevel, const char *app_id) { - /* ignore */ + ToplevelTask *task = data; + + gchar *app_id_lower = g_utf8_strdown (app_id, -1); + gchar *desktop_app_id = g_strdup_printf ("%s.desktop", app_id_lower); + GDesktopAppInfo *app_info = g_desktop_app_info_new (desktop_app_id); + + if (app_info) { + GIcon *icon = g_app_info_get_icon (G_APP_INFO (app_info)); + if (icon) { + gtk_image_set_from_gicon (GTK_IMAGE (task->icon), icon, GTK_ICON_SIZE_MENU); + goto cleanup; + } + } + gtk_image_set_from_icon_name (GTK_IMAGE (task->icon), app_id_lower, GTK_ICON_SIZE_MENU); + +cleanup: + if (app_info) { + g_object_unref (G_OBJECT (app_info)); + } + g_free (app_id_lower); + g_free (desktop_app_id); } static void @@ -235,6 +345,9 @@ foreign_toplevel_handle_state (void *data, ToplevelTask *task = data; task->active = FALSE; + task->maximized = FALSE; + task->minimized = FALSE; + task->fullscreen = FALSE; enum zwlr_foreign_toplevel_handle_v1_state *i; wl_array_for_each (i, state) @@ -244,7 +357,15 @@ foreign_toplevel_handle_state (void *data, case ZWLR_FOREIGN_TOPLEVEL_HANDLE_V1_STATE_ACTIVATED: task->active = TRUE; break; - + case ZWLR_FOREIGN_TOPLEVEL_HANDLE_V1_STATE_MAXIMIZED: + task->maximized = TRUE; + break; + case ZWLR_FOREIGN_TOPLEVEL_HANDLE_V1_STATE_MINIMIZED: + task->minimized = TRUE; + break; + case ZWLR_FOREIGN_TOPLEVEL_HANDLE_V1_STATE_FULLSCREEN: + task->fullscreen = TRUE; + break; default: break; } @@ -265,10 +386,87 @@ foreign_toplevel_handle_closed (void *data, struct zwlr_foreign_toplevel_handle_v1 *toplevel) { ToplevelTask *task = data; + if (task->button) + { + GtkOrientation orient; + GtkWidget *button; + GtkWidget *box; + GtkWidget *outer_box = gtk_widget_get_parent (GTK_WIDGET (task->button)); gtk_widget_destroy (task->button); -} + buttons = buttons -1; + + if (buttons == 0) + return; + /* We don't need to modify button size on a vertical panel*/ + orient = gtk_orientable_get_orientation (GTK_ORIENTABLE (outer_box)); + if (orient == GTK_ORIENTATION_VERTICAL) + return; + + /* Horizontal panel: if buttons can now fit + * with both labels and icons show them + */ + if (tasklist_width / buttons > icon_size * 3) + { + GList* children = gtk_container_get_children (GTK_CONTAINER (outer_box)); + while (children != NULL) + { + button = GTK_WIDGET (children->data); + + /* If maximum width buttons fix, expand to that dimension*/ + if (buttons * max_button_width < tasklist_width) + gtk_widget_set_size_request (button, max_button_width, -1); + + /* Otherwise expand remaining buttons to fill the tasklist*/ + else + gtk_widget_set_size_request (button, tasklist_width / buttons, -1); + + gtk_widget_show_all (button); + children = children->next; + } + } + /* If buttons with icons will fit, bring them back*/ + else if (tasklist_width / buttons > icon_size * 2) + { + GtkWidget *widget; + GList* children = gtk_container_get_children (GTK_CONTAINER (outer_box)); + while (children != NULL) + { + button = GTK_WIDGET (children->data); + box = gtk_bin_get_child (GTK_BIN (button)); + GList* contents = gtk_container_get_children (GTK_CONTAINER (box)); + while (contents != NULL) + { + widget = GTK_WIDGET (contents->data); + if (GTK_IS_LABEL (widget)) + gtk_widget_hide (widget); + + if (GTK_IS_IMAGE (widget)) + gtk_widget_show (widget); + + contents = contents->next; + gtk_widget_show (box); + gtk_widget_show (button); + } + + children = children->next; + gtk_widget_set_size_request (button, tasklist_width / buttons, -1); + } + } + /* If we still cannot fit labels or icons, just fill the available space*/ + else + { + GList* children = gtk_container_get_children (GTK_CONTAINER (outer_box)); + while (children != NULL) + { + button = GTK_WIDGET (children->data); + gtk_widget_set_size_request (button, tasklist_width / buttons, -1); + children = children->next; + } + } + } +} static const struct zwlr_foreign_toplevel_handle_v1_listener foreign_toplevel_handle_listener = { .title = foreign_toplevel_handle_title, @@ -286,6 +484,7 @@ toplevel_task_disconnected_from_widget (ToplevelTask *task) struct zwlr_foreign_toplevel_handle_v1 *toplevel = task->toplevel; task->button = NULL; + task->icon = NULL; task->label = NULL; task->toplevel = NULL; @@ -314,13 +513,25 @@ toplevel_task_handle_clicked (GtkButton *button, ToplevelTask *task) } } -static gboolean on_toplevel_button_press (GtkWidget *widget, GdkEvent *event, gpointer user_data) +static gboolean on_toplevel_button_press (GtkWidget *button, GdkEvent *event, TasklistManager *tasklist) { /* Assume event is a button press */ if (((GdkEventButton*)event)->button == GDK_BUTTON_SECONDARY) { - /* Returning true for secondary clicks suppresses the applet's default context menu, - * which we do not want to show up for task buttons */ + ContextMenu *menu = tasklist->context_menu; + ToplevelTask *task = g_object_get_data (G_OBJECT (button), toplevel_task_key); + + g_object_set_data (G_OBJECT (menu->maximize), toplevel_task_key, task); + g_object_set_data (G_OBJECT (menu->minimize), toplevel_task_key, task); + g_object_set_data (G_OBJECT (menu->close), toplevel_task_key, task); + + gtk_menu_item_set_label (GTK_MENU_ITEM (menu->minimize), + task->minimized ? "Unminimize" : "Minimize"); + gtk_menu_item_set_label (GTK_MENU_ITEM (menu->maximize), + task->maximized ? "Unmaximize" : "Maximize"); + + gtk_menu_popup_at_widget (GTK_MENU (menu->menu), button, + GDK_GRAVITY_NORTH_WEST, GDK_GRAVITY_SOUTH_WEST, event); return TRUE; } else @@ -333,18 +544,172 @@ static ToplevelTask * toplevel_task_new (TasklistManager *tasklist, struct zwlr_foreign_toplevel_handle_v1 *toplevel) { ToplevelTask *task = g_new0 (ToplevelTask, 1); + GtkWidget *button; + GtkOrientation orient; + buttons = buttons + 1; + orient = gtk_orientable_get_orientation (GTK_ORIENTABLE (tasklist->outer_box)); task->button = gtk_button_new (); g_signal_connect (task->button, "clicked", G_CALLBACK (toplevel_task_handle_clicked), task); + task->icon = gtk_image_new_from_icon_name ("unknown", icon_size); + task->label = gtk_label_new (""); - gtk_label_set_max_width_chars (GTK_LABEL (task->label), 1); - gtk_widget_set_size_request (task->label, window_button_width, -1); + gtk_label_set_max_width_chars (GTK_LABEL (task->label), TASKLIST_TEXT_MAX_WIDTH); gtk_label_set_ellipsize (GTK_LABEL (task->label), PANGO_ELLIPSIZE_END); - gtk_container_add (GTK_CONTAINER(task->button), task->label); + gtk_label_set_xalign (GTK_LABEL (task->label), 0.0); + + GtkWidget *box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + gtk_box_pack_start (GTK_BOX (box), task->icon, FALSE, FALSE, 6); + gtk_box_pack_start (GTK_BOX (box), task->label, TRUE, TRUE, 2); + gtk_container_add (GTK_CONTAINER (task->button), box); + gtk_widget_set_name (task->button , "tasklist-button"); gtk_widget_show_all (task->button); + /* Buttons on a vertical panel are not affected by how many are needed + * GTK handles compressing contents as needed as the window width tells + * GTK how much space to allocate the label and icon. Buttons will use + * the full width of a vertical panel without any special attention + * so break out here instead of breaking the vertical panel case + */ + + if (orient == GTK_ORIENTATION_VERTICAL) + { + gtk_widget_show_all (task->button); + task->toplevel = toplevel; + zwlr_foreign_toplevel_handle_v1_add_listener (toplevel, + &foreign_toplevel_handle_listener, + task); + g_object_set_data_full (G_OBJECT (task->button), + toplevel_task_key, + task, + (GDestroyNotify)toplevel_task_disconnected_from_widget); + + g_signal_connect (task->button, "button-press-event", + G_CALLBACK (on_toplevel_button_press), + tasklist); + + return task; + } + + /* On horizontal panels, GTK does not by default limit the width of the tasklist + * as it does not run out of space in the window until the entire panel is used, + * leaving buttons at full width until then and overflowing all other applets + * + * Thus we must get the tasklist's allocated width when extra space remains, + * which will be most of the distance between the handle and the next applet + * From there, we can expand buttons and/or hide elements as needed + */ + + + tasklist_width = gtk_widget_get_allocated_width (GTK_WIDGET (tasklist->outer_box)); + + /* First button can be buggy with this so hardcode it to expand to the limit */ + if (buttons == 1) + gtk_widget_set_size_request (task->button, max_button_width, -1); + + /* if the number of buttons forces width to less than 3x the icon size, shrink them */ + if ((buttons != 0) && (tasklist_width > 1 )&& (tasklist_width / buttons < (icon_size * 3))) + { + /* adjust the current button first or it can be missed */ + if (tasklist_width / buttons > icon_size * 2) + { + gtk_widget_hide (task->label); + gtk_widget_show (task->icon); + } + else + { + gtk_widget_show (task->label); + gtk_widget_hide (task->icon); + } + gtk_widget_show (box); + gtk_widget_show (task->button); + + /* iterate over all the buttons, first hide labels + * then hide icons and bring back labels + */ + GtkWidget *widget; + + GList* children = gtk_container_get_children (GTK_CONTAINER (tasklist->list)); + while (children != NULL) + { + button = GTK_WIDGET (children->data); + box = gtk_bin_get_child (GTK_BIN (button)); + + /* hide labels of all buttons but show icons if only icons will fit */ + if (tasklist_width / buttons > icon_size * 2) + { + /* find the icon and the label, show just the icon */ + GList* contents = gtk_container_get_children (GTK_CONTAINER (box)); + + while (contents != NULL) + { + widget = GTK_WIDGET (contents->data); + if (GTK_IS_LABEL (widget)) + gtk_widget_hide (widget); + + if (GTK_IS_IMAGE (widget)) + gtk_widget_show (widget); + + contents = contents->next; + } + } + else + { + /* find the icon and the label, show just the label as it is more + * compressable than the icon. Though less meaningful at this size, + * it is enough to keep the tasklist from disappearing on themes + * that do not set borders around tasklist buttons. + * This is same behavior as on x11 save that an extreme number of + * buttons (50+ on 700px of space) can still overflow + */ + + GList* contents = gtk_container_get_children (GTK_CONTAINER (box)); + while (contents != NULL) + { + widget = GTK_WIDGET (contents->data); + if (GTK_IS_LABEL (widget)) + gtk_widget_show (widget); + + if (GTK_IS_IMAGE (widget)) + gtk_widget_hide (widget); + + contents = contents->next; + } + } + /*expand buttons with labels or everything hidden to fit remaining space*/ + gtk_widget_set_size_request (button, tasklist_width / buttons, -1); + /*show the button and any contents that fit, then get the next button*/ + gtk_widget_show (box); + gtk_widget_show (button); + + children = children->next; + } + } + else + { + GList* children = gtk_container_get_children (GTK_CONTAINER(tasklist->list)); + while (children != NULL) + { + button = GTK_WIDGET (children->data); + if (((buttons ) * max_button_width < tasklist_width) || (buttons == 1)) + + /*Don't let buttons expand over the maximum button size*/ + gtk_widget_set_size_request (button, max_button_width, -1); + + else + /*if full width buttons won't fit, size them to just fill the tasklist*/ + gtk_widget_set_size_request (button, tasklist_width / buttons, -1); + + children = children->next; + } + gtk_widget_show_all (task->button); + } + + /*Reset the tasklist width after button adjustments*/ + tasklist_width = gtk_widget_get_allocated_width (GTK_WIDGET (tasklist->outer_box)); + task->toplevel = toplevel; zwlr_foreign_toplevel_handle_v1_add_listener (toplevel, &foreign_toplevel_handle_listener, @@ -354,10 +719,9 @@ toplevel_task_new (TasklistManager *tasklist, struct zwlr_foreign_toplevel_handl task, (GDestroyNotify)toplevel_task_disconnected_from_widget); - g_signal_connect (G_OBJECT (task->button), - "button-press-event", + g_signal_connect (task->button, "button-press-event", G_CALLBACK (on_toplevel_button_press), - task); + tasklist); return task; } diff --git a/applets/wncklet/wayland-backend.h b/applets/wncklet/wayland-backend.h index 0ea4634a..e2402236 100644 --- a/applets/wncklet/wayland-backend.h +++ b/applets/wncklet/wayland-backend.h @@ -38,11 +38,9 @@ extern "C" { GtkWidget* wayland_tasklist_new (void); void wayland_tasklist_set_orientation (GtkWidget* tasklist_widget, GtkOrientation orient); - #ifdef __cplusplus } #endif #endif /* _WNCKLET_APPLET_WAYLAND_BACKEND_H_ */ - diff --git a/applets/wncklet/window-list.c b/applets/wncklet/window-list.c index dd18fc72..a87649b1 100644 --- a/applets/wncklet/window-list.c +++ b/applets/wncklet/window-list.c @@ -62,6 +62,8 @@ typedef struct { TasklistGroupingType grouping; gboolean move_unminimized_windows; + gboolean scroll_enable; + gboolean middle_click_close; GtkOrientation orientation; int size; @@ -73,6 +75,7 @@ typedef struct { /* Properties: */ GtkWidget* properties_dialog; + GtkWidget* wayland_info_label; GtkWidget* show_current_radio; GtkWidget* show_all_radio; #ifdef HAVE_WINDOW_PREVIEWS @@ -85,6 +88,8 @@ typedef struct { GtkWidget* auto_group_radio; GtkWidget* always_group_radio; GtkWidget* move_minimized_radio; + GtkWidget* mouse_scroll_check; + GtkWidget* middle_click_close_check; GtkWidget* change_workspace_radio; GtkWidget* minimized_windows_box; GtkWidget* window_grouping_box; @@ -119,14 +124,23 @@ static void tasklist_update(TasklistData* tasklist) WnckTasklistGroupingType grouping; switch (tasklist->grouping) { - case TASKLIST_NEVER_GROUP: grouping = WNCK_TASKLIST_NEVER_GROUP; - case TASKLIST_AUTO_GROUP: grouping = WNCK_TASKLIST_AUTO_GROUP; - case TASKLIST_ALWAYS_GROUP: grouping = WNCK_TASKLIST_ALWAYS_GROUP; - default: grouping = WNCK_TASKLIST_NEVER_GROUP; + case TASKLIST_NEVER_GROUP: + grouping = WNCK_TASKLIST_NEVER_GROUP; + break; + case TASKLIST_AUTO_GROUP: + grouping = WNCK_TASKLIST_AUTO_GROUP; + break; + case TASKLIST_ALWAYS_GROUP: + grouping = WNCK_TASKLIST_ALWAYS_GROUP; + break; + default: + grouping = WNCK_TASKLIST_NEVER_GROUP; } wnck_tasklist_set_grouping(WNCK_TASKLIST(tasklist->tasklist), grouping); wnck_tasklist_set_include_all_workspaces(WNCK_TASKLIST(tasklist->tasklist), tasklist->include_all_workspaces); wnck_tasklist_set_switch_workspace_on_unminimize(WNCK_TASKLIST(tasklist->tasklist), tasklist->move_unminimized_windows); + wnck_tasklist_set_scroll_enabled (WNCK_TASKLIST(tasklist->tasklist), tasklist->scroll_enable); + wnck_tasklist_set_middle_click_close (WNCK_TASKLIST (tasklist->tasklist), tasklist->middle_click_close); } #endif /* HAVE_X11 */ @@ -236,91 +250,134 @@ static void applet_change_background(MatePanelApplet* applet, MatePanelAppletBac #ifdef HAVE_X11 #ifdef HAVE_WINDOW_PREVIEWS -static GdkPixbuf *preview_window_thumbnail (WnckWindow *wnck_window, TasklistData *tasklist) +static cairo_surface_t* +preview_window_thumbnail (WnckWindow *wnck_window, + TasklistData *tasklist, + int *thumbnail_width, + int *thumbnail_height, + int *thumbnail_scale) { GdkWindow *window; - GdkPixbuf *screenshot; - GdkPixbuf *thumbnail; + Window win; + cairo_surface_t *thumbnail; + cairo_t *cr; double ratio; - int width, height; - int scale; + int width, height, scale; - window = gdk_x11_window_foreign_new_for_display (gdk_display_get_default (), wnck_window_get_xid (wnck_window)); + win = wnck_window_get_xid (wnck_window); - if (window == NULL) + if ((window = gdk_x11_window_foreign_new_for_display (gdk_display_get_default (), win)) == NULL) + { return NULL; + } - scale = gdk_window_get_scale_factor (window); + *thumbnail_scale = scale = gdk_window_get_scale_factor (window); width = gdk_window_get_width (window) * scale; height = gdk_window_get_height (window) * scale; - /* Generate window screenshot for preview */ - screenshot = gdk_pixbuf_get_from_window (window, 0, 0, width / scale, height / scale); - g_object_unref (window); - - if (screenshot == NULL) - return NULL; - - /* Determine whether the contents of the screenshot are empty */ - if (gdk_pixbuf_get_byte_length (screenshot) == 0) - { - g_object_unref (screenshot); - return NULL; - } - /* Scale to configured size while maintaining aspect ratio */ if (width > height) { - ratio = (double) height / (double) width; - width = MIN(width, tasklist->thumbnail_size); - height = width * ratio; + int max_size = MIN (width, tasklist->thumbnail_size * scale); + ratio = (double) max_size / (double) width; + *thumbnail_width = max_size; + *thumbnail_height = (int) ((double) height * ratio); } else { - ratio = (double) width / (double) height; - height = MIN(height, tasklist->thumbnail_size); - width = height * ratio; + int max_size = MIN (height, tasklist->thumbnail_size * scale); + ratio = (double) max_size / (double) height; + *thumbnail_height = max_size; + *thumbnail_width = (int) ((double) width * ratio); + } + + gdk_x11_display_error_trap_push (gdk_window_get_display (window)); + + thumbnail = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + *thumbnail_width, + *thumbnail_height); + cairo_surface_set_device_scale (thumbnail, scale, scale); + cr = cairo_create (thumbnail); + cairo_scale (cr, ratio, ratio); + gdk_cairo_set_source_window (cr, window, 0, 0); + cairo_paint (cr); + cairo_destroy (cr); + + if (gdk_x11_display_error_trap_pop (gdk_window_get_display (window))) + { + cairo_surface_destroy (thumbnail); + thumbnail = NULL; } - thumbnail = gdk_pixbuf_scale_simple (screenshot, width, height, GDK_INTERP_BILINEAR); - g_object_unref (screenshot); + g_object_unref (window); return thumbnail; } +static int g_int_compare(gconstpointer a, gconstpointer b) +{ + gint a_val = GPOINTER_TO_INT(a); + gint b_val = GPOINTER_TO_INT(b); + if (a_val > b_val) return -1; + if (a_val == b_val) return 0; + return 1; +} + +static int find_offset(GList *list, gdouble target) +{ + GList *node = list; + while (node != NULL) { + int value = GPOINTER_TO_INT(node->data); + if (value <= target) + return value; + node = node->next; + } + return -1; +} + #define PREVIEW_PADDING 5 -static void preview_window_reposition (TasklistData *tasklist, GdkPixbuf *thumbnail) +static void +preview_window_reposition (WnckTasklist *tl, + TasklistData *tasklist, + int width, + int height, + int scale) { + /* Known issues: + * - When grouping is toggled the previews won't be centered correctly until a new window is opened or one is closed. + * - Previews are not shown at all for grouped windows, this function is not called when hovering over those. + */ + GdkMonitor *monitor; GdkRectangle monitor_geom; - int x_pos, y_pos; - int width, height; - - width = gdk_pixbuf_get_width (thumbnail); - height = gdk_pixbuf_get_height (thumbnail); + MatePanelAppletOrient orient; + gdouble x_pos, y_pos; + int x_offset, y_offset; - /* Resize window to fit thumbnail */ - gtk_window_resize (GTK_WINDOW (tasklist->preview), width, height); - - /* Set position at pointer, then re-adjust from there to just outside of the pointer */ - gtk_window_set_position (GTK_WINDOW (tasklist->preview), GTK_WIN_POS_MOUSE); - gtk_window_get_position (GTK_WINDOW (tasklist->preview), &x_pos, &y_pos); + /* Get mouse position */ + gdk_device_get_position_double (gdk_seat_get_pointer (gdk_display_get_default_seat (gdk_display_get_default ())), NULL, &x_pos, &y_pos); /* Get geometry of monitor where tasklist is located to calculate correct position of preview */ monitor = gdk_display_get_monitor_at_point (gdk_display_get_default (), x_pos, y_pos); gdk_monitor_get_geometry (monitor, &monitor_geom); + /* Get the position where the window list applet starts */ + gdk_window_get_origin (gtk_widget_get_window (gtk_widget_get_parent (GTK_WIDGET(tl))), &x_offset, &y_offset); + + /* Get panel orientation */ + orient = mate_panel_applet_get_orient (MATE_PANEL_APPLET (tasklist->applet)); + /* Add padding to clear the panel */ - switch (mate_panel_applet_get_orient (MATE_PANEL_APPLET (tasklist->applet))) + switch (orient) { case MATE_PANEL_APPLET_ORIENT_LEFT: - x_pos = monitor_geom.width + monitor_geom.x - (width + tasklist->size) - PREVIEW_PADDING; + x_pos = monitor_geom.width + monitor_geom.x - width - tasklist->size - PREVIEW_PADDING; break; case MATE_PANEL_APPLET_ORIENT_RIGHT: x_pos = tasklist->size + PREVIEW_PADDING; break; case MATE_PANEL_APPLET_ORIENT_UP: - y_pos = monitor_geom.height + monitor_geom.y - (height + tasklist->size) - PREVIEW_PADDING; + y_pos = monitor_geom.height + monitor_geom.y - height - tasklist->size - PREVIEW_PADDING; break; case MATE_PANEL_APPLET_ORIENT_DOWN: default: @@ -328,24 +385,77 @@ static void preview_window_reposition (TasklistData *tasklist, GdkPixbuf *thumbn break; } + /* Collect the allocation.x/y values of each button into lists. + * We need to iterate over all of them because grouped buttons will be the last children, + * even though they are positioned at the beginning. And not all buttons will have the exact same width. + * This allows us to avoid off-by-one errors that would cause the preview to be positioned over the adjacent button. */ + GList *alloc_x_list = NULL; + GList *alloc_y_list = NULL; + GtkAllocation last_alloc; + GList* children = gtk_container_get_children (GTK_CONTAINER(tl)); + while (children != NULL) + { + if (g_strcmp0 (gtk_widget_get_name (children->data), "tasklist-button") == 0) { + GtkAllocation alloc; + gtk_widget_get_allocation (children->data, &alloc); + + /* Skip grouped buttons: these usually have alloc width/heigh=1, except right after grouping is toggled. + * Then simply open or close a new window to get the correct offset. */ + if (alloc.width < 2 || alloc.height < 2) + { + children = children->next; + continue; + } + + /* Keep x and y offsets in sorted lists */ + alloc_x_list = g_list_insert_sorted (alloc_x_list, GINT_TO_POINTER(alloc.x), g_int_compare); + alloc_y_list = g_list_insert_sorted (alloc_y_list, GINT_TO_POINTER(alloc.y), g_int_compare); + + /* The width/height from the last allocation will be used for centering the preview. + * It might be off by a pixel because not all buttons have the exact same width/height but this isn't critical. */ + last_alloc = alloc; + } + children = children->next; + } + + /* Center preview at the midpoint of the tasklist button */ + if (orient == MATE_PANEL_APPLET_ORIENT_LEFT || orient == MATE_PANEL_APPLET_ORIENT_RIGHT) + { + /* Vertical panel */ + y_pos = y_offset + find_offset (alloc_y_list, y_pos - y_offset) + (last_alloc.height - height) / 2; + y_pos = y_pos < PREVIEW_PADDING ? PREVIEW_PADDING : y_pos; + } + else if (orient == MATE_PANEL_APPLET_ORIENT_UP || orient == MATE_PANEL_APPLET_ORIENT_DOWN) + { + /* Horizontal panel */ + x_pos = x_offset + find_offset (alloc_x_list, x_pos - x_offset) + (last_alloc.width - width) / 2; + x_pos = x_pos < PREVIEW_PADDING ? PREVIEW_PADDING : x_pos; + } + + g_list_free (alloc_x_list); + g_list_free (alloc_y_list); + gtk_window_move (GTK_WINDOW (tasklist->preview), x_pos, y_pos); } -static gboolean preview_window_draw (GtkWidget *widget, cairo_t *cr, GdkPixbuf *thumbnail) +static gboolean preview_window_draw (GtkWidget *widget, cairo_t *cr, cairo_surface_t *thumbnail) { GtkStyleContext *context; context = gtk_widget_get_style_context (widget); - gtk_render_icon (context, cr, thumbnail, 0, 0); + gtk_render_icon_surface (context, cr, thumbnail, 0, 0); return FALSE; } static gboolean applet_enter_notify_event (WnckTasklist *tl, GList *wnck_windows, TasklistData *tasklist) { - GdkPixbuf *thumbnail; + cairo_surface_t *thumbnail; WnckWindow *wnck_window = NULL; int n_windows; + int thumbnail_width; + int thumbnail_height; + int thumbnail_scale; if (tasklist->preview != NULL) { @@ -373,7 +483,7 @@ static gboolean applet_enter_notify_event (WnckTasklist *tl, GList *wnck_windows wnck_screen_get_active_workspace (wnck_screen_get_default ()))) return FALSE; - thumbnail = preview_window_thumbnail (wnck_window, tasklist); + thumbnail = preview_window_thumbnail (wnck_window, tasklist, &thumbnail_width, &thumbnail_height, &thumbnail_scale); if (thumbnail == NULL) return FALSE; @@ -382,13 +492,16 @@ static gboolean applet_enter_notify_event (WnckTasklist *tl, GList *wnck_windows tasklist->preview = gtk_window_new (GTK_WINDOW_POPUP); gtk_widget_set_app_paintable (tasklist->preview, TRUE); + gtk_window_set_default_size (GTK_WINDOW (tasklist->preview), thumbnail_width/thumbnail_scale, thumbnail_height/thumbnail_scale); gtk_window_set_resizable (GTK_WINDOW (tasklist->preview), TRUE); - - preview_window_reposition (tasklist, thumbnail); + preview_window_reposition (tl, tasklist, thumbnail_width/thumbnail_scale, thumbnail_height/thumbnail_scale, thumbnail_scale); gtk_widget_show (tasklist->preview); - g_signal_connect_data (G_OBJECT (tasklist->preview), "draw", G_CALLBACK (preview_window_draw), thumbnail, (GClosureNotify) G_CALLBACK (g_object_unref), 0); + g_signal_connect_data (tasklist->preview, "draw", + G_CALLBACK (preview_window_draw), thumbnail, + (GClosureNotify) G_CALLBACK (cairo_surface_destroy), + 0); return FALSE; } @@ -505,6 +618,11 @@ static void tasklist_update_thumbnail_size_spin(TasklistData* tasklist) gtk_spin_button_set_value(GTK_SPIN_BUTTON(button), (gdouble)tasklist->thumbnail_size); } +static void show_thumbnails_changed(GSettings* settings, gchar* key, TasklistData* tasklist) +{ + tasklist->show_window_thumbnails = g_settings_get_boolean (settings, key); +} + static void thumbnail_size_changed(GSettings *settings, gchar* key, TasklistData* tasklist) { tasklist->thumbnail_size = g_settings_get_int(settings, key); @@ -567,7 +685,6 @@ static void tasklist_update_unminimization_radio(TasklistData* tasklist) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); } - static void move_unminimized_windows_changed(GSettings* settings, gchar* key, TasklistData* tasklist) { gboolean value; @@ -580,6 +697,18 @@ static void move_unminimized_windows_changed(GSettings* settings, gchar* key, Ta tasklist_update_unminimization_radio(tasklist); } +static void scroll_enabled_changed (GSettings* settings, gchar* key, TasklistData* tasklist) +{ + tasklist->scroll_enable = g_settings_get_boolean (settings, key); + tasklist_update(tasklist); +} + +static void middle_click_close_changed (GSettings* settings, gchar* key, TasklistData* tasklist) +{ + tasklist->middle_click_close = g_settings_get_boolean (settings, key); + tasklist_update(tasklist); +} + static void setup_gsettings(TasklistData* tasklist) { tasklist->settings = mate_panel_applet_settings_new (MATE_PANEL_APPLET (tasklist->applet), WINDOW_LIST_SCHEMA); @@ -593,6 +722,11 @@ static void setup_gsettings(TasklistData* tasklist) tasklist->preview_settings = mate_panel_applet_settings_new (MATE_PANEL_APPLET (tasklist->applet), WINDOW_LIST_PREVIEW_SCHEMA); g_signal_connect (tasklist->preview_settings, + "changed::show-window-thumbnails", + G_CALLBACK (show_thumbnails_changed), + tasklist); + + g_signal_connect (tasklist->preview_settings, "changed::thumbnail-window-size", G_CALLBACK (thumbnail_size_changed), tasklist); @@ -605,6 +739,14 @@ static void setup_gsettings(TasklistData* tasklist) "changed::move-unminimized-windows", G_CALLBACK (move_unminimized_windows_changed), tasklist); + g_signal_connect (tasklist->settings, + "changed::scroll-enabled", + G_CALLBACK (scroll_enabled_changed), + tasklist); + g_signal_connect (tasklist->settings, + "changed::middle-click-close", + G_CALLBACK (middle_click_close_changed), + tasklist); } static void applet_size_allocate(GtkWidget *widget, GtkAllocation *allocation, TasklistData *tasklist) @@ -728,6 +870,10 @@ gboolean window_list_applet_fill(MatePanelApplet* applet) tasklist->move_unminimized_windows = g_settings_get_boolean (tasklist->settings, "move-unminimized-windows"); + tasklist->scroll_enable = g_settings_get_boolean (tasklist->settings, "scroll-enabled"); + + tasklist->middle_click_close = g_settings_get_boolean (tasklist->settings, "middle-click-close"); + tasklist->size = mate_panel_applet_get_size(applet); #if !defined(WNCKLET_INPROCESS) && !GTK_CHECK_VERSION (3, 23, 0) @@ -752,12 +898,15 @@ gboolean window_list_applet_fill(MatePanelApplet* applet) { tasklist->tasklist = wnck_tasklist_new(); - wnck_tasklist_set_middle_click_close (WNCK_TASKLIST (tasklist->tasklist), TRUE); wnck_tasklist_set_icon_loader(WNCK_TASKLIST(tasklist->tasklist), icon_loader_func, tasklist, NULL); #ifdef HAVE_WINDOW_PREVIEWS - g_signal_connect(G_OBJECT(tasklist->tasklist), "task_enter_notify", G_CALLBACK(applet_enter_notify_event), tasklist); - g_signal_connect(G_OBJECT(tasklist->tasklist), "task_leave_notify", G_CALLBACK(applet_leave_notify_event), tasklist); + g_signal_connect (tasklist->tasklist, "task-enter-notify", + G_CALLBACK (applet_enter_notify_event), + tasklist); + g_signal_connect (tasklist->tasklist, "task-leave-notify", + G_CALLBACK (applet_leave_notify_event), + tasklist); #endif /* HAVE_WINDOW_PREVIEWS */ } else @@ -777,27 +926,36 @@ gboolean window_list_applet_fill(MatePanelApplet* applet) tasklist_apply_orientation(tasklist); - g_signal_connect(G_OBJECT(tasklist->tasklist), "destroy", G_CALLBACK(destroy_tasklist), tasklist); - g_signal_connect(G_OBJECT(tasklist->applet), "size_allocate", G_CALLBACK(applet_size_allocate), tasklist); + g_signal_connect (tasklist->tasklist, "destroy", + G_CALLBACK (destroy_tasklist), + tasklist); + g_signal_connect (tasklist->applet, "size-allocate", + G_CALLBACK (applet_size_allocate), + tasklist); gtk_container_add(GTK_CONTAINER(tasklist->applet), tasklist->tasklist); - g_signal_connect(G_OBJECT(tasklist->applet), "realize", G_CALLBACK(applet_realized), tasklist); - g_signal_connect(G_OBJECT(tasklist->applet), "change_orient", G_CALLBACK(applet_change_orient), tasklist); - g_signal_connect(G_OBJECT(tasklist->applet), "change_size", G_CALLBACK(applet_change_pixel_size), tasklist); - g_signal_connect(G_OBJECT(tasklist->applet), "change_background", G_CALLBACK(applet_change_background), tasklist); - - mate_panel_applet_set_background_widget(MATE_PANEL_APPLET(tasklist->applet), GTK_WIDGET(tasklist->applet)); + g_signal_connect (tasklist->applet, "realize", + G_CALLBACK (applet_realized), + tasklist); + g_signal_connect (tasklist->applet, "change-orient", + G_CALLBACK (applet_change_orient), + tasklist); + g_signal_connect (tasklist->applet, "change-size", + G_CALLBACK (applet_change_pixel_size), + tasklist); + g_signal_connect (tasklist->applet, "change-background", + G_CALLBACK(applet_change_background), + tasklist); action_group = gtk_action_group_new("Tasklist Applet Actions"); gtk_action_group_set_translation_domain(action_group, GETTEXT_PACKAGE); gtk_action_group_add_actions(action_group, tasklist_menu_actions, G_N_ELEMENTS(tasklist_menu_actions), tasklist); - /* disable the item of system monitor, if not exists. * example, mate-system-monitor, o gnome-system-monitor */ char* programpath; - int i; + gsize i; for (i = 0; i < G_N_ELEMENTS(system_monitors); i += 1) { @@ -819,7 +977,6 @@ gboolean window_list_applet_fill(MatePanelApplet* applet) _system_monitor_found:; /* end of system monitor item */ - mate_panel_applet_setup_menu_from_resource (MATE_PANEL_APPLET (tasklist->applet), WNCKLET_RESOURCE_PATH "window-list-menu.xml", action_group); @@ -843,7 +1000,7 @@ gboolean window_list_applet_fill(MatePanelApplet* applet) static void call_system_monitor(GtkAction* action, TasklistData* tasklist) { - int i; + gsize i; for (i = 0; i < G_N_ELEMENTS(system_monitors); i += 1) { @@ -861,7 +1018,6 @@ static void call_system_monitor(GtkAction* action, TasklistData* tasklist) } } - static void display_help_dialog(GtkAction* action, TasklistData* tasklist) { wncklet_display_help(tasklist->applet, "mate-user-guide", "windowlist", WINDOW_LIST_ICON); @@ -889,13 +1045,13 @@ static void display_about_dialog(GtkAction* action, TasklistData* tasklist) "comments", _("The Window List shows a list of all windows in a set of buttons and lets you browse them."), "copyright", _("Copyright \xc2\xa9 2002 Red Hat, Inc.\n" "Copyright \xc2\xa9 2011 Perberos\n" - "Copyright \xc2\xa9 2012-2020 MATE developers"), + "Copyright \xc2\xa9 2012-2021 MATE developers"), "documenters", documenters, "icon-name", WINDOW_LIST_ICON, "logo-icon-name", WINDOW_LIST_ICON, "translator-credits", _("translator-credits"), "version", VERSION, - "website", "http://www.mate-desktop.org/", + "website", PACKAGE_URL, NULL); } @@ -959,6 +1115,8 @@ static void setup_sensitivity(TasklistData* tasklist, GtkBuilder* builder, const #ifdef HAVE_WAYLAND static void setup_dialog_wayland(TasklistData* tasklist) { + gtk_widget_show(tasklist->wayland_info_label); + gtk_widget_set_sensitive(tasklist->window_list_content_box, FALSE); gtk_widget_set_sensitive(tasklist->window_grouping_box, FALSE); gtk_widget_set_sensitive(tasklist->minimized_windows_box, FALSE); @@ -972,10 +1130,8 @@ static void setup_dialog_wayland(TasklistData* tasklist) static void setup_dialog(GtkBuilder* builder, TasklistData* tasklist) { GtkWidget* button; -#ifdef HAVE_WINDOW_PREVIEWS - GtkAdjustment *adjustment; -#endif /* HAVE_WINDOW_PREVIEWS */ + tasklist->wayland_info_label = WID("wayland_info_label"); tasklist->show_current_radio = WID("show_current_radio"); tasklist->show_all_radio = WID("show_all_radio"); @@ -1004,16 +1160,14 @@ static void setup_dialog(GtkBuilder* builder, TasklistData* tasklist) g_object_bind_property(tasklist->show_thumbnails_check, "active", tasklist->thumbnail_size_label, "sensitive", G_BINDING_DEFAULT); g_object_bind_property(tasklist->show_thumbnails_check, "active", tasklist->thumbnail_size_spin, "sensitive", G_BINDING_DEFAULT); - adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(tasklist->thumbnail_size_spin)); - gtk_adjustment_set_lower (adjustment, 0); - gtk_adjustment_set_upper (adjustment, 999); - gtk_adjustment_set_step_increment (adjustment, 1); #else gtk_widget_hide(WID("window_thumbnail_box")); #endif tasklist->move_minimized_radio = WID("move_minimized_radio"); tasklist->change_workspace_radio = WID("change_workspace_radio"); + tasklist->mouse_scroll_check = WID("mouse_scroll_check"); + tasklist->middle_click_close_check = WID("middle_click_close_check"); tasklist->minimized_windows_box = WID("minimized_windows_box"); tasklist->window_grouping_box = WID("window_grouping_box"); tasklist->window_list_content_box = WID("window_list_content_box"); @@ -1027,26 +1181,56 @@ static void setup_dialog(GtkBuilder* builder, TasklistData* tasklist) g_object_set_data(G_OBJECT(tasklist->auto_group_radio), "group_value", "auto"); g_object_set_data(G_OBJECT(tasklist->always_group_radio), "group_value", "always"); - g_signal_connect(G_OBJECT(tasklist->never_group_radio), "toggled", (GCallback) group_windows_toggled, tasklist); - g_signal_connect(G_OBJECT(tasklist->auto_group_radio), "toggled", (GCallback) group_windows_toggled, tasklist); - g_signal_connect(G_OBJECT(tasklist->always_group_radio), "toggled", (GCallback) group_windows_toggled, tasklist); + g_signal_connect (tasklist->never_group_radio, "toggled", + (GCallback) group_windows_toggled, + tasklist); + g_signal_connect (tasklist->auto_group_radio, "toggled", + (GCallback) group_windows_toggled, + tasklist); + g_signal_connect (tasklist->always_group_radio, "toggled", + (GCallback) group_windows_toggled, + tasklist); + + /* Mouse Scroll: */ + g_settings_bind (tasklist->settings, + "scroll-enabled", + tasklist->mouse_scroll_check, + "active", + G_SETTINGS_BIND_DEFAULT); + + /* Middle mouse click to close window: */ + g_settings_bind (tasklist->settings, + "middle-click-close", + tasklist->middle_click_close_check, + "active", + G_SETTINGS_BIND_DEFAULT); #ifdef HAVE_WINDOW_PREVIEWS /* change thumbnail size: */ tasklist_update_thumbnail_size_spin(tasklist); - g_signal_connect(G_OBJECT(tasklist->thumbnail_size_spin), "value-changed", (GCallback) thumbnail_size_spin_changed, tasklist); + g_signal_connect (tasklist->thumbnail_size_spin, "value-changed", + (GCallback) thumbnail_size_spin_changed, + tasklist); #endif /* move window when unminimizing: */ tasklist_update_unminimization_radio(tasklist); - g_signal_connect(G_OBJECT(tasklist->move_minimized_radio), "toggled", (GCallback) move_minimized_toggled, tasklist); + g_signal_connect (tasklist->move_minimized_radio, "toggled", + (GCallback) move_minimized_toggled, + tasklist); /* Tasklist content: */ tasklist_properties_update_content_radio (tasklist); - g_signal_connect(G_OBJECT(tasklist->show_all_radio), "toggled", (GCallback) display_all_workspaces_toggled, tasklist); - - g_signal_connect_swapped(WID("done_button"), "clicked", (GCallback) gtk_widget_hide, tasklist->properties_dialog); - g_signal_connect(tasklist->properties_dialog, "response", G_CALLBACK(response_cb), tasklist); + g_signal_connect (tasklist->show_all_radio, "toggled", + (GCallback) display_all_workspaces_toggled, + tasklist); + + g_signal_connect_swapped (WID ("done_button"), "clicked", + (GCallback) gtk_widget_hide, + tasklist->properties_dialog); + g_signal_connect (tasklist->properties_dialog, "response", + G_CALLBACK (response_cb), + tasklist); #ifdef HAVE_WAYLAND if (GDK_IS_WAYLAND_DISPLAY(gdk_display_get_default())) { diff --git a/applets/wncklet/window-list.ui b/applets/wncklet/window-list.ui index 2161d427..4cc49f9c 100644 --- a/applets/wncklet/window-list.ui +++ b/applets/wncklet/window-list.ui @@ -1,41 +1,46 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- Generated with glade 3.36.0 --> +<!-- Generated with glade 3.38.2 --> <interface> <requires lib="gtk+" version="3.22"/> + <object class="GtkAdjustment" id="adjustment1"> + <property name="upper">999</property> + <property name="step-increment">1</property> + <property name="page-increment">10</property> + </object> <object class="GtkImage" id="image1"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="icon_name">help-browser</property> + <property name="can-focus">False</property> + <property name="icon-name">help-browser</property> </object> <object class="GtkImage" id="image2"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="icon_name">window-close</property> + <property name="can-focus">False</property> + <property name="icon-name">window-close</property> </object> <object class="GtkDialog" id="tasklist_properties_dialog"> - <property name="can_focus">False</property> - <property name="border_width">5</property> + <property name="can-focus">False</property> + <property name="border-width">5</property> <property name="title" translatable="yes">Window List Preferences</property> - <property name="type_hint">normal</property> + <property name="resizable">False</property> + <property name="icon-name">mate-panel-window-list</property> + <property name="type-hint">normal</property> <child internal-child="vbox"> - <object class="GtkBox" id="dialog-vbox2"> - <property name="visible">True</property> - <property name="can_focus">False</property> + <object class="GtkBox"> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <property name="spacing">2</property> <child internal-child="action_area"> <object class="GtkButtonBox" id="dialog-action_area2"> - <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <child> <object class="GtkButton" id="help_button"> <property name="label" translatable="yes">_Help</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> + <property name="can-focus">True</property> + <property name="can-default">True</property> + <property name="receives-default">False</property> <property name="image">image1</property> - <property name="use_underline">True</property> + <property name="use-underline">True</property> </object> <packing> <property name="expand">False</property> @@ -47,12 +52,12 @@ <object class="GtkButton" id="done_button"> <property name="label" translatable="yes">_Close</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="has_default">True</property> - <property name="receives_default">False</property> + <property name="can-focus">True</property> + <property name="can-default">True</property> + <property name="has-default">True</property> + <property name="receives-default">False</property> <property name="image">image2</property> - <property name="use_underline">True</property> + <property name="use-underline">True</property> </object> <packing> <property name="expand">False</property> @@ -64,149 +69,206 @@ <packing> <property name="expand">False</property> <property name="fill">False</property> - <property name="pack_type">end</property> - <property name="position">1</property> + <property name="position">0</property> </packing> </child> <child> - <object class="GtkBox" id="vbox1"> + <object class="GtkNotebook"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="border_width">5</property> - <property name="orientation">vertical</property> - <property name="spacing">18</property> + <property name="can-focus">True</property> <child> - <object class="GtkBox" id="window_list_content_box"> + <object class="GtkBox" id="behaviour_vbox"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="border-width">12</property> <property name="orientation">vertical</property> - <property name="spacing">6</property> - <child> - <object class="GtkLabel" id="label1"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">Window List Content</property> - <property name="xalign">0</property> - <attributes> - <attribute name="weight" value="bold"/> - </attributes> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> + <property name="spacing">18</property> <child> - <object class="GtkAlignment" id="alignment1"> + <object class="GtkBox" id="window_thumbnail_box"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="left_padding">12</property> + <property name="can-focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> <child> - <object class="GtkBox" id="vbox9"> + <object class="GtkLabel" id="thumbnails_label"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes">Window Thumbnails</property> + <property name="xalign">0</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vbox16"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">6</property> <property name="orientation">vertical</property> <property name="spacing">6</property> <child> - <object class="GtkRadioButton" id="show_current_radio"> - <property name="label" translatable="yes">Sh_ow windows from current workspace</property> + <object class="GtkCheckButton" id="show_thumbnails_check"> + <property name="label" translatable="yes">Show _thumbnails on hover</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="use_underline">True</property> - <property name="draw_indicator">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> </object> <packing> <property name="expand">False</property> - <property name="fill">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> - <object class="GtkRadioButton" id="show_all_radio"> - <property name="label" translatable="yes">Show windows from a_ll workspaces</property> + <object class="GtkBox" id="thumbnail_box"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="use_underline">True</property> - <property name="draw_indicator">True</property> - <property name="group">show_current_radio</property> + <property name="can-focus">False</property> + <property name="spacing">6</property> + <child> + <object class="GtkLabel" id="thumbnail_size_label"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="tooltip-text" translatable="yes">Thumbnail width in pixels. Window aspect ratio will be maintained.</property> + <property name="label" translatable="yes">Thumbnail width:</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="thumbnail_size_spin"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="max-length">3</property> + <property name="text" translatable="yes">0</property> + <property name="caps-lock-warning">False</property> + <property name="placeholder-text" translatable="yes">px</property> + <property name="input-purpose">number</property> + <property name="adjustment">adjustment1</property> + <property name="climb-rate">1</property> + <property name="numeric">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> </object> <packing> <property name="expand">False</property> - <property name="fill">False</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> </child> </object> <packing> <property name="expand">False</property> <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkBox" id="window_thumbnail_box"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="orientation">vertical</property> - <property name="spacing">6</property> - <child> - <object class="GtkLabel" id="label4"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">Window Thumbnails</property> - <property name="xalign">0</property> - <attributes> - <attribute name="weight" value="bold"/> - </attributes> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> <property name="position">0</property> </packing> </child> <child> - <object class="GtkAlignment" id="alignment4"> + <object class="GtkBox" id="window_grouping_box"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="left_padding">12</property> + <property name="can-focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> <child> - <object class="GtkBox" id="vbox16"> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes">Window Grouping</property> + <property name="xalign">0</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vbox12"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> + <property name="margin-start">6</property> <property name="orientation">vertical</property> <property name="spacing">6</property> <child> - <object class="GtkCheckButton" id="show_thumbnails_check"> - <property name="label" translatable="yes">Show _thumbnails on hover</property> + <object class="GtkRadioButton" id="never_group_radio"> + <property name="label" translatable="yes">_Never group windows</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="use_underline">True</property> - <property name="draw_indicator">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="active">True</property> + <property name="draw-indicator">True</property> </object> <packing> <property name="expand">False</property> - <property name="fill">True</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="auto_group_radio"> + <property name="label" translatable="yes">Group windows when _space is limited</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">never_group_radio</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> <property name="position">1</property> </packing> </child> + <child> + <object class="GtkRadioButton" id="always_group_radio"> + <property name="label" translatable="yes">_Always group windows</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">never_group_radio</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> </child> </object> <packing> @@ -216,22 +278,42 @@ </packing> </child> <child> - <object class="GtkAlignment" id="alignment5"> + <object class="GtkBox" id="middle_click_close_box"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="left_padding">12</property> + <property name="can-focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> <child> - <object class="GtkBox" id="hbox1"> + <object class="GtkLabel" id="middle_click_close_label"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes">Middle mouse button</property> + <property name="xalign">0</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="middle_click_close_vbox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">6</property> + <property name="orientation">vertical</property> <property name="spacing">6</property> <child> - <object class="GtkLabel" id="thumbnail_size_label"> + <object class="GtkCheckButton" id="middle_click_close_check"> + <property name="label" translatable="yes">_Click to close window</property> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="tooltip_text" translatable="yes">Thumbnail width in pixels. Window aspect ratio will be maintained.</property> - <property name="label" translatable="yes">Thumbnail width:</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> </object> <packing> <property name="expand">False</property> @@ -239,82 +321,135 @@ <property name="position">0</property> </packing> </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkBox" id="mouse_scroll_box"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkLabel" id="mouse_scrolling_label"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes">Mouse Scrolling</property> + <property name="xalign">0</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="mouse_scrolling_vbox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">6</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> <child> - <object class="GtkSpinButton" id="thumbnail_size_spin"> + <object class="GtkCheckButton" id="mouse_scroll_check"> + <property name="label" translatable="yes">_Enable mouse scrolling</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="max_length">3</property> - <property name="caps_lock_warning">False</property> - <property name="placeholder_text" translatable="yes">px</property> - <property name="input_purpose">number</property> - <property name="climb_rate">1</property> - <property name="numeric">True</property> - <property name="value">200</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> </object> <packing> <property name="expand">False</property> <property name="fill">False</property> - <property name="position">1</property> + <property name="position">0</property> </packing> </child> </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> </child> </object> <packing> <property name="expand">False</property> <property name="fill">True</property> - <property name="position">2</property> + <property name="position">3</property> </packing> </child> </object> + </child> + <child type="tab"> + <object class="GtkLabel" id="behaviour_label"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes">Behaviour</property> + </object> <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> + <property name="tab-fill">False</property> </packing> </child> <child> - <object class="GtkBox" id="window_grouping_box"> + <object class="GtkBox" id="workspaces_vbox"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> + <property name="border-width">12</property> <property name="orientation">vertical</property> - <property name="spacing">6</property> + <property name="spacing">18</property> <child> - <object class="GtkLabel" id="label3"> + <object class="GtkBox" id="window_list_content_box"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">Window Grouping</property> - <property name="xalign">0</property> - <attributes> - <attribute name="weight" value="bold"/> - </attributes> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkAlignment" id="alignment2"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="left_padding">12</property> + <property name="can-focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> <child> - <object class="GtkBox" id="vbox12"> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes">Window List Content</property> + <property name="xalign">0</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vbox9"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> + <property name="margin-start">6</property> <property name="orientation">vertical</property> <property name="spacing">6</property> <child> - <object class="GtkRadioButton" id="never_group_radio"> - <property name="label" translatable="yes">_Never group windows</property> + <object class="GtkRadioButton" id="show_current_radio"> + <property name="label" translatable="yes">Sh_ow windows from current workspace</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="use_underline">True</property> - <property name="draw_indicator">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="active">True</property> + <property name="draw-indicator">True</property> </object> <packing> <property name="expand">False</property> @@ -323,14 +458,14 @@ </packing> </child> <child> - <object class="GtkRadioButton" id="auto_group_radio"> - <property name="label" translatable="yes">Group windows when _space is limited</property> + <object class="GtkRadioButton" id="show_all_radio"> + <property name="label" translatable="yes">Show windows from a_ll workspaces</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="use_underline">True</property> - <property name="draw_indicator">True</property> - <property name="group">never_group_radio</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + <property name="group">show_current_radio</property> </object> <packing> <property name="expand">False</property> @@ -338,80 +473,58 @@ <property name="position">1</property> </packing> </child> - <child> - <object class="GtkRadioButton" id="always_group_radio"> - <property name="label" translatable="yes">_Always group windows</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="use_underline">True</property> - <property name="draw_indicator">True</property> - <property name="group">never_group_radio</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">2</property> - </packing> - </child> </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> </child> </object> <packing> <property name="expand">False</property> <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">3</property> - </packing> - </child> - <child> - <object class="GtkBox" id="minimized_windows_box"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="orientation">vertical</property> - <property name="spacing">6</property> - <child> - <object class="GtkLabel" id="minimized_windows_label"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">Restoring Minimized Windows</property> - <property name="xalign">0</property> - <attributes> - <attribute name="weight" value="bold"/> - </attributes> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> <property name="position">0</property> </packing> </child> <child> - <object class="GtkAlignment" id="alignment3"> + <object class="GtkBox" id="minimized_windows_box"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="left_padding">12</property> + <property name="can-focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkLabel" id="minimized_windows_label"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes">Restoring Minimized Windows</property> + <property name="xalign">0</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> <child> <object class="GtkBox" id="vbox14"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> + <property name="margin-start">6</property> <property name="orientation">vertical</property> <property name="spacing">6</property> <child> <object class="GtkRadioButton" id="move_minimized_radio"> <property name="label" translatable="yes">Restore to current _workspace</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="use_underline">True</property> - <property name="draw_indicator">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="active">True</property> + <property name="draw-indicator">True</property> </object> <packing> <property name="expand">False</property> @@ -423,10 +536,10 @@ <object class="GtkRadioButton" id="change_workspace_radio"> <property name="label" translatable="yes">Restore to na_tive workspace</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="use_underline">True</property> - <property name="draw_indicator">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> <property name="group">move_minimized_radio</property> </object> <packing> @@ -436,6 +549,11 @@ </packing> </child> </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> </child> </object> <packing> @@ -446,9 +564,18 @@ </child> </object> <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">4</property> + <property name="position">1</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="workspaces_label"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes">Workspaces</property> + </object> + <packing> + <property name="position">1</property> + <property name="tab-fill">False</property> </packing> </child> </object> @@ -462,10 +589,7 @@ </child> <action-widgets> <action-widget response="-11">help_button</action-widget> - <action-widget response="0">done_button</action-widget> + <action-widget response="-7">done_button</action-widget> </action-widgets> - <child type="titlebar"> - <placeholder/> - </child> </object> </interface> diff --git a/applets/wncklet/window-menu.c b/applets/wncklet/window-menu.c index 48b1c31b..4b4e48dc 100644 --- a/applets/wncklet/window-menu.c +++ b/applets/wncklet/window-menu.c @@ -26,7 +26,7 @@ */ #ifdef HAVE_CONFIG_H - #include <config.h> +#include <config.h> #endif #include <string.h> @@ -88,13 +88,13 @@ static void window_menu_about(GtkAction* action, WindowMenu* window_menu) "Copyright \xc2\xa9 2001 Free Software Foundation, Inc.\n" "Copyright \xc2\xa9 2003 Sun Microsystems, Inc.\n" "Copyright \xc2\xa9 2011 Perberos\n" - "Copyright \xc2\xa9 2012-2020 MATE developers"), + "Copyright \xc2\xa9 2012-2021 MATE developers"), "documenters", documenters, "icon-name", WINDOW_MENU_ICON, "logo-icon-name", WINDOW_MENU_ICON, "translator-credits", _("translator-credits"), "version", VERSION, - "website", "http://www.mate-desktop.org/", + "website", PACKAGE_URL, NULL); } @@ -218,7 +218,7 @@ static gboolean window_menu_key_press_event(GtkWidget* widget, GdkEventKey* even static gboolean filter_button_press(GtkWidget* widget, GdkEventButton* event, gpointer data) { if (event->button != 1) - g_signal_stop_emission_by_name(widget, "button_press_event"); + g_signal_stop_emission_by_name(widget, "button-press-event"); return FALSE; } @@ -239,7 +239,7 @@ gboolean window_menu_applet_fill(MatePanelApplet* applet) window_menu->orient = mate_panel_applet_get_orient(applet); g_signal_connect(window_menu->applet, "destroy", G_CALLBACK(window_menu_destroy), window_menu); - g_signal_connect(window_menu->applet, "key_press_event", G_CALLBACK(window_menu_key_press_event), window_menu); + g_signal_connect(window_menu->applet, "key-press-event", G_CALLBACK(window_menu_key_press_event), window_menu); action_group = gtk_action_group_new("WindowMenu Applet Actions"); gtk_action_group_set_translation_domain(action_group, GETTEXT_PACKAGE); @@ -253,8 +253,6 @@ gboolean window_menu_applet_fill(MatePanelApplet* applet) if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) { window_menu->selector = wnck_selector_new(); - mate_panel_applet_set_background_widget(MATE_PANEL_APPLET(window_menu->applet), GTK_WIDGET(window_menu->selector)); - } else #endif /* HAVE_X11 */ @@ -273,13 +271,23 @@ gboolean window_menu_applet_fill(MatePanelApplet* applet) gtk_container_add(GTK_CONTAINER(window_menu->applet), window_menu->selector); - g_signal_connect(window_menu->applet, "size-allocate", G_CALLBACK(window_menu_size_allocate), window_menu); - - g_signal_connect_after(G_OBJECT(window_menu->applet), "focus-in-event", G_CALLBACK(gtk_widget_queue_draw), window_menu); - g_signal_connect_after(G_OBJECT(window_menu->applet), "focus-out-event", G_CALLBACK(gtk_widget_queue_draw), window_menu); - g_signal_connect_after(G_OBJECT(window_menu->selector), "draw", G_CALLBACK(window_menu_on_draw), window_menu); - - g_signal_connect(G_OBJECT(window_menu->selector), "button_press_event", G_CALLBACK(filter_button_press), window_menu); + g_signal_connect (window_menu->applet, "size-allocate", + G_CALLBACK(window_menu_size_allocate), + window_menu); + + g_signal_connect_after (window_menu->applet, "focus-in-event", + G_CALLBACK (gtk_widget_queue_draw), + window_menu); + g_signal_connect_after (window_menu->applet, "focus-out-event", + G_CALLBACK (gtk_widget_queue_draw), + window_menu); + g_signal_connect_after (window_menu->selector, "draw", + G_CALLBACK (window_menu_on_draw), + window_menu); + + g_signal_connect (window_menu->selector, "button_press_event", + G_CALLBACK (filter_button_press), + window_menu); gtk_widget_show_all(GTK_WIDGET(window_menu->applet)); diff --git a/applets/wncklet/wncklet.c b/applets/wncklet/wncklet.c index 67b2ae78..3b185910 100644 --- a/applets/wncklet/wncklet.c +++ b/applets/wncklet/wncklet.c @@ -148,7 +148,6 @@ static gboolean wncklet_factory(MatePanelApplet* applet, const char* iid, gpoint return retval; } - #ifdef WNCKLET_INPROCESS MATE_PANEL_APPLET_IN_PROCESS_FACTORY("WnckletFactory", PANEL_TYPE_APPLET, "WindowNavigationApplets", wncklet_factory, NULL) #else diff --git a/applets/wncklet/workspace-switcher.c b/applets/wncklet/workspace-switcher.c index 2335bb1d..e3fda355 100644 --- a/applets/wncklet/workspace-switcher.c +++ b/applets/wncklet/workspace-switcher.c @@ -53,17 +53,166 @@ #define WORKSPACE_SWITCHER_ICON "mate-panel-workspace-switcher" +/* Container for the WnckPager to work around the sizing issues we have in the + * panel. See + * https://github.com/mate-desktop/mate-panel/issues/1230#issuecomment-1046235088 */ + +typedef struct _PagerContainer PagerContainer; +typedef GtkBinClass PagerContainerClass; + +static GType pager_container_get_type (void); + +#define PAGER_CONTAINER_TYPE (pager_container_get_type ()) +#define PAGER_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PAGER_CONTAINER_TYPE, PagerContainer)) + +struct _PagerContainer +{ + GtkBin parent; + GtkOrientation orientation; + int size; +}; + +G_DEFINE_TYPE (PagerContainer, pager_container, GTK_TYPE_BIN) + +static gboolean +queue_resize_idle_cb (gpointer user_data) +{ + gtk_widget_queue_resize (GTK_WIDGET (user_data)); + return G_SOURCE_REMOVE; +} + +static void +pager_container_get_preferred_width (GtkWidget *widget, + int *minimum_width, + int *natural_width) +{ + PagerContainer *self; + + self = PAGER_CONTAINER (widget); + + if (self->orientation == GTK_ORIENTATION_VERTICAL) + { + /* self->size is panel width */ + *minimum_width = *natural_width = self->size; + } + else + { + /* self->size is panel size/height, that will get allocated to pager, request width for this size */ + gtk_widget_get_preferred_width_for_height (gtk_bin_get_child (GTK_BIN (self)), + self->size, + minimum_width, + natural_width); + } +} + +static void +pager_container_get_preferred_height (GtkWidget *widget, + int *minimum_height, + int *natural_height) +{ + PagerContainer *self; + + self = PAGER_CONTAINER (widget); + + if (self->orientation == GTK_ORIENTATION_VERTICAL) + { + /* self->size is panel size/width that will get allocated to pager, request height for this size */ + gtk_widget_get_preferred_height_for_width (gtk_bin_get_child (GTK_BIN (self)), + self->size, + minimum_height, + natural_height); + } + else + { + /* self->size is panel height */ + *minimum_height = *natural_height = self->size; + } +} + +static void +pager_container_size_allocate (GtkWidget *widget, + GtkAllocation *allocation) +{ + PagerContainer *self; + int size; + + self = PAGER_CONTAINER (widget); + + if (self->orientation == GTK_ORIENTATION_VERTICAL) + size = allocation->width; + else + size = allocation->height; + + size = MAX (size, 1); + + if (self->size != size) + { + self->size = size; + g_idle_add (queue_resize_idle_cb, self); + return; + } + + GTK_WIDGET_CLASS (pager_container_parent_class)->size_allocate (widget, + allocation); +} + +static void +pager_container_class_init (PagerContainerClass *self_class) +{ + GtkWidgetClass *widget_class; + + widget_class = GTK_WIDGET_CLASS (self_class); + + widget_class->get_preferred_width = pager_container_get_preferred_width; + widget_class->get_preferred_height = pager_container_get_preferred_height; + widget_class->size_allocate = pager_container_size_allocate; +} + +static void +pager_container_init (PagerContainer *self) +{ +} + +static GtkWidget * +pager_container_new (GtkWidget *child, + GtkOrientation orientation) +{ + PagerContainer *self; + + self = g_object_new (PAGER_CONTAINER_TYPE, "child", child, NULL); + + self->orientation = orientation; + + return GTK_WIDGET (self); +} + +static void +pager_container_set_orientation (PagerContainer *self, + GtkOrientation orientation) +{ + if (self->orientation == orientation) + return; + + self->orientation = orientation; + + gtk_widget_queue_resize (GTK_WIDGET (self)); +} + +/* Pager applet itself */ + typedef enum { PAGER_WM_MARCO, PAGER_WM_METACITY, PAGER_WM_COMPIZ, PAGER_WM_I3, + PAGER_WM_XMONAD, PAGER_WM_UNKNOWN } PagerWM; typedef struct { GtkWidget* applet; + GtkWidget* pager_container; GtkWidget* pager; WnckScreen* screen; @@ -107,7 +256,8 @@ static void pager_update_wnck(PagerData* pager, WnckPager* wnck_pager) if (pager->display_names && ( pager->wm == PAGER_WM_MARCO || pager->wm == PAGER_WM_METACITY || - pager->wm == PAGER_WM_I3)) + pager->wm == PAGER_WM_I3 || + pager->wm == PAGER_WM_XMONAD)) { display_mode = WNCK_PAGER_DISPLAY_NAME; } @@ -171,6 +321,20 @@ static void update_properties_for_wm(PagerData* pager) if (pager->cell) g_object_set (pager->cell, "editable", FALSE, NULL); break; + case PAGER_WM_XMONAD: + if (pager->workspaces_frame) + gtk_widget_show(pager->workspaces_frame); + if (pager->num_workspaces_spin) + gtk_widget_set_sensitive(pager->num_workspaces_spin, FALSE); + if (pager->workspace_names_label) + gtk_widget_hide(pager->workspace_names_label); + if (pager->workspace_names_scroll) + gtk_widget_hide(pager->workspace_names_scroll); + if (pager->display_workspaces_toggle) + gtk_widget_show(pager->display_workspaces_toggle); + if (pager->cell) + g_object_set (pager->cell, "editable", FALSE, NULL); + break; case PAGER_WM_COMPIZ: if (pager->workspaces_frame) gtk_widget_show(pager->workspaces_frame); @@ -200,14 +364,13 @@ static void update_properties_for_wm(PagerData* pager) static void window_manager_changed(WnckScreen* screen, PagerData* pager) { +#ifdef HAVE_X11 const char *wm_name = NULL; -#ifdef HAVE_X11 if (pager->screen) { wm_name = wnck_screen_get_window_manager_name (pager->screen); } -#endif /* HAVE_X11 */ if (!wm_name) pager->wm = PAGER_WM_UNKNOWN; @@ -217,10 +380,15 @@ static void window_manager_changed(WnckScreen* screen, PagerData* pager) pager->wm = PAGER_WM_METACITY; else if (strcmp(wm_name, "i3") == 0) pager->wm = PAGER_WM_I3; + else if (strcmp(wm_name, "xmonad") == 0) + pager->wm = PAGER_WM_XMONAD; else if (strcmp(wm_name, "Compiz") == 0) pager->wm = PAGER_WM_COMPIZ; else pager->wm = PAGER_WM_UNKNOWN; +#else + pager->wm = PAGER_WM_UNKNOWN; +#endif /* HAVE_X11 */ update_properties_for_wm(pager); pager_update(pager); @@ -270,6 +438,8 @@ static void applet_change_orient(MatePanelApplet* applet, MatePanelAppletOrient pager->orientation = new_orient; pager_update(pager); + pager_container_set_orientation(PAGER_CONTAINER(pager->pager_container), pager->orientation); + if (pager->label_row_col) gtk_label_set_text(GTK_LABEL(pager->label_row_col), pager->orientation == GTK_ORIENTATION_HORIZONTAL ? _("rows") : _("columns")); } @@ -321,11 +491,13 @@ static void applet_style_updated (MatePanelApplet *applet, GtkStyleContext *cont */ static gboolean applet_scroll(MatePanelApplet* applet, GdkEventScroll* event, PagerData* pager) { +#ifdef HAVE_X11 GdkScrollDirection absolute_direction; int index; int n_workspaces; int n_columns; int in_last_row; +#endif /* HAVE_X11 */ if (event->type != GDK_SCROLL) return FALSE; @@ -340,7 +512,6 @@ static gboolean applet_scroll(MatePanelApplet* applet, GdkEventScroll* event, Pa n_workspaces = wnck_screen_get_workspace_count(pager->screen); } else -#endif /* HAVE_X11 */ { index = 0; n_workspaces = 1; @@ -431,7 +602,6 @@ static gboolean applet_scroll(MatePanelApplet* applet, GdkEventScroll* event, Pa break; } -#ifdef HAVE_X11 if (pager->screen) { wnck_workspace_activate(wnck_screen_get_workspace(pager->screen, index), event->time); @@ -470,11 +640,12 @@ static const GtkActionEntry pager_menu_actions[] = { static void num_rows_changed(GSettings* settings, gchar* key, PagerData* pager) { - int n_rows = DEFAULT_ROWS; + int n_rows; - n_rows = g_settings_get_int (settings, key); - - n_rows = CLAMP(n_rows, 1, MAX_REASONABLE_ROWS); + n_rows = CLAMP (g_settings_get_int (settings, key), + 1, + MIN (wnck_screen_get_workspace_count (pager->screen), + MAX_REASONABLE_ROWS)); pager->n_rows = n_rows; pager_update(pager); @@ -499,12 +670,9 @@ static void display_workspace_names_changed(GSettings* settings, gchar* key, Pag } } - static void all_workspaces_changed(GSettings* settings, gchar* key, PagerData* pager) { - gboolean value = TRUE; /* Default value */ - - value = g_settings_get_boolean (settings, key); + gboolean value = g_settings_get_boolean (settings, key); pager->display_all = value; pager_update(pager); @@ -630,23 +798,37 @@ gboolean workspace_switcher_applet_fill(MatePanelApplet* applet) context = gtk_widget_get_style_context (pager->pager); gtk_style_context_add_class (context, "wnck-pager"); - g_signal_connect(G_OBJECT(pager->pager), "destroy", G_CALLBACK(destroy_pager), pager); + g_signal_connect (pager->pager, "destroy", + G_CALLBACK (destroy_pager), + pager); /* overwrite default WnckPager widget scroll-event */ - g_signal_connect(G_OBJECT(pager->pager), "scroll-event", G_CALLBACK(applet_scroll), pager); - - gtk_container_add(GTK_CONTAINER(pager->applet), pager->pager); - - g_signal_connect(G_OBJECT(pager->applet), "realize", G_CALLBACK(applet_realized), pager); - g_signal_connect(G_OBJECT(pager->applet), "unrealize", G_CALLBACK(applet_unrealized), pager); - g_signal_connect(G_OBJECT(pager->applet), "change_orient", G_CALLBACK(applet_change_orient), pager); - g_signal_connect(G_OBJECT(pager->applet), "change_background", G_CALLBACK(applet_change_background), pager); - g_signal_connect(G_OBJECT(pager->applet), "style-updated", G_CALLBACK(applet_style_updated), context); - - gtk_widget_show(pager->pager); - gtk_widget_show(pager->applet); - - mate_panel_applet_set_background_widget(MATE_PANEL_APPLET(pager->applet), GTK_WIDGET(pager->applet)); + g_signal_connect (pager->pager, "scroll-event", + G_CALLBACK (applet_scroll), + pager); + + pager->pager_container = pager_container_new(pager->pager, pager->orientation); + gtk_container_add(GTK_CONTAINER(pager->applet), pager->pager_container); + + g_signal_connect (pager->applet, "realize", + G_CALLBACK (applet_realized), + pager); + g_signal_connect (pager->applet, "unrealize", + G_CALLBACK (applet_unrealized), + pager); + g_signal_connect (pager->applet, "change-orient", + G_CALLBACK (applet_change_orient), + pager); + g_signal_connect (pager->applet, "change-background", + G_CALLBACK (applet_change_background), + pager); + g_signal_connect (pager->applet, "style-updated", + G_CALLBACK (applet_style_updated), + context); + + gtk_widget_show (pager->pager); + gtk_widget_show (pager->pager_container); + gtk_widget_show (pager->applet); action_group = gtk_action_group_new("WorkspaceSwitcher Applet Actions"); gtk_action_group_set_translation_domain(action_group, GETTEXT_PACKAGE); @@ -668,7 +850,6 @@ gboolean workspace_switcher_applet_fill(MatePanelApplet* applet) return TRUE; } - static void display_help_dialog(GtkAction* action, PagerData* pager) { wncklet_display_help(pager->applet, "mate-user-guide", "overview-workspaces", WORKSPACE_SWITCHER_ICON); @@ -697,13 +878,13 @@ static void display_about_dialog(GtkAction* action, PagerData* pager) "comments", _("The Workspace Switcher shows you a small version of your workspaces that lets you manage your windows."), "copyright", _("Copyright \xc2\xa9 2002 Red Hat, Inc.\n" "Copyright \xc2\xa9 2011 Perberos\n" - "Copyright \xc2\xa9 2012-2020 MATE developers"), + "Copyright \xc2\xa9 2012-2021 MATE developers"), "documenters", documenters, "icon-name", WORKSPACE_SWITCHER_ICON, "logo-icon-name", WORKSPACE_SWITCHER_ICON, "translator-credits", _("translator-credits"), "version", VERSION, - "website", "http://www.mate-desktop.org/", + "website", PACKAGE_URL, NULL); } @@ -796,13 +977,17 @@ static void workspace_destroyed(WnckScreen* screen, WnckWorkspace* space, PagerD } #endif /* HAVE_X11 */ -static void num_workspaces_value_changed(GtkSpinButton* button, PagerData* pager) +static void +on_num_workspaces_value_changed (GtkSpinButton *button, + PagerData *pager) { #ifdef HAVE_X11 if (pager->screen) { - int workspace_count = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(pager->num_workspaces_spin)); + int workspace_count = gtk_spin_button_get_value_as_int (button); wnck_screen_change_workspace_count(pager->screen, workspace_count); + if (workspace_count < pager->n_rows) + g_settings_set_int (pager->settings, "num-rows", workspace_count); } #endif /* HAVE_X11 */ } @@ -978,7 +1163,6 @@ static void setup_dialog(GtkBuilder* builder, PagerData* pager) if (marco_workspaces_settings != NULL) g_object_unref (marco_workspaces_settings); - /* Wrap workspaces: */ if (pager->wrap_workspaces_toggle) { @@ -986,18 +1170,24 @@ static void setup_dialog(GtkBuilder* builder, PagerData* pager) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pager->wrap_workspaces_toggle), pager->wrap_workspaces); } - g_signal_connect(G_OBJECT(pager->wrap_workspaces_toggle), "toggled", (GCallback) wrap_workspaces_toggled, pager); + g_signal_connect (pager->wrap_workspaces_toggle, "toggled", + (GCallback) wrap_workspaces_toggled, + pager); /* Display workspace names: */ - g_signal_connect(G_OBJECT(pager->display_workspaces_toggle), "toggled", (GCallback) display_workspace_names_toggled, pager); + g_signal_connect (pager->display_workspaces_toggle, "toggled", + (GCallback) display_workspace_names_toggled, + pager); value = pager->display_names; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pager->display_workspaces_toggle), value); /* Display all workspaces: */ - g_signal_connect(G_OBJECT(pager->all_workspaces_radio), "toggled", (GCallback) all_workspaces_toggled, pager); + g_signal_connect (pager->all_workspaces_radio, "toggled", + (GCallback) all_workspaces_toggled, + pager); if (pager->display_all) { @@ -1015,13 +1205,13 @@ static void setup_dialog(GtkBuilder* builder, PagerData* pager) } /* Num rows: */ - g_signal_connect(G_OBJECT(pager->num_rows_spin), "value_changed", (GCallback) num_rows_value_changed, pager); + g_signal_connect (pager->num_rows_spin, "value-changed", G_CALLBACK (num_rows_value_changed), pager); gtk_spin_button_set_value(GTK_SPIN_BUTTON(pager->num_rows_spin), pager->n_rows); gtk_label_set_text(GTK_LABEL(pager->label_row_col), pager->orientation == GTK_ORIENTATION_HORIZONTAL ? _("rows") : _("columns")); g_signal_connect(pager->properties_dialog, "destroy", G_CALLBACK(properties_dialog_destroyed), pager); - g_signal_connect(pager->properties_dialog, "delete_event", G_CALLBACK(delete_event), pager); + g_signal_connect(pager->properties_dialog, "delete-event", G_CALLBACK(delete_event), pager); g_signal_connect(pager->properties_dialog, "response", G_CALLBACK(response_cb), pager); g_signal_connect(WID("done_button"), "clicked", (GCallback) close_dialog, pager); @@ -1043,9 +1233,13 @@ static void setup_dialog(GtkBuilder* builder, PagerData* pager) } #endif /* HAVE_X11 */ - g_signal_connect(G_OBJECT(pager->num_workspaces_spin), "value_changed", (GCallback) num_workspaces_value_changed, pager); + g_signal_connect (pager->num_workspaces_spin, "value-changed", + G_CALLBACK (on_num_workspaces_value_changed), + pager); - g_signal_connect(G_OBJECT(pager->workspaces_tree), "focus_out_event", (GCallback) workspaces_tree_focused_out, pager); + g_signal_connect (pager->workspaces_tree, "focus-out-event", + (GCallback) workspaces_tree_focused_out, + pager); pager->workspaces_store = gtk_list_store_new(1, G_TYPE_STRING, NULL); update_workspaces_model(pager); |