Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ AC_ISC_POSIX
AC_PROG_CC
AM_PROG_CC_STDC
AC_HEADER_STDC
: ${CXXFLAGS="-std=c++20 -fcoroutines"}
AC_PROG_CXX
AC_PROG_MAKE_SET
AC_PROG_RANLIB
Expand Down
34 changes: 33 additions & 1 deletion gtk/gtkbuilder/Makefile.am
Original file line number Diff line number Diff line change
@@ -1,5 +1,37 @@
gtkbuilderdir = $(datadir)/synaptic/gtkbuilder/

gtkbuilder_DATA = *.ui
gtkbuilder_DATA = \
dialog_authentication.ui \
dialog_changelog.ui \
dialog_change_version.ui \
dialog_conffile.ui \
dialog_disc_label.ui \
dialog_download_error.ui \
dialog_new_repositroy.ui \
dialog_quit.ui \
dialog_task_descr.ui \
dialog_unmet.ui \
dialog_update_failed.ui \
dialog_update_outdated.ui \
dialog_upgrade.ui \
dialog_welcome.ui \
window_changes.ui \
window_details.ui \
window_disc_name.ui \
window_fetch.ui \
window_filters.ui \
window_find.ui \
window_iconlegend.ui \
window_logview.ui \
window_main.ui \
window_preferences.ui \
window_repositories.ui \
window_rgdebinstall_progress.ui \
window_rginstall_progress_msgs.ui \
window_rginstall_progress.ui \
window_setopt.ui \
window_summary.ui \
window_tasks.ui \
window_zvtinstallprogress.ui

EXTRA_DIST = $(gtkbuilder_DATA)
4 changes: 2 additions & 2 deletions gtk/rgchangelogdialog.cc
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

#include "rgchangelogdialog.h"

void ShowChangelogDialog(RGWindow *me, RPackage *pkg)
task<nothing> ShowChangelogDialog(RGWindow *me, RPackage *pkg)
{
RGFetchProgress *status = new RGFetchProgress(me);;
status->setDescription(_("Downloading Changelog"),
Expand Down Expand Up @@ -63,7 +63,7 @@ void ShowChangelogDialog(RGWindow *me, RPackage *pkg)
gtk_text_buffer_insert_at_cursor(buffer, "\n", -1);
}

dia.run();
co_await dia.co_run();

// clean up
delete status;
Expand Down
3 changes: 2 additions & 1 deletion gtk/rgchangelogdialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include <rpackage.h>
#include <rgfetchprogress.h>
#include <rguserdialog.h>
#include <rgutils.h>
#include <cassert>

void ShowChangelogDialog(RGWindow *me, RPackage *pkg);
task<nothing> ShowChangelogDialog(RGWindow *me, RPackage *pkg);
16 changes: 9 additions & 7 deletions gtk/rgmainwindow.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1699,13 +1699,15 @@ void RGMainWindow::cbChangelogDialog(GSimpleAction *action,
{
RGMainWindow *me = (RGMainWindow*)data;

RPackage *pkg = me->selectedPackage();
if(pkg == NULL)
return;

me->setInterfaceLocked(TRUE);
ShowChangelogDialog(me, pkg);
me->setInterfaceLocked(FALSE);
start_task([me]() -> task<nothing> {
RPackage *pkg = me->selectedPackage();
if (pkg != NULL) {
me->setInterfaceLocked(TRUE);
co_await ShowChangelogDialog(me, pkg);
me->setInterfaceLocked(FALSE);
}
co_return nothing {};
});
}


Expand Down
6 changes: 5 additions & 1 deletion gtk/rgpkgdetails.cc
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,11 @@ void RGPkgDetailsWindow::cbShowChangelog(GtkWidget *button, void *data)
{
RPackage *pkg = (RPackage*)data;
RGWindow *parent = (RGWindow*)g_object_get_data(G_OBJECT(button), "me");
ShowChangelogDialog(parent, pkg);

start_task([parent, pkg]() -> task<nothing> {
co_await ShowChangelogDialog(parent, pkg);
co_return nothing {};
});
}

gboolean RGPkgDetailsWindow::cbOpenLink(GtkWidget *label,
Expand Down
76 changes: 39 additions & 37 deletions gtk/rgpreferenceswindow.cc
Original file line number Diff line number Diff line change
Expand Up @@ -436,40 +436,34 @@ void RGPreferencesWindow::doneAction(GtkWidget *self, void *data)
me->closeAction(self, data);
}

void RGPreferencesWindow::changeFontAction(GtkWidget *self, void *data)
void RGPreferencesWindow::changeDefaultFontAction(GtkWidget *self, void *data)
{
const char *fontName, *propName;

switch (GPOINTER_TO_INT(data)) {
case FONT_DEFAULT:
propName = "Synaptic::FontName";
fontName = "sans 10";
break;
case FONT_TERMINAL:
propName = "Synaptic::TerminalFontName";
fontName = "monospace 10";
break;
default:
cerr << "changeFontAction called with unknown argument" << endl;
return;
}
auto me = static_cast<RGPreferencesWindow *>(data);
me->co_changeFont("Synaptic::FontName", "sans 10").start_detached();
}

void RGPreferencesWindow::changeTerminalFontAction(GtkWidget *self, void *data)
{
auto me = static_cast<RGPreferencesWindow *>(data);
me->co_changeFont("Synaptic::TerminalFontName", "monospace 10").start_detached();
}

task<nothing> RGPreferencesWindow::co_changeFont(const char *propName, const char *defaultValue)
{
GtkWidget *fontsel = gtk_font_chooser_dialog_new(_("Choose font"),
GTK_WINDOW(gtk_widget_get_toplevel(self)));
GTK_WINDOW(window()));
gtk_window_set_modal(GTK_WINDOW(fontsel), true);

gtk_font_chooser_set_font(GTK_FONT_CHOOSER(fontsel),
_config->Find(propName, fontName).c_str());
_config->Find(propName, defaultValue).c_str());

gint result = gtk_dialog_run(GTK_DIALOG(fontsel));
if (result != GTK_RESPONSE_OK) {
gtk_widget_destroy(fontsel);
return;
}

fontName = gtk_font_chooser_get_font(GTK_FONT_CHOOSER(fontsel));
//cout << "fontname: " << fontName << endl;
int result = co_await co_run_dialog(GTK_DIALOG(fontsel));
if (result == GTK_RESPONSE_OK) {
auto fontName = gtk_font_chooser_get_font(GTK_FONT_CHOOSER(fontsel));
//cout << "fontname: " << fontName << endl;

_config->Set(propName, fontName);
_config->Set(propName, fontName);
}

gtk_widget_destroy(fontsel);
}
Expand Down Expand Up @@ -902,26 +896,34 @@ void RGPreferencesWindow::cbToggleColumn(GtkWidget *self, char*path_string,


void RGPreferencesWindow::colorClicked(GtkWidget *self, void *data)
{
RGPreferencesWindow *me = (RGPreferencesWindow *) g_object_get_data(G_OBJECT(self), "me");
int status = GPOINTER_TO_INT(data);

me->co_colorClicked(status).start_detached();
}

task<nothing> RGPreferencesWindow::co_colorClicked(int status)
{
GtkWidget *color_dialog;
RGPreferencesWindow *me;
me = (RGPreferencesWindow *) g_object_get_data(G_OBJECT(self), "me");

color_dialog = gtk_color_chooser_dialog_new(_("Color selection"),
GTK_WINDOW(gtk_builder_get_object(me->_builder, "window_preferences")));
GTK_WINDOW(window()));
gtk_window_set_modal(GTK_WINDOW(color_dialog), true);
gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(color_dialog), false);

GdkRGBA *color = NULL;
color = RGPackageStatus::pkgStatus.getColor(GPOINTER_TO_INT(data));
color = RGPackageStatus::pkgStatus.getColor(status);
if (color != NULL)
gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(color_dialog), color);

if (gtk_dialog_run(GTK_DIALOG(color_dialog)) == GTK_RESPONSE_OK) {
int response_id = co_await co_run_dialog(GTK_DIALOG(color_dialog));
if (response_id == GTK_RESPONSE_OK) {
GdkRGBA current_color;
gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(color_dialog), &current_color);
RGPackageStatus::pkgStatus.setColor(GPOINTER_TO_INT(data),
RGPackageStatus::pkgStatus.setColor(status,
gdk_rgba_copy(&current_color));
me->readColors();
readColors();
}
gtk_widget_destroy(color_dialog);
}
Expand Down Expand Up @@ -1171,7 +1173,7 @@ RGPreferencesWindow::RGPreferencesWindow(RGWindow *win,

g_signal_connect(gtk_builder_get_object(_builder, "button_default_font"),
"clicked",
G_CALLBACK(changeFontAction),GINT_TO_POINTER(FONT_DEFAULT));
G_CALLBACK(changeDefaultFontAction), this);

g_signal_connect(gtk_builder_get_object(_builder, "checkbutton_user_terminal_font"),
"toggled",
Expand All @@ -1182,8 +1184,8 @@ RGPreferencesWindow::RGPreferencesWindow(RGWindow *win,

g_signal_connect(gtk_builder_get_object(_builder, "button_terminal_font"),
"clicked",
G_CALLBACK(changeFontAction),
GINT_TO_POINTER(FONT_TERMINAL));
G_CALLBACK(changeTerminalFontAction),
this);

checkbuttonUserTerminalFontToggled(NULL, this);
checkbuttonUserFontToggled(NULL, this);
Expand Down
5 changes: 4 additions & 1 deletion gtk/rgpreferenceswindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,9 @@ class RGPreferencesWindow:public RGGtkBuilderWindow {
static void cbToggleColumn(GtkWidget *self, char *path, void *data);

// callbacks
static void changeFontAction(GtkWidget *self, void *data);
static void changeDefaultFontAction(GtkWidget *self, void *data);
static void changeTerminalFontAction(GtkWidget *self, void *data);
task<nothing> co_changeFont(const char *propName, const char *defaultValue);
static void checkbuttonUserFontToggled(GtkWidget *self, void *data);
static void checkbuttonUserTerminalFontToggled(GtkWidget *self,
void *data);
Expand All @@ -123,6 +125,7 @@ class RGPreferencesWindow:public RGGtkBuilderWindow {
static void clearCacheAction(GtkWidget *self, void *data);

static void colorClicked(GtkWidget *self, void *data);
task<nothing> co_colorClicked(int status);
static void buttonAuthenticationClicked(GtkWidget *self, void *data);

static void useProxyToggled(GtkWidget *self, void *data);
Expand Down
13 changes: 13 additions & 0 deletions gtk/rguserdialog.cc
Original file line number Diff line number Diff line change
Expand Up @@ -290,5 +290,18 @@ int RGGtkBuilderUserDialog::run(const char *name, bool return_gtk_response)
return (res == GTK_RESPONSE_OK) || (res == GTK_RESPONSE_YES) || (res == GTK_RESPONSE_CLOSE);
}

task<int> RGGtkBuilderUserDialog::co_run(const char *name, bool return_gtk_response)
{
if(name != NULL)
init(name);

res = (GtkResponseType) co_await co_run_dialog(GTK_DIALOG(_dialog));
gtk_widget_hide(_dialog);

if(return_gtk_response)
co_return res;
else
co_return (res == GTK_RESPONSE_OK) || (res == GTK_RESPONSE_YES) || (res == GTK_RESPONSE_CLOSE);
}

// vim:sts=4:sw=4
2 changes: 2 additions & 0 deletions gtk/rguserdialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@

#include "ruserdialog.h"
#include "rgwindow.h"
#include "rgutils.h"

class RGUserDialog : public RUserDialog
{
Expand Down Expand Up @@ -87,6 +88,7 @@ class RGGtkBuilderUserDialog : public RGUserDialog
}

int run(const char *name=NULL, bool return_gtk_response=false);
task<int> co_run(const char *name=NULL, bool return_gtk_response=false);
GtkBuilder *getGtkBuilder() { return builder; };
};
#endif
Expand Down
44 changes: 44 additions & 0 deletions gtk/rgutils.cc
Original file line number Diff line number Diff line change
Expand Up @@ -315,4 +315,48 @@ const char *utf8(const char *str)
}
return escaped;
}

void g_main_context_schedule(std::coroutine_handle<> h)
{
g_main_context_invoke(
g_main_context_default(),
[](gpointer data) -> gboolean {
auto h = std::coroutine_handle<>::from_address(data);
h.resume();
return G_SOURCE_REMOVE;
},
h.address()
);
}

struct DialogResponseCallback {
std::function<void(int)> func;
};

static void destroy_dialog_response_callback(gpointer data, GClosure *)
{
delete static_cast<DialogResponseCallback *>(data);
}

static void on_dialog_response(GtkDialog *, int response_id, gpointer user_data)
{
auto *callback = static_cast<DialogResponseCallback *>(user_data);
callback->func(response_id);
}

Awaiter<int> co_run_dialog(GtkDialog *dialog)
{
gtk_window_present(GTK_WINDOW(dialog));
return Awaiter<int> {
[dialog](std::function<void(int)> callback) {
auto *handler = new DialogResponseCallback { std::move(callback) };
g_signal_connect_data(dialog, "response",
G_CALLBACK(on_dialog_response),
handler,
destroy_dialog_response_callback,
G_CONNECT_DEFAULT);
}
};
}

// vim:ts=3:sw=3:et
Loading
Loading