Add `OpenWorkspaceFolder` event

finchie
Dec 22, 2025, 6:39 AM
NB2MF3MYAJ25KNZP3GMHX42LUSBYOX6FTNLIBK3CQ7CMANFZFEGQC

Dependencies

  • [2] WFWTKCJN Create initial Visual Studio Code extension
  • [3] T4NQUSRP Emit events on file decoration change
  • [4] 3YGYMEXV Create `event_loop` module
  • [5] TDTLSDFG Create macro for defining `ThreadsafeFunction`s

Change contents

  • edit in extensions/vscode/src/vscode_sys/threadsafe_function.rs at line 2
    [5.88]
    threadsafe_function! {
    "scm": scm {
    "createSourceControl":
    create_source_control(
    String,
    String,
    Option<crate::vscode_sys::reference::UriRef>
    ) -> crate::vscode_sys::reference::SourceControlRef;
    }
    }
  • edit in extensions/vscode/src/vscode_sys/reference.rs at line 6
    [3.112]
    [3.112]
    Uri,
  • edit in extensions/vscode/src/vscode_sys/reference.rs at line 14
    [2.58378]
    object_reference!(UriRef: Uri);
  • edit in extensions/vscode/src/lib.rs at line 250
    [2.117319]
    [2.117319]
    let added_workspace_uri = added_workspace.get_uri()?;
    let added_uri = added_workspace_uri.to_string()?;
    event_loop::send(Event::OpenWorkspaceFolder { uri: added_uri });
  • replacement in extensions/vscode/src/lib.rs at line 393
    [2.118517][4.89:114]()
    event_loop::start();
    [2.118517]
    [4.114]
    event_loop::start(env)?;
  • edit in extensions/vscode/src/lib.rs at line 399
    [2.118719]
    [2.118719]
    let workspace_uri = workspace_folder.get_uri()?;
    let uri = workspace_uri.to_string()?;
    event_loop::send(Event::OpenWorkspaceFolder { uri });
  • file addition: threadsafe_function.rs (----------)
    [4.138]
    use napi::bindgen_prelude::FnArgs;
    use crate::vscode_sys;
    pub struct ThreadsafeFunctions {
    create_source_control: vscode_sys::threadsafe_function::scm::create_source_control::Prototype,
    }
    impl ThreadsafeFunctions {
    pub fn get(env: &napi::Env) -> Result<Self, napi::Error> {
    Ok(Self {
    create_source_control:
    vscode_sys::threadsafe_function::scm::create_source_control::get(env)?,
    })
    }
    pub async fn create_source_control(
    &self,
    id: String,
    name: String,
    uri: &str,
    ) -> Result<vscode_sys::reference::SourceControlRef, napi::Error> {
    let arguments = FnArgs::from((id, name, None));
    self.create_source_control.call_async(arguments).await
    }
    }
  • replacement in extensions/vscode/src/event_loop/mod.rs at line 5
    [5.1733][5.1733:1759]()
    mod threadsafe_functions;
    [5.1733]
    [4.259]
    mod threadsafe_function;
  • replacement in extensions/vscode/src/event_loop/mod.rs at line 12
    [4.388][4.388:406]()
    pub enum Event {}
    [4.388]
    [4.406]
    pub enum Event {
    OpenWorkspaceFolder { uri: String },
    }
  • replacement in extensions/vscode/src/event_loop/mod.rs at line 18
    [4.455][4.455:517]()
    async fn event_loop(mut receiver: UnboundedReceiver<Event>) {
    [4.455]
    [4.517]
    async fn event_loop(
    threadsafe_functions: threadsafe_function::ThreadsafeFunctions,
    mut receiver: UnboundedReceiver<Event>,
    ) {
  • edit in extensions/vscode/src/event_loop/mod.rs at line 34
    [4.934]
    [4.934]
    for event in &event_buffer {
    match event {
    Event::OpenWorkspaceFolder { uri } => {
    // TODO: handle multiple repositories per workspace
    // TODO: properly handle URIs
    let source_control_ref = match threadsafe_functions
    .create_source_control(String::from("pijul"), String::from("Pijul"), uri)
    .await
    {
    Ok(source_control_ref) => source_control_ref,
    Err(error) => {
    tracing::error!(message = "Unable to create source control", ?error);
    continue;
    }
    };
    }
    }
    }
  • replacement in extensions/vscode/src/event_loop/mod.rs at line 60
    [4.1015][4.1015:1055]()
    #[tracing::instrument]
    pub fn start() {
    [4.1015]
    [4.1055]
    #[tracing::instrument(skip_all)]
    pub fn start(env: &napi::Env) -> Result<(), napi::Error> {
    let threadsafe_functions = threadsafe_function::ThreadsafeFunctions::get(env)?;
  • replacement in extensions/vscode/src/event_loop/mod.rs at line 66
    [4.1185][4.1185:1255]()
    tracing::error!("Event sender has already been initialized");
    [4.1185]
    [4.1255]
    return Err(napi::Error::from_reason(
    "Event sender has already been initialized",
    ));
  • replacement in extensions/vscode/src/event_loop/mod.rs at line 71
    [4.1262][4.1262:1311]()
    std::thread::spawn(|| event_loop(receiver));
    [4.1262]
    [4.1311]
    std::thread::spawn(|| event_loop(threadsafe_functions, receiver));
    Ok(())