/* * Called when the user releases the mouse button. Checks whether the * coordinates are over a button and executes the appropriate action. * */ static void handle_button_release(xcb_connection_t *conn, xcb_button_release_event_t *event) { printf("button released on x = %d, y = %d\n", event->event_x, event->event_y); /* If the user hits the close button, we exit(0) */ if (event->event_x >= (rect.width - logical_px(32))) exit(0); button_t *button = get_button_at(event->event_x, event->event_y); if (!button) return; /* We need to create a custom script containing our actual command * since not every terminal emulator which is contained in * i3-sensible-terminal supports -e with multiple arguments (and not * all of them support -e with one quoted argument either). * * NB: The paths need to be unique, that is, don’t assume users close * their nagbars at any point in time (and they still need to work). * */ char *script_path = get_process_filename("nagbar-cmd"); int fd = open(script_path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); if (fd == -1) { warn("Could not create temporary script to store the nagbar command"); return; } FILE *script = fdopen(fd, "w"); if (script == NULL) { warn("Could not fdopen() temporary script to store the nagbar command"); return; } fprintf(script, "#!/bin/sh\nrm %s\n%s", script_path, button->action); /* Also closes fd */ fclose(script); char *link_path; char *exe_path = get_exe_path(argv0); sasprintf(&link_path, "%s.nagbar_cmd", script_path); if (symlink(exe_path, link_path) == -1) { err(EXIT_FAILURE, "Failed to symlink %s to %s", link_path, exe_path); } char *terminal_cmd; sasprintf(&terminal_cmd, "i3-sensible-terminal -e %s", link_path); printf("argv0 = %s\n", argv0); printf("terminal_cmd = %s\n", terminal_cmd); start_application(terminal_cmd); free(link_path); free(terminal_cmd); free(script_path); free(exe_path); /* TODO: unset flag, re-render */ }
void Dialog::event(const SDL_Event& ev) { if (m_passive) // Passive dialogs don't accept events return; switch (ev.type) { case SDL_MOUSEBUTTONDOWN: if (ev.button.button == SDL_BUTTON_LEFT) { Vector mouse_pos = VideoSystem::current()->get_viewport().to_logical(ev.motion.x, ev.motion.y); int new_button = get_button_at(mouse_pos); if (new_button != -1) { m_selected_button = new_button; on_button_click(m_selected_button); } } break; case SDL_MOUSEMOTION: { Vector mouse_pos = VideoSystem::current()->get_viewport().to_logical(ev.motion.x, ev.motion.y); int new_button = get_button_at(mouse_pos); if (new_button != -1) { m_selected_button = new_button; if (MouseCursor::current()) MouseCursor::current()->set_state(MouseCursorState::LINK); } else { if (MouseCursor::current()) MouseCursor::current()->set_state(MouseCursorState::NORMAL); } } break; default: break; } }
void Dialog::event(const SDL_Event& ev) { switch(ev.type) { case SDL_MOUSEBUTTONDOWN: if(ev.button.button == SDL_BUTTON_LEFT) { Vector mouse_pos = VideoSystem::current()->get_renderer().to_logical(ev.motion.x, ev.motion.y); int new_button = get_button_at(mouse_pos); if (new_button != -1) { m_selected_button = new_button; on_button_click(m_selected_button); } } break; case SDL_MOUSEMOTION: { Vector mouse_pos = VideoSystem::current()->get_renderer().to_logical(ev.motion.x, ev.motion.y); int new_button = get_button_at(mouse_pos); if (new_button != -1) { m_selected_button = new_button; if(MouseCursor::current()) MouseCursor::current()->set_state(MC_LINK); } else { if(MouseCursor::current()) MouseCursor::current()->set_state(MC_NORMAL); } } break; default: break; } }
/* * Called when the user releases the mouse button. Checks whether the * coordinates are over a button and executes the appropriate action. * */ static void handle_button_release(xcb_connection_t *conn, xcb_button_release_event_t *event) { printf("button released on x = %d, y = %d\n", event->event_x, event->event_y); /* If the user hits the close button, we exit(0) */ if (event->event_x >= (rect.width - 32)) exit(0); button_t *button = get_button_at(event->event_x, event->event_y); if (!button) return; start_application(button->action); /* TODO: unset flag, re-render */ }