Compare commits
	
		
			No commits in common. "a20e4c74d85b4fde4e7b75b46551383761659bbb" and "92c1bf783f699067b507e56a15977292a319c492" have entirely different histories.
		
	
	
		
			a20e4c74d8
			...
			92c1bf783f
		
	
		
							
								
								
									
										2
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								NEWS
									
									
									
									
									
								
							| @ -2,8 +2,6 @@ Unreleased | ||||
| 
 | ||||
|  * Added an optional X11 user interface | ||||
| 
 | ||||
|  * Implemented mouse drags on the elapsed time gauge and the scrollbar | ||||
| 
 | ||||
|  * Added a "z" binding to center the view on the selected item | ||||
| 
 | ||||
|  * Fixed possibility of connection timeouts with PulseAudio integration | ||||
|  | ||||
							
								
								
									
										88
									
								
								nncmpp.c
									
									
									
									
									
								
							
							
						
						
									
										88
									
								
								nncmpp.c
									
									
									
									
									
								
							| @ -1144,7 +1144,7 @@ pulse_volume_status (struct pulse *self, struct str *s) | ||||
| enum | ||||
| { | ||||
| 	WIDGET_NONE = 0, WIDGET_BUTTON, WIDGET_GAUGE, WIDGET_TAB, WIDGET_SPECTRUM, | ||||
| 	WIDGET_LIST, WIDGET_SCROLLBAR, WIDGET_MESSAGE, | ||||
| 	WIDGET_LIST, WIDGET_SCROLLBAR, | ||||
| }; | ||||
| 
 | ||||
| struct widget; | ||||
| @ -1335,7 +1335,6 @@ static struct app_context | ||||
| 	int ui_hunit;                       ///< Horizontal unit
 | ||||
| 	int ui_vunit;                       ///< Vertical unit
 | ||||
| 	bool ui_focused;                    ///< Whether the window has focus
 | ||||
| 	short ui_dragging;                  ///< ID of any dragged widget
 | ||||
| 
 | ||||
| #ifdef WITH_FFTW | ||||
| 	struct spectrum spectrum;           ///< Spectrum analyser
 | ||||
| @ -2188,19 +2187,12 @@ app_layout_mpd_status (void) | ||||
| static void | ||||
| app_layout_statusbar (void) | ||||
| { | ||||
| 	struct layout l = {}; | ||||
| 
 | ||||
| 	if (g.message) | ||||
| 	{ | ||||
| 		app_push (&l, g.ui->padding (APP_ATTR (NORMAL), 0.25, 1)) | ||||
| 			->id = WIDGET_MESSAGE; | ||||
| 		app_push_fill (&l, g.ui->label (APP_ATTR (HIGHLIGHT), g.message)) | ||||
| 			->id = WIDGET_MESSAGE; | ||||
| 		app_push (&l, g.ui->padding (APP_ATTR (NORMAL), 0.25, 1)) | ||||
| 			->id = WIDGET_MESSAGE; | ||||
| 		app_flush_layout (&l); | ||||
| 	} | ||||
| 		app_layout_text (g.message, APP_ATTR (HIGHLIGHT)); | ||||
| 	else if (g.editor.line) | ||||
| 	{ | ||||
| 		struct layout l = {}; | ||||
| 		app_push (&l, g.ui->padding (APP_ATTR (NORMAL), 0.25, 1)); | ||||
| 		app_push (&l, g.ui->editor (APP_ATTR (HIGHLIGHT))); | ||||
| 		app_push (&l, g.ui->padding (APP_ATTR (NORMAL), 0.25, 1)); | ||||
| @ -2544,7 +2536,6 @@ app_process_action (enum action action) | ||||
| 		app_invalidate (); | ||||
| 		return true; | ||||
| 	default: | ||||
| 		print_error ("can't do that here: %s", g_action_descriptions[action]); | ||||
| 		return false; | ||||
| 
 | ||||
| 	case ACTION_MULTISELECT: | ||||
| @ -2675,7 +2666,6 @@ app_editor_process_action (enum action action) | ||||
| 		g.editor.on_end = NULL; | ||||
| 		return true; | ||||
| 	default: | ||||
| 		print_error ("can't do that here: %s", g_action_descriptions[action]); | ||||
| 		return false; | ||||
| 
 | ||||
| 	case ACTION_EDITOR_B_CHAR: | ||||
| @ -2716,7 +2706,6 @@ app_process_left_mouse_click (struct widget *w, int x, int y, bool double_click) | ||||
| 		break; | ||||
| 	case WIDGET_GAUGE: | ||||
| 	{ | ||||
| 		// TODO: We should avoid queuing up too many.
 | ||||
| 		float position = (float) x / w->width; | ||||
| 		if (g.song_duration >= 1) | ||||
| 		{ | ||||
| @ -2761,12 +2750,7 @@ app_process_left_mouse_click (struct widget *w, int x, int y, bool double_click) | ||||
| 		tab->item_top = (float) y / w->height | ||||
| 			* (int) tab->item_count - visible_items / 2; | ||||
| 		app_invalidate (); | ||||
| 		break; | ||||
| 	} | ||||
| 	case WIDGET_MESSAGE: | ||||
| 		cstr_set (&g.message, NULL); | ||||
| 		poller_timer_reset (&g.message_timer); | ||||
| 		app_invalidate (); | ||||
| 	} | ||||
| 	return true; | ||||
| } | ||||
| @ -2778,27 +2762,8 @@ app_process_mouse (termo_mouse_event_t type, int x, int y, int button, | ||||
| 	// XXX: Terminals don't let us know which button has been released,
 | ||||
| 	//   so we can't press buttons at that point.  We'd need a special "click"
 | ||||
| 	//   event handler that could be handled better under X11.
 | ||||
| 	if (type == TERMO_MOUSE_RELEASE) | ||||
| 	{ | ||||
| 		g.ui_dragging = WIDGET_NONE; | ||||
| 	if (type != TERMO_MOUSE_PRESS) | ||||
| 		return true; | ||||
| 	} | ||||
| 
 | ||||
| 	if (type == TERMO_MOUSE_DRAG) | ||||
| 	{ | ||||
| 		if (g.ui_dragging != WIDGET_GAUGE | ||||
| 		 && g.ui_dragging != WIDGET_SCROLLBAR) | ||||
| 			return true; | ||||
| 
 | ||||
| 		struct widget *target = NULL; | ||||
| 		LIST_FOR_EACH (struct widget, w, g.widgets.head) | ||||
| 			if (w->id == g.ui_dragging) | ||||
| 				target = w; | ||||
| 
 | ||||
| 		x -= target->x; | ||||
| 		y -= target->y; | ||||
| 		return app_process_left_mouse_click (target, x, y, double_click); | ||||
| 	} | ||||
| 
 | ||||
| 	if (g.editor.line) | ||||
| 	{ | ||||
| @ -2819,7 +2784,6 @@ app_process_mouse (termo_mouse_event_t type, int x, int y, int button, | ||||
| 	switch (button) | ||||
| 	{ | ||||
| 	case 1: | ||||
| 		g.ui_dragging = target->id; | ||||
| 		return app_process_left_mouse_click (target, x, y, double_click); | ||||
| 	case 4: | ||||
| 		if (target->id == WIDGET_LIST) | ||||
| @ -5280,8 +5244,6 @@ tui_init (void) | ||||
| 	if (!termo_start (g.tk) || !initscr () || nonl () == ERR) | ||||
| 		exit_fatal ("failed to set up the terminal"); | ||||
| 
 | ||||
| 	termo_set_mouse_tracking_mode (g.tk, TERMO_MOUSE_TRACKING_DRAG); | ||||
| 
 | ||||
| 	g.ui = &tui_ui; | ||||
| 	g.ui_width = COLS; | ||||
| 	g.ui_height = LINES; | ||||
| @ -5979,13 +5941,6 @@ on_x11_input_event (XEvent *ev) | ||||
| 		on_x11_keypress (ev); | ||||
| 		return; | ||||
| 	} | ||||
| 	if (ev->type == MotionNotify) | ||||
| 	{ | ||||
| 		// We only select for Button1MotionMask, so this works out.
 | ||||
| 		int x = ev->xmotion.x, y = ev->xmotion.y; | ||||
| 		app_process_mouse (TERMO_MOUSE_DRAG, x, y, 1, false); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	// See tui_on_tty_event().  Just here we know the button on button release.
 | ||||
| 	int x = ev->xbutton.x, y = ev->xbutton.y; | ||||
| @ -6031,7 +5986,6 @@ on_x11_event (XEvent *ev) | ||||
| 	case KeyPress: | ||||
| 	case ButtonPress: | ||||
| 	case ButtonRelease: | ||||
| 	case MotionNotify: | ||||
| 		on_x11_input_event (ev); | ||||
| 		break; | ||||
| 	case UnmapNotify: | ||||
| @ -6228,8 +6182,7 @@ x11_init (void) | ||||
| 	XSetWindowAttributes attrs = | ||||
| 	{ | ||||
| 		.event_mask = StructureNotifyMask | ExposureMask | FocusChangeMask | ||||
| 			| KeyPressMask | ButtonPressMask | ButtonReleaseMask | ||||
| 			| Button1MotionMask, | ||||
| 			| KeyPressMask | ButtonPressMask | ButtonReleaseMask, | ||||
| 		.bit_gravity = NorthWestGravity, | ||||
| 		.background_pixel = default_bg.pixel, | ||||
| 	}; | ||||
| @ -6354,8 +6307,6 @@ signals_setup_handlers (void) | ||||
| 
 | ||||
| // --- Initialisation, event handling ------------------------------------------
 | ||||
| 
 | ||||
| static bool g_verbose_mode = false; | ||||
| 
 | ||||
| static void | ||||
| app_on_signal_pipe_readable (const struct pollfd *fd, void *user_data) | ||||
| { | ||||
| @ -6401,16 +6352,19 @@ app_log_handler (void *user_data, const char *quote, const char *fmt, | ||||
| 	str_append (&message, quote); | ||||
| 	str_append_vprintf (&message, fmt, ap); | ||||
| 
 | ||||
| 	// Show it to the user, then maybe log it elsewhere as well.
 | ||||
| 	cstr_set (&g.message, xstrdup (message.str)); | ||||
| 	poller_timer_set (&g.message_timer, 5000); | ||||
| 	app_invalidate (); | ||||
| 
 | ||||
| 	if (g_verbose_mode && (g.ui != &tui_ui || !isatty (STDERR_FILENO))) | ||||
| 	// If the standard error output isn't redirected, try our best at showing
 | ||||
| 	// the message to the user
 | ||||
| 	if (!isatty (STDERR_FILENO)) | ||||
| 		fprintf (stderr, "%s\n", message.str); | ||||
| 	if (g_debug_tab.active) | ||||
| 	else if (g_debug_tab.active) | ||||
| 		debug_tab_push (str_steal (&message), | ||||
| 			user_data == NULL ? 0 : g.attrs[(intptr_t) user_data].attrs); | ||||
| 	else | ||||
| 	{ | ||||
| 		cstr_set (&g.message, xstrdup (message.str)); | ||||
| 		app_invalidate (); | ||||
| 		poller_timer_set (&g.message_timer, 5000); | ||||
| 	} | ||||
| 	str_free (&message); | ||||
| 
 | ||||
| 	in_processing = false; | ||||
| @ -6480,7 +6434,6 @@ main (int argc, char *argv[]) | ||||
| 		{ 'x', "x11", NULL, 0, "use X11 even when run from a terminal" }, | ||||
| #endif  // WITH_X11
 | ||||
| 		{ 'h', "help", NULL, 0, "display this help and exit" }, | ||||
| 		{ 'v', "verbose", NULL, 0, "log messages on standard error" }, | ||||
| 		{ 'V', "version", NULL, 0, "output version information and exit" }, | ||||
| 		{ 0, NULL, NULL, 0, NULL } | ||||
| 	}; | ||||
| @ -6496,18 +6449,15 @@ main (int argc, char *argv[]) | ||||
| 	case 'd': | ||||
| 		g_debug_mode = true; | ||||
| 		break; | ||||
| 	case 'x': | ||||
| 		requested_x11 = true; | ||||
| 		break; | ||||
| 	case 'v': | ||||
| 		g_verbose_mode = true; | ||||
| 		break; | ||||
| 	case 'h': | ||||
| 		opt_handler_usage (&oh, stdout); | ||||
| 		exit (EXIT_SUCCESS); | ||||
| 	case 'V': | ||||
| 		printf (PROGRAM_NAME " " PROGRAM_VERSION "\n"); | ||||
| 		exit (EXIT_SUCCESS); | ||||
| 	case 'x': | ||||
| 		requested_x11 = true; | ||||
| 		break; | ||||
| 	default: | ||||
| 		print_error ("wrong options"); | ||||
| 		opt_handler_usage (&oh, stderr); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user