class_docstr: inotify(7)-based event emitter.
  
  :param event_queue:
      The event queue to fill with events.
  :param watch:
      A watch object representing the directory to monitor.
  :type watch:
      :class:`watchdog.observers.api.ObservedWatch`
  :param timeout:
      Read events blocking timeout (in seconds).
  :type timeout:
      ``float``
class_docstr_tok: ["inotify","(","7",")","-based","event","emitter",".",":","param","event_queue",":","The","event","queue","to","fill","with","events",".",":","param","watch",":","A","watch","object","representing","the","directory","to","monitor",".",":","type","watch",":",":","class",":","`","watchdog.observers.api.ObservedWatch","`",":","param","timeout",":","Read","events","blocking","timeout","(","in","seconds",")",".",":","type","timeout",":","``","float","``"]
code: def queue_events(self, timeout, full_events=False):
      # If "full_events" is true, then the method will report unmatched move events as seperate events
      # This behavior is by default only called by a InotifyFullEmitter
      with self._lock:
          event = self._inotify.read_event()
          if event is None:
              return
          if isinstance(event, tuple):
              move_from, move_to = event
              src_path = self._decode_path(move_from.src_path)
              dest_path = self._decode_path(move_to.src_path)
              cls = (
                  DirMovedEvent
                  if move_from.is_directory
                  else FileMovedEvent
              )
              self.queue_event(cls(src_path, dest_path))
              self.queue_event(
                  DirModifiedEvent(os.path.dirname(src_path))
              )
              self.queue_event(
                  DirModifiedEvent(os.path.dirname(dest_path))
              )
              if move_from.is_directory and self.watch.is_recursive:
                  for sub_event in generate_sub_moved_events(
                      src_path, dest_path
                  ):
                      self.queue_event(sub_event)
              return
  
          src_path = self._decode_path(event.src_path)
          if event.is_moved_to:
              if full_events:
                  cls = (
                      DirMovedEvent
                      if event.is_directory
                      else FileMovedEvent
                  )
                  self.queue_event(cls(None, src_path))
              else:
                  cls = (
                      DirCreatedEvent
                      if event.is_directory
                      else FileCreatedEvent
                  )
                  self.queue_event(cls(src_path))
              self.queue_event(
                  DirModifiedEvent(os.path.dirname(src_path))
              )
              if event.is_directory and self.watch.is_recursive:
                  for sub_event in generate_sub_created_events(
                      src_path
                  ):
                      self.queue_event(sub_event)
          elif event.is_attrib:
              cls = (
                  DirModifiedEvent
                  if event.is_directory
                  else FileModifiedEvent
              )
              self.queue_event(cls(src_path))
          elif event.is_modify:
              cls = (
                  DirModifiedEvent
                  if event.is_directory
                  else FileModifiedEvent
              )
              self.queue_event(cls(src_path))
          elif event.is_delete or (
              event.is_moved_from and not full_events
          ):
              cls = (
                  DirDeletedEvent
                  if event.is_directory
                  else FileDeletedEvent
              )
              self.queue_event(cls(src_path))
              self.queue_event(
                  DirModifiedEvent(os.path.dirname(src_path))
              )
          elif event.is_moved_from and full_events:
              cls = (
                  DirMovedEvent
                  if event.is_directory
                  else FileMovedEvent
              )
              self.queue_event(cls(src_path, None))
              self.queue_event(
                  DirModifiedEvent(os.path.dirname(src_path))
              )
          elif event.is_create:
              cls = (
                  DirCreatedEvent
                  if event.is_directory
                  else FileCreatedEvent
              )
              self.queue_event(cls(src_path))
              self.queue_event(
                  DirModifiedEvent(os.path.dirname(src_path))
              )
  
imports: from __future__ import with_statement
  import os
  import threading
  from .inotify_buffer import InotifyBuffer
  from wandb_watchdog.observers.api import EventEmitter, BaseObserver, DEFAULT_EMITTER_TIMEOUT, DEFAULT_OBSERVER_TIMEOUT
  from wandb_watchdog.events import DirDeletedEvent, DirModifiedEvent, DirMovedEvent, DirCreatedEvent, FileDeletedEvent, FileModifiedEvent, FileMovedEvent, FileCreatedEvent, generate_sub_moved_events, generate_sub_created_events
  from wandb_watchdog.utils import unicode_paths
label_desc: Use image node_id 4 for calling the InotifyEmitter obj's underlying member method code with example usage: obj.queue_events(timeout, full_events) without return types