-
-
Notifications
You must be signed in to change notification settings - Fork 76
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'master' into tintou/pantheon-desktop-shell
- Loading branch information
Showing
273 changed files
with
15,630 additions
and
13,786 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
/* | ||
* Copyright 2024 elementary, Inc. (https://elementary.io) | ||
* SPDX-License-Identifier: GPL-3.0-or-later | ||
*/ | ||
|
||
public class Gala.Daemon.BackgroundMenu : Gtk.Menu { | ||
public const string ACTION_GROUP_PREFIX = "background-menu"; | ||
public const string ACTION_PREFIX = ACTION_GROUP_PREFIX + "."; | ||
|
||
construct { | ||
var change_wallpaper = new Gtk.MenuItem.with_label (_("Change Wallpaper…")) { | ||
action_name = ACTION_PREFIX + "launch-uri", | ||
action_target = new Variant.string ("settings://desktop/appearance/wallpaper") | ||
}; | ||
|
||
var display_settings = new Gtk.MenuItem.with_label (_("Display Settings…")) { | ||
action_name = ACTION_PREFIX + "launch-uri", | ||
action_target = new Variant.string ("settings://display") | ||
}; | ||
|
||
|
||
var system_settings = new Gtk.MenuItem.with_label (_("System Settings…")) { | ||
action_name = ACTION_PREFIX + "launch-uri", | ||
action_target = new Variant.string ("settings://") | ||
}; | ||
|
||
append (change_wallpaper); | ||
append (display_settings); | ||
append (new Gtk.SeparatorMenuItem ()); | ||
append (system_settings); | ||
show_all (); | ||
|
||
var launch_action = new SimpleAction ("launch-uri", VariantType.STRING); | ||
launch_action.activate.connect (action_launch); | ||
|
||
var action_group = new SimpleActionGroup (); | ||
action_group.add_action (launch_action); | ||
|
||
insert_action_group (ACTION_GROUP_PREFIX, action_group); | ||
} | ||
|
||
private void action_launch (SimpleAction action, Variant? variant) { | ||
try { | ||
AppInfo.launch_default_for_uri (variant.get_string (), null); | ||
} catch (Error e) { | ||
var message_dialog = new Granite.MessageDialog.with_image_from_icon_name ( | ||
_("Failed to open System Settings"), | ||
_("A handler for the “settings://” URI scheme must be installed."), | ||
"dialog-error", | ||
Gtk.ButtonsType.CLOSE | ||
); | ||
message_dialog.show_error_details (e.message); | ||
message_dialog.present (); | ||
message_dialog.response.connect (message_dialog.destroy); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,133 @@ | ||
/* | ||
* Copyright 2024 elementary, Inc. (https://elementary.io) | ||
* SPDX-License-Identifier: GPL-3.0-or-later | ||
*/ | ||
|
||
[DBus (name = "org.pantheon.gala")] | ||
public interface Gala.WMDBus : GLib.Object { | ||
public abstract void perform_action (Gala.ActionType type) throws DBusError, IOError; | ||
} | ||
|
||
public struct Gala.Daemon.MonitorLabelInfo { | ||
public int monitor; | ||
public string label; | ||
public string background_color; | ||
public string text_color; | ||
public int x; | ||
public int y; | ||
} | ||
|
||
[DBus (name = "org.pantheon.gala.daemon")] | ||
public class Gala.Daemon.DBus : GLib.Object { | ||
private const string DBUS_NAME = "org.pantheon.gala"; | ||
private const string DBUS_OBJECT_PATH = "/org/pantheon/gala"; | ||
|
||
private const string DAEMON_DBUS_NAME = "org.pantheon.gala.daemon"; | ||
private const string DAEMON_DBUS_OBJECT_PATH = "/org/pantheon/gala/daemon"; | ||
|
||
private WMDBus? wm_proxy = null; | ||
|
||
private WindowMenu? window_menu; | ||
private BackgroundMenu? background_menu; | ||
|
||
private List<MonitorLabel> monitor_labels = new List<MonitorLabel> (); | ||
|
||
construct { | ||
Bus.watch_name (BusType.SESSION, DBUS_NAME, BusNameWatcherFlags.NONE, gala_appeared, lost_gala); | ||
} | ||
|
||
private void on_gala_get (GLib.Object? obj, GLib.AsyncResult? res) { | ||
try { | ||
wm_proxy = Bus.get_proxy.end (res); | ||
} catch (Error e) { | ||
warning ("Failed to get Gala proxy: %s", e.message); | ||
} | ||
} | ||
|
||
private void lost_gala () { | ||
wm_proxy = null; | ||
} | ||
|
||
private void gala_appeared () { | ||
if (wm_proxy == null) { | ||
Bus.get_proxy.begin<WMDBus> (BusType.SESSION, DBUS_NAME, DBUS_OBJECT_PATH, 0, null, on_gala_get); | ||
} | ||
} | ||
|
||
private void perform_action (Gala.ActionType type) { | ||
if (wm_proxy != null) { | ||
try { | ||
wm_proxy.perform_action (type); | ||
} catch (Error e) { | ||
warning ("Failed to perform Gala action over DBus: %s", e.message); | ||
} | ||
} | ||
} | ||
|
||
public void show_window_menu (Gala.WindowFlags flags, int display_width, int display_height, int x, int y) throws DBusError, IOError { | ||
if (window_menu == null) { | ||
window_menu = new WindowMenu (); | ||
window_menu.perform_action.connect (perform_action); | ||
} | ||
|
||
window_menu.update (flags); | ||
|
||
show_menu (window_menu, display_width, display_height, x, y, true); | ||
} | ||
|
||
public void show_desktop_menu (int display_width, int display_height, int x, int y) throws DBusError, IOError { | ||
if (background_menu == null) { | ||
background_menu = new BackgroundMenu (); | ||
} | ||
|
||
show_menu (background_menu, display_width, display_height, x, y, false); | ||
} | ||
|
||
private void show_menu (Gtk.Menu menu, int display_width, int display_height, int x, int y, bool ignore_first_release) { | ||
var window = new Window (display_width, display_height); | ||
window.present (); | ||
|
||
menu.attach_to_widget (window.content, null); | ||
|
||
Gdk.Rectangle rect = { | ||
x, | ||
y, | ||
0, | ||
0 | ||
}; | ||
|
||
menu.show_all (); | ||
menu.popup_at_rect (window.get_window (), rect, NORTH, NORTH_WEST); | ||
|
||
menu.deactivate.connect (window.close); | ||
|
||
if (ignore_first_release) { | ||
bool first = true; | ||
menu.button_release_event.connect (() => { | ||
if (first) { | ||
first = false; | ||
return Gdk.EVENT_STOP; | ||
} | ||
|
||
return Gdk.EVENT_PROPAGATE; | ||
}); | ||
} | ||
} | ||
|
||
public void show_monitor_labels (MonitorLabelInfo[] label_infos) throws GLib.DBusError, GLib.IOError { | ||
hide_monitor_labels (); | ||
|
||
monitor_labels = new List<MonitorLabel> (); | ||
foreach (var info in label_infos) { | ||
var label = new MonitorLabel (info); | ||
monitor_labels.append (label); | ||
label.present (); | ||
} | ||
} | ||
|
||
public void hide_monitor_labels () throws GLib.DBusError, GLib.IOError { | ||
foreach (var monitor_label in monitor_labels) { | ||
monitor_label.close (); | ||
} | ||
} | ||
} |
Oops, something went wrong.