Advertisement
Guest User

Untitled

a guest
Apr 18th, 2016
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Vala 13.35 KB | None | 0 0
  1. namespace Jade {
  2.  
  3.     public static const string MUTTER_BUTTON_LAYOUT = "button-layout";
  4.     public static const string WM_SCHEMA            = "org.jade.wm";
  5.  
  6.     public static const bool CLUTTER_EVENT_PROPAGATE = false;
  7.     public static const bool CLUTTER_EVENT_STOP      = true;
  8.  
  9.     public class JadeWM : Meta.Plugin
  10.     {
  11.         public Clutter.Actor ui_group { get; protected set; }
  12.         public Clutter.Stage stage { get; protected set; }
  13.         public Clutter.Actor window_group { get; protected set; }
  14.         public Clutter.Actor top_window_group { get; protected set; }
  15.         public Meta.BackgroundGroup background_group { get; protected set; }
  16.         static Meta.PluginInfo info;
  17.  
  18.         public static string[]? old_args;
  19.  
  20.         Gee.HashSet<Meta.WindowActor> minimizing = new Gee.HashSet<Meta.WindowActor> ();
  21.         Gee.HashSet<Meta.WindowActor> mapping = new Gee.HashSet<Meta.WindowActor>();
  22.         Gee.HashSet<Meta.WindowActor> destroying = new Gee.HashSet<Meta.WindowActor> ();
  23.  
  24.         static construct
  25.         {
  26.             info = Meta.PluginInfo() {
  27.                 name = "Jade WM",
  28.                 version = "0.1",
  29.                 author = "Joseph Mccullar",
  30.                 license = "GPL-2.0",
  31.                 description = "Jade Window Manager"
  32.             };
  33.         }
  34.  
  35.         public override void start()
  36.         {
  37.             var screen = this.get_screen();
  38.             var display = screen.get_display();
  39.  
  40.             Meta.Prefs.override_preference_schema(MUTTER_BUTTON_LAYOUT, WM_SCHEMA);
  41.  
  42.             var stage = Meta.Compositor.get_stage_for_screen(screen) as Clutter.Stage;
  43.             stage.background_color = Clutter.Color.from_string("rgb(0,0,0)");
  44.  
  45.             ui_group = new Clutter.Actor();
  46.             ui_group.reactive = true;
  47.             stage.add_child(ui_group);
  48.  
  49.             window_group = Meta.Compositor.get_window_group_for_screen(screen);
  50.             stage.remove_child(window_group);
  51.             ui_group.add_child(window_group);
  52.  
  53.             background_group = new Meta.BackgroundGroup();
  54.             window_group.add_child (background_group);
  55.             window_group.set_child_below_sibling (background_group, null);
  56.  
  57.             screen.monitors_changed.connect(on_monitors_changed);
  58.             on_monitors_changed(screen);
  59.  
  60.             top_window_group = Meta.Compositor.get_top_window_group_for_screen(screen);
  61.             stage.remove_child(top_window_group);
  62.             ui_group.add_child(top_window_group);
  63.  
  64.             stage.show();
  65.         }
  66.  
  67.         void on_monitors_changed(Meta.Screen? screen)
  68.         {
  69.             background_group.destroy_all_children();
  70.  
  71.             for (int i = 0; i < screen.get_n_monitors(); i++) {
  72.                 var actor = new JadeBackground(screen, i);
  73.                 background_group.add_child(actor);
  74.             }
  75.         }
  76.  
  77.         public override void minimize (Meta.WindowActor actor)
  78.         {
  79.             var duration = 200;
  80.  
  81.             kill_window_effects (actor);
  82.             minimizing.add (actor);
  83.  
  84.             int width, height;
  85.             get_screen ().get_size (out width, out height);
  86.  
  87.             Meta.Rectangle icon = {};
  88.             if (actor.get_meta_window ().get_icon_geometry (out icon)) {
  89.  
  90.                 float scale_x  = (float)icon.width  / actor.width;
  91.                 float scale_y  = (float)icon.height / actor.height;
  92.                 float anchor_x = (float)(actor.x - icon.x) * actor.width  / (icon.width  - actor.width);
  93.                 float anchor_y = (float)(actor.y - icon.y) * actor.height / (icon.height - actor.height);
  94.                 actor.set_pivot_point (anchor_x, anchor_y);
  95.  
  96.                 actor.save_easing_state ();
  97.                 actor.set_easing_mode (Clutter.AnimationMode.EASE_IN_EXPO);
  98.                 actor.set_easing_duration (duration);
  99.                 actor.set_scale (scale_x, scale_y);
  100.                 actor.opacity = 0U;
  101.                 actor.restore_easing_state ();
  102.  
  103.                 ulong minimize_handler_id = 0UL;
  104.                 minimize_handler_id = actor.transitions_completed.connect (() => {
  105.                     actor.disconnect (minimize_handler_id);
  106.                     actor.set_pivot_point (0.0f, 0.0f);
  107.                     actor.set_scale (1.0f, 1.0f);
  108.                     actor.opacity = 255U;
  109.                     minimize_completed (actor);
  110.                     minimizing.remove (actor);
  111.                 });
  112.  
  113.             } else {
  114.                 actor.set_pivot_point (width / 2.0f - actor.x, height - actor.y);
  115.  
  116.                 actor.save_easing_state ();
  117.                 actor.set_easing_mode (Clutter.AnimationMode.EASE_IN_EXPO);
  118.                 actor.set_easing_duration (duration);
  119.                 actor.set_scale (0.0f, 0.0f);
  120.                 actor.opacity = 0U;
  121.                 actor.restore_easing_state ();
  122.  
  123.                 ulong minimize_handler_id = 0UL;
  124.                 minimize_handler_id = actor.transitions_completed.connect (() => {
  125.                     actor.disconnect (minimize_handler_id);
  126.                     actor.set_pivot_point (0.0f, 0.0f);
  127.                     actor.set_scale (1.0f, 1.0f);
  128.                     actor.opacity = 255U;
  129.                     minimize_completed (actor);
  130.                     minimizing.remove (actor);
  131.                 });
  132.             }
  133.         }
  134.  
  135.         public override void map(Meta.WindowActor actor)
  136.         {
  137.             var window = actor.get_meta_window();
  138.  
  139.             actor.remove_all_transitions();
  140.             actor.show();
  141.  
  142.             switch (window.window_type) {
  143.                 case Meta.WindowType.NORMAL:
  144.                     var duration = 350;
  145.                     if (duration == 0) {
  146.                         map_completed (actor);
  147.                         return;
  148.                     }
  149.  
  150.                     mapping.add (actor);
  151.  
  152.                     actor.set_pivot_point (0.5f, 1.0f);
  153.                     actor.set_scale (0.01f, 0.1f);
  154.                     actor.opacity = 0;
  155.  
  156.                     actor.save_easing_state ();
  157.                     actor.set_easing_mode (Clutter.AnimationMode.EASE_OUT_EXPO);
  158.                     actor.set_easing_duration (duration);
  159.                     actor.set_scale (1.0f, 1.0f);
  160.                     actor.opacity = 255U;
  161.                     actor.restore_easing_state ();
  162.  
  163.                     ulong map_handler_id = 0UL;
  164.                     map_handler_id = actor.transitions_completed.connect (() => {
  165.                         actor.disconnect (map_handler_id);
  166.                         mapping.remove (actor);
  167.                         map_completed (actor);
  168.                     });
  169.                     break;
  170.                 case Meta.WindowType.MENU:
  171.                 case Meta.WindowType.DROPDOWN_MENU:
  172.                 case Meta.WindowType.POPUP_MENU:
  173.                     var duration = 150;
  174.                     if (duration == 0) {
  175.                         map_completed (actor);
  176.                         return;
  177.                     }
  178.  
  179.                     mapping.add (actor);
  180.  
  181.                     actor.set_pivot_point (0.5f, 0.5f);
  182.                     actor.set_pivot_point_z (0.2f);
  183.                     actor.set_scale (0.9f, 0.9f);
  184.                     actor.opacity = 0;
  185.  
  186.                     actor.save_easing_state ();
  187.                     actor.set_easing_mode (Clutter.AnimationMode.EASE_OUT_QUAD);
  188.                     actor.set_easing_duration (duration);
  189.                     actor.set_scale (1.0f, 1.0f);
  190.                     actor.opacity = 255U;
  191.                     actor.restore_easing_state ();
  192.  
  193.                     ulong map_handler_id = 0UL;
  194.                     map_handler_id = actor.transitions_completed.connect (() => {
  195.                         actor.disconnect (map_handler_id);
  196.                         mapping.remove (actor);
  197.                         map_completed (actor);
  198.                     });
  199.                     break;
  200.                 case Meta.WindowType.MODAL_DIALOG:
  201.                 case Meta.WindowType.DIALOG:
  202.  
  203.                     mapping.add (actor);
  204.  
  205.                     actor.set_pivot_point (0.5f, 0.0f);
  206.                     actor.set_scale (1.0f, 0.0f);
  207.                     actor.opacity = 0;
  208.  
  209.                     actor.save_easing_state ();
  210.                     actor.set_easing_mode (Clutter.AnimationMode.EASE_OUT_QUAD);
  211.                     actor.set_easing_duration (250);
  212.                     actor.set_scale (1.0f, 1.0f);
  213.                     actor.opacity = 255U;
  214.                     actor.restore_easing_state ();
  215.  
  216.                     ulong map_handler_id = 0UL;
  217.                     map_handler_id = actor.transitions_completed.connect (() => {
  218.                         actor.disconnect (map_handler_id);
  219.                         mapping.remove (actor);
  220.                         map_completed (actor);
  221.                     });
  222.                     break;
  223.                 default:
  224.                     map_completed (actor);
  225.                     break;
  226.             }
  227.         }
  228.  
  229.         public override void destroy (Meta.WindowActor actor)
  230.         {
  231.             var window = actor.get_meta_window ();
  232.             actor.remove_all_transitions ();
  233.  
  234.             switch (window.window_type) {
  235.                 case Meta.WindowType.NORMAL:
  236.                     var duration = 300;
  237.                     if (duration == 0) {
  238.                         destroy_completed (actor);
  239.                         return;
  240.                     }
  241.  
  242.                     destroying.add (actor);
  243.  
  244.                     actor.set_pivot_point (0.5f, 0.5f);
  245.                     actor.show ();
  246.  
  247.                     actor.save_easing_state ();
  248.                     actor.set_easing_mode (Clutter.AnimationMode.LINEAR);
  249.                     actor.set_easing_duration (duration);
  250.                     actor.set_scale (0.8f, 0.8f);
  251.                     actor.opacity = 0U;
  252.                     actor.restore_easing_state ();
  253.  
  254.                     ulong destroy_handler_id = 0UL;
  255.                     destroy_handler_id = actor.transitions_completed.connect (() => {
  256.                         actor.disconnect (destroy_handler_id);
  257.                         destroying.remove (actor);
  258.                         destroy_completed (actor);
  259.                         // Utils.request_clean_icon_cache (get_all_xids ());
  260.                     });
  261.                     break;
  262.                 case Meta.WindowType.MODAL_DIALOG:
  263.                 case Meta.WindowType.DIALOG:
  264.                     destroying.add (actor);
  265.  
  266.                     actor.set_pivot_point (0.5f, 0.0f);
  267.                     actor.save_easing_state ();
  268.                     actor.set_easing_mode (Clutter.AnimationMode.EASE_OUT_QUAD);
  269.                     actor.set_easing_duration (200);
  270.                     actor.set_scale (1.0f, 0.0f);
  271.                     actor.opacity = 0U;
  272.                     actor.restore_easing_state ();
  273.  
  274.                     ulong destroy_handler_id = 0UL;
  275.                     destroy_handler_id = actor.transitions_completed.connect (() => {
  276.                         actor.disconnect (destroy_handler_id);
  277.                         destroying.remove (actor);
  278.                         destroy_completed (actor);
  279.                     });
  280.  
  281.                     // dim_window (window.find_root_ancestor (), false);
  282.  
  283.                     break;
  284.                 case Meta.WindowType.MENU:
  285.                 case Meta.WindowType.DROPDOWN_MENU:
  286.                 case Meta.WindowType.POPUP_MENU:
  287.                     var duration = 150;
  288.                     if (duration == 0) {
  289.                         destroy_completed (actor);
  290.                         return;
  291.                     }
  292.  
  293.                     destroying.add (actor);
  294.                     actor.save_easing_state ();
  295.                     actor.set_easing_mode (Clutter.AnimationMode.EASE_OUT_QUAD);
  296.                     actor.set_easing_duration (duration);
  297.                     actor.set_scale (0.8f, 0.8f);
  298.                     actor.opacity = 0U;
  299.                     actor.restore_easing_state ();
  300.  
  301.                     ulong destroy_handler_id = 0UL;
  302.                     destroy_handler_id = actor.transitions_completed.connect (() => {
  303.                         actor.disconnect (destroy_handler_id);
  304.                         destroying.remove (actor);
  305.                         destroy_completed (actor);
  306.                     });
  307.                     break;
  308.                 default:
  309.                     destroy_completed (actor);
  310.                     break;
  311.             }
  312.         }
  313.  
  314.         bool end_animation (ref Gee.HashSet<Meta.WindowActor> list, Meta.WindowActor actor)
  315.         {
  316.             if (!list.contains (actor))
  317.                 return false;
  318.  
  319.             if (actor.is_destroyed ()) {
  320.                 list.remove (actor);
  321.                 return false;
  322.             }
  323.  
  324.             actor.remove_all_transitions ();
  325.             actor.opacity = 255U;
  326.             actor.set_scale (1.0f, 1.0f);
  327.             actor.rotation_angle_x = 0.0f;
  328.             actor.set_pivot_point (0.0f, 0.0f);
  329.  
  330.             list.remove (actor);
  331.             return true;
  332.         }
  333.  
  334.         public override void kill_window_effects (Meta.WindowActor actor)
  335.         {
  336.             if (end_animation (ref mapping, actor))
  337.                 map_completed (actor);
  338.             if (end_animation (ref minimizing, actor))
  339.                 minimize_completed (actor);
  340.             if (end_animation (ref destroying, actor))
  341.                 destroy_completed (actor);
  342.         }
  343.     }
  344. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement