Class: Fusuma::Plugin::Remap::LayerManager

Inherits:
Object
  • Object
show all
Includes:
Singleton
Defined in:
lib/fusuma/plugin/remap/layer_manager.rb

Overview

Set layer sent from pipe

Constant Summary collapse

CONTEXT_PRIORITIES =

Priority order for context types (higher number = higher priority)

{
  device: 1,
  thumbsense: 2,
  application: 3
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeLayerManager

Returns a new instance of LayerManager.



21
22
23
24
25
26
27
# File 'lib/fusuma/plugin/remap/layer_manager.rb', line 21

def initialize
  @layers = {}
  @reader, @writer = IO.pipe
  @current_layer = {} # preserve order
  @last_layer = nil
  @last_remove = nil
end

Instance Attribute Details

#current_layerObject (readonly)

Returns the value of attribute current_layer.



19
20
21
# File 'lib/fusuma/plugin/remap/layer_manager.rb', line 19

def current_layer
  @current_layer
end

#layersObject (readonly)

Returns the value of attribute layers.



19
20
21
# File 'lib/fusuma/plugin/remap/layer_manager.rb', line 19

def layers
  @layers
end

#readerObject (readonly)

Returns the value of attribute reader.



19
20
21
# File 'lib/fusuma/plugin/remap/layer_manager.rb', line 19

def reader
  @reader
end

#writerObject (readonly)

Returns the value of attribute writer.



19
20
21
# File 'lib/fusuma/plugin/remap/layer_manager.rb', line 19

def writer
  @writer
end

Instance Method Details

#find_mapping(layer) ⇒ Hash

Find remap layer from config

Parameters:

  • layer (Hash)

Returns:

  • (Hash)

    remap layer



72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/fusuma/plugin/remap/layer_manager.rb', line 72

def find_mapping(layer)
  @layers[layer] ||= begin
    result = nil
    _ = Fusuma::Config::Searcher.find_context(layer) do
      result = Fusuma::Config.search(Fusuma::Config::Index.new(:remap))
      next unless result

      result = result.deep_transform_keys { |key| key.upcase.to_sym }
    end

    result || {}
  end
end

#find_merged_mapping(layer) ⇒ Hash

Find merged mapping from all applicable layers Merges mappings from default, individual contexts, and complete match Higher priority contexts override lower priority ones

Parameters:

  • layer (Hash)

    current active layer (e.g., { thumbsense: true, application: “Google-chrome” })

Returns:

  • (Hash)

    merged remap mapping



91
92
93
94
# File 'lib/fusuma/plugin/remap/layer_manager.rb', line 91

def find_merged_mapping(layer)
  @merged_layers ||= {}
  @merged_layers[layer] ||= merge_all_applicable_mappings(layer)
end

#receive_layerHash

Read layer from pipe and update @current_layer

Examples:

receive_layer
# => { thumbsense: true }
receive_layer
# => { thumbsense: true, application: "Google-chrome" }

Returns:

  • (Hash)

    current layer



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/fusuma/plugin/remap/layer_manager.rb', line 46

def receive_layer
  @layer_unpacker ||= MessagePack::Unpacker.new(@reader)

  data = @layer_unpacker.unpack

  return unless data.is_a? Hash

  data = data.deep_symbolize_keys
  layer = data[:layer] # e.g { thumbsense: true }
  remove = data[:remove] # e.g true

  # update @current_layer
  if remove
    MultiLogger.debug "Remove layer: #{layer}"
    @current_layer.delete_if { |k, _v| layer.key?(k) }
  else
    MultiLogger.debug "Add layer: #{layer}"
    # If duplicate keys exist, order of keys is preserved
    @current_layer.merge!(layer)
  end
  @current_layer
end

#send_layer(layer:, remove: false) ⇒ Object

Parameters:

  • layer (Hash)
  • remove (Boolean) (defaults to: false)


31
32
33
34
35
36
37
# File 'lib/fusuma/plugin/remap/layer_manager.rb', line 31

def send_layer(layer:, remove: false)
  return if (@last_layer == layer) && (@last_remove == remove)

  @last_layer = layer
  @last_remove = remove
  @writer.write({layer: layer, remove: remove}.to_msgpack)
end